API reference · Upload
Create a job and get a presigned upload URL
Creates the job and returns a URL to PUT the audio to. The job is not queued until /api/v1/upload/complete is called. Rate limit: 120 requests per minute.
This request is NOT safe to retry blindly: the job is created the moment the server handles it, so a retry after an ambiguous failure creates a second job for the same audio. The official SDKs retry it only on a connect timeout or a 429.
Authenticate with your key in the X-API-Key header — Authentication.
Request body
Required. application/json
- model string default: zephyr
The transcription model. One today.
- output_type string default: json
Format of the stored transcript at
download_url.One of
json,txt,srt,vtt,docx,pdf - word_timestamps boolean default: true
Per-word start and end times.
- speaker_labels boolean default: true
Diarize, labelling turns
SPEAKER_1,SPEAKER_2and so on, dense and numbered from one in order of first appearance. - nltk boolean default: true
Punctuation and sentence segmentation.
- custom_vocabulary string[] | null
Domain terms to bias towards — names, jargon, product names.
- callback_url string (uri) | null
Webhook to POST on completion or permanent failure. The body is signed with HMAC-SHA256 in
X-SR-Signature, and carriesX-SR-EventandX-SR-Delivery. - file_size integer | null
Size in bytes of the file you are about to upload. Used to plan the upload; the real size is checked at complete.
- audio_url string (uri) | null
Fetch the audio from here instead of uploading it. When set, no
upload_urlis returned and the job is queued immediately.
Responses
- 200 Job created.
- 400 The request was understood but cannot be acted on — for example, completing an upload whose bytes never arrived.
- 401 Missing, malformed or revoked API key.
- 402 The account is out of credit. Top up, or turn on auto-recharge, and retry. Reads and cancellations keep working.
- 413 The file exceeds the limit for this route: 10 GB through the upload routes, 200 MB streaming to
/api/v1/transcribe. - 422 A field is missing or the wrong type. The body names the offending field.
- 429 Too many requests for this endpoint. Back off and retry; the official SDKs do this for you.
200 response fields
- job_id string (uuid) required
- upload_url string (uri) | null
PUT the audio here. Null when
audio_urlwas given. - download_url string (uri) required
Where the finished transcript will be readable.
- content_type string required
The Content-Type to send with the PUT. The signature covers it, so it must match exactly.
- expires_in integer required
Seconds until the presigned URLs expire.
Related endpoints
- Keep a pending upload alive POST /api/v1/upload/progress
- Enqueue the job once the bytes are uploaded POST /api/v1/upload/complete