diff --git a/api-reference/jobs-voice-translate.mdx b/api-reference/jobs-voice-translate.mdx new file mode 100644 index 0000000..248448e --- /dev/null +++ b/api-reference/jobs-voice-translate.mdx @@ -0,0 +1,374 @@ +--- +title: "Translate Audio Files" +sidebarTitle: "Overview" +description: "Translate pre-recorded audio files into text or audio in other languages using asynchronous jobs." +public: true +--- + + + **Alpha.** This API may change without notice. To request access, [submit a support request](https://support.deepl.com/hc/en-us/requests/new). See [alpha and beta features](/docs/resources/alpha-and-beta-features) for details. + + +The Voice Translate Job API provides asynchronous translation of audio files into text or audio in other languages. + +Unlike the [real-time Voice API](/api-reference/voice), which streams audio over a WebSocket connection, the Voice Translate Job API processes entire audio files asynchronously. This makes it suitable for pre-recorded content such as podcasts, meeting recordings, or media files up to 1 GB. + +Each job can produce multiple translation targets simultaneously. For example, a single English podcast can be translated into German text and Spanish audio in one job. + +For full request and response schemas, see the [Create Job](/api-reference/jobs-voice-translate/create-voice-translate-job) and [Get Job Status](/api-reference/jobs-voice-translate/get-voice-translate-job-status) endpoint references. + +## Workflow + +Translating an audio file is a four-step process: + + + + ### Create Job + Make a `POST` request to `/v1/jobs/voice/translate` with file metadata, processing parameters, and translation targets. + + The response includes a `job_id`, an `upload_url`, and a `signature` for authenticating the upload. + + + + The examples below use our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead. + + ```sh Example request + curl -X POST 'https://api.deepl.com/v1/jobs/voice/translate' \ + --header 'Authorization: DeepL-Auth-Key [yourAuthKey]' \ + --header 'Content-Type: application/json' \ + --data '{ + "source_file": { + "name": "podcast-episode-42.mp3", + "content_type": "audio/mpeg", + "content_length": 15728640 + }, + "parameters": { + "source_language": "en" + }, + "targets": [ + { "language": "de", "type": "text/plain" }, + { "language": "es", "type": "audio/pcm;encoding=s16le;rate=16000" } + ] + }' + ``` + + ```json Example response + { + "job_id": "a74d88fb-ed2a-4943-a664-a4512398b994", + "upload_url": "https://assets.deepl.com/collections/a74d88fb-.../assets/b1c2d3e4-...", + "signature": "eyJhbGciOiJIUzI1NiIs..." + } + ``` + + + The examples below use our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead. + + ```http Example request + POST /v1/jobs/voice/translate HTTP/2 + Host: api.deepl.com + Authorization: DeepL-Auth-Key [yourAuthKey] + Content-Type: application/json + + { + "source_file": { + "name": "podcast-episode-42.mp3", + "content_type": "audio/mpeg", + "content_length": 15728640 + }, + "parameters": { + "source_language": "en" + }, + "targets": [ + { "language": "de", "type": "text/plain" }, + { "language": "es", "type": "audio/pcm;encoding=s16le;rate=16000" } + ] + } + ``` + + ```json Example response + { + "job_id": "a74d88fb-ed2a-4943-a664-a4512398b994", + "upload_url": "https://assets.deepl.com/collections/a74d88fb-.../assets/b1c2d3e4-...", + "signature": "eyJhbGciOiJIUzI1NiIs..." + } + ``` + + + + See the [Create Job endpoint reference](/api-reference/jobs-voice-translate/create-voice-translate-job) for the full request and response schema. + + + ### Upload File + Upload the source audio file to the `upload_url` returned in step 1. + + + + ```sh Upload with authorization header (recommended) + curl -X PUT '{upload_url}' \ + --header 'Authorization: DeepL-Signature {signature}' \ + --header 'Content-Type: application/octet-stream' \ + --data-binary @podcast-episode-42.mp3 + ``` + + + ```http Upload with authorization header (recommended) + PUT {upload_url} HTTP/2 + Authorization: DeepL-Signature {signature} + Content-Type: application/octet-stream + + [binary audio data] + ``` + + + + See [Choosing an authentication method](#choosing-an-authentication-method) for details on the two upload options. + + + ### Poll Status + Poll `GET /v1/jobs/voice/translate/{job_id}` until all targets reach a terminal status (`complete`, `downloaded`, or `failed`). We recommend polling every 5 seconds. + + + + The examples below use our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead. + + ```sh Example request + curl 'https://api.deepl.com/v1/jobs/voice/translate/a74d88fb-ed2a-4943-a664-a4512398b994' \ + --header 'Authorization: DeepL-Auth-Key [yourAuthKey]' + ``` + + ```json Example response: processing + { + "job_id": "a74d88fb-ed2a-4943-a664-a4512398b994", + "product": "voice", + "operation": "translate", + "created_at": "2026-10-01T01:03:03.444Z", + "updated_at": "2026-10-01T04:03:03.333Z", + "usage": { "storage_used": 31457280 }, + "source_file": { + "name": "podcast-episode-42.mp3", + "content_type": "audio/mpeg", + "content_length": 15728640 + }, + "parameters": { "source_language": "en" }, + "targets": [ + { "language": "de", "type": "text/plain" }, + { "language": "es", "type": "audio/pcm;encoding=s16le;rate=16000" } + ], + "results": [ + { "status": "processing" }, + { "status": "processing" } + ] + } + ``` + + ```json Example response: complete with mixed results + { + "job_id": "a74d88fb-ed2a-4943-a664-a4512398b994", + "product": "voice", + "operation": "translate", + "created_at": "2026-10-01T01:03:03.444Z", + "updated_at": "2026-10-01T04:03:03.333Z", + "usage": { "storage_used": 31457280 }, + "source_file": { + "name": "podcast-episode-42.mp3", + "content_type": "audio/mpeg", + "content_length": 15728640 + }, + "parameters": { "source_language": "en" }, + "targets": [ + { "language": "de", "type": "text/plain" }, + { "language": "es", "type": "audio/pcm;encoding=s16le;rate=16000" } + ], + "results": [ + { + "status": "complete", + "download_url": "https://assets.deepl.com/collections/a74d88fb/assets/c3d4e5f6", + "signature": "eyJhbGciOiJIUzI1NiIs..." + }, + { + "status": "failed", + "error": { "message": "processing failed" } + } + ] + } + ``` + + + The examples below use our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead. + + ```http Example request + GET /v1/jobs/voice/translate/a74d88fb-ed2a-4943-a664-a4512398b994 HTTP/2 + Host: api.deepl.com + Authorization: DeepL-Auth-Key [yourAuthKey] + ``` + + ```json Example response: processing + { + "job_id": "a74d88fb-ed2a-4943-a664-a4512398b994", + "product": "voice", + "operation": "translate", + "created_at": "2026-10-01T01:03:03.444Z", + "updated_at": "2026-10-01T04:03:03.333Z", + "usage": { "storage_used": 31457280 }, + "source_file": { + "name": "podcast-episode-42.mp3", + "content_type": "audio/mpeg", + "content_length": 15728640 + }, + "parameters": { "source_language": "en" }, + "targets": [ + { "language": "de", "type": "text/plain" }, + { "language": "es", "type": "audio/pcm;encoding=s16le;rate=16000" } + ], + "results": [ + { "status": "processing" }, + { "status": "processing" } + ] + } + ``` + + ```json Example response: complete with mixed results + { + "job_id": "a74d88fb-ed2a-4943-a664-a4512398b994", + "product": "voice", + "operation": "translate", + "created_at": "2026-10-01T01:03:03.444Z", + "updated_at": "2026-10-01T04:03:03.333Z", + "usage": { "storage_used": 31457280 }, + "source_file": { + "name": "podcast-episode-42.mp3", + "content_type": "audio/mpeg", + "content_length": 15728640 + }, + "parameters": { "source_language": "en" }, + "targets": [ + { "language": "de", "type": "text/plain" }, + { "language": "es", "type": "audio/pcm;encoding=s16le;rate=16000" } + ], + "results": [ + { + "status": "complete", + "download_url": "https://assets.deepl.com/collections/a74d88fb/assets/c3d4e5f6", + "signature": "eyJhbGciOiJIUzI1NiIs..." + }, + { + "status": "failed", + "error": { "message": "processing failed" } + } + ] + } + ``` + + + + See the [Get Job Status endpoint reference](/api-reference/jobs-voice-translate/get-voice-translate-job-status) for the full response schema. + + + ### Download Result + Download completed results using the `download_url` and `signature` from the poll response. + + + + ```sh Download with authorization header (recommended) + curl '{download_url}' \ + --header 'Authorization: DeepL-Signature {signature}' \ + --output translated-output.txt + ``` + + + ```http Download with authorization header (recommended) + GET {download_url} HTTP/2 + Authorization: DeepL-Signature {signature} + ``` + + + + After a result is downloaded, its status changes to `downloaded` and the assets are marked for deletion. See [Choosing an authentication method](#choosing-an-authentication-method) for details on the two download options. + + + +## Choosing an authentication method + +By default, the API returns an unsigned `upload_url` and `download_url`. Use the `Authorization: DeepL-Signature {signature}` header to authenticate uploads and downloads. Both methods use time-limited credentials. + +If you need to delegate uploads or downloads to browsers, mobile clients, or other systems that cannot set custom headers, pass `?include=signed_url` to the create or poll request to get pre-signed URLs instead. + + + Use the `Authorization` header by default. A leaked signed URL could allow an attacker to upload malicious content to your job or download your results. + + +For a full comparison of authentication methods, see the [Create Job endpoint reference](/api-reference/jobs-voice-translate/create-voice-translate-job). + +## Result Status Lifecycle + +Each target result progresses through the following statuses independently: + +`pending` -> `uploaded` -> `processing` -> `complete` -> `downloaded` + +A target may transition to `failed` at any point during processing. When a target fails, the `error` field contains a description of the failure. + +Jobs must be uploaded within 5 minutes of creation, and results must be downloaded within 1 hour of upload. After all results are downloaded or the job expires, the job is deleted and returns `404`. + +## Limits + +| **Limit** | **Value** | +| :--- | :--- | +| Maximum file size | 1 GB (1,073,741,824 bytes) | +| Time to upload after job creation | 5 minutes | +| Time to download results after upload | 1 hour | +| Maximum concurrent jobs per customer | 10 | +| Maximum concurrent jobs per customer (files > 100 MB) | 2 | +| Maximum targets per job | No limit (constrained by storage quota) | + +Usage is billed based on the duration of the source audio. + +## Supported Source Audio Formats + +| **MIME type** | +| :--- | +| `audio/mpeg` | +| `audio/wav` | +| `audio/ogg` | +| `audio/flac` | +| `audio/mp4` | +| `audio/webm` | + +## Supported Languages + +Source and target languages are the same as those supported by the [real-time Voice API](/api-reference/voice#supported-languages). + + + `source_language` is optional. If omitted, the language is detected automatically. + + +## Supported Output Formats + +Each target specifies a `type` for the desired output format. + +| **Type** | **Description** | +| :--- | :--- | +| `text/plain` | Plain text transcript | +| `audio/opus` | Opus audio | +| `audio/flac` | FLAC audio | +| `audio/pcm;encoding=s16le;rate=16000` | PCM 16-bit signed LE, 16 kHz | +| `audio/pcm;encoding=s16le;rate=24000` | PCM 16-bit signed LE, 24 kHz | +| `audio/pcm;encoding=ulaw;rate=8000` | PCM u-law, 8 kHz | +| `audio/pcm;encoding=alaw;rate=8000` | PCM A-law, 8 kHz | +| `audio/x-matroska;codecs=aac` | Matroska with AAC | +| `audio/x-matroska;codecs=flac` | Matroska with FLAC | +| `audio/x-matroska;codecs=opus` | Matroska with Opus | +| `audio/x-matroska;codecs=pcm_s16le;rate=16000` | Matroska with PCM 16 kHz | +| `audio/x-matroska;codecs=pcm_s16le;rate=24000` | Matroska with PCM 24 kHz | +| `video/mp2t;codecs=aac` | MPEG-TS with AAC | +| `video/mp2t;codecs=opus` | MPEG-TS with Opus | +| `audio/ogg;codecs=flac` | Ogg with FLAC | +| `audio/ogg;codecs=opus` | Ogg with Opus | +| `audio/webm;codecs=opus` | WebM with Opus | + +## Next steps + +Now that you understand how to translate audio files asynchronously: + +- **Create a job:** Review the [Create Job endpoint reference](/api-reference/jobs-voice-translate/create-voice-translate-job) for the full request and response schema +- **Poll job status:** Review the [Get Job Status endpoint reference](/api-reference/jobs-voice-translate/get-voice-translate-job-status) for the full response schema +- **Try realtime translation:** Use the [Voice API](/api-reference/voice) for streaming audio translation over WebSocket instead of batch processing diff --git a/api-reference/jobs-voice-translate/create-voice-translate-job.mdx b/api-reference/jobs-voice-translate/create-voice-translate-job.mdx new file mode 100644 index 0000000..9da2298 --- /dev/null +++ b/api-reference/jobs-voice-translate/create-voice-translate-job.mdx @@ -0,0 +1,4 @@ +--- +openapi: post /v1/jobs/voice/translate +title: "Create a voice translation job" +--- diff --git a/api-reference/jobs-voice-translate/get-voice-translate-job-status.mdx b/api-reference/jobs-voice-translate/get-voice-translate-job-status.mdx new file mode 100644 index 0000000..b3a1264 --- /dev/null +++ b/api-reference/jobs-voice-translate/get-voice-translate-job-status.mdx @@ -0,0 +1,4 @@ +--- +openapi: get /v1/jobs/voice/translate/{job_id} +title: "Get voice translation job status" +--- diff --git a/api-reference/openapi.yaml b/api-reference/openapi.yaml index ff919a7..c07d4f4 100644 --- a/api-reference/openapi.yaml +++ b/api-reference/openapi.yaml @@ -85,6 +85,8 @@ tags: description: |- The Voice API provides real-time voice transcription and translation services. Use a two-step flow: first request a streaming URL via REST, then establish a WebSocket connection for streaming audio and receiving transcriptions. +- name: VoiceTranslateJob + description: "**Alpha.** Async voice translation jobs. This API may change without notice." x-hideTryItPanel: true x-codeSamples: false paths: @@ -2929,6 +2931,135 @@ paths: $ref: '#/components/responses/ServiceUnavailable' security: - auth_header: [] + /v1/jobs/voice/translate: + post: + tags: + - VoiceTranslateJob + operationId: createVoiceTranslateJob + summary: Create a voice translation job + description: Creates an async voice translation job. The response includes an upload URL for the source audio file. + security: + - auth_header: [] + parameters: + - $ref: '#/components/parameters/VoiceTranslateJobIncludeParam' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/VoiceTranslateCreateJobRequest' + example: + source_file: + name: "podcast-episode-42.mp3" + content_type: "audio/mpeg" + content_length: 15728640 + parameters: + source_language: "en" + targets: + - language: "de" + type: "text/plain" + - language: "es" + type: "audio/pcm;encoding=s16le;rate=16000" + responses: + "201": + description: Job created successfully. + content: + application/json: + schema: + $ref: '#/components/schemas/VoiceTranslateCreateJobResponse' + example: + job_id: "a74d88fb-ed2a-4943-a664-a4512398b994" + upload_url: "https://assets.deepl.com/collections/a74d88fb-ed2a-4943-a664-a4512398b994/assets/b1c2d3e4-f5a6-7890-abcd-ef1234567890" + signature: "eyJhbGciOiJIUzI1NiIs..." + "400": + $ref: '#/components/responses/VoiceTranslateJobBadRequest' + "401": + $ref: '#/components/responses/Unauthorized' + "403": + $ref: '#/components/responses/Forbidden' + "429": + $ref: '#/components/responses/TooManyRequests' + /v1/jobs/voice/translate/{job_id}: + get: + tags: + - VoiceTranslateJob + operationId: getVoiceTranslateJobStatus + summary: Get voice translation job status + description: |- + Returns the current status of a voice translation job, including per-target result statuses. + + When a target's status is `complete`, the response includes a `download_url` and `signature` for that target. Results are returned in the same order as the targets in the create request. + security: + - auth_header: [] + parameters: + - $ref: '#/components/parameters/VoiceTranslateJobIdParam' + - $ref: '#/components/parameters/VoiceTranslateJobIncludeParam' + responses: + "200": + description: Job status retrieved successfully. + content: + application/json: + schema: + $ref: '#/components/schemas/VoiceTranslateJobStatusResponse' + examples: + processing: + summary: Job still processing + value: + job_id: "a74d88fb-ed2a-4943-a664-a4512398b994" + product: "voice" + operation: "translate" + created_at: "2026-10-01T01:03:03.444Z" + updated_at: "2026-10-01T04:03:03.333Z" + usage: + storage_used: 31457280 + source_file: + name: "podcast-episode-42.mp3" + content_type: "audio/mpeg" + content_length: 15728640 + parameters: + source_language: "en" + targets: + - language: "de" + type: "text/plain" + - language: "es" + type: "audio/pcm;encoding=s16le;rate=16000" + results: + - status: "processing" + - status: "processing" + complete: + summary: Job with mixed results + value: + job_id: "a74d88fb-ed2a-4943-a664-a4512398b994" + product: "voice" + operation: "translate" + created_at: "2026-10-01T01:03:03.444Z" + updated_at: "2026-10-01T04:03:03.333Z" + usage: + storage_used: 31457280 + source_file: + name: "podcast-episode-42.mp3" + content_type: "audio/mpeg" + content_length: 15728640 + parameters: + source_language: "en" + targets: + - language: "de" + type: "text/plain" + - language: "es" + type: "audio/pcm;encoding=s16le;rate=16000" + results: + - status: "complete" + download_url: "https://assets.deepl.com/collections/a74d88fb/assets/c3d4e5f6" + signature: "eyJhbGciOiJIUzI1NiIs..." + - status: "failed" + error: + message: "processing failed" + "401": + $ref: '#/components/responses/Unauthorized' + "404": + $ref: '#/components/responses/NotFound' + "429": + $ref: '#/components/responses/TooManyRequests' components: headers: X-Trace-ID: @@ -2946,6 +3077,30 @@ components: schema: type: string example: 04DE5AD98A02647D83285A36021911C6 + VoiceTranslateJobIdParam: + name: job_id + in: path + required: true + description: The unique identifier of the job, returned by the create job endpoint. + schema: + type: string + format: uuid + example: "a74d88fb-ed2a-4943-a664-a4512398b994" + VoiceTranslateJobIncludeParam: + name: include + in: query + required: false + description: |- + Additional fields to include in the response. + - `signed_url`: Include pre-signed URLs (`signed_upload_url` on create, `signed_download_url` on status) that can be used without an authorization header. + schema: + type: array + items: + type: string + enum: + - signed_url + style: form + explode: true GlossaryID: name: glossary_id description: A unique ID assigned to the glossary. @@ -2965,6 +3120,14 @@ components: schema: $ref: '#/components/schemas/TargetLanguage' responses: + VoiceTranslateJobBadRequest: + description: Bad request. Check the error message and request parameters. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + example: + message: "/targets/0/type: Value is not valid" BadRequest: description: Bad request. Please check error message and your parameters. BadRequestGlossaries: @@ -5488,3 +5651,268 @@ components: example: "DeepL API Key Prod" usage: $ref: '#/components/schemas/UsageBreakdown' + ErrorResponse: + type: object + required: + - message + properties: + message: + type: string + description: A human-readable description of the error. + code: + type: string + description: A machine-readable identifier for the error, when available. Clients should match on this value rather than on `message` when branching on error types. + example: "invalid_content_type" + VoiceTranslateJobSourceContentType: + type: string + description: The MIME type of the source audio file. + enum: + - audio/mpeg + - audio/wav + - audio/ogg + - audio/flac + - audio/mp4 + - audio/webm + JobSourceFileRequest: + type: object + description: Metadata about the source audio file to be uploaded. + required: + - name + - content_type + - content_length + properties: + name: + type: string + minLength: 1 + description: The file name of the source audio file. + example: "podcast-episode-42.mp3" + content_type: + $ref: '#/components/schemas/VoiceTranslateJobSourceContentType' + content_length: + type: integer + format: int64 + minimum: 1 + maximum: 1073741824 + description: The size of the source audio file in bytes. Maximum 1 GB (1,073,741,824 bytes). + example: 15728640 + JobSourceFileResponse: + type: object + description: Metadata about the uploaded source audio file. + required: + - name + - content_type + - content_length + properties: + name: + type: string + description: The file name of the source audio file. + content_type: + type: string + description: The MIME type of the source audio file. + content_length: + type: integer + format: int64 + description: The size of the source audio file in bytes. + VoiceTranslateJobTargetOutputType: + type: string + description: The desired output format for the translation target. + enum: + - text/plain + - audio/opus + - audio/flac + - "audio/pcm;encoding=s16le;rate=16000" + - "audio/pcm;encoding=s16le;rate=24000" + - "audio/pcm;encoding=ulaw;rate=8000" + - "audio/pcm;encoding=alaw;rate=8000" + - "audio/x-matroska;codecs=aac" + - "audio/x-matroska;codecs=flac" + - "audio/x-matroska;codecs=opus" + - "audio/x-matroska;codecs=pcm_s16le;rate=16000" + - "audio/x-matroska;codecs=pcm_s16le;rate=24000" + - "video/mp2t;codecs=aac" + - "video/mp2t;codecs=opus" + - "audio/ogg;codecs=flac" + - "audio/ogg;codecs=opus" + - "audio/webm;codecs=opus" + VoiceTranslateJobParametersRequest: + type: object + description: Processing parameters for the voice translation job. + properties: + source_language: + allOf: + - $ref: '#/components/schemas/SourceLanguage' + - description: Language of the source audio. If omitted, the language is detected automatically. + VoiceTranslateJobParametersResponse: + type: object + description: Processing parameters as applied to the voice translation job. + properties: + source_language: + allOf: + - $ref: '#/components/schemas/SourceLanguage' + - description: Language of the source audio. + VoiceTranslateJobTargetRequest: + type: object + description: A translation target specifying the desired output language and format. + required: + - language + - type + properties: + language: + $ref: '#/components/schemas/TargetLanguage' + type: + $ref: '#/components/schemas/VoiceTranslateJobTargetOutputType' + VoiceTranslateJobTargetResponse: + type: object + description: A translation target as recorded on the job. + required: + - language + - type + properties: + language: + $ref: '#/components/schemas/TargetLanguage' + type: + $ref: '#/components/schemas/VoiceTranslateJobTargetOutputType' + VoiceTranslateCreateJobRequest: + type: object + required: + - source_file + - targets + properties: + source_file: + $ref: '#/components/schemas/JobSourceFileRequest' + parameters: + $ref: '#/components/schemas/VoiceTranslateJobParametersRequest' + targets: + type: array + minItems: 1 + description: One or more translation targets. Each target produces a separate result. + items: + $ref: '#/components/schemas/VoiceTranslateJobTargetRequest' + VoiceTranslateCreateJobResponse: + type: object + required: + - job_id + - upload_url + - signature + properties: + job_id: + type: string + format: uuid + description: The unique identifier of the created job. + upload_url: + type: string + format: uri + description: |- + The URL to upload the source audio file to via `PUT` with `Content-Type: application/octet-stream`. + Requires the `Authorization: DeepL-Signature {signature}` header. + See [Upload File](/api-reference/jobs-voice-translate#upload-file) for details. + signature: + type: string + description: >- + A short-lived token used to authorize the file upload. + Pass it via the `Authorization` header as `DeepL-Signature {signature}` when uploading to the `upload_url`. + signed_upload_url: + type: string + format: uri + description: A pre-signed upload URL that does not require an authorization header. Only present when `?include=signed_url` is specified. + JobUsage: + type: object + properties: + storage_used: + type: integer + format: int64 + description: Total storage used by this job in bytes, including source and output files. + ResultStatus: + type: string + description: |- + The processing status of a target result. + - `pending`: Job created, awaiting file upload. + - `uploaded`: File uploaded, awaiting processing. + - `processing`: Translation in progress. + - `complete`: Translation complete, result available for download. + - `downloaded`: Result has been downloaded. Assets are marked for deletion. + - `failed`: Processing failed. See the `error` field for details. + enum: + - pending + - uploaded + - processing + - complete + - downloaded + - failed + VoiceTranslateJobTargetResult: + type: object + description: The processing result for a single translation target. + required: + - status + properties: + status: + $ref: '#/components/schemas/ResultStatus' + download_url: + type: string + format: uri + description: |- + The URL to download the translated result via `GET`. + Requires the `Authorization: DeepL-Signature {signature}` header. + Only present when `status` is `complete`. + See [Download Result](/api-reference/jobs-voice-translate#download-result) for details. + signature: + type: string + description: A short-lived token used to authorize the result download. Only present when `status` is `complete`. + signed_download_url: + type: string + format: uri + description: A pre-signed download URL that does not require an authorization header. Only present when `status` is `complete` and `?include=signed_url` is specified. + error: + allOf: + - $ref: '#/components/schemas/ErrorResponse' + description: Details about the processing failure. Only present when `status` is `failed`. + VoiceTranslateJobStatusResponse: + type: object + required: + - job_id + - product + - operation + - created_at + - updated_at + - usage + - source_file + - parameters + - targets + - results + properties: + job_id: + type: string + format: uuid + description: The unique identifier of the job. + product: + type: string + description: The product identifier. + example: "voice" + operation: + type: string + description: The operation identifier. + example: "translate" + created_at: + type: string + format: date-time + description: When the job was created (ISO 8601). + updated_at: + type: string + format: date-time + description: When the job was last updated (ISO 8601). + usage: + $ref: '#/components/schemas/JobUsage' + source_file: + $ref: '#/components/schemas/JobSourceFileResponse' + parameters: + $ref: '#/components/schemas/VoiceTranslateJobParametersResponse' + targets: + type: array + description: The translation targets as specified in the create request. + items: + $ref: '#/components/schemas/VoiceTranslateJobTargetResponse' + results: + type: array + description: Per-target processing results, in the same order as the `targets` array. + items: + $ref: '#/components/schemas/VoiceTranslateJobTargetResult'