> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.milliseconds.ai/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.milliseconds.ai/_mcp/server.

# Limits and errors

## Limits

| Limit          | Value               | What happens above it                                                             |
| -------------- | ------------------- | --------------------------------------------------------------------------------- |
| Audio duration | 60 minutes per call | `400 audio_too_long`. The API checks the duration before it transcribes           |
| Request body   | 100 MB              | `413` from the edge, before the API. That response is not the JSON error envelope |
| Speakers       | 4                   | Diarization labels at most four speakers                                          |
| Client timeout | Allow 5 minutes     | A long file can take more than a minute                                           |

> **Tip**
>
> **Send compressed audio for long files.** One hour of 16 kHz mono WAV is about 115 MB, over the body limit. The same hour as a 64 kbps mp3 is about 29 MB.

A `rakeaudio` call counts as one request against your requests-per-minute limit. See [Limits and rate limits](/reference/limits).

## Errors

Errors use the standard envelope: `{ "error": { "code": "...", "message": "..." } }`. See [Errors](/reference/errors).

| Code                     | Status | Cause                                                                                          | What to do                                     |
| ------------------------ | ------ | ---------------------------------------------------------------------------------------------- | ---------------------------------------------- |
| `unsupported_media_type` | 415    | The `Content-Type` is not `audio/*` or `application/octet-stream`. A JSON body gets this error | Send the file bytes with an audio content type |
| `invalid_audio`          | 400    | The body is empty, or the API cannot decode it as audio                                        | Check the file. Do not retry the same bytes    |
| `invalid_request`        | 400    | `diarize` is not `true` or `false`                                                             | Fix the query parameter                        |
| `audio_too_long`         | 400    | The audio is longer than 60 minutes                                                            | Split the file                                 |
| `runner_error`           | 502    | Transcription failed                                                                           | Retry with backoff                             |
| `model_unavailable`      | 503    | The model is not available                                                                     | Retry later                                    |
| `overloaded`             | 529    | Every transcription slot stayed busy                                                           | Retry with backoff                             |

These are real responses:

```json
{"error":{"code":"unsupported_media_type","message":"Send the audio file as the raw body with content-type audio/* or application/octet-stream."}}
{"error":{"code":"invalid_audio","message":"The audio could not be decoded."}}
```

Authentication, rate-limit and credit errors (`401`, `403`, `429`) are the same for every model. See [Errors](/reference/errors).

## Retries

Retry `502`, `503` and `529` with exponential backoff, for example after 2, 4 and 8 seconds. A failed call is not billed. Never retry a `400` or a `415` with the same request: it fails again.