- Table of Contents
- About This Document
- Required RSS Namespace Declarations
- RSS Feed Elements
This document specifies requirements and best practices for PSP-certififed podcast feeds. It defines required and optional RSS namespaces and feed elements that have proven the most useful, and codifies other conventions to remove ambiguities that app creators have wrestled with since the dawn of podcasting.
This specification builds on the RSS feed format standard, which is possible thanks the foresight of the creators of RSS.
The Podcast Standards Project (PSP) is a grassroots industry coalition to advocate for and help evolve open podcasting. Its mission is to develop modern, open standards, unlock innovation, and improve podcasting for both listeners and creators.
In the beginning, podcasting was “open” by definition — any podcast could be enjoyed via any podcast app, just as any web browser can view any website. In the mid-2010s, podcasting broke through as a mainstream medium.
Big tech companies naturally stepped in to duplicate podcasting’s success with closed, proprietary platforms. They called shows distributed on their closed platforms “podcasts” to leverage podcasting’s popularity, but the cost was that the word “podcasting” lost its standards-based guarantee. These closed platforms remove choice — they lock audiences into one player, lock creators into a single vendor’s services, and take ownership of the relationship between creators and their audiences.
PSP supports “open” or “standards-based” podcasting, which is based open web standards and works with any standards-based app or service. Specifically, podcasts are distributed as RSS feeds which represent a collection of episodes with associated audio and/or video content, as well as other useful show and episode metadata.
Podcast feeds utilize RSS 2.0 tags and require extensions from three namespaces (itunes
, podcast
, and atom
). These namespace declarations must be made in the opening of your XML.
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:podcast="https://podcastindex.org/namespace/1.0"
xmlns:atom="http://www.w3.org/2005/Atom">
To include HTML in your podcast feed, you must also declare the RDF Site Summary 1.0 Modules: Content namespace in the second line of your XML.
Together with the required <itunes>
, <podcast>
, and <atom>
namespace declarations, the first two lines of RSS look like this:
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:podcast="https://podcastindex.org/namespace/1.0"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:content="http://purl.org/rss/1.0/modules/content/">
With the RDF Site Summary 1.0 Content Module Specification namespace included, you can enclose all portions of your XML that contain embedded HTML in a CDATA section to prevent formatting issues and to ensure proper link functionality.
<![CDATA[
<a href="https://www.podstandards.org">The Podcast Standards Project</a>
]]>
Namespace definitions are case-sensitive and must be entered as shown.
Feeds must be plain text UTF-8 encoded. Node values are limited to 255 characters unless otherwise specified and should have no leading or trailing spaces.
All elements within a podcast RSS feed will have <channel>
or <item>
parent tags. Elements at the <channel>
level describe the podcast, while elements at the <item>
level describe an episode.
Required elements must be present in your RSS feed to pass validation. Recommended elements are encouraged because they provide useful information to listeners. Situational elements may be important for specific podcasts, podcasters, or listeners.
Note: This document describes the standard elements for podcast RSS feeds. The extendable nature of RSS allows for the use of additional elements as long as a proper namespace extension is declared in the XML. The itunes, podcast, and atom namespace extensions include additional "non-standard" elements that can be used in podcast RSS feeds, although broad support should not be expected.
The declared canonical feed URL for the podcast. Official Docs
<atom:link href="https://www.podstandards.org/my-podcast.rss"
rel="self" type="application/rss+xml" />
The podcast title. A string containing the name of a podcast and nothing else. Official Docs
<title>Sample Podcast Title</title>
Including keywords in an attempt to improve a podcast's search ranking, may result in being blocked from certain directories.
Text that describes a podcast to potential listeners. Official Docs
<description>Sample podcast description.</description>
<description><![CDATA[Sample podcast description.]]></description>
The maximum amount of text allowed for this tag is 4,000 bytes.
The website or web page associated with a podcast. Official Docs
<link>https://www.podstandards.org</link>
<link>https://www.podstandards.org/podcast</link>
The language that is spoken on the podcast, specified in the ISO 639 format. Official Docs
<language>en-us</language>
The category that best fits a podcast, selected from the list of Apple Podcasts categories. Official Docs
<itunes:category text="News">
<itunes:category text="Tech News" />
</itunes:category>
<itunes:category text="Technology" />
Multiple category selections are permitted. Categories should be listed in order of priority.
The parental advisory information for a podcast. Official Docs
<itunes:explicit>false</itunes:explicit>
The value can be true
, indicating the presence of explicit content, or false
, indicating that a podcast doesn’t contain explicit language or adult content.
The artwork for the podcast, specified by providing a URL linking to it. Official Docs
<itunes:image href="https://www.podstandards.org/podcast/artwork.jpg" />
Verify the web server hosting your image allows HTTP head requests.
Image must be a minimum size of 1400 x 1400 pixels and a maximum size of 3000 x 3000 pixels, in JPEG or PNG format, 72 dpi, with appropriate file extensions (.jpg, .png), and in the RGB colorspace. File type extension must match the actual file type of the image file.
Tells podcast hosting platforms whether they are allowed to import this feed. Official Docs
<podcast:locked>yes</podcast:locked>
A value of yes
means that import attempts should be rejected. A value of no
means the feed can be imported.
The globally unique identifier (GUID) for a podcast. The value is a UUIDv5, and 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. Official Docs
Example GUID for feed url podnews.net/rss:
<podcast:guid>9b024349-ccf0-5f69-a609-6b82873eab3c</podcast:guid>
A podcast should be 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 existence, 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 podcasting ecosystem without the need for a central authority.
The group, person, or people responsible for creating the podcast. Official Docs
<itunes:author>Dallas Times-Herald</itunes:author>
The following <channel>
elements may be used in PSP-complient podcast feeds when relevant.
The copyright details for a podcast. Official Docs
<copyright>The Podcast Standards Project</copyright>
Should not include the word "Copyright", the © symbol, and/or a year.
A free-form text field to present a string in a podcast feed. Official Docs
<podcast:txt>naj3eEZaWVVY9a38uhX8FekACyhtqP4JN</podcast:txt>
One use case of this is to verify ownership. For example, a show owner may be asked to add a unique <podcast:txt>
to prove that they control the feed (and therefore the show).
<podcast:txt purpose="verify">S6lpp-7ZCn8-dZfGc-OoyaG</podcast:txt>
The element value is limited to 4,000 characters. This element can optionally be used with a purpose
attribute, which is also free-form but limited to 128 characters.
Note Although
<podcast:funding>
is optional for podcast feeds, support for this element is required for PSP-certified podcast hosts and players.
This element specifies the donation/funding links for the podcast. The content of the tag is the recommended string to be used with the link. [Official Docs]
<podcast:funding url="https://www.podstandards.org/support">Support</podcast:funding>
Specifies the podcast as either episodic or serial. Official Docs
<itunes:type>episodic</itunes:type>
<itunes:type>serial</itunes:type>
episodic
is the default and assumed if this element is not present. This element is required for serial podcasts.
Specifies that a podcast is complete and will not post any more episodes in the future. Official Docs
<itunes:complete>yes</itunes:complete>
The only valid value for this element is yes
. All other values will be ignored.
Each <item>
in an RSS files represents one podcast episode.
The title for the podcast episode. Official Docs
<title>Why podcasts standards are important</title>
The title value is a string containing a concise name for your episode. Title values should not include season or episode numbers, as there are specific elements to capture those values.
The audio/video episode content, file size, and file type information. Official Docs
<enclosure length="24986" type="audio/mpeg"
url="https://www.podstandards.org/episode_123.mp3" />
The following attributes are required: The length
in bytes, the MIME media type
(audio/mpeg
, audio/m4a
, video/m4v
, video/mp4
), and the URL
of the file. Supported file formats include MP3 (.mp3
) and MPEG-4 (.m4a
, .m4v
, .mp4
).
The globally unique identifier (GUID) for a podcast episode. Official Docs
<guid isPermaLink="false">podcast-12345678</guid>
Each episode must have a unique GUID that never changes. Values are case-sensitive strings.
The URL of a web page associated with the podcast episode. Official Docs
<link>https://www.podstandards.org/1983/05/06/post.html</link>
Useful when an episode has a corresponding webpage.
The release date and time of an episode. Official Docs
<pubDate>Fri, 26 Feb 2021 00:00:00 -0500</pubDate>
Values must use the RFC 2822 specifications.
The description of the podcast episode. Official Docs
<description>Sample episode description.</description>
<description><![CDATA[<p>Sample episode description.</p>]]></description>
The maximum amount of text allowed for this tag is 4000 bytes. Some HTML is permitted (<p>
, <ol>
, <ul>
, <li>
, <a>
, <b>
, <i>
, <strong>
, <em>
) if wrapped in the <CDATA>
tag.
The duration of a podcast episode in seconds. Official Docs
<itunes:duration>1801</itunes:duration>
The episode-specific artwork. Official Docs
<itunes:image href="https://www.podstandards.org/podcast/episode/1/artwork.jpg" />
Verify the web server hosting your image allows HTTP head requests.
Image must be a minimum size of 1400 x 1400 pixels and a maximum size of 3000 x 3000 pixels, in JPEG or PNG format, 72 dpi, with appropriate file extensions (.jpg, .png), and in the sRGB colorspace. File type extension must match the actual file type of the image file.
The parental advisory information for a podcast episode. Official Docs
<itunes:explicit>true</itunes:explicit>
<itunes:explicit>false</itunes:explicit>
The value can be true
, indicating the presence of explicit content, or false
, indicating that a podcast doesn’t contain explicit language or adult content.
A link to a transcript or closed captions file. Multiple tags can be present for multiple formats. Official Docs
<podcast:transcript url="https://www.podstandards.org/episode1/transcript.html" type="text/html" />
<podcast:transcript url="https://www.podstandards.org/episode1/transcript.srt" type="application/x-subrip" rel="captions" />
<podcast:transcript url="https://www.podstandards.org/episode1/transcript.vtt" type="text/vtt" />
<podcast:transcript url="https://www.podstandards.org/episode1/transcript.json" type="application/json" language="es" rel="captions" />
Must contain two attributes: The URL
of the podcast transcript, and the type
(text/plain
, text/html
, text/vtt
, application/json
, application/x-subrip
).
The following <item>
elements may be used in PSP-complient podcast feeds when relevant.
The chronological number that is associated with a podcast episode. Official Docs
<itunes:episode>46</itunes:episode>
Must be a non-zero integer. This is required for serial podcasts.
The chronological number associated with a podcast episode's season. Official Docs
<itunes:season>2</itunes:season>
Must be a non-zero integer.
Defines the type of content for a specific podcast episode. Official Docs
<itunes:episodeType>full</itunes:episodeType>
full
(assumed if absent) – A complete podcast episodetrailer
– A short promotional or preview episode for a podcastbonus
– Additional content that is unlike a typical episode (e.g., behind-the-scenes or a promotional episode for another podcast)
Prevents a specific episode from appearing in podcast listening applications. Official Docs
<itunes:block>yes</itunes:block>
The only valid value for this element is yes
. All other values will be ignored.
###
- Added a bunch of context at the top of the document
- Conformed to
markdownlint
style suggestions whenever possible - Added explicit internal links because Markdown doesn't like duplicate heading names
- Added comments that make it easier to navigate source