VocalFuse is a Fuse Intelligence product.

PODCAST SEO

Podcast Episode Schema — the JSON-LD Template, Done Right

Google removed its podcast rich result in April 2024, so episode markup no longer buys you a carousel. What it still buys is retrieval: PodcastEpisode + AudioObject JSON-LD tells search engines and AI answer engines what your episode is — and the transcript it carries is the only part they can actually quote. Copy the template below, avoid the properties most guides get wrong, and feed it with transcripts generated locally, free tier.

Why episode schema still matters in 2026

The story most guides still tell is out of date. Google Podcasts shut down in 2024 and Google retired the podcast rich result with it — the documentation is gone. Two things did not retire:

First, retrieval. Audio is opaque to every search and answer engine; the only text they can read is your transcript and your markup. PodcastEpisode markup with a transcript gives AI systems (Google AI Overviews, ChatGPT, Perplexity) a citable, structured representation of what was actually said — the transcript field is the single strongest answer-engine signal on an episode page.

Second, entity clarity. An episode page carrying only WebPage or Article markup is anonymous: a machine cannot tell episode 42 from a blog post. PodcastEpisode nested under a PodcastSeries (defined once with an @id, referenced via partOfSeries) makes every episode a first-class entity with its own title, number, guests, and duration.

The practical playbook: full transcript in the HTML, mirrored into the AudioObject's transcript property, episode numbers as integers not just title strings, audio in associatedMedia — then a local transcription pipeline so producing that transcript for every episode costs minutes, not dollars.

The copy-paste PodcastEpisode JSON-LD template

Structure follows schema.org's official PodcastEpisode example and the AudioObject property table. Swap the values; keep the shape.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "PodcastSeries",
      "@id": "https://example.com/podcast/#series",
      "name": "Your Show Name",
      "url": "https://example.com/podcast/",
      "author": { "@type": "Person", "name": "Host Name" }
    },
    {
      "@type": "PodcastEpisode",
      "@id": "https://example.com/podcast/ep-42/#episode",
      "url": "https://example.com/podcast/ep-42/",
      "name": "Ep. 42 — Episode Title",
      "episodeNumber": 42,
      "datePublished": "2026-09-01",
      "timeRequired": "PT47M12S",
      "inLanguage": "en",
      "description": "One or two sentences on what the listener gets.",
      "image": "https://example.com/images/ep-42.jpg",
      "partOfSeries": { "@id": "https://example.com/podcast/#series" },
      "actor": [
        { "@type": "Person", "name": "Guest Name", "sameAs": "https://www.linkedin.com/in/guest" }
      ],
      "associatedMedia": {
        "@type": "AudioObject",
        "contentUrl": "https://example.com/audio/ep-42.mp3",
        "encodingFormat": "audio/mpeg",
        "duration": "PT47M12S",
        "transcript": "https://example.com/podcast/ep-42/#transcript"
      }
    }
  ]
}
</script>

Drop the AudioObject's transcript URL and paste the full episode text there instead when the transcript is on the same page — that is the highest-leverage variant.

The properties most guides get wrong

transcript belongs on the AudioObject (inside associatedMedia), not the episode node — that is where schema.org defines the property. Point it at the on-page transcript anchor, or paste the full text. Mirror the visible on-page text exactly; answer engines reading JSON-LD only retrieve what is declared there.

timeRequired is what schema.org's official PodcastEpisode example uses for episode length (ISO 8601: PT47M12S). duration on the AudioObject is equally valid — the mistake is neither property, it is writing 47:12 or raw seconds.

episodeNumber as an integer, not only inside the name string. A parser reading "Ep. 42" from a headline is guessing; where seasons exist, seasonNumber belongs in the markup too.

partOfSeries referencing a PodcastSeries @id defined once on your hub page and referenced everywhere — restating the full series node on every episode creates competing entities.

associatedMedia is the difference between an episode entity and a metadata stub. No AudioObject means no stated audio; directories and ingestion pipelines that consume schema skip episodes missing the audio reference.

How to publish a podcast transcript (the right way)

  1. Transcribe locally. Run the mastered episode through a local Whisper tool (VocalFuse on Windows: GPU/CPU, speaker turns, SRT/VTT/TXT export, free tier). Nothing uploads — NDA and embargo episodes stay on your disk.
  2. Clean the transcript. Fix speaker labels, drop filler words if you like, and add topic headings with timestamps — headings turn a wall of text into scannable, indexable sections.
  3. Publish it as real HTML on the episode page. Not behind a click-to-load tab, not inside the player widget, not as a PDF. Retrieval reads rendered HTML only; details/summary accordions (like this page's FAQ) keep it in the initial DOM.
  4. Mirror it into the schema. Put the same text (or its anchor URL) in the AudioObject's transcript property inside your PodcastEpisode JSON-LD.
  5. Ship metadata that machines can parse. episodeNumber as an integer, ISO 8601 duration, guests as Person objects with sameAs links, partOfSeries pointing at a single PodcastSeries @id.
  6. Repurpose the same transcript. One transcript feeds show notes, chapter markers, quote graphics, and a newsletter — see the podcast show notes generator below.

Keep reading

Explore related AI note taking guides

Podcast episode schema — FAQ

Does PodcastEpisode schema still work now that Google Podcasts is gone?

Yes — the goalposts moved, the markup did not. Google retired its podcast rich result and removed the documentation in April 2024, so no special carousel or play button is coming. What still works is retrieval: PodcastEpisode markup gives search engines and AI answer engines a structured entity for the episode (title, number, duration, audio file, transcript) instead of guesses from HTML. Directories and apps that ingest feeds still consume it, and the transcript it carries is what gets your show quoted in AI answers.

Where does the transcript property go — on PodcastEpisode or AudioObject?

On the AudioObject inside associatedMedia. That is where schema.org defines transcript for media. PodcastEpisode sits above the AudioObject and describes the episode; the AudioObject describes the audio file, and transcript is an AudioObject property. Keep it as a URL if the transcript lives on another page, or paste the full text there if the transcript is on the page itself — mirroring the visible on-page text exactly.

Is duration a valid PodcastEpisode property?

Yes — PodcastEpisode inherits duration from Episode, in ISO 8601 format (PT47M12S). You will also see timeRequired in the official schema.org PodcastEpisode example, which is valid there too. Either validates; use one consistently across your episodes. The mistake to avoid is writing 47:12 or 2832 seconds — both validators and engines require the PT-prefixed form.

Should the full transcript be on the episode page or a separate page?

On the episode page. Splitting it creates two thin pages competing for the same topic instead of one strong one. If length is a design concern, use headings and a summary rather than a separate URL — or details/summary accordions like the ones on this page, which keep the text in the initial HTML. Retrieval systems read rendered HTML, so anything behind a click-to-load tab or inside a PDF is invisible to them.

How long until podcast transcripts show up in search?

Publishing a transcript does not guarantee a ranking bump — treat claims of guaranteed 10-60% traffic lifts with skepticism, though case studies (Moz-cited ~15% organic lift) and podcast-industry guides converge on transcripts as the highest-leverage episode-page element for 2026. Google re-crawls popular shows within days; smaller sites may wait weeks. You can nudge it: request indexing in Search Console for the episode URL, and keep sitemap lastmod current so crawlers see the change.

What is the fastest way to get full transcripts for every episode?

Run the audio through a local Whisper-based tool instead of uploading masters to a cloud metered by the minute. VocalFuse runs Whisper on your Windows GPU/CPU with speaker turns and SRT/VTT/TXT export — free tier, no minute meter; Basic is $5/mo flat and Pro $10/mo adds the AI notes layer. A 60-minute episode transcribes in minutes on your own hardware, and embargoed or NDA-gated episodes never leave the machine.