Overview
- The API separates job creation from file upload and uses pre-signed URLs for direct object storage access
- Job targets are tracked independently, each transitioning through its own status values
- Per-target results must be checked individually; partial failures do not affect other targets in the same job
Prerequisites
- A DeepL API key with Voice Translate Job access
- An audio file to translate (see supported source formats and limits)
curlfor the HTTP requests;wgetor any HTTP client for the download
Create a job
Send a POST request to/v1/jobs/voice/translate with the source file metadata and a list of targets. The API returns an upload URL for your audio file; it does not accept the file directly.
content_length must be the exact byte size of the file. The API uses this to pre-allocate the upload URL and rejects uploads that don’t match.
The response contains the job ID and a pre-signed upload URL:
job_id and upload_url. You have 5 minutes to complete the upload before the URL expires.
Upload the source file
PUT your audio file directly to theupload_url from the previous step. This is a direct upload to object storage, not to the DeepL API, so no authorization header is needed.
Content-Type header must match the content_type you declared when creating the job.
A successful upload returns HTTP 200 with an empty body. Processing starts automatically once the upload is complete.
Poll for status
Check the job status by sending a GET request to/v1/jobs/voice/translate/{job_id}. Results for each target are returned in the same order as the targets in your create request.
processing status:
complete or failed. See the status lifecycle reference for the full set of intermediate statuses. When a target reaches complete, its result object includes a download_url:
status field before attempting to download.
Download results
Fetch each completed result from itsdownload_url. Like the upload, this is a direct request to object storage, so no authorization header is needed (access is controlled by the pre-signed URL itself).
.pcm, .mp3, .wav, etc.).
Full example script
This Python script runs all four steps end to end. Replace the placeholder values with your own.This is a minimal example. It reads the full audio file into memory, which is not suitable for large files. Production code should open the file in streaming mode rather than loading it all at once.
translate_audio.py
Next steps
- Check the status lifecycle, limits, and supported formats for the full list of input and output audio types
- For live audio, see the Real-Time Voice Quickstart
- Review the Create Job and Get Job Status endpoint references for complete request and response schemas