Two batch surfaces. They are not interchangeable.
POST /v1/listen/prerecorded | POST /v1/transcribe | |
|---|---|---|
| Engine | Parakeet-TDT (streaming, chunk-pumped) | faster-whisper large-v3 (batch) |
| Shape | Synchronous — one response | Async job — submit / poll / result |
| Audio length | Short clips (≲ a few minutes) | 1 hour+ |
| Languages | 25 EU locales | 99 incl. tr, ar + all EU |
| Word timestamps | Yes | Yes |
| Diarization | Sortformer (4-speaker cap) | Pluggable — Sortformer or pyannote |
| Word hints / context | Keyword boost only | word_hints + context + medical lexicon |
| Webhook | No | callback_url |
Rule of thumb. Audio longer than a few minutes, or any need for Turkish/Arabic, multi-speaker labelling, or vocabulary biasing → use /v1/transcribe. The synchronous route stays for short clips and is unchanged.
Options ride as ONE JSON string in an options form field — not as separate -F fields. A flat -F 'language=de' is silently ignored and the job runs with defaults.
curl -X POST http://localhost:4600/v1/transcribe \
-F 'file=@consultation.wav' \
-F 'options={"language":"de","diarize":true,"medical_lexicon":true,"word_hints":["Ösophagusvarizen","Sankt Augustin"]}'
# → 202 {"job_id": "...", "status": "queued"}
# Remote URL: options live inline, in the SAME object as `url`
curl -X POST http://localhost:4600/v1/transcribe \
-H 'content-type: application/json' \
-d '{"url":"https://example.com/consultation.mp3","language":"de"}'
curl http://localhost:4600/v1/transcribe/$JOB_ID # status + progress
curl http://localhost:4600/v1/transcribe/$JOB_ID/result # DG Results envelopeRendered from the live request model — this table cannot drift from the code.
| Field | Default | Purpose |
|---|---|---|
language | — | |
context | — | |
word_hints | — | |
medical_lexicon | False | |
smart_format | True | |
term_correction | False | |
diarize | False | |
callback_url | — | |
url | — |
context and word_hints feed Whisper's initial_prompt, which conditions the decoder toward supplied spellings. This is the highest-leverage control for medical terms, surnames and place names. medical_lexicon=true appends the in-repo lexicon for the resolved locale. Biasing is a prior, not a guarantee — it raises the likelihood of a spelling, it does not force it.
The envelope is the same Deepgram-shaped Results frame the streaming path emits — see TypeScript.