Audio transcription
Whisper-class speech-to-text. Multipart audio upload, plain-text or SRT/VTT subtitle output.
POST /api/v1/audio/transcriptions is mirrored at the
OpenAI-style alias /v1/audio/transcriptions. Multipart form
upload, up to 25 MB per file; a larger upload is rejected with
413 before it is processed. Uploads must be wav,
mp3, or flac — convert other formats first
(e.g. ffmpeg -i input.m4a output.wav). The file's contents
decide, not its name: any other format, including a browser recording
saved with an .mp3 name, is rejected with 400
and the message Unsupported audio format. Accepted formats: wav,
mp3, flac.
file
file
Required
wav, mp3, or flac).
model
string
Required
whisper-large-v3-turbo.
language
string
en, cy) to improve accuracy.
prompt
string
temperature
number
default: 0
0 for the most accurate,
fully deterministic transcript. Raising it makes the decoder sample instead
of searching, which also switches beam_size off — use it only
to shake a stuck or repeating transcript loose.
beam_size
integer
default: 5
1 decodes greedily, which is the fastest
option. Range 1–8. Leave it out to get the
accuracy-first default. Applies when temperature is
0 (the default).
response_format
string
default: json
json, text, srt, vtt, or verbose_json (timing metadata + optional word/segment timestamps).
timestamp_granularities
string[]
["segment"] and/or ["word"]. Only applies with response_format=verbose_json.
Response
The shape depends on response_format. The default
json returns { "text": ... } (see example).
text returns a plain UTF-8 string. verbose_json
adds timing and language metadata plus optional timestamps:
{
"task": "transcribe",
"language": "en",
"duration": 12.48,
"text": "We're starting the meeting now. First item on the agenda is the Q3 forecast.",
"segments": [
{ "id": 0, "start": 0.0, "end": 4.2, "text": "We're starting the meeting now.", "avg_logprob": -0.21, "no_speech_prob": 0.01 },
{ "id": 1, "start": 4.2, "end": 12.48, "text": "First item on the agenda is the Q3 forecast.", "avg_logprob": -0.18, "no_speech_prob": 0.02 }
]
}
Every transcription also names the worker that produced it: in the
X-Worker-Id and X-Worker-Name headers, and for the
JSON formats in a pendra field too
("pendra": {"worker": {"id": ..., "name": ..., "version": ...}, "request_id": ...}).
In the SDKs it's result.pendra.worker. See
Which worker served the request.
Subtitle output
Set response_format=srt (or vtt) for time-coded
captions. The body is the raw subtitle file:
1
00:00:00,000 --> 00:00:04,200
We're starting the meeting now.
2
00:00:04,200 --> 00:00:12,480
First item on the agenda is the Q3 forecast.
curl https://api.pendra.ai/api/v1/audio/transcriptions \
-H "Authorization: Bearer pdr_sk_..." \
-F file=@meeting.mp3 \
-F model=whisper-large-v3-turbo \
-F response_format=srt
Models
Transcription is built into every Pendra worker — no separate service to
install. Two Whisper-class models are available:
whisper-large-v3-turbo (fast, multilingual) and
whisper-large-v3 (highest accuracy).