Synchronous transcription
The wait query parameter blocks a request until the job reaches a terminal state, so you can get a transcript in one call instead of polling. It applies to job creation, job status, and transcript retrieval.
wait is available on SaaS on Cloud only. It is not available on on-prem deployments.
wait takes a number of seconds and is capped server-side. If the job has not finished when wait elapses, the request returns the current state and you retry to keep waiting.
Create a job and wait for the transcript
Pass wait to POST /jobs to block until the job finishes. Add format to choose the embedded transcript format (json-v2, txt, or srt; defaults to json-v2).
API_KEY="YOUR_API_KEY"
PATH_TO_FILE="example.wav"
# Create a job and block for up to 60 seconds for a plain-text transcript
curl -L -X POST "https://eu1.asr.api.speechmatics.com/v2/jobs/?wait=60&format=txt" \
-H "Authorization: Bearer ${API_KEY}" \
-F data_file=@${PATH_TO_FILE} \
-F config='{"type": "transcription","transcription_config": { "model": "enhanced", "language": "en" }}'
The response is always HTTP 201. When wait is set, it includes a status field reporting the outcome. On done, the transcript is embedded under a key named after the requested format. For format=txt (and srt) the value is a string:
{
"id": "a1b2c3d4e5",
"status": "done",
"txt": "Welcome to Speechmatics..."
}
For the default format=json-v2, the value is a nested object with the same shape as the transcript endpoint response, not a string. The results array is abbreviated below:
{
"id": "uwcl3jevp3",
"status": "done",
"json-v2": {
"format": "2.9",
"job": {
"created_at": "2026-06-23T13:33:24.230Z",
"data_name": "example.wav",
"duration": 10,
"id": "uwcl3jevp3"
},
"metadata": {
"created_at": "2026-06-23T13:33:24.879071Z",
"transcription_config": { "language": "en", "model": "enhanced" },
"type": "transcription"
},
"results": [
{
"alternatives": [
{ "confidence": 1.0, "content": "I", "language": "en", "speaker": "UU" }
],
"start_time": 1.5,
"end_time": 1.79,
"type": "word"
}
]
}
}
If the job is still running when wait elapses, status is created and no transcript is embedded:
{
"id": "a1b2c3d4e5",
"status": "created"
}
status reports the outcome of the wait, which is distinct from the job lifecycle status:
The embedded transcript is best-effort. If status is done but no transcript key is present, fetch it from the transcript endpoint.
Wait when checking job status
Pass wait to GET /jobs/{jobid} to block until the job reaches a terminal state.
# Wait up to 30 seconds for the job to reach a terminal state
curl -L -X GET "https://eu1.asr.api.speechmatics.com/v2/jobs/${JOB_ID}?wait=30" \
-H "Authorization: Bearer ${API_KEY}"
The response is always HTTP 200 with the job in its current state. If the job is still running when wait elapses, retry to keep waiting.
Wait for the transcript
Pass wait to GET /jobs/{jobid}/transcript to block until the transcript is ready.
# Wait up to 30 seconds for the transcript, then return it as plain text
curl -L -X GET "https://eu1.asr.api.speechmatics.com/v2/jobs/${JOB_ID}/transcript?wait=30&format=txt" \
-H "Authorization: Bearer ${API_KEY}"
If the transcript becomes ready within wait, the response is HTTP 200 with the transcript. Otherwise it returns the usual HTTP 404, and you retry to keep waiting.
Next steps
- Output formats — load and process the transcript.
- API reference — full request and response details.