RSS Namespace Extension for Podcasting (Tag Specification)

A wholistic RSS namespace for podcasting that is meant to synthesize the fragmented world of podcast namespaces. As elements are canonized, they will be added to this document so developers can begin implementation. The specifications below are considered locked and the team will prioritize backward compatibility. We are operating under the Rules for Standards-Makers.

The namespace for this extension is https://podcastindex.org/namespace/1.0. Clients which recognize this namespace must also recognize https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md as identical. The suggested tag prefix for use in XML is podcast, but clients should support alternate prefixes for this namespace. If your application generates RSS feeds and you implement one or more elements below, you will need to link this document in your XML:

<rss version="2.0" xmlns:podcast="https://podcastindex.org/namespace/1.0">



Table of Contents



Podcast Tags

Each tag below exists in the podcast namespace within the specified parent. All attributes are required unless explicitly specified as optional. Anywhere the url of a hyper-text based resource is specified, it must be given as https: and not http:.





Transcript

<podcast:transcript>

This tag is used to link to a transcript or closed captions file. Multiple tags can be present for multiple transcript formats.

Detailed file format information and example files are here.

Parent

  <item>

Count

  Multiple

Attributes

Examples

<podcast:transcript url="https://example.com/episode1/transcript.html" type="text/html" />
<podcast:transcript url="https://example.com/episode1/transcript.vtt" type="text/vtt" />
<podcast:transcript
        url="https://example.com/episode1/transcript.json"
        type="application/json"
        language="es"
        rel="captions"
/>
<podcast:transcript url="https://example.com/episode1/transcript.srt" type="application/x-subrip" rel="captions" />





Locked

<podcast:locked>

This tag may be set to yes or no. The purpose is to tell other podcast hosting platforms whether they are allowed to import this feed. A value of yes means that any attempt to import this feed into a new platform should be rejected.

Parent

  <channel>

Count

  Single

Node value

  The node value must be "yes" or "no".

Attributes

Examples

<podcast:locked>yes</podcast:locked>
<podcast:locked owner="[email protected]">no</podcast:locked>





Funding

<podcast:funding>

This tag lists possible donation/funding links for the podcast. The content of the tag is the recommended string to be used with the link.

Parent

  <channel>

Count

  Multiple

Node value

  This is a free form string supplied by the creator which they expect to be displayed in the app next to the link. Please do not exceed 128 characters for the node value or it may be truncated by aggregators.

Attributes

Examples

<podcast:funding url="https://www.example.com/donations">Support the show!</podcast:funding>
<podcast:funding url="https://www.example.com/members">Become a member!</podcast:funding>





Chapters

<podcast:chapters>

Links to an external file (see example file) containing chapter data for the episode. See the [jsonChapters.md] (https://github.com/Podcastindex-org/podcast-namespace/blob/main/chapters/jsonChapters.md) file for a description of the chapter file syntax. And, see the example.json example file for a real world example.

Benefits with this approach are that chapters do not require altering audio files, and the chapters can be edited after publishing, since they are a separate file that can be requested on playback (or cached with download). JSON chapter information also allows chapters to be displayed by a wider range of playback tools, including web browsers (which typically have no access to ID3 tags), thus greatly simplifying chapter support; and images can be retrieved on playback, rather than bloating the filesize of the audio. The data held is compatible with normal ID3 tags, thus requiring no additional work for the publisher.

Parent

  <item>

Count

  Single

Attributes

Examples

<podcast:chapters url="https://example.com/episode1/chapters.json" type="application/json+chapters" />





Soundbite

<podcast:soundbite>

Points to one or more soundbites within a podcast episode. The intended use includes episodes previews, discoverability, audiogram generation, episode highlights, etc. It should be assumed that the audio/video source of the soundbite is the audio/video given in the item's <enclosure> element.

Parent

  <item>

Count

  Multiple

Node value

  This is a free form string from the podcast creator to specify a title for the soundbite. If the podcaster does not provide a value for the soundbite title, then leave the value blank, and podcast apps can decide to use the episode title or some other placeholder value in its place. Please do not exceed 128 characters for the node value or it may be truncated by aggregators.

Attributes

Examples

<podcast:soundbite startTime="73.0" duration="60.0" />
<podcast:soundbite startTime="1234.5" duration="42.25">Why the Podcast Namespace Matters</podcast:soundbite>





Person

<podcast:person>

This element specifies a person of interest to the podcast. It is primarily intended to identify people like hosts, co-hosts and guests. Although, it is flexible enough to allow fuller credits to be given using the roles and groups that are listed in the Podcast Taxonomy Project

Parent

  <channel> (for a podcast) or <item> (for an individual episode)

It is suggested that <channel> is always populated, and <item> is populated where needed for an individual episode. Where present, people information in <item> wholly replaces all information from the <channel>.

Publishers are expected to use the podcast:person element in the <channel> parent to set the regular people involved in the podcast: the detail that would be expected to be seen in an overview of the show.

Publishers are expected to use the podcast:person in the <item> parent to replace all existing information for an individual episode.

For example: Terry and June

The fictional podcast Terry and June is normally hosted by Terry Scott and June Whitfield. Within <channel>, Terry Scott and June Whitfield are listed as the hosts. A podcast directory, or podcast app, should show Terry Scott and June Whitfield as the hosts of this show.

For one episode, Terry and June was hosted by Reginald Marsh and June Whitfield (Terry was away). In this case, the <item> for this episode should contain Reginald Marsh and June Whitfield as the hosts of this episode. A podcast app, when playing this episode, should show only Reginald Marsh and June Whitfield as the hosts of this episode. Because people information in <item> replaces all existing people information in <channel>, Terry Scott should not be visible as a host of this episode.

For example: Big Daddy

The fictional podcast Big Daddy Interviews is hosted by Big Daddy, a wrestler. Within <channel>, Big Daddy is listed as the host. A podcast directory, or podcast app, should show Big Daddy as the host of this show.

For one episode, Big Daddy Interviews had a guest of Sid James. In this case, the <item> for this episode should contain Sid James as a guest, and Big Daddy as the host of this episode. Because people information in <item> replaces all existing people information in <channel>, Big Daddy should be re-stated as the host of this episode.

Count

  Multiple

Node value

  This is the full name or alias of the person. This value cannot be blank. Please do not exceed 128 characters for the node value or it may be truncated by aggregators.

Attributes

The role and group attributes are case-insensitive. So, "Host" is the same as "host", and "Cover Art Designer" is the same as "cover art designer".

The full taxonomy list is here as a json file.

Examples

<podcast:person
        href="https://example.com/johnsmith/blog"
        img="http://example.com/images/johnsmith.jpg"
>John Smith</podcast:person>
<podcast:person
        role="guest"
        href="https://www.imdb.com/name/nm0427852888/"
        img="http://example.com/images/janedoe.jpg"
>Jane Doe</podcast:person>
<podcast:person
        role="guest"
        href="https://www.wikipedia/alicebrown"
        img="http://example.com/images/alicebrown.jpg"
>Alice Brown</podcast:person>
<podcast:person
        group="writing"
        role="guest"
        href="https://www.wikipedia/alicebrown"
        img="http://example.com/images/alicebrown.jpg"
>Alice Brown</podcast:person>
<podcast:person
        group="visuals"
        role="Cover Art Designer"
        href="https://example.com/artist/beckysmith"
>Becky Smith</podcast:person>





Location

<podcast:location>

This tag is intended to describe the location of editorial focus for a podcast's content (i.e. "what place is this podcast about?"). The tag has many use cases and is one of the more complex ones. You are highly encouraged to read the full implementation document before starting to code for it.

Parent

  <item> or <channel>

Count

  Single

Node Value

  This is a free-form string meant to be a human readable location. It may conform to conventional location verbiage (i.e. "Austin, TX"), but it shouldn't be depended on to be parseable in any specific way. This value cannot be blank. Please do not exceed 128 characters for the node value or it may be truncated by aggregators.

Attributes

Examples

<podcast:location geo="geo:30.2672,97.7431" osm="R113314">Austin, TX</podcast:location>
<podcast:location geo="geo:33.51601,-86.81455" osm="R6930627">Birmingham Civil Rights Museum</podcast:location>
<podcast:location geo="geo:-27.86159,153.3169" osm="W43678282">Dreamworld (Queensland)</podcast:location>





Season

<podcast:season>

This element allows for identifying which episodes in a podcast are part of a particular "season", with an optional season name attached.

Parent

  <item>

Count

  Single

Node Value

  The node value is an integer, and represents the season "number". It is required.

Attributes

Please do not exceed 128 characters for the name attribute.

Examples

<podcast:season>5</podcast:season>
<podcast:season name="Race for the Whitehouse 2020">3</podcast:season>
<podcast:season name="Egyptology: The 19th Century">1</podcast:season>
<podcast:season name="The Yearling - Chapter 3">3</podcast:season>





Episode

<podcast:episode>

This element exists largely for compatibility with the season tag. But, it also allows for a similar idea to what "name" functions as in that element.

Parent

  <item>

Count

  Single

Node Value

  The node value is a decimal number. It is required.

Attributes

The episode numbers are decimal, so numbering such as 100.5 is acceptable if there was a special mini-episode published between two other episodes. In that scenario, the number would help with proper chronological sorting, while the display attribute could specify an alternate special "number" (a moniker) to display for the episode in a podcast player app UI.

Please do not exceed 32 characters for the display attribute.

Examples

<podcast:episode>3</podcast:episode>
<podcast:episode>315.5</podcast:episode>
<podcast:episode display="Ch.3">204</podcast:episode>
<podcast:episode display="Day 5">9</podcast:episode>





Trailer

<podcast:trailer>

This element is used to define the location of an audio or video file to be used as a trailer for the entire podcast or a specific season. There can be more than one trailer present in the channel of the feed. This element is basically just like an <enclosure> with the extra pubdate and season attributes added.

If there is more than one trailer tag present in the channel, the most recent one (according to its pubdate) should be chosen as the preview by default within podcast apps.

Parent

  <channel>

Count

  Multiple

Node Value

  The node value is a string, which is the title of the trailer. It is required. Please do not exceed 128 characters for the node value or it may be truncated by aggregators.

Attributes

If the season attribute is present, it must be a number that matches the format of the <podcast:season> tag. So, for a podcast that has 3 published seasons, a new <podcast:trailer season="4"> tag can be put in the channel to later be matched up with a <podcast:season>4<podcast:season> tag when it is published within a new <item>.

Examples

<podcast:trailer
        pubdate="Thu, 01 Apr 2021 08:00:00 EST"
        url="https://example.org/trailers/teaser"
        length="12345678"
        type="audio/mp3
">Coming April 1st, 2021</podcast:trailer>
<podcast:trailer
        pubdate="Thu, 01 Apr 2021 08:00:00 EST"
        url="https://example.org/trailers/season4teaser"
        length="12345678"
        type="video/mp4"
        season="4"
>Season 4: Race for the Whitehouse</podcast:trailer>

(later matches with)

<podcast:season name="Race for the Whitehouse">4</podcast:season>





License

<podcast:license>

This element defines a license that is applied to the audio/video content of a single episode, or the audio/video of the podcast as a whole. Custom licenses must always include a url attribute. Implementors are encouraged to read the license tag companion document for a more complete picture of what this tag is intended to accomplish.

Parent

  <channel> or <item>

Count

  Single

Node Value

  The node value must be a lower-cased reference to a license "identifier" defined in the [SPDX License List] (https://spdx.org/licenses/) file if the license being used is a well-known, public license. Or, if it is a custom license, it must be a free form abbreviation of the name of the license as you reference it publicly. Please do not exceed 128 characters for the node value or it may be truncated by aggregators.

Attributes

Examples

<podcast:license>cc-by-4.0</podcast:license>
<podcast:license url="https://example.org/mypodcastlicense/full.pdf">my-podcast-license-v1</podcast:license>





Alternate Enclosure

<podcast:alternateEnclosure>

This element is meant to provide different versions of, or companion media to the main <enclosure> file. This could be an audio only version of a video podcast to allow apps to switch back and forth between audio/video, lower (or higher) bitrate versions for bandwidth constrained areas, alternative codecs for different device platforms, alternate URI schemes and download types such as IPFS or WebTorrent, commentary tracks or supporting source clips, etc.

This is a complex tag, so implementors are highly encouraged to read the companion document for a fuller understanding of how this tag works and what it is capable of.

Parent

  <item>

Count

  Multiple

Node Value

  The node value must be one or more <podcast:source> elements that each define a uri where the media file can be downloaded or streamed. A single, optional <podcast:integrity> element may also be included to allow for file integrity checking.

Attributes

Examples

<enclosure url="https://example.com/file-0.mp3" length="43200000" type="audio/mpeg" />

<podcast:alternateEnclosure type="audio/mpeg" length="43200000" bitrate="128000" default="true" title="Standard">
    <podcast:source uri="https://example.com/file-0.mp3" />
    <podcast:source uri="ipfs://someRandomMpegFile" />
</podcast:alternateEnclosure>

<podcast:alternateEnclosure type="audio/opus" length="32400000" bitrate="96000" title="High quality">
    <podcast:source uri="https://example.com/file-high.opus" />
    <podcast:source uri="ipfs://someRandomHighBitrateOpusFile" />
</podcast:alternateEnclosure>

<podcast:alternateEnclosure type="audio/aac" length="54000000" bitrate="160000" title="High quality AAC">
    <podcast:source uri="https://example.com/file-proprietary.aac" />
    <podcast:source uri="ipfs://someRandomProprietaryAACFile" />
</podcast:alternateEnclosure>

<podcast:alternateEnclosure type="audio/opus" length="5400000" bitrate="16000" title="Low bandwidth">
    <podcast:source uri="https://example.com/file-low.opus" />
    <podcast:source uri="ipfs://someRandomLowBitrateOpusFile" />
</podcast:alternateEnclosure>
<podcast:alternateEnclosure type="audio/mpeg" length="2490970" bitrate="160707.74">
    <podcast:source uri="https://example.com/file-0.mp3" />
    <podcast:source uri="ipfs://QmdwGqd3d2gFPGeJNLLCshdiPert45fMu84552Y4XHTy4y" />
    <podcast:source uri="https://example.com/file-0.torrent" contentType="application/x-bittorrent" />
    <podcast:source uri="http://example.onion/file-0.mp3" />
</podcast:alternateEnclosure>

<podcast:alternateEnclosure type="video/mp4" length="10562995" bitrate="681483.55" height="1080">
    <podcast:source uri="https://example.com/file-1080.mp4" />
    <podcast:source uri="ipfs://QmfQKJcp2xdByEt8mzWr1AJUhwvb9rdWPoacvdq2roDhgh" />
    <podcast:source uri="https://example.com/file-1080.torrent" contentType="application/x-bittorrent" />
    <podcast:source uri="http://example.onion/file-1080.mp4" />
</podcast:alternateEnclosure>





Source

<podcast:source>

This element defines a uri location for a <podcast:alternateEnclosure> media file. It is meant to be used as a child of the <podcast:alternateEnclosure> element. At least one <podcast:source> element must be present within every <podcast:alternateEnclosure> element.

Parent

  <podcast:alternateEnclosure>

Count

  Multiple

Attributes

Examples

<podcast:alternateEnclosure type="video/mp4" length="7924786" bitrate="511276.52" height="720">
    <podcast:source uri="https://example.com/file-720.mp4" />
    <podcast:source uri="ipfs://QmX33FYehk6ckGQ6g1D9D3FqZPix5JpKstKQKbaS8quUFb" />
    <podcast:source uri="https://example.com/file-720.torrent" contentType="application/x-bittorrent" />
    <podcast:source uri="http://example.onion/file-720.mp4" />
</podcast:alternateEnclosure>





Integrity

<podcast:integrity>

This element defines a method of verifying integrity of the media given either an [SRI-compliant integrity string] (https://www.w3.org/TR/SRI/) (preferred) or a base64 encoded PGP signature. This element is optional within a <podcast:alternateEnclosure> element. It allows to ensure that the file has not been tampered with.

Parent

  <podcast:alternateEnclosure>

Count

  Single

Attributes

Examples

<podcast:alternateEnclosure type="video/mp4" length="7924786" bitrate="511276.52" height="720">
    <podcast:source uri="https://example.com/file-720.mp4" />
    <podcast:source uri="ipfs://QmX33FYehk6ckGQ6g1D9D3FqZPix5JpKstKQKbaS8quUFb" />
    <podcast:integrity type="sri" value="sha384-ExVqijgYHm15PqQqdXfW95x+Rs6C+d6E/ICxyQOeFevnxNLR/wtJNrNYTjIysUBo" />
</podcast:alternateEnclosure>





Guid

<podcast:guid>

This element is used to declare a unique, global identifier for a podcast. The value is a UUIDv5, and is easily generated from the RSS feed url, with the protocol scheme and trailing slashes stripped off, combined with a unique "podcast" namespace which has a UUID of ead4c236-bf58-58c6-a2c6-a6b28d128cb6. Tools like [this one] (https://www.uuidtools.com/v5) can help generate these values by hand. Or, language libraries like [this one] (https://github.com/sporkmonger/uuidtools) in Ruby are widely available. Specifically for podcasts, this tool from RSS Blue can help generate a GUID by hand.

A podcast gets assigned a podcast:guid once in its lifetime using its current feed url (at the time of assignment) as the seed value. That GUID is then meant to follow the podcast from then on, for the duration of its life, even if the feed url changes. This means that when a podcast moves from one hosting platform to another, its podcast:guid should be discovered by the new host and imported into the new platform for inclusion into the feed.

Using this pattern, podcasts can maintain a consistent identity across the open RSS ecosystem without a central authority.

Tips:

Parent

  <channel>

Count

  Single

Node Value

  The node value is a UUIDv5 string.

Examples

Example GUID for feed url mp3s.nashownotes.com/pc20rss.xml:

<podcast:guid>917393e3-1b1e-5cef-ace4-edaa54e1f810</podcast:guid>

Example GUID for feed url podnews.net/rss:

<podcast:guid>9b024349-ccf0-5f69-a609-6b82873eab3c</podcast:guid>

  The podcast:guid value above enables podcasters to produce a link that can share a podcast on a variety of different platforms.

  The format of the link is https://(a podcast website link)#fastfollow-(type):(a podcast guid)

  type is currently podcast, but may be extended in future.

  A working example is https://podnews.net/podcast/i8xe9/listen#fastfollow-podcast:9b024349-ccf0-5f69-a609 -6b82873eab3c or the QR code given below.

  podnews-qr

  When scanned on a mobile phone's camera app, this link will go to the specified podcast website. Behavior of this website is up to the creator: some may use a default homepage, others may sniff the useragent and open a default podcast app on a device. In the working example, above, an iPhone user may be taken to Apple Podcasts; an Android user may be taken to Google Podcasts; and another device will be given a page with a player.

  When scanned on a QR code reader inside a podcast app, like CurioCaster, the app can parse the podcast:guid value from the URL, allowing the podcast to be opened within the application.





Value

<podcast:value>

This element designates the cryptocurrency or payment layer that will be used, the transport method for transacting the payments, and a suggested amount denominated in the given cryptocurrency.

This element can exist at either the <channel> or <item> level. When it exists at the <item> level, it should be treated as an "override" of whatever is defined at the <channel> level.

This is a complex tag, so implementors are HIGHLY encouraged to read the companion document for a complete understanding of how this tag works and what it is capable of.

Parent

  <channel> or <item>

Count

  Single

Node Value

  The node value must be one or more <podcast:valueRecipient> elements.

Attributes

Examples

<podcast:value
    type="lightning"
    method="keysend"
    suggested="0.00000005000"
></podcast:value>





Value Recipient

<podcast:valueRecipient>

The valueRecipient tag designates various destinations for payments to be sent to during consumption of the enclosed media. Each recipient is considered to receive a "split" of the total payment according to the number of shares given in the split attribute.

This element may only exist within a parent <podcast:value> element.

There is no limit on how many valueRecipient elements can be present in a given <podcast:value> element.

This is a complex tag, so implementors are HIGHLY encouraged to read the companion document for a complete understanding of how this tag works and what it is capable of.

Parent

  <podcast:value>

Count

  Multiple

Attributes

Examples

<podcast:value type="lightning" method="keysend" suggested="0.00000015000">
  <podcast:valueRecipient
      name="Alice (Podcaster)"
      type="node"
      address="02d5c1bf8b940dc9cadca86d1b0a3c37fbe39cee4c7e839e33bef9174531d27f52"
      split="40"
  />
  <podcast:valueRecipient
      name="Bob (Podcaster)"
      type="node"
      address="032f4ffbbafffbe51726ad3c164a3d0d37ec27bc67b29a159b0f49ae8ac21b8508"
      split="40"
  />
  <podcast:valueRecipient
      name="Carol (Producer)"
      type="node"
      address="02dd306e68c46681aa21d88a436fb35355a8579dd30201581cefa17cb179fc4c15"
      split="15"
  />
  <podcast:valueRecipient
      name="Hosting Provider"
      type="node"
      address="03ae9f91a0cb8ff43840e3c322c4c61f019d8c1c3cea15a25cfc425ac605e61a4a"
      split="5"
      fee="true"
  />
</podcast:value>





Medium

<podcast:medium>

The medium tag tells an application what the content contained within the feed IS, as opposed to what the content is ABOUT in the case of a category. This allows a podcast app to modify it's behavior or UI to give a better experience to the user for this content. For example, if a podcast has <podcast:medium>music</podcast:medium> an app may choose to reset playback speed to 1x and adjust it's EQ settings to be better for music vs. spoken word.

Accepted medium names are curated within a list maintained by the community as new mediums are discovered over time. Newly proposed mediums should require some level of justification to be added to this list. One may argue and/or prove use of a new medium even for only one application, should it prove different enough from existing mediums to have meaning.

Parent

  <channel>

Count

  Single

Node Value

The node value is a string denoting one of the following possible values:

List Mediums

In addition to the above mediums, each medium also has a counterpart "list" variant, where the original medium name is suffixed by the letter "L" to indicate that it is a "List" of that type of content. For example, podcast would become podcastL, music would become musicL, audiobook would become audiobookL, etc.

There is also a dedicated list medium for mixed content:

A "list" medium feed should not be expected to have regular <item>'s,<podcast:liveItem>'s, or any future similar new item type. Rather, a "List" feed is intended to exclusively contain one or more <podcast:remoteItem>'s, allowing one to reference a feed by its <podcast:guid> and the guid of an item.

Examples

Example use for a standard "podcast" feed:

<podcast:medium>podcast</podcast:medium>

Example use for a "music" feed:

<podcast:medium>music</podcast:medium>

Example use for a "music" playlist feed:

<rss xmlns:podcast="https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
    <channel>
        <title>Picking the Hits 2.0!</title>
        <description>All the hits played on the Podcasting 2.0 show.</description>
        <link>https://podcastindex.org</link>
        <language>en-US</language>
        <pubDate>Wed, 07 Jun 2023 04:30:38 GMT</pubDate>
        <image>
            <url>https://example.com/images/pci_avatar-massive.jpg</url>
        </image>

        <podcast:guid>3f2a8e4e-263a-51aa-9d3d-0d71f82a1564</podcast:guid>
        <podcast:medium>musicL</podcast:medium>
        <itunes:image>https://example.com/images/pci_avatar-massive.jpg</itunes:image>

        <podcast:value type="lightning" method="keysend" suggested="0.00000005000">
            <podcast:valueRecipient name="podcaster" type="node" address="036557ea56b3b86f08be31bcd2557cae8021b0e3a9413f0c0e52625c6696972e57" split="99" />
            <podcast:valueRecipient name="hosting company" type="node" address="036557ea56b3b86f08be31bcd2557cae8021b0e3a9413f0c0e52625c6696972e57" split="1" />
        </podcast:value>

        <podcast:remoteItem
                feedGuid="ff519475-6e90-5231-91a0-37d092088d88"
                feedUrl="https://media.rss.com/joemartinmusic/feed.xml"
                itemGuid="e75771b1-e8d4-4133-9392-c579822247d9"
                medium="music"
        />

        <podcast:remoteItem
                feedGuid="47081700-bd65-511f-b535-f545f3cd660c"
                feedUrl="https://player.wavlake.com/feed/d1ed0ec9-21a8-4eda-b2c9-b17c8019a7e8"
                itemGuid="7b03666e-b323-499d-93a7-ca51ce627ffd"
                medium="music"
        />

       <podcast:remoteItem
               feedGuid="483dde8e-7e94-59a7-8eb0-2b0dc64a87bd"
               feedUrl="https://player.wavlake.com/feed/1dd1bbd8-1084-4fdc-9788-dddaa62fbc6a"
               itemGuid="8501fb64-a6a3-475a-8b10-9c746f0fe579"
               medium="music"
       />

       <podcast:remoteItem
               feedGuid="b40ffcf7-2c48-5cfe-8daa-b65d766b2c25"
               feedUrl="https://www.wavlake.com/feed/92b04241-97f5-4ff7-be11-cf45f70812e7"
               itemGuid="9a48aab8-6da6-4cc1-9951-5b049c333580"
               medium="music"
       />
    </channel>
</rss>





Images

<podcast:images>

This tag, when present, allows for specifying many different image sizes in a compact way at either the episode or channel level. The syntax is borrowed from the HTML5 srcset syntax. It allows for describing multiple image sources with width and pixel hints directly in the attribute. Although the HTML5 srcset attribute allows relative urls, absolute urls are required in this tag - since the feed url may not represent an appropriate base url for relativization.

Parent

  <channel> or <item>

Count

  Single

Attributes

Examples

Example of specifying four different image sizes:

<podcast:images
    srcset="https://example.com/images/ep1/pci_avatar-massive.jpg 1500w,
            https://example.com/images/ep1/pci_avatar-middle.jpg 600w,
            https://example.com/images/ep1/pci_avatar-small.jpg 300w,
            https://example.com/images/ep1/pci_avatar-tiny.jpg 150w"
/>





Live Item

<podcast:liveItem>

The liveItem tag is used for a feed to deliver a live audio or video stream to podcast apps. It takes the same format as a standard <item> episode tag, and all tags that are allowed as children of a normal <item> are also allowed as children of <podcast:liveItem>. Note that "allowed" is not the same as "supported". So, just like a normal <item>, you cannot depend on all apps to support all tags within <podcast:liveItem>, especially when the function of the tag is not obvious. For instance, including an <itunes:duration> tag in a live item is probably a waste of time since apps will not know what to do with that value in the context of live media.

This tag will also make use of the podping notification network. A podping notification SHOULD be sent out by the host when the live stream starts, to let apps know.

Parent

  <channel>

Count

  Multiple

Node Value

All tags that are valid as children of a standard <item> tag are also valid as children here.

When specifying the audio/video source, the <podcast:alternateEnclosure> tag is highly encouraged since it gives the broadest coverage of possible stream types and is explicit in it's communication of what transport protocol and media codecs are being used. In addition to [<podcast:alternateEnclosure>] (#alternate-enclosure), a standard <enclosure> should also be given as a fallback to support podcast apps that don't yet implement <podcast:alternateEnclosure>.

Regardless of which enclosure tag is used, feed owners must be conscious of the fact that choosing a non-mainstream streaming protocol/codec will limit the number of apps that can play the content. For that reason, it's highly recommended to use only the two most widely supported protocols (mp3 and mp4/h.264) to ensure compatibility with the broadest number of apps on various platforms. Choosing a streaming format that is outside of this narrow list might exclude many apps from playing your content. As broader adoption of HLS, Opus, etc. becomes apparent, this recommendation will change to include newer formats.

The <podcast:contentLink> tag is also required to be present, to ensure that listeners have a fallback option in case their chosen app cannot play the given content stream directly. In most instances this will just be a link to an HTML page that can play the live stream. Such a page can reside on the podcaster's own website, a page provided by their hosting company or a third party platform they have chosen to use. Podcasters who live stream to multiple platforms at once can also use the <podcast:contentLink> tag to provide links to those other platforms.

A robust, well-written <podcast:liveItem> tag will include all three of: [<podcast:alternateEnclosure>] (#alternate-enclosure), <enclosure> and <podcast:contentLink> to ensure the broadest interopability with podcast apps.

The function of <guid> within a live item tag is the same as it is within a regular item. If the <guid> of a <podcast:liveItem> changes, it MUST be considered a new stream by podcast apps.

Attributes

The start and end attributes denote when the live stream "should" start and end. But, real life dictates that those times might not be adhered to. Apps are therefore encouraged not to rely solely on those times as anything more than an approximation. The canonical way to know if a stream has started is with the status attribute. If status is "live" then the stream has started.

Examples

A complete example:

<podcast:liveItem status="live" start="2021-09-26T07:30:00.000-0600" end="2021-09-26T09:30:00.000-0600">
    <title>Podcasting 2.0 Live Show</title>
    <description>A look into the future of podcasting and how we get to Podcasting 2.0!</description>
    <link>https://example.com/podcast/live</link>
    <guid isPermaLink="true">https://example.com/live</guid>
    <author>John Doe (john@example.com)</author>
    <podcast:images srcset="https://example.com/images/live/pci_avatar-massive.jpg 1500w,
        https://example.com/images/live/pci_avatar-middle.jpg 600w,
        https://example.com/images/live/pci_avatar-small.jpg 300w,
        https://example.com/images/live/pci_avatar-tiny.jpg 150w"
    />
    <podcast:person href="https://www.podchaser.com/creators/adam-curry-107ZzmWE5f"
                    img="https://example.com/images/adamcurry.jpg">Adam Curry</podcast:person>
    <podcast:person role="guest" href="https://github.com/daveajones/"
                    img="https://example.com/images/davejones.jpg">Dave Jones</podcast:person>
    <podcast:person group="visuals" role="cover art designer"
                    href="https://example.com/artist/beckysmith">Becky Smith</podcast:person>
    <podcast:alternateEnclosure type="audio/mpeg" length="312" default="true">
        <podcast:source uri="https://example.com/pc20/livestream" />
    </podcast:alternateEnclosure>
    <enclosure url="https://example.com/pc20/livestream?format=.mp3" type="audio/mpeg" length="312" />
    <podcast:contentLink href="https://youtube.com/pc20/livestream">YouTube!</podcast:contentLink>
    <podcast:contentLink href="https://twitch.com/pc20/livestream">Twitch!</podcast:contentLink>
    <podcast:contentLink href="https://example.com/html/livestream">Listen Live!</podcast:contentLink>
</podcast:liveItem>

A bare bones example:

<podcast:liveItem status="live" start="2021-09-26T07:30:00.000-0600" end="2021-09-26T09:30:00.000-0600">
    <title>Podcasting 2.0 Live Stream</title>
    <guid>e32b4890-983b-4ce5-8b46-f2d6bc1d8819</guid>
    <enclosure url="https://example.com/pc20/livestream?format=.mp3" type="audio/mpeg" length="312" />
    <podcast:contentLink href="https://example.com/html/livestream">Listen Live!</podcast:contentLink>
</podcast:liveItem>





<podcast:contentLink>

The contentLink tag is used to indicate that the content begin delivered by the parent element can be found at an external location instead of, or in addition to, being delivered directly to the tag itself within an app. In most instances it is used as a fallback link for the user to use when the app itself can't handle a certain content delivery directly.

For instance, perhaps a podcast feed specifies a <podcast:liveItem> to deliver a live stream to apps. The feed may also give a <podcast:contentLink> pointing to YouTube and Twitch versions of the live stream as well, just in case the listener uses an app that doesn't fully support live streaming content.

Currently this tag is only indicated for use in the <podcast:liveItem> tag. In the future, its use will be expanded.

Parent

  <podcast:liveItem>

Count

  Multiple

Node Value

The node value is a free form string meant to explain to the user where this content link points and/or the nature of it's purpose.

Attributes

Examples

<podcast:contentLink href="https://youtube.com/blahblah/livestream">Live on YouTube!</podcast:contentLink>
<podcast:contentLink href="https://twitter.com/statuses/somepost">Chat on Twitter!</podcast:contentLink>





Social Interact

<podcast:socialInteract>

The socialInteract tag allows a podcaster to attach the url of a "root post" of a comment thread to an episode.
This "root post" is treated as the canonical location of where the comments and discussion around this episode will take place. This can be thought of as the "official" social media comment space for this episode. If a protocol such as "activitypub" is used, or some other protocol that allows programmatic API access, these comments can be directly pulled into the app, and replies can be posted back to the thread from the app itself.

If multiple socialInteract tags are given for an <item>, the priority attribute is strongly recommended to give the app an indication as to which comments to display first.

This tag can also be used as a signal to platforms and apps that the podcaster does not want public comments shown alongside this episode. For this purpose a protocol value of "disabled" can be specified, with no other attributes or node value present.

Parent

  <item>

Count

  Multiple

Attributes

Example (simple):

<podcast:socialInteract
        uri="https://podcastindex.social/web/@dave/108013847520053258"
        protocol="activitypub"
        accountId="@dave"
/>

Example (complex):

<podcast:socialInteract
        priority="1"
        uri="https://podcastindex.social/web/@dave/108013847520053258"
        protocol="activitypub"
        accountId="@dave"
        accountUrl="https://podcastindex.social/web/@dave"
/>
<podcast:socialInteract
        priority="2"
        uri="https://twitter.com/PodcastindexOrg/status/1507120226361647115"
        protocol="twitter"
        accountId="@podcastindexorg"
        accountUrl="https://twitter.com/PodcastindexOrg"
/>

Example (disabled):

<podcast:socialInteract protocol="disabled" />





Block

<podcast:block>

This element allows a podcaster to express which platforms are allowed to publicly display this feed and its contents. In its basic form, it is a direct drop-in replacement for the <itunes:block> tag, but allows for greater flexibility by the inclusion of the id attribute and by including multiple copies of itself in the feed.

Platforms should not ingest a feed for public display/use if their slug exists in the id of a yes block tag, or if an unbounded yes block tag exists (meaning block all public ingestion). Conversely, if a platform finds their slug in the id of a no block tag, they are free to ingest that feed for public display/usage.

In plain language, the sequence of discovery an ingesting platform should use is as follows:

  1. Does <podcast:block id="[myslug]">no</podcast:block> exist in this feed? Safe to ingest.
  2. Does <podcast:block id="[myslug]">yes</podcast:block> exist in this feed? Do not ingest.
  3. Does <podcast:block>yes</podcast:block> exist in this feed? Do not ingest.

Parent

  <channel>

Count

  Multiple

Attributes

Node value

  The node value must be "yes" or "no".

Examples

<!-- This means "block everything" -->
<podcast:block>yes</podcast:block>
<!-- This means "block nothing" (same as not present) -->
<podcast:block>no</podcast:block>
<!-- This means "block only google and amazon" -->
<podcast:block id="google">yes</podcast:block>
<podcast:block id="amazon">yes</podcast:block>
<!-- This means "block every platform _except_ google and amazon" -->
<podcast:block>yes</podcast:block>
<podcast:block id="google">no</podcast:block>
<podcast:block id="amazon">no</podcast:block>





Txt

<podcast:txt>

This element holds free-form text and is modeled after the DNS "TXT" record. It's meant to allow for usages that might be niche or otherwise not rise to the level of needing a dedicated tag. Just like TXT records in DNS allowed for new things like SPF to evolve, this tag can allow novel techniques to be created and sandboxed without a formalization process.

Parent

  <channel> or <item>

Count

  Multiple

Attributes

Purposes

The following are a list of strings known to be in common use. This list is in no way exhaustive. As new purposes come into common use, this list will be updated by the community to reflect that.

Node value

  This is a free form string. Please do not exceed 4000 characters for the node value or it may be truncated by aggregators.

Examples

<podcast:txt>naj3eEZaWVVY9a38uhX8FekACyhtqP4JN</podcast:txt>
<podcast:txt purpose="verify">S6lpp-7ZCn8-dZfGc-OoyaG</podcast:txt>
<podcast:txt purpose="release">2022-10-26T04:45:30.742Z</podcast:txt>





Remote Item

<podcast:remoteItem>

This element provides a way to "point" to another feed or an <item> in another feed in order to obtain some sort of data that the other feed or feed item has. This allows a podcast app to know where to go and fetch the data being requested. What data is being requested is determined by the parent item. For instance, if the parent item is a <podcast:podroll> element, then the remote feed's <channel> metadata is needed.

Using the feedGuid attribute is the preferred way to address a remote feed since, but there are times when an app may not have access to a list of resolvable <podcast:guid>'s. In that case, it can be beneficial to include the feedUrl attribute for those cases as a fallback. If both are present and the app is capable the feedGuid should be resolved and used.

Parent

  <channel> or <podcast:podroll> or <podcast:valueTimeSplit>

Count

  Multiple

Attributes

Examples

<podcast:remoteItem feedGuid="917393e3-1b1e-5cef-ace4-edaa54e1f810" />
<podcast:remoteItem
    feedGuid="917393e3-1b1e-5cef-ace4-edaa54e1f810"
    itemGuid="asdf089j0-ep240-20230510"
/>
<podcast:remoteItem
    feedGuid="917393e3-1b1e-5cef-ace4-edaa54e1f810"
    feedUrl="https://feeds.example.org/917393e3-1b1e-5cef-ace4-edaa54e1f810/rss.xml"
    itemGuid="asdf089j0-ep240-20230510"
    medium="music"
/>





Podroll

<podcast:podroll>

This element allows for a podcaster to include references to one or more podcasts in it's <channel> as a way of "recommending" other podcasts to their listener.

Parent

  <channel>

Count

  Single

Node value

  The node value must be one or more <podcast:remoteItem> elements.

Example

<podcast:podroll>
    <podcast:remoteItem feedGuid="29cdca4a-32d8-56ba-b48b-09a011c5daa9" />
    <podcast:remoteItem feedGuid="396d9ae0-da7e-5557-b894-b606231fa3ea" />
    <podcast:remoteItem feedGuid="917393e3-1b1e-5cef-ace4-edaa54e1f810" />
</podcast:podroll>





Update Frequency

<podcast:updateFrequency>

This element allows a podcaster to express their intended release schedule as structured data and text.

Parent

<channel>

Count

Single

Node value

The node value is a free-form string, which might be displayed alongside other information about the podcast. Please do not exceed 128 characters for the node value or it may be truncated by aggregators.

Attributes

Examples

Recreating most of Apple Podcasts Connect’s “Update Frequency” values is easily achieved:

<podcast:updateFrequency rrule="FREQ=DAILY">Daily</podcast:updateFrequency>

<podcast:updateFrequency rrule="FREQ=WEEKLY">Weekly</podcast:updateFrequency>

<podcast:updateFrequency rrule="FREQ=WEEKLY;INTERVAL=2">Biweekly</podcast:updateFrequency>

<podcast:updateFrequency rrule="FREQ=MONTHLY">Monthly</podcast:updateFrequency>

<podcast:updateFrequency rrule="FREQ=MONTHLY;INTERVAL=2">Bimonthly</podcast:updateFrequency>

<podcast:updateFrequency rrule="FREQ=MONTHLY">Monthly</podcast:updateFrequency>

<podcast:updateFrequency rrule="FREQ=YEARLY">Yearly</podcast:updateFrequency>

However, greater precision can be easily communicated:

<podcast:updateFrequency rrule="FREQ=DAILY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR">Every weekday</podcast:updateFrequency>

<podcast:updateFrequency rrule="FREQ=WEEKLY;BYDAY=MO,WE">Every Monday and Wednesday</podcast:updateFrequency>

<podcast:updateFrequency rrule="FREQ=WEEKLY;BYDAY=FR;BYMONTHDAY=13">Every friday the 13th</podcast:updateFrequency>

<podcast:updateFrequency rrule="FREQ=YEARLY;BYDAY=+4TH;BYMONTH=11">
    Every year on American Thanksgiving
</podcast:updateFrequency>

Limited-run podcasts can indicate when they’ll go on hiatus by setting an UNTIL date or a COUNT:

<podcast:updateFrequency rrule="FREQ=WEEKLY;INTERVAL=2;BYDAY=MO;COUNT=10" dtstart="2023-08-28T00:00:00.000Z">
    Every other Monday for 10 episodes starting on Aug 28, 2023
</podcast:updateFrequency>

<podcast:updateFrequency rrule="FREQ=WEEKLY;UNTIL=2023-12-31T00:00:00.000Z;BYDAY=MO">
    Every Monday until Dec 31, 2023
</podcast:updateFrequency>

Podcasts currently on hiatus can indicate their intention to resume production by setting a DTSTART value in the future:

<podcast:updateFrequency dtstart="2025-01-01T00:00:00.000Z" rrule="FREQ=WEEKLY">
    Weekly, starting in 2025
</podcast:updateFrequency>

Complete podcasts with no intention to release further episodes:

<podcast:updateFrequency complete="true">That’s all folks!</podcast:updateFrequency>





Podping

<podcast:podping>

This element allows feed owners to signal to aggregators that the feed sends out Podping notifications when changes are made to it, reducing the need for frequent speculative feed polling.

Parent

  <channel>

Count

  Single

Examples

 <podcast:podping usesPodping="true"/>





Value Time Split

<podcast:valueTimeSplit>

This element allows different value splits for a certain period of time. It is a combination of the concept of

and where a start time and a duration is supplied with alternative value recipients. The alternative value recipients are not required to be remote, as the recipients may not have an RSS feed/item of their own to reference.

The <podcast:valueTimeSplit> element allows time-based changes of value recipient information during playback of a feed's enclosure content.

This can either contain one or more <podcast:valueRecipient> tags or exactly one <podcast:remoteItem> tag. If a <podcast:remoteItem> tag is present, the remotePercentage attribute can be defined to control how much the remote value block's <podcast:valueRecipient> tags will receive as a whole on top of the default, non-fee <podcast:valueRecipient> tags.

If the remote value block contains any <podcast:valueTimeSplit> tags, they should be ignored even if the remoteStartTime indicates it's in a position that would invoke them. When referencing a remote value block, only the root level block splits should be used and any <podcast:valueTimeSplit> children are to be ignored.

Fees from the default <podcast:valueRecipient> tags should remain to be calculated before anything is taken out from <podcast:valueTimeSplit>.

Parent

  <podcast:value>

Count

  Multiple

Node Value

  A single <podcast:remoteItem> element OR one or more <podcast:valueRecipient> elements.

Attributes

Example (Remote Item)

<rss xmlns:podcast="https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md" version="2.0">
   <channel>
      <title>Metal Showcase</title>
      <description>A great playlist of my favorite metal tracks.</description>
      <link>https://example.com/rss-metal-showcase.xml</link>
      <language>en</language>
      <pubDate>Fri, 21 Apr 2023 18:56:30 -0500</pubDate>
      <podcast:medium>music</podcast:medium>
      <item>
         <title>Special interview with Torcon VII</title>
         <otherTagsHere>...</otherTagsHere>
         <podcast:value type="lightning" method="keysend">
            <podcast:valueRecipient name="Alice (Podcaster)" type="node" address="02d5c1bf8b940dc9cadca86d1b0a3c37fbe39cee4c7e839e33bef9174531d27f52" split="95" />
            <podcast:valueRecipient name="Hosting Provider" type="node" address="03ae9f91a0cb8ff43840e3c322c4c61f019d8c1c3cea15a25cfc425ac605e61a4a" split="5" fee="true" />

            <podcast:valueTimeSplit startTime="60" duration="237" remotePercentage="95">
               <podcast:remoteItem itemGuid="https://podcastindex.org/podcast/4148683#1" feedGuid="a94f5cc9-8c58-55fc-91fe-a324087a655b" medium="music" />
            </podcast:valueTimeSplit>

            <podcast:valueTimeSplit startTime="330" duration="53" remoteStartTime="174" remotePercentage="95">
               <podcast:remoteItem itemGuid="https://podcastindex.org/podcast/4148683#3" feedGuid="a94f5cc9-8c58-55fc-91fe-a324087a655b" medium="music" />
            </podcast:valueTimeSplit>
         </podcast:value>
      </item>
   </channel>
</rss>

Example (Locally Specified)

<rss xmlns:podcast="https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md" version="2.0">
   <channel>
      <title>Cool Pod</title>
      <description>This is a cool pod</description>
      <link>https://example.com/rss-cool-pod.xml</link>
      <language>en</language>
      <pubDate>Fri, 21 Apr 2023 18:56:30 -0500</pubDate>
      <podcast:medium>podcast</podcast:medium>
      <item>
         <title>Adam Hates the word "pod" (and I do, too)</title>
         <otherTagsHere>...</otherTagsHere>
         <podcast:value type="lightning" method="keysend">
            <podcast:valueRecipient name="Alice (Podcaster)" type="node" address="02d5c1bf8b940dc9cadca86d1b0a3c37fbe39cee4c7e839e33bef9174531d27f52" split="95" />
            <podcast:valueRecipient name="Hosting Provider" type="node" address="03ae9f91a0cb8ff43840e3c322c4c61f019d8c1c3cea15a25cfc425ac605e61a4a" split="5" fee="true" />

            <podcast:valueTimeSplit startTime="63" duration="388">
               <podcast:valueRecipient name="Alice (Podcaster)" type="node" address="02d5c1bf8b940dc9cadca86d1b0a3c37fbe39cee4c7e839e33bef9174531d27f52" split="85" />
               <podcast:valueRecipient name="Jimbob (Guest)" type="node" address="02dd306e68c46681aa21d88a436fb35355a8579dd30201581cefa17cb179fc4c15" split="10" />
            </podcast:valueTimeSplit>

            <podcast:valueTimeSplit startTime="367" duration="246">
               <podcast:valueRecipient name="Alice (Podcaster)" type="node" address="02d5c1bf8b940dc9cadca86d1b0a3c37fbe39cee4c7e839e33bef9174531d27f52" split="85" />
               <podcast:valueRecipient name="Bobjim (Guest)" type="node" address="032f4ffbbafffbe51726ad3c164a3d0d37ec27bc67b29a159b0f49ae8ac21b8508" split="10" />
            </podcast:valueTimeSplit>
         </podcast:value>
      </item>
   </channel>
</rss>