IRIS RSS Media Extension · v1.0

IRIS Subtitle Orders & Media Feed Namespace

Namespace URI: https://rss.iris.a2d.tv/ns/media/1.0/

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:

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

Pagination & Updates

Pagination model

The feed is paginated at the channel level using atom:link elements:

.../rss/subtitles/iyuno/orders?limit=50&offset=0   
.../rss/subtitles/iyuno/orders?limit=50&offset=50  

Ordering

Updates & deduplication

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&amp;offset=0"></atom:link>
    <atom:link rel="next" href="https://api.iris.a2d.tv/rss/subtitles/iyuno/orders?limit=50&amp;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&amp;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>