Overview
This namespace defines IRIS-specific elements that extend RSS 2.0 (optionally alongside Media RSS) for publishing distributed media files (subtitles and video) with storage metadata.
Feeds include atom:link pagination links (rel="self", rel="prev",
rel="next") at the channel level, and order items by most-recent update. Updated items will bump
their pubDate.
The machine-readable schema for this namespace is published alongside this page at
schema.xsd.
Feed Endpoints
Two feed shapes serve this namespace. Both return
Content-Type: application/rss+xml.
| Endpoint | Authentication | Scope |
|---|---|---|
https://api.iris.a2d.tv/rss/distribution/{operator}/media |
HTTP Basic (per-operator credentials, issued separately) | Per-operator feed. The channel title/description are suffixed with the
operator name, e.g. Distributed Media Feed (Tele2). |
https://api.iris.a2d.tv/rss/distribution/media |
Bearer token (Authorization: Bearer <api-key>) |
General feed. Accepts an optional clientId query parameter to filter by delivery
destination; valid client IDs are issued separately. |
Query parameters
limit— items per page. Default50, clamped to a maximum of200.offset— pagination offset. Default0, negative values are clamped to0.clientId— general feed only; filters by delivery destination.sinceSeq— return only items withiris:seqgreater than this value, ordered byseqascending (oldest change first). See Incremental reading.
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)
Pagination parameters are conveyed via query string, using
limit and offset:
.../rss/distribution/tele2/media?limit=50&offset=0
.../rss/distribution/tele2/media?limit=50&offset=50
Ordering
Items are ordered by most-recent update first. When a file is distributed or re-distributed, it appears (or moves) to the top of page 1.
Updates & deduplication
- Stable GUIDs: Each item has a stable
<guid isPermaLink="false">that never changes. It is derived deterministically from the file's storage location (iris:bucketName+iris:objectKey), so re-delivering to the same object key reuses the sameguid. Delivering to a different object key produces a differentguidand therefore a distinct item. - Item updates: On any change to the distributed file, the item's
<pubDate>is set to the record's latest modification time (UTC). - Feed freshness: The channel's
<lastBuildDate>equals the most recent itempubDateon the current page. On page 2 and beyond it therefore reflects that page, not the feed as a whole. - Client behavior: Consumers should deduplicate by
guidand treat a higherpubDatefor the sameguidas a replacement of prior state.
Incremental reading with iris:seq
?sinceSeq=<n> returns only items whose iris:seq is greater than
n, ordered by seq ascending — oldest change first.
limit and offset work as usual and the atom:link pagination links
preserve the parameter.
Persist two values: the highest seq you have processed (your cursor W), and the
iris:feedEpoch you last saw. Compare the epoch on every poll; if it changed, discard
W and restart from 0. Then:
- Request
?sinceSeq=W&limit=200. - Process the items. A
guidyou have seen before is an update — replace your prior state for that file. - Set
Wto the highestseqon the page and persist it. - Repeat until you receive an empty page.
Bootstrap with sinceSeq=0 to stream the whole current state oldest-first, or read page 1 of the
default feed once and start from the highest iris:seq you see.
What the cursor does not cover. It is exact for additions and re-distributions, but the feed
is add/update-only: there are no tombstones. A file removed from the feed's underlying data simply stops
appearing, and a renamed file retires its old guid without minting anything for it — so a
cursor-only consumer accumulates stale entries. Do a full default-feed re-read periodically and drop any
guid it does not contain.
Do not offset-page through a fixed sinceSeq as a substitute for advancing the cursor. Under
seq-ascending ordering a re-mint moves an item to the end of the result set and shifts every later
item left by one, so a sweep with a fixed W and increasing offset can skip an item
entirely.
Filenames
Distributed files are named after the product external reference:
<iris:programExternalReference>.mp4 for video and
<iris:programExternalReference>_<LANG>.ttml for subtitles, language upper-cased. The name is
the storage object key, so it is also the last path segment of iris:objectKey and of the
iris:mediaUrl download URL — nothing needs renaming on your side.
Read the name from iris:objectKey; never recompose it from
iris:programExternalReference. The key is fixed when the file is distributed, from the
work order as it stood then, while iris:programExternalReference is read live on every request. If a work
order gains or changes its reference afterwards, the two will not match.
Both namings coexist
Files whose work order carried no usable reference are named <iris:materialId> instead, and
a file is only renamed when its material is next re-distributed. Files that are never re-distributed keep their
material-id names indefinitely, and one programme can carry a reference-named video beside a material-id-named
subtitle, because subtitles are only re-emitted on a subtitle event. Do not expect the naming to be
uniform.
The filename is not unique, and is not an identity
A programme can have more than one media, and they share one filename, so a later distribution supersedes an
earlier one at that key. iris:objectKey is a storage location; iris:materialId still
identifies the individual material and is the only field that does.
- Supersession is by write order, not by media recency. A late delivery for an older media overwrites a newer media's file at the shared key.
- Video and subtitles are superseded independently. A programme whose newer media delivered only a video keeps the older media's subtitles — usually what you want, but the two can originate from different media, and in rare cases from different edits.
- A
guidis stable across a content replacement. Deduplicate on it, but re-fetch wheneveriris:seq,pubDateormedia:hashchanges for aguidyou already hold — ignoring repeats of a knownguidwill silently skip new bytes.
Element Reference
Channel
| Element | Description | Type | Card. | Example |
|---|---|---|---|---|
title |
Human-readable title for the feed. Operator feeds are suffixed with the operator name. | xsd:string |
1..1 | Distributed Media Feed (Tele2) |
description |
Short description of the feed's content. | xsd:string |
1..1 | Latest distributed media files for Tele2 |
link |
Canonical URL of the feed. Operator feeds emit the feed's own URL. | xsd:anyURI |
1..1 | https://api.iris.a2d.tv/rss/distribution/tele2/media |
lastBuildDate |
Most recent item pubDate on this page (RFC-822/RFC-1123). |
xsd:string (RFC-822 date) |
0..1 | Wed, 19 Aug 2026 09:09:52 GMT |
iris:feedEpoch |
Token identifying the current sequence generation. Persist it alongside any
sinceSeq cursor and compare it on every poll. If it changes, your cursor is invalid:
discard it and restart from sinceSeq=0. It carries no ordering and is not a version number. |
xsd:string |
0..1 | 3f9a1c84-2d1e-4b77-9f0a-6c2b5e8d4471 |
atom:link [rel="self"] |
Canonical URL of this page of the feed. | xsd:anyURI |
1..1 | https://api.iris.a2d.tv/rss/distribution/tele2/media?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/distribution/tele2/media?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/distribution/tele2/media?limit=50&offset=50 |
Item
Elements are listed in the order they appear in the feed. Treat every optional element and attribute as optional in practice — older items predate later additions and simply omit them.
| Element | Description | Type | Card. | Example |
|---|---|---|---|---|
guid [isPermaLink="false"] |
Stable identifier for the item, used for deduplication. A UUID derived deterministically from
iris:bucketName and iris:objectKey; it is not a resolvable URL, hence
isPermaLink="false". See Updates & deduplication above. |
xsd:string (UUID) |
1..1 | d7eb4ae1-9a6a-b5a6-d099-faf39b44443b |
title |
Human-readable title for the media item. Falls back to the material ID when no composed title is available. | xsd:string |
1..1 | Other Bennet Sister, The I 7 "Chapter Seven" (S01E07) |
link |
Canonical S3 URI of the distributed object. This URI is not publicly retrievable — use
iris:mediaUrl to download the file. |
xsd:anyURI |
0..1 | https…/12305144312800.mp4 |
description |
Short description of the item. Video for <materialId> for video, or
Subtitle <language> for <materialId> for subtitles. |
xsd:string |
0..1 | Subtitle sv for M0665262 |
pubDate |
Publication/update time for this item (RFC-822/RFC-1123). | xsd:string (RFC-822 date) |
0..1 | Wed, 19 Aug 2026 09:09:52 GMT |
media:content |
Media RSS content element pointing at the S3 URI. Like link, that URI is not
publicly retrievable — download via iris:mediaUrl. The optional fileSize attribute (bytes) may be
present on any file type. The optional duration attribute (seconds, rounded) is
video-only — it comes from the mezzanine result, which only describes the video asset.
May contain an optional <media:hash> child element (see next row). |
Element (attrs: url, type, fileSize, duration) |
0..n | url="https…/12305144312800.mp4" type="video/mp4" fileSize="1686218954" duration="1771" |
media:hash |
SHA-256 of the distributed object's bytes, lowercase hex (64 chars). Equivalent to running
sha256sum on the downloaded file — partners can verify integrity directly without any
S3-specific tooling. |
Element child of media:content (attr: algo="sha256") |
0..1 | <media:hash algo="sha256">174a932a…5aa296fe</media:hash> |
iris:language |
Language of the file, as a two-letter ISO 639-1 code. Always emitted. Files that carry no language
— video in particular — use the literal sentinel n/a, which is not a language tag and
must be handled explicitly by consumers. Current possible values:
sv, fi, no, da, en, nl,
n/a. |
xsd:string |
1..1 | sv |
iris:video |
Indicates if the item is a video (vs. subtitle, etc.). | xsd:boolean |
1..1 | false |
iris:materialId |
Unique identifier of the source material or program. | xsd:string |
1..1 | M0665262 |
iris:bucketName |
Backing storage bucket name (distribution outbox). | xsd:string |
1..1 | tv4-irisdistribution-general-irisprod1-outbox |
iris:objectKey |
Object key / path within the bucket. | xsd:string |
1..1 | 12305034612900_SV.ttml |
iris:lastAccessDate |
Availability timestamp carried on the distributed-file record, in RFC-822/RFC-1123 UTC form
(not ISO-8601). In current production data this is dated ahead of the item's pubDate and
tracks the expiry of the signed iris:mediaUrl. Parse it as a date string, not as
xsd:dateTime. |
xsd:string (RFC-822 date) |
1..1 | Fri, 18 Sep 2026 09:00:00 GMT |
iris:seq |
Change sequence number, strictly increasing across the whole feed — each distribution or
re-distribution is assigned a value higher than every one before it. Use it with the sinceSeq
query parameter to read incrementally. Never assume gapless numbering, and do not compare it
to wall-clock time. Absent on the rare item written before sequencing existed, and on files distributed by a
task draining during a rolling deploy — such an item is invisible to sinceSeq at every
cursor value, so a periodic full re-read remains necessary. |
xsd:unsignedLong |
0..1 | 21680 |
iris:mediaUrl |
The download URL. A signed CloudFront URL for the distributed object, wrapped in
CDATA (the query string contains characters that would otherwise need escaping). Signed once when
the file is distributed — it is not re-signed per feed request, so the remaining validity
shrinks as the item ages. The expiry is carried in the Expires query parameter. Omitted when URL
signing is unavailable for the file; consumers must tolerate its absence. |
xsd:anyURI |
0..1 | https://media.distribution.iris.a2d.tv/12305034612900_SV.ttml?Expires=1789721961&Key-Pair-Id=…&Signature=… |
iris:wonMediaAssetSequenceId |
WON media asset sequence identifier for the delivered asset. Empty when the source record carries no value. | xsd:string |
0..1 | 12305034775927 |
iris:wonProductCode |
WON product code for the delivered asset. Always emitted; empty when the source record carries no value. | xsd:string |
1..1 | 500835323 |
iris:programExternalReference |
The product-level external reference — the key the Mercury Metadata and VOD APIs
are queried by (references.external_reference / product_external_reference), so use
it to join a distributed file to its editorial and rights metadata. A work order carries three external
references (product, media and segmentation); this is the one that resolves against
/metadata/programs, and it is strictly 1:1 with iris:wonProductCode. It identifies a
programme, not a file: one programme can have several media, so this value is not unique across the
feed. Omitted for the rare item whose work order carries no product external reference. |
xsd:string |
0..1 | 12304453349498 |
iris:wonMediaId |
WON media identifier of the delivery request this file belongs to. Frequently equal to
iris:materialId, but a distinct field — do not assume they match. |
xsd:string |
0..1 | M0665262 |
Full XML Example
A two-item response from the Tele2 operator feed. The Key-Pair-Id and Signature values
in iris:mediaUrl 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/distribution/1.0/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:media="http://search.yahoo.com/mrss/">
<channel>
<title>Distributed Media Feed (Tele2)</title>
<description>Latest distributed media files for Tele2</description>
<link>https://api.iris.a2d.tv/rss/distribution/tele2/media</link>
<lastBuildDate>Wed, 19 Aug 2026 09:09:52 GMT</lastBuildDate>
<iris:feedEpoch>3f9a1c84-2d1e-4b77-9f0a-6c2b5e8d4471</iris:feedEpoch>
<atom:link rel="self" href="https://api.iris.a2d.tv/rss/distribution/tele2/media?limit=50&offset=0"></atom:link>
<atom:link rel="next" href="https://api.iris.a2d.tv/rss/distribution/tele2/media?limit=50&offset=50"></atom:link>
<item>
<guid isPermaLink="false">d7eb4ae1-9a6a-b5a6-d099-faf39b44443b</guid>
<title>Other Bennet Sister, The I 7 "Chapter Seven" (S01E07)</title>
<link>https://tv4-irisdistribution-general-irisprod1-outbox.s3.amazonaws.com/12305144312800.mp4</link>
<description>Video for M0671323</description>
<pubDate>Wed, 19 Aug 2026 09:09:52 GMT</pubDate>
<media:content url="https://tv4-irisdistribution-general-irisprod1-outbox.s3.amazonaws.com/12305144312800.mp4" type="video/mp4" fileSize="1686218954" duration="1771">
<media:hash algo="sha256">174a932a150eebd7ff0e8f027fce1032bc7b36d25b7ab13f1ca9e0b65aa296fe</media:hash>
</media:content>
<iris:language>n/a</iris:language>
<iris:video>true</iris:video>
<iris:materialId>M0671323</iris:materialId>
<iris:bucketName>tv4-irisdistribution-general-irisprod1-outbox</iris:bucketName>
<iris:objectKey>12305144312800.mp4</iris:objectKey>
<iris:lastAccessDate>Fri, 18 Sep 2026 09:00:00 GMT</iris:lastAccessDate>
<iris:seq>21680</iris:seq>
<iris:mediaUrl>
<![CDATA[https://media.distribution.iris.a2d.tv/12305144312800.mp4?Expires=1789722618&Key-Pair-Id=K2PK...PM8V&Signature=ZBzQuocpzT0q...PER8HA__]]>
</iris:mediaUrl>
<iris:wonMediaAssetSequenceId>12305144498506</iris:wonMediaAssetSequenceId>
<iris:wonProductCode>500841194</iris:wonProductCode>
<iris:programExternalReference>12305144312800</iris:programExternalReference>
<iris:wonMediaId>M0671323</iris:wonMediaId>
</item>
<item>
<guid isPermaLink="false">4fadf53d-b887-8b21-916a-b5e6fc30cb8a</guid>
<title>Home and Away XXXV 8 (7893) (S35E08)</title>
<link>https://tv4-irisdistribution-general-irisprod1-outbox.s3.amazonaws.com/12305034612900_SV.ttml</link>
<description>Subtitle sv for M0665262</description>
<pubDate>Wed, 19 Aug 2026 08:59:05 GMT</pubDate>
<media:content url="https://tv4-irisdistribution-general-irisprod1-outbox.s3.amazonaws.com/12305034612900_SV.ttml" type="text/ttml">
<media:hash algo="sha256">9f114583e6ff4382dfb7251d4f89838dc0bef493b2f7e28ead9d23c85d53d174</media:hash>
</media:content>
<iris:language>sv</iris:language>
<iris:video>false</iris:video>
<iris:materialId>M0665262</iris:materialId>
<iris:bucketName>tv4-irisdistribution-general-irisprod1-outbox</iris:bucketName>
<iris:objectKey>12305034612900_SV.ttml</iris:objectKey>
<iris:lastAccessDate>Fri, 18 Sep 2026 08:00:00 GMT</iris:lastAccessDate>
<iris:seq>21675</iris:seq>
<iris:mediaUrl>
<![CDATA[https://media.distribution.iris.a2d.tv/12305034612900_SV.ttml?Expires=1789721961&Key-Pair-Id=K2PK...PM8V&Signature=pqITYRIaqnPp...uFLg__]]>
</iris:mediaUrl>
<iris:wonMediaAssetSequenceId>12305034775927</iris:wonMediaAssetSequenceId>
<iris:wonProductCode>500835323</iris:wonProductCode>
<iris:programExternalReference>12305034612900</iris:programExternalReference>
<iris:wonMediaId>M0665262</iris:wonMediaId>
</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/distribution/1.0/"
xmlns="https://rss.iris.a2d.tv/ns/distribution/1.0/"
elementFormDefault="qualified">
<!-- iris:language -->
<xsd:element name="language" type="xsd:string"/>
<!-- iris:video -->
<xsd:element name="video" type="xsd:boolean"/>
<!-- iris:materialId -->
<xsd:element name="materialId" type="xsd:string"/>
<!-- iris:bucketName -->
<xsd:element name="bucketName" type="xsd:string"/>
<!-- iris:objectKey -->
<xsd:element name="objectKey" type="xsd:string"/>
<!-- iris:lastAccessDate (RFC-822 / RFC-1123 date string) -->
<xsd:element name="lastAccessDate" type="xsd:string"/>
<!-- iris:wonMediaAssetSequenceId -->
<xsd:element name="wonMediaAssetSequenceId" type="xsd:string"/>
<!-- iris:wonProductCode -->
<xsd:element name="wonProductCode" type="xsd:string"/>
<!-- iris:wonMediaId -->
<xsd:element name="wonMediaId" type="xsd:string"/>
<!-- iris:mediaUrl -->
<xsd:element name="mediaUrl" type="xsd:anyURI"/>
<!-- iris:programExternalReference (programme-level Mercury reference) -->
<xsd:element name="programExternalReference" type="xsd:string"/>
<!-- iris:seq (change sequence number; strictly increasing, may have gaps) -->
<xsd:element name="seq" type="xsd:unsignedLong"/>
<!-- iris:feedEpoch (channel-level; invalidates a sinceSeq cursor when it changes) -->
<xsd:element name="feedEpoch" type="xsd:string"/>
</xsd:schema>