Batch API

Get transcription job status or result (V2)

Recommended status and result operation for new direct HTTP integrations.

GET/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
x-api-key<token>

In: header

Path Parameters

job_id*string

Transcription job ID.

Query Parameters

save_result?boolean

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.

On this page