PodcastEpisode
PodcastEpisode describes a single episode of a podcast. Google uses it (alongside RSS feeds) to surface episodes in Google Podcasts, Google Search, and Google Assistant. The markup is especially useful for podcast websites that host episode pages with show notes: it gives Google structured metadata that the RSS feed alone may not carry, like guest names, topic tags, and transcript links.
The structure mirrors how TV shows work in schema.org: a PodcastSeries contains PodcastSeasons which contain PodcastEpisodes. Most podcasts skip seasons, so the episode connects directly to the series via partOfSeries. The audio file is linked through associatedMedia with an AudioObject.
Full example of schema.org/PodcastEpisode json-ld markup
The markup is verified as valid with Rich Results Test from Google.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@id": "https://xoocode.com/podcast/ep-42-common-schema-mistakes#episode",
"@type": "PodcastEpisode",
"name": "The 5 Schema Mistakes We See on Every Audit",
"description": "Tomás Herrera joins Lena to break down the five structured data errors that show up in nearly every site audit they run, from missing @id references to headline truncation. Plus a listener question about FAQPage vs QAPage.",
"url": "https://xoocode.com/podcast/ep-42-common-schema-mistakes",
"datePublished": "2026-03-28",
"episodeNumber": 42,
"timeRequired": "PT38M",
"inLanguage": "en-US",
"image": "https://xoocode.com/podcast/images/ep-42-cover.jpg",
"partOfSeries": {
"@type": "PodcastSeries",
"@id": "https://xoocode.com/podcast#series",
"name": "Structured Data Unpacked",
"url": "https://xoocode.com/podcast",
"webFeed": "https://xoocode.com/podcast/feed.xml",
"author": {
"@type": "Organization",
"@id": "https://xoocode.com#organization",
"name": "Xoo Code Inc."
}
},
"actor": [
{
"@type": "Person",
"name": "Lena Vasquez",
"url": "https://xoocode.com/team/lena-vasquez",
"jobTitle": "Host"
},
{
"@type": "Person",
"name": "Tomás Herrera",
"url": "https://xoocode.com/team/tomas-herrera",
"jobTitle": "Guest"
}
],
"associatedMedia": {
"@type": "AudioObject",
"contentUrl": "https://xoocode.com/podcast/audio/ep-42-common-schema-mistakes.mp3",
"encodingFormat": "audio/mpeg",
"duration": "PT38M12S",
"contentSize": "36.4 MB",
"transcript": "https://xoocode.com/podcast/ep-42-common-schema-mistakes/transcript"
},
"keywords": "structured data, schema markup, site audit, common mistakes, FAQPage, QAPage"
}
</script>partOfSeries and PodcastSeries
partOfSeries links the episode to its parent PodcastSeries (the show). The series has its own name, url, and webFeed (the RSS feed URL). Google uses the webFeed to cross-reference the structured data with the podcast's RSS feed, which strengthens indexing. If the PodcastSeries has a stable @id, reference it from every episode.
associatedMedia and AudioObject
The associatedMedia property takes an AudioObject with contentUrl (the MP3/M4A file URL), encodingFormat (MIME type), duration (ISO 8601), and contentSize. This is the actual audio file that podcast players will download or stream. Google reads this to populate play buttons in search results.
episodeNumber and seasonNumber
episodeNumber is an integer identifying the episode within its season (or within the series if the podcast has no seasons). seasonNumber is optional. Google uses these for ordering episodes in search results and for answering queries like "episode 42 of [podcast name]."
Transcript and accessibility
The transcript property (on the AudioObject) can contain the full text transcript or link to a transcript page via a URL. Transcripts make podcast content searchable by Google and accessible to deaf and hard-of-hearing users. They also significantly improve discoverability for long-tail keyword queries that match something said in the episode but not mentioned in the show notes.
Minimal valid version
The smallest markup that still produces a valid PodcastEpisode entity. Use it as the floor. Reach for the advanced example above when you want search engines and AI agents to understand more about your content.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "PodcastEpisode",
"name": "The 5 Schema Mistakes We See on Every Audit",
"episodeNumber": 42,
"partOfSeries": {
"@type": "PodcastSeries",
"name": "Structured Data Unpacked"
},
"associatedMedia": {
"@type": "AudioObject",
"contentUrl": "https://xoocode.com/podcast/audio/ep-42.mp3"
}
}
</script>Google rich results this unlocks
Markup matching this example makes your page eligible for the following Google Search rich results. The primary target drives the required / recommended property classification in the advanced code block above.
- Google docsPodcast rich result (via RSS + markup)primary
Common PodcastEpisode mistakes
Mistakes that pass validation but silently fail to earn rich results or mislead consumers walking the graph. Avoid these and your markup will be ahead of most sites in the wild.
- 01
Missing partOfSeries
WrongPodcastEpisode with no partOfSeriesRight"partOfSeries": { "@type": "PodcastSeries", "name": "Structured Data Unpacked", "webFeed": "https://.../feed.xml" }Without partOfSeries, Google cannot associate the episode with a podcast show. The episode appears orphaned in search results, without the show name, artwork, or subscription link. Always link to the parent PodcastSeries.
- 02
Missing webFeed on PodcastSeries
Wrong"partOfSeries": { "@type": "PodcastSeries", "name": "..." } (no webFeed)Right"partOfSeries": { "@type": "PodcastSeries", "name": "...", "webFeed": "https://.../feed.xml" }Google cross-references structured data with the podcast RSS feed. The webFeed URL is the bridge between the two. Without it, Google has to match by name alone, which fails for common podcast names.
- 03
Audio file linked via url instead of associatedMedia
Wrong"url": "https://example.com/podcast/audio/ep-42.mp3" (pointing to the audio file)Right"url": "https://example.com/podcast/ep-42" (the episode page) "associatedMedia": { "@type": "AudioObject", "contentUrl": "https://.../ep-42.mp3" }url should point to the episode's web page (show notes, transcript). The audio file goes in associatedMedia as an AudioObject with contentUrl. Putting the audio URL in url means Google indexes the MP3 file as the canonical page, which provides no useful snippet.
- 04
duration on the episode instead of the AudioObject
Wrong"duration": "PT38M" on the PodcastEpisodeRight"associatedMedia": { "@type": "AudioObject", "duration": "PT38M12S" }duration belongs on the AudioObject, not the episode. The AudioObject describes the media file and its properties. timeRequired on the episode is the estimated listening time, which can differ from the file duration (for episodes with variable-speed playback recommendations).
- 05
Omitting transcript when one exists
Wrong(PodcastEpisode with show notes page and full transcript, but no transcript property in markup)Right"transcript": "https://example.com/podcast/ep-42/transcript" on the AudioObjectTranscripts make episode content searchable by Google. Without a transcript, Google can only index the show notes and episode title. With one, every word spoken in the episode becomes discoverable via search. This is the single biggest discoverability improvement for podcast SEO.
Schema properties in this example
About the example data
The episode is from "Structured Data Unpacked," the fictional Xoo Code podcast. Guest Tomás Herrera (the developer advocate from the TechArticle example) discusses common structured data mistakes. The series publisher is Xoo Code Inc. Host is Lena Vasquez, who also wrote the BlogPosting and DigitalDocument examples.
Comments
Loading comments...