Overview
This namespace defines IRIS-specific elements that extend RSS 2.0 for distributing subtitle work to translation agencies. It covers two different feed shapes, which share the namespace but have entirely different item elements:
- Orders — what to translate: material ID, target language and format, deadline, and editorial metadata.
- Media — how to do it: the burnt-in time code (BITC) proxy video to work from and the upload portal link to deliver the finished file to.
The two are linked by the order identifier: an order item's <guid> is the same value a media
item carries in <iris:guid value="…"/>.
Feeds include atom:link pagination links (rel="self", rel="prev",
rel="next") at the channel level. Updated orders bump their pubDate.
The machine-readable schema for this namespace is published alongside this page at
schema.xsd.
Feed Endpoints
Each translation agency has its own pair of endpoints and its own credentials, and sees only its own orders.
All four return Content-Type: application/rss+xml and authenticate with HTTP Basic using
credentials issued separately.
| Endpoint | Shape | Scope |
|---|---|---|
https://api.iris.a2d.tv/rss/subtitles/iyuno/orders |
Orders | Subtitle orders assigned to IYUNO. |
https://api.iris.a2d.tv/rss/subtitles/iyuno/media |
Media | BITC proxy and upload links for IYUNO's orders. |
https://api.iris.a2d.tv/rss/subtitles/plint/orders |
Orders | Subtitle orders assigned to PLINT. |
https://api.iris.a2d.tv/rss/subtitles/plint/media |
Media | BITC proxy and upload links for PLINT's orders. |
Query parameters
limit— items per page. Default50, clamped to a maximum of200.offset— pagination offset. Default0, negative values are clamped to0.
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)
.../rss/subtitles/iyuno/orders?limit=50&offset=0
.../rss/subtitles/iyuno/orders?limit=50&offset=50
Ordering
- Orders feed: most-recently-updated first. When an order is created or changed it moves to the top of page 1.
- Media feed: most-recently-created first. A media item is never edited in place —
renewing its links replaces the record, so the renewed item reappears at the head under a new
guid.
Updates & deduplication
- Orders GUIDs are stable — an orders item's
<guid isPermaLink="false">is the order identifier and never changes. - Media GUIDs are not. A media item's
<guid>identifies the media record, and renewing the links (see Both media URLs expire below) deletes that record and creates a new one. The oldguiddisappears, a new item arrives at the head with a newguidand a freshpubDate, and onlyiris:guid/@value— the order identifier — is carried across. Key media items oniris:guid/@value, not onguid, and keep the newestpubDateper order. - Item updates: on any change to an order, its
<pubDate>and<iris:updatedAt>are set to the record's latest modification time. Both carry the same instant,pubDatein RFC-822 form andiris:updatedAtin ISO-8601. - Feed freshness: on the orders feeds 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. The media feeds do not emit<lastBuildDate>at all. - Client behavior: consumers should deduplicate by
guidand treat a higherpubDatefor the sameguidas a replacement of prior state. - Cancellation is a status, not a removal. A cancelled order stays in the feed with
<iris:status>CANCELLED</iris:status>; do not treat its continued presence as a live request.
Both media URLs expire
Unlike the IRIS billboards feed, iris:bitc and iris:upload are not re-signed
per request. Both are minted once, when the media record is created, and stored verbatim — so
their remaining validity shrinks as the item ages, measured from the item's pubDate, not from when
you fetched the feed.
| Element | What it is | Validity from pubDate |
|---|---|---|
iris:bitc |
Presigned S3 URL | 7 days (the S3 maximum) |
iris:upload |
Upload portal link carrying a signed token | Deployment-configured; currently 365 days in production |
In practice this means the BITC proxy link on an item older than a week will not download.
Neither element is accompanied by an expiry timestamp — derive it from pubDate.
The links can be reissued. When that happens the media record is replaced rather than updated, so the item
returns to the head of the feed under a new guid with fresh URLs and the same
iris:guid/@value. If a link you need has expired, ask IRIS to renew it rather than retrying the
dead URL.
Element Reference
Channel
Shared by both feed shapes, except lastBuildDate as noted.
| Element | Description | Type | Card. | Example |
|---|---|---|---|---|
title |
Human-readable title for the feed, naming the agency. | xsd:string |
1..1 | Subtitle Orders Feed (IYUNO) |
description |
Short description of the feed's content. | xsd:string |
1..1 | Latest subtitle orders |
link |
Fixed placeholder. These feeds do not emit their own URL here — use
atom:link [rel="self"] instead. |
xsd:anyURI |
1..1 | https://example.com/ |
lastBuildDate |
Most recent item pubDate on this page (RFC-822/RFC-1123). Orders feeds only
— the media feeds omit it. Falls back to the time of the request when the page is empty. |
xsd:string (RFC-822 date) |
0..1 | Wed, 17 Sep 2025 14:21:44 GMT |
atom:link [rel="self"] |
Canonical URL of this page of the feed. | xsd:anyURI |
1..1 | https://api.iris.a2d.tv/rss/subtitles/iyuno/orders?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/subtitles/iyuno/orders?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/subtitles/iyuno/orders?limit=50&offset=50 |
Item — Orders feed
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. The editorial titles are the main source of
variation: a single work carries iris:title, while an episode of a series carries the
iris:series* and iris:episode* family instead.
| Element | Description | Type | Card. | Example |
|---|---|---|---|---|
guid [isPermaLink="false"] |
Stable identifier of the subtitle order (UUID). The same value appears on the matching media item as
iris:guid/@value. |
xsd:string (UUID) |
1..1 | 7b7c56f8-cfdd-4f20-b0b4-fe4586207a9c |
title |
Human-readable title of the order, composed by IRIS from the editorial metadata. | xsd:string |
1..1 | Subtitle Order for Halv åtta hos mig (S28E13) (sv) |
pubDate |
Last modification time of the order (RFC-822/RFC-1123). Same instant as
iris:updatedAt. |
xsd:string (RFC-822 date) |
1..1 | Wed, 17 Sep 2025 14:21:44 GMT |
iris:updatedAt |
Last modification time of the order, ISO-8601 UTC at seconds precision (milliseconds are stripped). Same
instant as pubDate. |
xsd:dateTime |
1..1 | 2025-09-17T14:21:44Z |
iris:materialId |
Identifier of the target material the finished subtitle belongs to. | xsd:string |
1..1 | M0637100 |
iris:deadline |
Delivery deadline, ISO-8601 UTC at seconds precision. | xsd:dateTime |
1..1 | 2099-12-29T13:00:00Z |
iris:costLocation |
Accounting or commissioning cost center / label. The literal unknown when IRIS holds no
value. |
xsd:string |
1..1 | TV4 Commissioned |
iris:targetLanguageTag |
Target subtitle language. One of sv, fi, no, da,
en, nl. |
xsd:string |
1..1 | sv |
iris:targetSubtitleFormats |
Desired subtitle format. One of TTML, SRT, SCC, 890.
|
xsd:string |
1..1 | TTML |
iris:status |
Lifecycle status of the order: RECEIVED (open), FULFILLED (subtitle delivered
and accepted) or CANCELLED. Omitted when IRIS holds no status for the order. |
xsd:string (enumeration) |
0..1 | RECEIVED |
iris:season |
Season run order. This is the run-order position, which is normally but not always the season number. | xsd:positiveInteger |
0..1 | 28 |
iris:episode |
Episode run order. This is the run-order position, which is normally but not always the episode number. | xsd:positiveInteger |
0..1 | 13 |
iris:duration |
Expected program duration in HH:MM:SS. Note this is not the
HH:MM:SS:FF timecode form used by the IRIS billboards namespace. |
xsd:string (pattern \d{2}:\d{2}:\d{2}) |
0..1 | 00:22:00 |
iris:title |
Title of a single, non-episodic work (a film). Absent for episodic content, which uses
iris:seriesTitle and iris:episodeTitle instead. |
xsd:string |
0..1 | The Other Bennet Sister |
iris:domesticTitle |
Localized/domestic title of a single work. | xsd:string |
0..1 | Den andra systern Bennet |
iris:productionTitle |
Production title of a single work. | xsd:string |
0..1 | The Other Bennet Sister |
iris:seriesTitle |
Canonical series title. | xsd:string |
0..1 | Halv åtta hos mig XXVIII 2 |
iris:seriesDomesticTitle |
Localized/domestic series title. | xsd:string |
0..1 | Halv åtta hos mig |
iris:seriesProductionTitle |
Production title of the series. | xsd:string |
0..1 | Halv åtta hos mig |
iris:episodeTitle |
Episode title. | xsd:string |
0..1 | Göteborg – Finalen |
iris:episodeDomesticTitle |
Localized/domestic episode title. | xsd:string |
0..1 | Göteborg – Finalen |
iris:sourceLanguage |
Original/source language of the media (BCP-47). | xsd:string |
0..1 | en |
Item — Media feed
Media items carry no editorial metadata; look the order up by its identifier for that. All three
iris: elements below also carry a human-readable description attribute, which is a fixed
label and safe to ignore.
| Element | Description | Type | Card. | Example |
|---|---|---|---|---|
guid [isPermaLink="false"] |
Identifier of the media record (UUID). This is not the order identifier
— that is in iris:guid/@value — and unlike an orders guid it is
not stable across a link renewal. Deduplicate on iris:guid/@value. |
xsd:string (UUID) |
1..1 | 2a9e4d15-7c30-4f88-9b21-0e5a6c7d8f90 |
title |
Human-readable title of the media, matching the order it belongs to. | xsd:string |
1..1 | Subtitle Order for Halv åtta hos mig (S28E13) (sv) |
description |
Fixed explanatory sentence, identical on every media item. | xsd:string |
1..1 | Burnt-in time code proxy (BITC) video file and upload portal link… |
iris:bitc |
The video to work from. Presigned S3 URL of the burnt-in time code proxy, wrapped in
CDATA. Carries a fixed description attribute. Expires 7 days after the
item's pubDate — see Both media URLs expire above. |
xsd:anyURI |
1..1 | <iris:bitc description="…"><![CDATA[https…_bitc.mp4]]></iris:bitc>
|
iris:guid [value] |
Back-reference to the subtitle order. The identifier is in the value
attribute and the element itself is empty — reading its text content yields nothing.
Match it against the <guid> of an item in the corresponding orders feed. |
Element (attrs: value, description) |
1..1 | <iris:guid value="7b7c56f8-cfdd-4f20-b0b4-fe4586207a9c" description="…"/> |
iris:upload |
Where to deliver the finished subtitle. IRIS upload portal link for this order,
wrapped in CDATA. Carries a fixed description attribute. Carries a signed token
that expires on its own clock — 365 days after pubDate in production. |
xsd:anyURI |
1..1 | <iris:upload description="…"><![CDATA[https://portal.iris.a2d.tv/new/…]]></iris:upload>
|
pubDate |
Creation time of the media record (RFC-822/RFC-1123), and the clock both URLs above expire from. A
renewal creates a new record, so the renewed item carries a later pubDate. |
xsd:string (RFC-822 date) |
1..1 | Wed, 17 Sep 2025 14:21:44 GMT |
Full XML Examples
Orders feed
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:iris="https://rss.iris.a2d.tv/ns/media/1.0/"
xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Subtitle Orders Feed (IYUNO)</title>
<description>Latest subtitle orders</description>
<link>https://example.com/</link>
<lastBuildDate>Wed, 17 Sep 2025 14:21:44 GMT</lastBuildDate>
<atom:link rel="self" href="https://api.iris.a2d.tv/rss/subtitles/iyuno/orders?limit=50&offset=0"></atom:link>
<atom:link rel="next" href="https://api.iris.a2d.tv/rss/subtitles/iyuno/orders?limit=50&offset=50"></atom:link>
<item>
<guid isPermaLink="false">7b7c56f8-cfdd-4f20-b0b4-fe4586207a9c</guid>
<title>Subtitle Order for Halv åtta hos mig (S28E13) (sv)</title>
<pubDate>Wed, 17 Sep 2025 14:21:44 GMT</pubDate>
<iris:updatedAt>2025-09-17T14:21:44Z</iris:updatedAt>
<iris:materialId>M0637100</iris:materialId>
<iris:deadline>2099-12-29T13:00:00Z</iris:deadline>
<iris:costLocation>TV4 Commissioned</iris:costLocation>
<iris:targetLanguageTag>sv</iris:targetLanguageTag>
<iris:targetSubtitleFormats>TTML</iris:targetSubtitleFormats>
<iris:status>RECEIVED</iris:status>
<iris:season>28</iris:season>
<iris:episode>13</iris:episode>
<iris:duration>00:22:00</iris:duration>
<iris:seriesTitle>Halv åtta hos mig XXVIII 2</iris:seriesTitle>
<iris:seriesDomesticTitle>Halv åtta hos mig</iris:seriesDomesticTitle>
<iris:seriesProductionTitle>Halv åtta hos mig</iris:seriesProductionTitle>
<iris:episodeTitle>Göteborg – Finalen</iris:episodeTitle>
<iris:episodeDomesticTitle>Göteborg – Finalen</iris:episodeDomesticTitle>
<iris:sourceLanguage>en</iris:sourceLanguage>
</item>
</channel>
</rss>
Media feed
Note that iris:guid is empty and carries the order identifier in its value attribute.
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:iris="https://rss.iris.a2d.tv/ns/media/1.0/"
xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Subtitle Media Feed (IYUNO)</title>
<description>Latest subtitle media files and links</description>
<link>https://example.com/</link>
<atom:link rel="self" href="https://api.iris.a2d.tv/rss/subtitles/iyuno/media?limit=50&offset=0"></atom:link>
<item>
<guid isPermaLink="false">2a9e4d15-7c30-4f88-9b21-0e5a6c7d8f90</guid>
<title>Subtitle Order for Halv åtta hos mig (S28E13) (sv)</title>
<description>Burnt-in time code proxy (BITC) video file and upload portal link for the delivery of subtitle file.</description>
<iris:bitc description="Burnt-in time code proxy video file">
<![CDATA[https://irismezztranscode-general-irisprod1-bitc-storage.s3.eu-north-1.amazonaws.com/3c1a7e50-9d84-4b62-8f10-2a6b5c4d3e91/1/3c1a7e50-9d84-4b62-8f10-2a6b5c4d3e91_2000_1080p_bitc.mp4?X-Amz-Expires=604800&X-Amz-Signature=ZBzQ...HA__]]>
</iris:bitc>
<iris:guid value="7b7c56f8-cfdd-4f20-b0b4-fe4586207a9c" description="Internal identifier referencing the subtitle order associated with this media"></iris:guid>
<iris:upload description="Upload portal for the delivery of subtitle file">
<![CDATA[https://portal.iris.a2d.tv/new/M0637100/halv-atta-hos-mig-xxviii-2-s28e13/EXAMPLEt0k3n]]>
</iris:upload>
<pubDate>Wed, 17 Sep 2025 14:21:44 GMT</pubDate>
</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/media/1.0/"
xmlns="https://rss.iris.a2d.tv/ns/media/1.0/"
elementFormDefault="qualified">
<!-- ===== Common simple types ===== -->
<xsd:simpleType name="HHMMSS">
<xsd:restriction base="xsd:string">
<xsd:pattern value="\d{2}:\d{2}:\d{2}"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="OrderStatus">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="RECEIVED"/>
<xsd:enumeration value="CANCELLED"/>
<xsd:enumeration value="FULFILLED"/>
</xsd:restriction>
</xsd:simpleType>
<!-- ===== Orders feed elements (iris:*) ===== -->
<!-- Last modification of the order (ISO-8601 UTC, seconds precision) -->
<xsd:element name="updatedAt" type="xsd:dateTime"/>
<!-- Identifier of the target material the finished subtitle belongs to -->
<xsd:element name="materialId" type="xsd:string"/>
<!-- Delivery deadline in UTC (ISO-8601) -->
<xsd:element name="deadline" type="xsd:dateTime"/>
<!-- Accounting or commissioning cost center / label -->
<xsd:element name="costLocation" type="xsd:string"/>
<!-- Target subtitle language (BCP-47) -->
<xsd:element name="targetLanguageTag" type="xsd:string"/>
<!-- Desired subtitle format - always a single value, never a list -->
<xsd:element name="targetSubtitleFormats" type="xsd:string"/>
<!-- Order lifecycle status -->
<xsd:element name="status" type="OrderStatus"/>
<!-- Season run order -->
<xsd:element name="season" type="xsd:integer"/>
<!-- Episode run order -->
<xsd:element name="episode" type="xsd:integer"/>
<!-- Program duration (HH:MM:SS) -->
<xsd:element name="duration" type="HHMMSS"/>
<!-- Title of a single (non-episodic) work -->
<xsd:element name="title" type="xsd:string"/>
<!-- Localized/domestic title of a single work -->
<xsd:element name="domesticTitle" type="xsd:string"/>
<!-- Production title of a single work -->
<xsd:element name="productionTitle" type="xsd:string"/>
<!-- Canonical series title -->
<xsd:element name="seriesTitle" type="xsd:string"/>
<!-- Localized/domestic series title -->
<xsd:element name="seriesDomesticTitle" type="xsd:string"/>
<!-- Production title of the series -->
<xsd:element name="seriesProductionTitle" type="xsd:string"/>
<!-- Episode title -->
<xsd:element name="episodeTitle" type="xsd:string"/>
<!-- Localized/domestic episode title -->
<xsd:element name="episodeDomesticTitle" type="xsd:string"/>
<!-- Original/source language (BCP-47) -->
<xsd:element name="sourceLanguage" type="xsd:string"/>
<!-- ===== Media feed elements (iris:*) ===== -->
<!-- Burnt-in time code (BITC) proxy video URL. Presigned when the media
record is created and stored as-is, so it expires ~7 days after pubDate -->
<xsd:element name="bitc">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:anyURI">
<xsd:attribute name="description" type="xsd:string"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
<!-- Upload portal URL for delivering the finished subtitle file. Minted when
the media record is created and stored as-is, so it expires on its own clock -->
<xsd:element name="upload">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:anyURI">
<xsd:attribute name="description" type="xsd:string"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
<!-- Back-reference to the subtitle order; the identifier is carried in the
"value" attribute and the element itself is empty -->
<xsd:element name="guid">
<xsd:complexType>
<xsd:attribute name="value" type="xsd:string" use="required"/>
<xsd:attribute name="description" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>