Get transcription job status or result (V2)
Recommended status and result operation for new direct HTTP integrations.
/transcribe/{job_id}Recommended status and result operation for new direct HTTP integrations.
Use the jobId returned by POST /transcribe/{lang} as job_id, call
this operation from a trusted backend, and send x-api-key.
A successful read returns { "message": "success", "data": ... }. Poll
data.status with a timeout on every request and one finite application
deadline. Continue only for queued and processing; stop on done,
failed, or cleared. Consume data.final_result and related result
fields only when status is done. cleared is terminal and means the
result is unavailable.
This V2 response is intended for direct HTTP integrations. JavaScript
and Python SDK 0.18.0 use the legacy V1 route and response shape.
With save_result=false (the default), a successful read of a done or
failed job can clear stored result fields after constructing the
response. A later read can therefore return cleared. Set
save_result=true when terminal retrieval must be repeatable. The API
does not define a retention duration.
Authorization
ApiKeyAuth In: header
Path Parameters
Transcription job ID.
Query Parameters
Preserve terminal result fields after this fetch. The default is
false. With false, a done or failed read can clear stored
result fields after returning them, and a later read can return
cleared. Set true before polling when the application must retry
or fetch the terminal result again. This option does not define a
retention duration.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -sS --fail-with-body --connect-timeout 10 --max-time 120 -X GET \ "https://example.com/transcribe/497f6eca-6276-4993-bfeb-53cbbbba6f08" \ -H "Origin: https://example.com"Transcription job
application/json
Job is queued
{
"message": "success",
"data": {
"id": "7f51f2c2-e7bc-41c8-a850-f848df2ddfc8",
"version": 1,
"created_at": "2025-12-29T08:00:00.000Z",
"updated_at": "2025-12-29T08:00:00.000Z",
"language": "en",
"audio_duration": 12.34,
"sample_rate_hz": 16000,
"status": "queued"
}
}Job is processing
{
"message": "success",
"data": {
"id": "7f51f2c2-e7bc-41c8-a850-f848df2ddfc8",
"version": 1,
"created_at": "2025-12-29T08:00:00.000Z",
"updated_at": "2025-12-29T08:00:02.000Z",
"language": "en",
"audio_duration": 12.34,
"sample_rate_hz": 16000,
"status": "processing"
}
}Job is complete
{
"message": "success",
"data": {
"id": "7f51f2c2-e7bc-41c8-a850-f848df2ddfc8",
"version": 1,
"created_at": "2025-12-29T08:00:00.000Z",
"updated_at": "2025-12-29T08:00:05.000Z",
"language": "en",
"audio_duration": 12.34,
"sample_rate_hz": 16000,
"status": "done",
"asr_result": "hello world",
"asr_word_segments": [
{
"start_time": 0,
"end_time": 0.45,
"word": "hello"
}
],
"diarization_segments": [
{
"start_time": 0,
"end_time": 1,
"speaker": "speaker-1"
}
],
"itn_result": null,
"itn_word_segments": null,
"itn_output_formats": null,
"redaction_result": null,
"redaction_word_segments": null,
"redaction_labels": "",
"final_result": "hello world",
"final_word_segments": [
{
"start_time": 0,
"end_time": 0.45,
"word": "hello"
}
]
}
}Job failed
{
"message": "success",
"data": {
"id": "7f51f2c2-e7bc-41c8-a850-f848df2ddfc8",
"version": 1,
"created_at": "2025-12-29T08:00:00.000Z",
"updated_at": "2025-12-29T08:00:05.000Z",
"language": "en",
"audio_duration": 12.34,
"sample_rate_hz": 16000,
"status": "failed"
}
}Stored result was cleared
{
"message": "success",
"data": {
"id": "7f51f2c2-e7bc-41c8-a850-f848df2ddfc8",
"version": 1,
"created_at": "2025-12-29T08:00:00.000Z",
"updated_at": "2025-12-29T08:00:06.000Z",
"language": "en",
"audio_duration": 12.34,
"sample_rate_hz": 16000,
"status": "cleared"
}
}Invalid job ID or save_result value
application/json
Invalid job ID
{
"error": "error.uuid.invalid",
"code": "VALIDATION_INVALID_UUID",
"detail": "error.uuid.invalid",
"job_id": "not-a-uuid",
"retryable": false,
"timestamp": "2026-01-15T10:30:00Z"
}Unauthorized
application/json
Example missing_key
{
"error": "auth.unauthorized",
"message": "unauthorized",
"code": "AUTH_UNAUTHORIZED",
"retryable": false,
"timestamp": "2026-01-15T10:30:00Z"
}The API key does not grant batch transcription access
application/json
Example scope_denied
{
"error": "error.api_key.scope_denied",
"code": "AUTH_FORBIDDEN",
"detail": "scope not permitted",
"retryable": false,
"timestamp": "2026-01-15T10:30:00Z"
}Transcription job not found
application/json
Example missing_job
{
"error": "error.transcription_job.get",
"code": "TRANSCRIPTION_JOB_NOT_FOUND",
"detail": "transcription job not found",
"job_id": "7f51f2c2-e7bc-41c8-a850-f848df2ddfc8",
"retryable": false,
"timestamp": "2026-01-15T10:30:00Z"
}Internal server error
application/json
Example internal
{
"error": "error.transcription_job.get",
"code": "SERVER_INTERNAL",
"detail": "error.transcription_job.get",
"retryable": true,
"timestamp": "2026-01-15T10:30:00Z"
}Next steps
Turn this lookup into a bounded poller: continue only for queued and processing, stop for every terminal state, and set save_result=true whenever a lost terminal response must be retrievable again.