- Plain text transcripts (
text/plain) - SRT subtitles (
application/x-subrip) — preserves the original timecodes - Translated speech audio — speech-to-speech in a range of audio and video container formats (see the Reference for the full list)
Workflow
Translating an audio file is a four-step process. The examples below use the API Pro endpointhttps://api.deepl.com. API Free users should use https://api-free.deepl.com instead.
1
Create Job
Make aPOST request to /v1/jobs/voice/translate with file metadata, processing parameters, and translation targets.The response includes a job_id, an upload_url, and an upload signature for authenticating the upload. (A separate result signature is returned per target later, in step 3.)- cURL
- HTTP Request
Example request
Example response
2
Upload File
Upload the source audio file to theupload_url returned in step 1.- cURL
- HTTP Request
Upload with authorization header (recommended)
204 No Content with an empty body. The Content-Type: application/octet-stream on the PUT is just for transport; the asset host stores the body as opaque bytes. The audio MIME type from source_file.content_type in the create request is what’s used for processing.See Choosing an Authentication Method for details on the two upload options.3
Poll Status
PollGET /v1/jobs/voice/translate/{job_id} until every result reaches complete, downloaded, or failed. We recommend polling every 5 seconds.The results array is parallel to targets: results[i] is the outcome for targets[i]. When a result reaches complete, it includes its own download_url and result signature — distinct from the upload signature returned by the create endpoint, and distinct per target. complete becomes downloaded only after you fetch the result; it does not transition on its own, so it’s safe to stop polling at complete.- cURL
- HTTP Request
Example request
Example response: processing
Example response: complete with mixed results
4
Download Result
Download each completed result using thedownload_url and result signature from that result entry in the poll response. Each completed target has its own pair; signatures are not interchangeable across targets, and the upload signature from step 1 cannot be used here.- cURL
- HTTP Request
Download with authorization header (recommended)
200 OK with the translated file as the binary response body.After a result is downloaded, its status changes to downloaded and the assets are marked for deletion. See Choosing an Authentication Method for details on the two download options.Complete Example
The following Python script runs all four steps end-to-end: it creates a job, uploads the source file, polls until every target reaches a terminal state, and downloads each completed result.complete_example.py
DEEPL_AUTH_KEY=... python complete_example.py.
Choosing an Authentication Method
There are two ways to authenticate uploads and downloads. The default is theAuthorization: DeepL-Signature {signature} header, which the workflow examples above use. The alternative is a pre-signed URL, opted into per request with ?include=signed_url.
Both methods use the same time-limited windows: 5 minutes for upload after job creation, 1 hour for download after upload. The
signature and signed URL stop working when those windows close.
Pre-signed URL example
Add?include=signed_url to the create or poll request to receive pre-signed URLs alongside the regular ones.
Create with signed URL
Response includes signed_upload_url
Upload using the signed URL (no auth header)
?include=signed_url to the poll request, and each completed result will also include signed_download_url.
Next Steps
Now that you understand how to translate audio files asynchronously:- Create a job: Review the Create Job endpoint reference for the full request and response schema
- Poll job status: Review the Get Job Status endpoint reference for the full response schema
- Look up limits and formats: See the Reference for status values, limits, supported audio formats, languages, and output formats
- Try realtime translation: Use the Voice API for streaming audio translation over WebSocket instead of batch processing