# Create Translation
Purpose: API operation reference for `POST /v1/audio/translations`.
Last updated: 2026-09-15

## Endpoint

```txt
POST /v1/audio/translations
```

## Description

Upload audio as multipart form data with the model field. Name the language you want back in `target_language`, and narrow the decoder with `source_languages` when you already know what was spoken. Both take BCP-47 tags.

Translate an uploaded audio file and return the translated text.

## Request body

Content type: `multipart/form-data`

| Field | Required | Type | Description |
| --- | --- | --- | --- |
| `model` | Yes | `string` | model name to route to (may be an alias; rejected if blank) |
| `file` | Yes | `string` | the audio file to translate |
| `source_languages` | No | `array<string> \| null` | ISO-639 language tags the audio may be spoken in, e.g. 'nl'; repeat the field to name several. Omit to have the model detect the language. Naming exactly one asserts it to the model; naming several says the language is uncertain, which the model resolves by detecting it. |
| `target_language` | No | `string \| null` | ISO-639 language tag to translate into, e.g. 'de'; English when omitted. Must be one of the tags this model publishes as `languages` on GET /v1/models. |
| `prompt` | No | `string \| null` | optional decoding prompt |
| `response_format` | No | `"json" \| null` | the response body's shape; this endpoint answers json and nothing else, so the only value it accepts is 'json' |
| `temperature` | No | `number \| null` | sampling temperature |
| `top_p` | No | `number \| null` | nucleus sampling probability mass |
| `top_k` | No | `integer \| null` | top-k sampling candidate count |
| `frequency_penalty` | No | `number \| null` | frequency penalty on generated tokens |
| `presence_penalty` | No | `number \| null` | presence penalty on generated tokens |
| `repetition_penalty` | No | `number \| null` | repetition penalty on generated tokens |

## Success response

Status: `200`
Content type: `application/json`

| Field | Required | Type | Description |
| --- | --- | --- | --- |
| `text` | Yes | `string` | the translated text |
| `usage` | No | `Usage \| null` | the request's measured per-modality usage and cost; absent when nothing was measured |

## Error responses

| Status | Description |
| --- | --- |
| `400` | The request was malformed, or a field value was invalid. |
| `401` | Missing, invalid, or expired credentials. |
| `402` | The account is out of credit. |
| `403` | Authenticated, but not a member of the requested organization. |
| `404` | The requested model does not exist or is not available. |
| `413` | The request body, or an inline media part, exceeds the accepted size. |
| `429` | Rate limit exceeded. |
| `500` | The model backend, or the gateway itself, failed while serving the request. |
| `502` | The model backend answered with something the gateway could not serve. |
| `503` | Temporarily unavailable; retry after `Retry-After` when present. |
| `504` | The model backend did not respond in time. |

## Related links

- [Markdown reference](https://sprag.ai/docs/api/audio/translations.md)
- [OpenAPI spec](https://sprag.ai/openapi.json)
- [Authentication](https://sprag.ai/docs/authentication.md)
- [Errors](https://sprag.ai/docs/errors.md)
