---
title: "Get dubbing job status"
method: GET
path: "/v1/dub/jobs/{job_id}"
tags: ["Dub"]
---

# Get dubbing job status

`GET /v1/dub/jobs/{job_id}`

## Request

- Base URL: `https://api.pyai.com`
- URL: `https://api.pyai.com/v1/dub/jobs/{job_id}`
- Auth: one of:
  - HTTP bearer
  - API key in header `x-api-key`

Requires dub:render. Jobs belong to the calling organization. queued and running are nonterminal; done and error are terminal. Download outputs only after done. A failed job is returned as HTTP 200 with status error and error_code.

## Path parameters

- `job_id` string, required

## Response `200`

Current job state.

- DubJob
  - `job_id` string, required
  - `status` 'queued' | 'running' | 'done' | 'error', required
  - `billing` object
    - `status` 'pending' | 'charged' | 'not_charged', required
    - `charged_usd` number
    - `source_seconds` number: Source seconds counted for this generation, including only selected passages for a revision.
    - `pricing_version` string
  - `editable` boolean: True when completed passages can be reviewed, edited and regenerated.
  - `parent_job_id` string, nullable: Previous version for a passage revision.
  - `source_lang` string, nullable
  - `target_lang` string, nullable
  - `stage` string, nullable: Current processing stage, such as transcribe, refs, render or done. Do not treat stage names as a closed enum.
  - `progress` object
    - `done` integer
    - `total` integer
  - `source_seconds` number
  - `dubbed_seconds` number, nullable
  - `media_kind` 'audio' | 'video'
  - `segments` integer, nullable
  - `audio_url` string: Relative authenticated audio-download path; present after done.
  - `video_url` string: Relative authenticated video-download path; only present when a video output exists.
  - `outputs` object
    - `audio` object
      - `url` string
      - `format` 'wav'
    - `video` object
      - `url` string
      - `container` string, nullable
      - `media_type` string, nullable
  - `error` string, nullable: Failure detail when status is error.
  - `error_code` string: Stable failure code when status is error.

## Other responses

- `401`: Missing or invalid API key (`code: unauthorized`)
- `402`: Billing gate: org out of prepaid credit, per-key budget hit, or plan quota exhausted (`code: credit_exhausted | key_budget_exceeded | insufficient_quota`). Do not retry; add credit or raise the limit. A brand-new key may see this on its first call until the account is funded.
- `403`: The product key lacks dub:render.
- `404`: unknown_job: no matching job in the calling organization.
- `429`: Rate/concurrency limit or dub_busy. Retry with backoff.
- `503`: Dubbing is unavailable. Retry with backoff.

---

[API](https://skmtc.dev/pyai/apis/pyai-api.md) · [All operations](https://skmtc.dev/pyai/apis/pyai-api/llms.txt) · [OpenAPI document](https://skmtc.dev/pyai/apis/pyai-api/revisions/271a1539185b?raw)
