The Voice Translate Job API translates pre-recorded audio files asynchronously. You submit a file, poll for completion, and download one or more outputs — plain text transcripts, SRT subtitles, or translated speech audio — in any combination of target languages. This guide walks you through the complete workflow with a real English MP3 podcast episode translated into German text and Spanish audio.
For live audio, see the Real-Time Voice Quickstart instead.
Closed alpha. This API is only available to select DeepL customers and may change without notice. Contact your customer success manager to request access.
Prerequisites
- A DeepL API account with Voice Translate Job API access
- Your DeepL API key
- An audio file to translate (see supported source formats)
curl and jq installed, or a language environment of your choice
The workflow at a glance
Translating an audio file takes four steps:
- Create a job — get back an upload URL and a job ID
- Upload your audio file to the upload URL
- Poll the job status until all targets are
complete (or failed)
- Download each result using its
download_url
The examples below use https://api.deepl.com (API Pro). If you’re on API Free, replace that with https://api-free.deepl.com.
Step 1: Create a job
Send a POST request with your source file metadata and the list of outputs you want. You must declare the file’s content_length and content_type upfront — these are used to pre-authorize the upload.
A successful response returns a job ID, an upload URL, and a signature:
Save the job_id — you’ll need it to poll for status. The upload_url is a pre-signed URL valid for 5 minutes. If you miss the window, you’ll need to create a new job.
Each entry in targets is independent. A single job can produce any combination of output types and languages — one job, multiple results.
Step 2: Upload your audio file
PUT the file directly to the upload_url from step 1. Include the Content-Type header matching the content_type you declared when creating the job.
A successful upload returns an HTTP 200 with no body. Once the file is received, processing begins automatically — you don’t need to trigger it separately.
The Content-Type on the upload request must exactly match content_type in your job creation request. A mismatch will cause the upload to fail.
Step 3: Poll for status
Poll GET /v1/jobs/voice/translate/{job_id} until all targets reach a terminal status (complete, failed, or downloaded). Each target is processed independently, so some may finish before others.
While processing, targets show status: processing:
When a target completes, its result includes a download_url and signature:
Results appear in the same order as the targets array in your create request. A failed target does not affect other targets in the same job — if the German text completes successfully, its download_url is available even if the Spanish audio fails.
A reasonable polling strategy is to start with a 5-second interval and back off to 30 seconds for larger files. Results expire 1 hour after the upload completes, so don’t wait too long to download them.
Step 4: Download results
Fetch each completed result using its download_url:
The download URL does not require your API key — authentication is embedded in the pre-signed URL itself. After you download a result, its status transitions to downloaded and DeepL marks the asset for deletion. Download each result only once, or save it locally before processing.
Putting it all together
Here’s the complete flow as a shell script:
Common issues
Upload returns 403 or 400: Check that the Content-Type header on the PUT request matches the content_type you declared in the create request. Also verify you’re using the full upload_url from the response, not a reconstructed URL.
Job returns 404: Either the job ID is wrong, or the job has expired and been deleted. Jobs are deleted after all results are downloaded or the result window closes.
A target fails with “processing failed”: The source audio may be corrupt, silent, or in an unsupported format. Verify the file plays correctly locally, and check the supported source formats.
File upload window expired: You have 5 minutes from job creation to complete the upload. If you miss it, create a new job.
Next steps