Search the documentation

Pick a page and open it with Enter.

Transcribe

Turn a recording into text (multipart).

POST/api/v1/transcribe

Turns a recording into text. Multipart in, JSON out. The language is detected — you never have to pick one first, and a sentence that switches mid-way still comes back whole.

Form fields

filefilerequired

The recording. webm/opus, mp4, ogg, mp3, wav and flac all work — send what the browser recorded, no conversion needed. Up to 25 MB.

modelstring

An id from GET /transcribe/models. Left out, the server uses TRANSCRIBE_MODEL. This is also what decides whether the recording leaves the machine: whisper-local keeps it here, everything else goes to OpenAI.

languagestring

ISO code such as de or en. Normally unnecessary — the model detects it. Set it only when you already know, to skip the detection step.

Example

bash
curl -X POST http://localhost:8000/api/v1/transcribe \
  -F "file=@recording.webm" \
  -F "model=gpt-transcribe"

Response

json
{
  "text": "Hallo, das ist ein Test der Transkription.",
  "language": "de",
  "duration_ms": 3200,
  "model": "gpt-transcribe"
}
textstring

The transcript as one flowing string.

languagestring | null

What the model heard, not what you asked for. null when the model does not report it — whisper-1 in plain JSON, for instance.

duration_msinteger

Length of the recording in milliseconds, where the model reports it.

modelstring

Which entry actually did the work.

Availability

GET /api/v1/transcribe answers whether it can work at all, without sending a recording: { available, reason, model }. Pass ?model= to ask about a specific one — the answer differs, since whisper-local needs two programs installed and the hosted ones need a key. The frontend asks once on load and hides the microphone when the answer is no, rather than showing a button that is certain to fail.

200

Transcribed successfully.

422

The recording was empty, too large, or could not be decoded.

503

Transcription is disabled (TRANSCRIBE_ENABLED=false).