PodcastsToText
Reference

Export formats

Every format with a sample of its output, and which ones need timestamps.

GET/api/v1/transcriptions/{id}?format=srtscope: transcriptions:read

One parameter on the fetch endpoint returns the transcript as a file instead of JSON metadata, served with Content-Disposition: inline. The download is named after the episode title, as both an ASCII filename and a UTF-8 filename* (RFC 6266), so a non-Latin title survives the download.

Speaker labels are opt-in for the text formats. Add speakers=true to prefix each cue in srt, vtt and txt with its speaker. json always includes a speaker field when the transcript has diarization, and the names are the ones you set in the editor, with any merges already applied.

FormatContent typeTimingsSpeakersUse it for
txttext/plainNoNoReading, search indexing, feeding an LLM
jsonapplication/jsonYesYesBuilding anything: the richest shape
srtapplication/x-subripYesNoVideo editors, YouTube, most players
vtttext/vttYesNoHTML5 <track>, the web
docxOOXMLOptionalOptionalHanding a transcript to a person
pdfapplication/pdfOptionalOptionalArchives, records, print
Download any of them
curl "https://podcaststotext.com/api/v1/transcriptions/$ID?format=srt" \
  -H "Authorization: Bearer $PTT_KEY" -o episode.srt

srt, vtt and json need a segmented transcript. Free-tier transcripts are stored without timings, so a time-coded format returns 400. Check format on the transcript object first: "json" means segments are present, "txt" means they are not. txt, docx and pdf always work.

JSON

The segment array as a file, as opposed to ?include=text, which returns the metadata object with a text field added. start and end are fractional seconds; speaker is present only when speaker recognition ran (paid plans, on by default), and labels mark *distinct* speakers rather than who they are, numbered by first appearance, stable within a transcript, meaningless across two.

?format=json
[
  {
    "start": 0.0,
    "end": 4.82,
    "text": "Welcome back to the show. Today we are talking about interest rates,",
    "speaker": "SPEAKER_00"
  },
  {
    "start": 8.44,
    "end": 13.90,
    "text": "I think the thing everyone missed is that the decision was already made.",
    "speaker": "SPEAKER_01"
  }
]

TXT

Plain UTF-8, no timings, no speaker labels: the one format that works for every transcript on every plan, and the right shape for a language model, where timings are noise that costs tokens.

?format=txt
Welcome back to the show. Today we are talking about interest rates, and
what happened in the two weeks since we last recorded.

I think the thing everyone missed is that the decision was already made
before the meeting started.

SRT and VTT

Both are subtitle formats and they differ in three details that break parsers: VTT requires a WEBVTT header, uses a period before the milliseconds where SRT uses a comma, and treats cue numbers as optional.

?format=srt
1
00:00:00,000 --> 00:00:04,820
Welcome back to the show. Today we are talking about interest rates,

2
00:00:04,820 --> 00:00:08,110
and what happened in the two weeks since we last recorded.
?format=vtt
WEBVTT

00:00:00.000 --> 00:00:04.820
Welcome back to the show. Today we are talking about interest rates,

00:00:04.820 --> 00:00:08.110
and what happened in the two weeks since we last recorded.

SRT imports directly into Premiere, Final Cut and Resolve, and uploads to YouTube under Studio → Subtitles. VTT is what HTML5 <track> accepts:

HTML5 video
<video controls src="/episode.mp3">
  <track default kind="captions" srclang="en" label="English"
         src="/captions/episode.vtt">
</video>

Serve VTT same-origin. Browsers apply CORS to <track>. Fetch the file with your API key server-side and serve it from your own origin: simpler than proxying, and it keeps the key where it belongs.

DOCX and PDF

Both are made for handing to a person: the episode title as a heading, paragraphs broken where the speaker changes, and speaker names and timestamps where the transcript has them. Neither needs a segmented transcript, so free-tier transcripts export fine. The response is a binary document named after the episode title, do not pipe it through a JSON parser.

For a different layout, fetch format=json and render it yourself; the segment array is the same source material these exports are built from.