Endpoints
Base URL
https://dublab.app/api/v2
All endpoints use the apikey header (or Authorization: Bearer) and
snake_case fields. See Authentication for keys.
Endpoint Summary
| Method | Path | Description |
|---|---|---|
| GET | /api/v2/me | Profile and credit balance |
| POST | /api/v2/dubs | Create a dub — file upload or source_url |
| GET | /api/v2/dubs | List your dubs, paginated |
| GET | /api/v2/dubs/ | A single dub with download links |
Workflow
POST /dubs (file or source_url) → poll GET /dubs/{id} → read `outputs`
- Create:
POST /api/v2/dubswith afileupload or asource_url. - Poll:
GET /api/v2/dubs/{id}untilexternal_status_id = 5(Completed). - Download: read the
outputsmap on the dub — signed URLs are included directly on the List and Dub Details responses (no separate call).
Status Codes (external_status_id)
| external_status_id | Meaning |
|---|---|
| 1 | Uploading |
| 2 | In Queue |
| 3 | Processing |
| 4 | Failed |
| 5 | Completed |
The public status surface is 1–5 (the pipeline tracks a separate internal
status not returned by the API).
Output types
outputs is a map of { <type>: { url, download_url } }. url is inline-viewable,
download_url forces a file download. Both are presigned and expire ~1 hour after
the response. The map is empty until the dub completes.
| Type | Meaning |
|---|---|
| translated_mp4 | Dubbed video (MP4) |
| translated | Dubbed video (pipeline format) |
| translated_mp3 | Dubbed audio (MP3) |
| translated_subtitle | Subtitles in the target language |
| original / original_mp4 | Original uploaded video |
| original_mp3 | Original audio |
| original_subtitle | Subtitles in the source language |
| poster | Thumbnail image |
Error Handling
All errors return { "error": "message" } with an appropriate HTTP status code:
| Status | Meaning |
|---|---|
| 400 | Bad request — missing or invalid parameters |
| 401 | Unauthorized — missing or invalid API key |
| 402 | Payment required — insufficient credit balance |
| 404 | Not found — dub or user doesn't exist |
| 413 | Payload too large — file exceeds the 1 GB limit |
| 502 | Bad gateway — processing backend unavailable |
| 500 | Internal server error |
Notes
- Billing: credits are charged once on completion, against the server-measured
output duration (
measured_duration), not thedurationyou submit. - Multiple target languages = multiple
POST /dubscalls (one perdest_lang).