Overview
This namespace defines IRIS-specific elements that extend RSS 2.0 (alongside Media RSS) for publishing the billboards IRIS has received — short sponsor/promo spots ingested from commercial delivery — together with download URLs for their transcoded video files.
Every billboard IRIS holds appears in the feed, not only those that reached playout. Two different files may be
offered per item and they are not interchangeable: a browsable MP4 mezzanine
(iris:mediaUrl) and the broadcast XDCAMHD MXF (iris:playoutFileUrl). See
The two file URLs below.
Feeds include atom:link pagination links (rel="self", rel="prev",
rel="next") at the channel level, and order items by iris:createdAt descending.
The machine-readable schema for this namespace is published alongside this page at
schema.xsd.
Feed Endpoint
A single endpoint serves this namespace. It returns Content-Type: application/rss+xml.
| Endpoint | Authentication | Scope |
|---|---|---|
https://api.iris.a2d.tv/rss/billboards |
Bearer token (Authorization: Bearer <api-key>) |
Every billboard IRIS has received, latest version of each only. The key for this feed is issued separately from the general distribution RSS key and is rotated independently. |
Query parameters
limit— items per page. Default50, clamped to the range1–200.offset— pagination offset. Default0, negative values are clamped to0.spotId— exact spot code (filmkod) to filter on, matched case-insensitively against the same value the feed emits asiris:spotID. Accepted asspotIDtoo. Maximum 64 characters, restricted toA-Z a-z 0-9 . _ -. Omit for the full feed.
An empty result for a spotId means no billboard is indexed under that code — not that IRIS
never received it. Roughly a quarter of billboards carry no spot code at all and can only be found by walking
the feed.
The two file URLs
An item may carry a mezzanine URL, a playout MXF URL, both, or neither. They are produced by different transcodes at different times and serve different purposes.
iris:mediaUrl (and media:content) |
iris:playoutFileUrl |
|
|---|---|---|
| File | Archive mezzanine, MP4 (video/mp4) |
DEFAULT playout package, XDCAMHD MXF (application/mxf) |
| URL type | Signed CloudFront URL | Presigned S3 URL, served with a
Content-Disposition filename of <spot code>.mxf, falling back to
<external ID>.mxf when the billboard has no spot code |
| Validity | Currently 7 days from the moment the feed was rendered. Read the actual value from
iris:mediaUrlExpiresAt rather than assuming the interval |
Currently 7 days from the moment the feed was rendered. Read the actual value from
iris:playoutFileExpiresAt rather than assuming the interval |
| Available when | The mezzanine transcode has finished — normally within a minute of
iris:createdAt, and immediately for a new version of existing material. |
A playout transcode has produced an MXF. Absence means none exists: either the billboard has not been dispatched to playout yet, or it never will be, as with digital-only billboards. |
Both URLs are re-signed on every feed request, so the advertised expiry always sits a full TTL ahead of the response you are reading — currently 7 days, though that is deployment configuration rather than a contract. Do not persist either URL beyond its stated expiry — re-poll the feed to obtain a fresh one.
Either URL may be omitted for the whole feed if IRIS cannot sign it (a signing key missing or unusable). The feed degrades rather than failing, so treat both as best-effort on every poll.
Pagination & Updates
Pagination model
The feed is paginated at the channel level using atom:link elements:
<atom:link rel="self" href="..."/>— the canonical URL of this page<atom:link rel="prev" href="..."/>— the URL for the previous page (omitted whenoffset=0)<atom:link rel="next" href="..."/>— the URL for the next page (omitted on the last page)
A spotId filter is carried through into the pagination links.
.../rss/billboards?limit=50&offset=0
.../rss/billboards?limit=50&offset=50
Ordering
Items are ordered by iris:createdAt descending — when IRIS created the
delivery request, newest first — with the delivery request's identifier as a tie-break. This is a
creation timestamp and it never changes for a given version, so the ordering is stable.
Versions, GUIDs and deduplication
- GUIDs encode the version. Each item's
<guid isPermaLink="false">is<delivery-request-id>:v<version>, for example3f7c…a91b:v1. - The feed is not append-only. When a new version of a billboard is created — a
re-delivery or an operator revision — it replaces the previous item. Its
guidchanges from…:v1to…:v2, it moves back to the head of the feed, and the oldguiddisappears. Aguidthat vanishes has almost always been superseded by a higher version rather than retracted. - Crawl repeatedly. Deduplicate on
guid, walk everyrel="next"page, and repeat the crawl on a schedule rather than treating one pass as exhaustive. Paging is offset-based, so an item created or removed mid-crawl can be duplicated or missed. - Most elements are optional and best-effort. Any of them can be absent on one poll and present on the next, or the reverse. Do not treat a missing element as a retraction.
- Feed freshness: the channel's
<lastBuildDate>equals theiris:createdAtof the first item on the current page. On page 2 and beyond it therefore reflects that page, not the feed as a whole.
Element Reference
Channel
| Element | Description | Type | Card. | Example |
|---|---|---|---|---|
title |
Human-readable title for the feed. Billboards (Filtered) when a spotId filter is
applied. |
xsd:string |
1..1 | Billboards |
description |
Short description of the feed's content. Names the spot code when filtered. | xsd:string |
1..1 | Billboards received by Iris |
link |
Fixed placeholder. This feed does not emit its own URL here — use
atom:link [rel="self"] instead. |
xsd:anyURI |
1..1 | https://example.com/ |
lastBuildDate |
iris:createdAt of the first item on this page, as an RFC-822/RFC-1123 date. Omitted when the
page is empty. |
xsd:string (RFC-822 date) |
0..1 | Tue, 01 Sep 2026 09:12:33 GMT |
atom:link [rel="self"] |
Canonical URL of this page of the feed. | xsd:anyURI |
1..1 | https://api.iris.a2d.tv/rss/billboards?limit=50&offset=0 |
atom:link [rel="prev"] |
URL of the previous page (omitted when offset=0). |
xsd:anyURI |
0..1 | https://api.iris.a2d.tv/rss/billboards?limit=50&offset=0 |
atom:link [rel="next"] |
URL of the next page (omitted on last page). | xsd:anyURI |
0..1 | https://api.iris.a2d.tv/rss/billboards?limit=50&offset=50 |
Item
Elements are listed in the order they appear in the feed. Treat every optional element as optional in practice — older items predate later additions and simply omit them.
| Element | Description | Type | Card. | Example |
|---|---|---|---|---|
guid [isPermaLink="false"] |
Stable identifier for this version of the billboard, in the form
<delivery-request-id>:v<version>. It is not a resolvable URL, hence
isPermaLink="false". See Versions, GUIDs and deduplication above. |
xsd:string |
1..1 | 8b1f0c94-2d3e-4a77-9b10-5c6d7e8f9a0b:v1 |
title |
Human-readable title. Falls back to iris:spotID, then to iris:externalId, when
no title was supplied. |
xsd:string |
1..1 | Ohy_J1_v2_(2026-09-01)_Veik2_Coca_Moi2_Lidl_Billys_Sievi_Kamux_53s |
description |
Short description of the item, naming the spot code (or the external ID when there is none). | xsd:string |
1..1 | Billboard SG447916 |
pubDate |
Creation time of the delivery request (RFC-822/RFC-1123). Same instant as
iris:createdAt, in RSS date form. |
xsd:string (RFC-822 date) |
1..1 | Tue, 01 Sep 2026 09:12:33 GMT |
media:content |
Media RSS content element pointing at the signed mezzanine URL — the same URL as
iris:mediaUrl. The duration attribute is in seconds, rounded;
note that this differs from iris:duration, which is normally a frame-accurate timecode.
Emitted only when the mezzanine URL is available. fileSize and duration are each
omitted when the mezzanine did not record that value. |
Element (attrs: url, type; optional fileSize,
duration) |
0..1 | url="https://mezzanine.iris.a2d.tv/…" type="video/mp4" fileSize="24051233" duration="53" |
iris:mediaUrl |
Mezzanine download URL. A signed CloudFront URL for the archive mezzanine MP4, wrapped in
CDATA (the query string contains characters that would otherwise need escaping). Re-signed on
every feed request; the expiry is in iris:mediaUrlExpiresAt. |
xsd:anyURI |
0..1 | https://mezzanine.iris.a2d.tv/…_1080p.mp4?Expires=…&Key-Pair-Id=…&Signature=… |
iris:mediaUrlExpiresAt |
When iris:mediaUrl stops working, ISO-8601 UTC. Present exactly when
iris:mediaUrl is. |
xsd:dateTime |
0..1 | 2026-09-10T09:12:33.000Z |
iris:externalId |
Identifier of the billboard in the upstream commercial-delivery system. | xsd:string |
1..1 | 355430 |
iris:version |
Version number of this billboard within IRIS, starting at 1. Only the highest version of a
billboard appears in the feed. |
xsd:positiveInteger |
1..1 | 1 |
iris:createdAt |
When IRIS created the delivery request for this billboard version, ISO-8601 UTC. This is the feed's ordering key. | xsd:dateTime |
1..1 | 2026-09-01T09:12:33.000Z |
iris:firstCopiedToPlayoutAt |
When the billboard's first playout transfer completed, ISO-8601 UTC. Present only once a transfer has completed, and the only indication that a billboard reached playout. Absent for digital-only billboards and for anything not yet dispatched. | xsd:dateTime |
0..1 | 2026-09-02T13:50:18.859Z |
iris:playoutFileUrl |
Playout MXF download URL. A presigned S3 URL for the DEFAULT playout package's XDCAMHD
MXF, wrapped in CDATA. Served with a Content-Disposition filename of
<spot code>.mxf — or <external ID>.mxf when there is no spot
code — and a content type of application/mxf. Re-signed on every feed request; the
expiry is in iris:playoutFileExpiresAt. |
xsd:anyURI |
0..1 | https://irisplayouttranscode-general-irisprod1-outbox.s3.eu-north-1.amazonaws.com/…_xdcamhd_50m.mxf?X-Amz-Expires=…&X-Amz-Signature=… |
iris:playoutFileExpiresAt |
When iris:playoutFileUrl stops working, ISO-8601 UTC. Present exactly when
iris:playoutFileUrl is. |
xsd:dateTime |
0..1 | 2026-09-10T09:12:33.000Z |
iris:playoutFileSize |
Size of the playout MXF in bytes. Omitted when the size is not recorded, even if
iris:playoutFileUrl is present. |
xsd:nonNegativeInteger |
0..1 | 412738560 |
iris:spotID |
Spot code (filmkod). Absent on billboards IRIS received without one — currently around a quarter of
the feed — which can then only be found by walking the feed. This is the value the
spotId query parameter matches. |
xsd:string |
0..1 | SG447916 |
iris:targetCompany |
Broadcaster the billboard was delivered for. Observed values: tv4, mtv. |
xsd:string |
0..1 | mtv |
iris:duration |
Normally an HH:MM:SS:FF timecode — the last field is frames, not milliseconds or
hundredths, so 00:00:53:00 is 53 seconds. Do not parse it as xsd:duration or as
HH:MM:SS.mmm. It is an upstream tag that IRIS passes through without
validating, so treat any other shape (a bare number of seconds, for instance) as possible and
parse defensively. |
xsd:string |
0..1 | 00:00:53:00 |
iris:channelGroup |
Channel group the billboard is intended for. Present on a minority of items; currently only
TV4 is emitted. |
xsd:string |
0..1 | TV4 |
Full XML Example
A two-item response. The first item has both files; the second is digital-only and has no playout MXF and no spot code. Both items were signed by the same request, so they share an expiry instant regardless of when each billboard was created. Signature values are abbreviated here; live feeds carry them in full.
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:iris="https://rss.iris.a2d.tv/ns/billboards/1.0/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:media="http://search.yahoo.com/mrss/">
<channel>
<title>Billboards</title>
<description>Billboards received by Iris</description>
<link>https://example.com/</link>
<lastBuildDate>Tue, 01 Sep 2026 09:12:33 GMT</lastBuildDate>
<atom:link rel="self" href="https://api.iris.a2d.tv/rss/billboards?limit=50&offset=0"></atom:link>
<atom:link rel="next" href="https://api.iris.a2d.tv/rss/billboards?limit=50&offset=50"></atom:link>
<item>
<guid isPermaLink="false">8b1f0c94-2d3e-4a77-9b10-5c6d7e8f9a0b:v1</guid>
<title>Ohy_J1_v2_(2026-09-01)_Veik2_Coca_Moi2_Lidl_Billys_Sievi_Kamux_53s</title>
<description>Billboard SG447916</description>
<pubDate>Tue, 01 Sep 2026 09:12:33 GMT</pubDate>
<media:content url="https://mezzanine.iris.a2d.tv/8b1f0c94-2d3e-4a77-9b10-5c6d7e8f9a0b/1/8b1f0c94-2d3e-4a77-9b10-5c6d7e8f9a0b_1788270210604_15000_1080p.mp4?Expires=1789751553&Key-Pair-Id=K2PK...PM8V&Signature=ZBzQ...HA__" type="video/mp4" fileSize="24051233" duration="53"></media:content>
<iris:mediaUrl>
<![CDATA[https://mezzanine.iris.a2d.tv/8b1f0c94-2d3e-4a77-9b10-5c6d7e8f9a0b/1/8b1f0c94-2d3e-4a77-9b10-5c6d7e8f9a0b_1788270210604_15000_1080p.mp4?Expires=1789751553&Key-Pair-Id=K2PK...PM8V&Signature=ZBzQ...HA__]]>
</iris:mediaUrl>
<iris:mediaUrlExpiresAt>2026-09-10T09:12:33.000Z</iris:mediaUrlExpiresAt>
<iris:externalId>355430</iris:externalId>
<iris:version>1</iris:version>
<iris:createdAt>2026-09-01T09:12:33.000Z</iris:createdAt>
<iris:firstCopiedToPlayoutAt>2026-09-02T13:50:18.859Z</iris:firstCopiedToPlayoutAt>
<iris:playoutFileUrl>
<![CDATA[https://irisplayouttranscode-general-irisprod1-outbox.s3.eu-north-1.amazonaws.com/8b1f0c94-2d3e-4a77-9b10-5c6d7e8f9a0b/1/8b1f0c94-2d3e-4a77-9b10-5c6d7e8f9a0b_xdcamhd_50m.mxf?X-Amz-Expires=604800&response-content-disposition=attachment%3B%20filename%3D%22SG447916.mxf%22&X-Amz-Signature=6f21...9c4e]]>
</iris:playoutFileUrl>
<iris:playoutFileExpiresAt>2026-09-10T09:12:33.000Z</iris:playoutFileExpiresAt>
<iris:playoutFileSize>412738560</iris:playoutFileSize>
<iris:spotID>SG447916</iris:spotID>
<iris:targetCompany>mtv</iris:targetCompany>
<iris:duration>00:00:53:00</iris:duration>
</item>
<item>
<guid isPermaLink="false">c40d5a71-88ef-4b02-a6d3-1e2f3a4b5c6d:v2</guid>
<title>355118</title>
<description>Billboard 355118</description>
<pubDate>Mon, 31 Aug 2026 14:02:10 GMT</pubDate>
<media:content url="https://mezzanine.iris.a2d.tv/c40d5a71-88ef-4b02-a6d3-1e2f3a4b5c6d/1/c40d5a71-88ef-4b02-a6d3-1e2f3a4b5c6d_1788183730000_15000_1080p.mp4?Expires=1789751553&Key-Pair-Id=K2PK...PM8V&Signature=Qm9v...Kg__" type="video/mp4" fileSize="9812004" duration="20"></media:content>
<iris:mediaUrl>
<![CDATA[https://mezzanine.iris.a2d.tv/c40d5a71-88ef-4b02-a6d3-1e2f3a4b5c6d/1/c40d5a71-88ef-4b02-a6d3-1e2f3a4b5c6d_1788183730000_15000_1080p.mp4?Expires=1789751553&Key-Pair-Id=K2PK...PM8V&Signature=Qm9v...Kg__]]>
</iris:mediaUrl>
<iris:mediaUrlExpiresAt>2026-09-10T09:12:33.000Z</iris:mediaUrlExpiresAt>
<iris:externalId>355118</iris:externalId>
<iris:version>2</iris:version>
<iris:createdAt>2026-08-31T14:02:10.000Z</iris:createdAt>
<iris:targetCompany>tv4</iris:targetCompany>
<iris:duration>00:00:20:00</iris:duration>
<iris:channelGroup>TV4</iris:channelGroup>
</item>
</channel>
</rss>
Schema
The authoritative schema is published at schema.xsd, alongside this page.
It is reproduced below for convenience.
Show schema.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="https://rss.iris.a2d.tv/ns/billboards/1.0/"
xmlns="https://rss.iris.a2d.tv/ns/billboards/1.0/"
elementFormDefault="qualified">
<!-- iris:externalId -->
<xsd:element name="externalId" type="xsd:string"/>
<!-- iris:version -->
<xsd:element name="version" type="xsd:positiveInteger"/>
<!-- iris:createdAt (ISO-8601 UTC) -->
<xsd:element name="createdAt" type="xsd:dateTime"/>
<!-- iris:mediaUrl (signed CloudFront URL for the archive mezzanine) -->
<xsd:element name="mediaUrl" type="xsd:anyURI"/>
<!-- iris:mediaUrlExpiresAt (ISO-8601 UTC) -->
<xsd:element name="mediaUrlExpiresAt" type="xsd:dateTime"/>
<!-- iris:playoutFileUrl (presigned S3 URL for the XDCAMHD MXF) -->
<xsd:element name="playoutFileUrl" type="xsd:anyURI"/>
<!-- iris:playoutFileExpiresAt (ISO-8601 UTC) -->
<xsd:element name="playoutFileExpiresAt" type="xsd:dateTime"/>
<!-- iris:playoutFileSize (bytes) -->
<xsd:element name="playoutFileSize" type="xsd:nonNegativeInteger"/>
<!-- iris:firstCopiedToPlayoutAt (ISO-8601 UTC) -->
<xsd:element name="firstCopiedToPlayoutAt" type="xsd:dateTime"/>
<!-- iris:spotID (spot code / filmkod) -->
<xsd:element name="spotID" type="xsd:string"/>
<!-- iris:targetCompany -->
<xsd:element name="targetCompany" type="xsd:string"/>
<!-- iris:duration - normally an HH:MM:SS:FF timecode, but it is an upstream
tag that IRIS passes through without validating, so it is typed loosely -->
<xsd:element name="duration" type="xsd:string"/>
<!-- iris:channelGroup -->
<xsd:element name="channelGroup" type="xsd:string"/>
</xsd:schema>