Skip to main content
The Voice Translate Job API translates pre-recorded audio files asynchronously. You submit a file, poll a status endpoint until results are ready, then download them. This guide walks through the complete flow using a podcast episode as the example: one English MP3 in, German plain text and Spanish audio out. For live audio that needs low-latency results, see the real-time Voice API instead.
Closed alpha. This API is only available to select DeepL customers and may change without notice. See alpha and beta features for details.

Prerequisites

  • A DeepL API key with Voice Translate Job API access
  • curl for the API calls in this guide
  • An audio file to translate (MP3, WAV, or another supported format)
The examples below use https://api.deepl.com. API Free users should replace this with https://api-free.deepl.com.

Step 1: Create the job

Send a POST request to /v1/jobs/voice/translate with three pieces of information:
  • The source file’s name, size in bytes, and content type
  • The source language
  • One or more translation targets, each specifying a language and output type
The content_length must be the exact byte size of the file you will upload in the next step. A successful response returns HTTP 201 with a job_id, a one-time upload_url, and a signature:
Save the job_id — you need it to check status and retrieve results.

Step 2: Upload the source file

PUT the audio file directly to the upload_url from the previous response. You must complete the upload within 5 minutes of creating the job.
The Content-Type header must match the content_type you declared when creating the job.
Do not include your DeepL API key in the upload request. The upload_url is pre-authorized and expires after 5 minutes.

Step 3: Poll for status

Check the job status by sending a GET request to /v1/jobs/voice/translate/{job_id}. The API processes each target independently, so results may become available at different times.
While processing, the response looks like this:
Results appear in the same order as the targets in the create request. Poll at a reasonable interval — every 10-30 seconds is appropriate for audio files, since processing time scales with duration. When processing finishes, each completed result includes a download_url and signature:
A result’s status can be pending, uploaded, processing, complete, downloaded, or failed. See the status lifecycle for how these progress. A failed status on one target does not affect the others.

Step 4: Download the results

For each result with "status": "complete", download the output from its download_url. No authentication header is required — the URL is pre-authorized.
Download results promptly. Results expire 1 hour after the source file is uploaded, and are deleted once downloaded or expired. After deletion, the job returns 404.

Putting it together

Here is the complete flow as a Python script. It creates the job, uploads the file, polls until all results are complete or failed, then downloads each completed result.
translate_audio.py

Common issues

400 on job creation: The content_length must exactly match the file you will upload. Read the file size before sending the create request, don’t estimate it. Upload times out: The upload window is 5 minutes from job creation. If your file is large or your connection is slow, start the upload immediately after creating the job. Results expire before download: Download results within 1 hour of uploading the source file. If your polling loop is slow, check updated_at in the status response to estimate how much time remains. One target fails, others succeed: Failures are per-target. Check the error.message field on failed results and download the successful ones independently. For format support, per-language availability, and job limits, see the Translate Audio Files reference.