Prerequisites
- A DeepL API account with Voice Translate Job API access
- Your DeepL API key (set as
DEEPL_API_KEYin the examples below) - A pre-recorded audio file in a supported format
https://api.deepl.com. API Free users call https://api-free.deepl.com instead.
The four-step workflow
Every translation follows the same pattern:- Create a job to declare your source file and desired outputs. The API returns an upload URL.
- Upload your audio file directly to that URL.
- Poll for status until all targets are complete (or failed).
- Download each result from its download URL.
Step 1: Create a job
Send a POST request to/v1/jobs/voice/translate with the source file metadata and your desired translation targets.
The content_length and content_type fields in source_file must match your actual file exactly. The API uses them to provision a pre-signed upload URL, so mismatches will cause the upload in step 2 to fail.
job_id, an upload_url, and a signature:
job_id for polling and the upload_url for the next step. You have 5 minutes to complete the upload before the URL expires.
Each job can have multiple targets in different output types, so a single English recording can produce a German transcript, French subtitles, and Spanish audio in one request. See the Translate Audio Files reference for the full list of output types and supported languages.
Step 2: Upload your audio file
PUT your audio file to theupload_url returned in step 1. Set Content-Type to the same value you declared in source_file.content_type.
Do not include your DeepL API key in the upload request. The URL is pre-signed and only requires the Content-Type header. Adding an Authorization header will cause the request to fail.
200 OK response with no body means the upload succeeded. Processing starts automatically once the file is received.
Step 3: Poll for status
Check the job status by sending a GET request to/v1/jobs/voice/translate/{job_id}. Each target in the results array has its own status field that progresses independently.
download_url and signature:
targets array in your create request, so results[0] corresponds to targets[0].
Poll every 10-30 seconds for files under 100 MB. Larger files or longer recordings may take several minutes. Keep polling until every result has reached a terminal status: complete, failed, or downloaded.
Step 4: Download results
For each target withstatus: complete, download the result from its download_url. No authentication header is needed — the URL is pre-signed.
downloaded and the asset is queued for deletion. You have 1 hour from the time the upload completes to download all results. After that window, or once all results are downloaded, the job is deleted and returns 404.
Handling partial failures
Individual targets can fail while others succeed. Check each result’sstatus independently and handle failed results by reading the error.message field. You cannot retry a failed target within an existing job; you need to create a new job.