---
title: "Dubbing API Reference"
section: "Dubbing"
order: 1
sidebarLabel: "API Reference"
---
## Overview
The Dubbing API is an asynchronous dubbing service. Submit an audio or video URL, and receive a fully dubbed file in your target language.
- **Pricing:** $0.50 per minute of input media
- **Max duration:** 10 minutes
- **Max file size:** 500 MB
- **Min duration:** 1 second
- **Supported languages:** English (`en`), Spanish (`es`), French (`fr`), German (`de`), Italian (`it`), Portuguese (`pt`), Russian (`ru`), Japanese (`ja`), Korean (`ko`), Chinese (`zh`)
## Supported Formats
### Input requirements
#### Video files
| Constraint | Accepted values |
|---|---|
| **Containers** | MP4, MOV, MKV, WebM, AVI, FLV, TS |
| **Video codecs** | H.264, H.265/HEVC, VP8, VP9, AV1, ProRes, MPEG-4 |
| **Audio codecs** | AAC, MP3, Opus, Vorbis, PCM, FLAC, AC-3 |
| **Audio** | Must contain at least one audio track with speech |
#### Audio files
| Constraint | Accepted values |
|---|---|
| **Formats** | WAV, MP3, FLAC, OGG, M4A, AAC, WMA |
| **Audio** | Must contain speech |
The input must contain audible speech in a [supported language](#overview). Background music, sound effects, and multiple speakers are all handled automatically.
### Output format
The output format depends on the input type:
- **Video input** -- returned as **MP4** (H.264 video + AAC audio at 192 kbps). Resolution and frame rate match the input.
- **Audio-only input** -- returned as **MP3** (192 kbps) or **WAV** depending on the input format.
The output URL is a presigned S3 link valid for 48 hours.
### Providing a source URL
The `source_url` must be a publicly accessible HTTP(S) URL that returns the media file directly (not an HTML page). Good options:
- **Pinch upload endpoint** — Use the [Upload Media](#upload-media-optional) endpoint to get a presigned S3 URL. This is the simplest approach.
- **Your own S3 bucket** — Generate a presigned GET URL with a long enough expiry (we recommend at least 1 hour):
```python
import boto3
s3 = boto3.client("s3")
url = s3.generate_presigned_url(
"get_object",
Params={"Bucket": "my-bucket", "Key": "media/input.mp4"},
ExpiresIn=3600,
)
```
- **Other cloud storage** — Any direct download URL works (Google Cloud Storage signed URLs, Azure Blob SAS URLs, Cloudflare R2 presigned URLs, etc.)
- **CDN / public URL** — Direct links to media files (e.g., `https://cdn.example.com/video.mp4`)
> **Note:** Private network URLs (localhost, internal IPs) are rejected for security. The URL must resolve to a public IP address.
## Authentication
All API requests require authentication using a Bearer token in the `Authorization` header.
Authorization header
Authorization: Bearer <your-api-token>
**Base URL:** `https://api.startpinch.com`
## Endpoints
### Upload Media (optional)
Returns a presigned S3 PUT URL for direct upload. Use this if you need to upload a local file before creating a dubbing job.
POST/api/dubbing/upload-url
Playground: enter your API key + fields below, then send a real request and inspect the JSON response.
**Response Fields:**
| Field | Type | Description |
| --- | --- | --- |
| `upload_url` | string | Presigned S3 PUT URL for uploading the file |
| `source_url` | string | The URL to use as `source_url` when creating a dubbing job |
| `upload_id` | string | Unique identifier for this upload |
| `max_file_size_bytes` | number | Maximum allowed file size in bytes (500 MB) |
| `expires_in_sec` | number | Seconds until the upload URL expires |
---
### Create Dubbing Job
Submit an audio or video file for dubbing. The file will be processed asynchronously.
POST/api/dubbing/jobs
Playground: enter your API key + fields below, then send a real request and inspect the JSON response.
**Parameters:**
| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `source_url` | string | Yes | URL of the audio or video file to dub (public URL or from upload endpoint) |
| `target_lang` | string | Yes | Target language code (`en`, `es`, `fr`, `de`, `it`, `pt`, `ru`, `ja`, `ko`, `zh`) |
| `source_lang` | string | No | Source language code or `"auto"` for auto-detection (default: `"auto"`) |
| `reduce_accent` | boolean | No | Reduce source language accent in dubbed audio. When set to True, produces more natural target language pronunciation at the cost of slightly less voice similarity. (default: `false`) |
| `translation_lag_time` | number | No | Seconds to delay translated speech after original segment start. Useful for a "live interpreter" effect. Range: 0–3. (default: `0`) |
| `original_speech_volume` | number | No | Mix original speech back in at this volume (0 = off, 0.1 = background voice, 1 = full volume). Useful for a "live interpreter" effect. Range: 0–1.(default: `0`) |
#### Response (201 Created)
**Response Fields:**
| Field | Type | Description |
| --- | --- | --- |
| `job_id` | string | Unique identifier for the dubbing job |
| `status` | string | Current job status (initially `"pending"`) |
| `source_lang` | string | Source language (or `"auto"` if auto-detecting) |
| `target_lang` | string | Target language code |
| `created_at` | string | ISO 8601 timestamp of job creation |
| `limits` | object | Job limits applied |
| `limits.max_duration_sec` | number | Maximum input duration in seconds |
| `limits.max_file_size_bytes` | number | Maximum file size in bytes |
---
### Get Job Status
Poll this endpoint to track the progress of a dubbing job.
GET/api/dubbing/jobs/{id}
Playground: enter your API key + job ID below, then send a real request and inspect the JSON response.
**Response Fields:**
| Field | Type | Description |
| --- | --- | --- |
| `job_id` | string | Unique identifier for the dubbing job |
| `status` | string | Current status (see Status Flow below) |
| `source_lang` | string | Source language |
| `target_lang` | string | Target language code |
| `error` | string or null | Error message if status is `"failed"` |
| `progress` | object | Progress details (stage and percent) |
| `input_duration_sec` | number | Duration of the input media in seconds |
| `cost_usd` | number | Cost charged for this job in USD |
| `output_url` | string or null | Presigned download URL (available when `"completed"`) |
| `output_expires_at` | string or null | ISO 8601 expiry time of the download URL |
| `created_at` | string | ISO 8601 timestamp of job creation |
| `updated_at` | string | ISO 8601 timestamp of last update |
---
### List Jobs
Retrieve a paginated list of your dubbing jobs.
GET/api/dubbing/jobs?limit=20&offset=0
Playground: enter your API key below, then send a real request and inspect the JSON response.
**Response Fields:**
| Field | Type | Description |
| --- | --- | --- |
| `jobs` | array | Array of job summary objects |
| `total` | number | Total number of jobs |
| `limit` | number | Limit used in the query |
| `offset` | number | Offset used in the query |
---
### Get Download URL (refresh)
Generates a fresh presigned download URL for a completed dubbing job. Use this if the original `output_url` has expired.
GET/api/dubbing/jobs/{id}/result
Playground: enter your API key + job ID below, then send a real request and inspect the JSON response.