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>| Element | Rule | Consequence of getting it wrong |
|---|---|---|
enclosure url | Absolute HTTPS URL to the media file | The episode does not play; directories may reject the feed |
enclosure type | A real MIME type, audio/mpeg for MP3 | Some players refuse the file |
enclosure length | Byte count of the file | Downloads show no progress and some apps stall |
guid | Stable forever, even after re-hosting | Every subscriber is re-notified, or the episode disappears |
itunes:category | Must come from the published list | Submission is rejected |
itunes:image | Square, at least 1400 by 1400, JPEG or PNG | Artwork is missing in directories |
itunes:explicit | Required by some directories | Submission 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:episodeanditunes:season; do not rely on readers inferring it from the title. podcast:transcriptsignificantly 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.
Related
Namespace extensions: content:encoded, dc: and Media RSS Validating and troubleshooting feeds
Last refreshed 2026-09-18.