---
title: "Create a dubbing job"
method: POST
path: "/v1/dub"
tags: ["Dub"]
---

# Create a dubbing job

`POST /v1/dub`

## Request

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

Submit exactly one file or source_url as multipart form data. Requires dub:render. Choose a supported source and target language. GET /healthz/dub reports the currently available languages. Processing is asynchronous: keep the returned job_id and poll status_url until done or error.

## Response `202`

Dubbing job queued.

- DubJobCreated
  - `job_id` string, required
  - `status` 'queued', required
  - `status_url` string, required: Relative path on api.pyai.com. Requires the same product key.

## Other responses

- `400`: Invalid input, unsupported_target_lang, or missing_source (provide exactly one source).
- `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.
- `413`: file_too_large: upload exceeds the service limit.
- `415`: unsupported_media_type: use an audio or video file.
- `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/819d8e7c4d09?raw)
