Podcast feeds and the Apple and Podcasting 2.0 tags

A podcast feed is an RSS feed with an enclosure, plus a set of namespaced tags that directories enforce strictly enough to reject your show.

The tags a directory requires

<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
     xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:podcast="https://podcastindex.org/namespace/1.0"
     xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Shipping It</title>
    <link>https://example.com/podcast</link>
    <description>Interviews about releasing software.</description>
    <language>en-gb</language>
    <atom:link href="https://example.com/podcast/feed.xml" rel="self" type="application/rss+xml"/>
    <itunes:author>Platform Team</itunes:author>
    <itunes:type>episodic</itunes:type>
    <itunes:explicit>false</itunes:explicit>
    <itunes:category text="Technology">
      <itunes:category text="Software How-To"/>
    </itunes:category>
    <itunes:image href="https://example.com/podcast/cover-3000.jpg"/>
    <podcast:guid>9f2b1c4d-1111-2222-3333-abcdef012345</podcast:guid>
    <podcast:funding url="https://example.com/support">Support the show</podcast:funding>

    <item>
      <title>Episode 41: Cold starts</title>
      <guid isPermaLink="false">ep-41</guid>
      <pubDate>Thu, 18 Sep 2026 06:00:00 +0100</pubDate>
      <enclosure url="https://cdn.example.com/ep41.mp3"
                 type="audio/mpeg" length="41873421"/>
      <itunes:duration>00:42:17</itunes:duration>
      <itunes:episode>41</itunes:episode>
      <itunes:season>3</itunes:season>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:explicit>false</itunes:explicit>
      <description>Why the first request after a deploy is slow.</description>
      <content:encoded><![CDATA[<p>Why the first request after a deploy is slow.</p>]]></content:encoded>
      <podcast:transcript url="https://example.com/podcast/41.vtt"
                         type="text/vtt" language="en"/>
      <podcast:chapters url="https://example.com/podcast/41-chapters.json"
                        type="application/json+chapters"/>
    </item>
  </channel>
</rss>
ElementRuleConsequence of getting it wrong
enclosure urlAbsolute HTTPS URL to the media fileThe episode does not play; directories may reject the feed
enclosure typeA real MIME type, audio/mpeg for MP3Some players refuse the file
enclosure lengthByte count of the fileDownloads show no progress and some apps stall
guidStable forever, even after re-hostingEvery subscriber is re-notified, or the episode disappears
itunes:categoryMust come from the published listSubmission is rejected
itunes:imageSquare, at least 1400 by 1400, JPEG or PNGArtwork is missing in directories
itunes:explicitRequired by some directoriesSubmission fails validation

Identifiers that survive a re-host

# A podcast guid must not depend on anything you might change later.
BAD = "https://cdn.example.com/audio/ep41.mp3"   # breaks if you move the CDN
BAD2 = "Episode 41: Cold starts"                 # breaks if you fix a typo in a title
GOOD = "urn:example:podcast:shipping-it:ep-41"   # opaque, permanent, ours

# If the feed moves to a new host, the <podcast:guid> of the channel should
# stay put too, so directories recognise it as the same show.
CHANNEL_GUID = "9f2b1c4d-1111-2222-3333-abcdef012345"
  • Never use the file URL as the guid. Re-hosting on a new CDN would change it and every episode would look new.
  • Episode numbering should be explicit with itunes:episode and itunes:season; do not rely on readers inferring it from the title.
  • podcast:transcript significantly improves accessibility and discovery, and costs one static file per episode.
  • Podcast directories cache aggressively. After a feed change, verify with the directory's own refresh tool rather than assuming a fixed delay.
  • A 301 redirect per episode is worth setting up before a CDN move: enclosure URLs can be redirected, but guids cannot.
⚠️
A podcast feed is a public contract with third-party directories you cannot control or contact. Test any change with a validator in a staging feed first — a mistake that empties the enclosure URL can make a back catalogue unplayable across every app at once.

FAQ

What is the difference between itunes:explicit and podcast:explicit?
They are two namespaces expressing the same idea. Apple reads the itunes one; Podcasting 2.0 readers may read either. Set both to the same value for consistency.
Do I need Podcasting 2.0 tags at all?
No, the show works without them. Add them when you want transcripts, chapters, funding links or stable cross-app identity, and keep the Apple tags complete regardless.

Namespace extensions: content:encoded, dc: and Media RSS Validating and troubleshooting feeds

Last refreshed 2026-09-18.