The request
Pass exactly one source. A remote url covers an audio or video file, a podcast RSS or Apple link, or a social link. A media_ref comes from a direct upload, and a public blob_url covers media you already host somewhere reachable.
Send an Idempotency-Key header and retries become safe: repeating the same key returns the original job rather than starting a second one.
curl -X POST https://pepys.co/api/v1/transcriptions \
-H "Authorization: Bearer pk_live_…" \
-H "Idempotency-Key: my-unique-id" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/episode.mp3",
"diarize": true,
"summary": true,
"language": "en"
}'
# → 202 { "id": "…", "status": "queued", "url": "/api/v1/transcriptions/…" }Options
language takes an ISO code; omit it to auto-detect. diarize detects speakers and is billed at 3× on long-form. summary and chapters add the AI extras. translate_to takes an ISO code and also returns a translation. quality selects fast or accurate.
When a job is already done
A cached source, or one that arrives with provider captions already attached, returns 200 with status: "done" immediately instead of queueing. Treat that as success and read the transcript straight away rather than polling.
What comes next
The response id is what you poll with Get a transcription, or what a webhook tells you about when the job finishes. Whole podcast feeds can be started in one call with the podcasts endpoints.