# OpenRouter APIs — Mistral: Voxtral Mini TTS (mistralai/voxtral-mini-tts-2603)

Guide for calling every confirmed OpenRouter API that serves `mistralai/voxtral-mini-tts-2603`.

Model page: https://openrouter.ai/mistralai/voxtral-mini-tts-2603
Create an API key: https://openrouter.ai/settings/keys

## EU in-region routing

`mistralai/voxtral-mini-tts-2603` is available through EU in-region routing. Requests sent to eu.openrouter.ai are decrypted in the EU and routed only to shared provider endpoints in Europe (the EU/EEA, the UK, and Switzerland).

- Providers in Europe: Mistral
- Prices in Europe:
  - Mistral: $17.60/M characters
- Base URL: https://eu.openrouter.ai/api/v1
- Plan: requires Business or Enterprise. Self-serve on Business: no contract, no monthly minimum. https://openrouter.ai/business/eu
- Fails closed: if no shared provider endpoint in Europe is available, the request errors instead of leaving the region. Requests served by your own BYOK key go to your deployment’s region, which you control.

Docs: https://openrouter.ai/docs/guides/features/in-region-routing

## Authentication

Send this header with every request:

- Authorization: Bearer $OPENROUTER_API_KEY

## Text-to-Speech API

Synthesize audio with `mistralai/voxtral-mini-tts-2603` through OpenRouter's Text-to-Speech API.

Docs: https://openrouter.ai/docs/api/api-reference/tts/create-speech

### Endpoint

POST https://openrouter.ai/api/v1/audio/speech

Headers:
- Content-Type: application/json

### Request fields (mistralai/voxtral-mini-tts-2603)

- model: string (required) — `"mistralai/voxtral-mini-tts-2603"`
- input: string (required) — text to synthesize
- voice: "en_paul_sad" | "en_paul_neutral" | "en_paul_happy" | "en_paul_frustrated" | "en_paul_excited" | "en_paul_confident" | "en_paul_cheerful" | "en_paul_angry" | "gb_oliver_neutral" | "gb_oliver_sad" | "gb_oliver_excited" | "gb_oliver_curious" | "gb_oliver_confident" | "gb_oliver_cheerful" | "gb_oliver_angry" | "gb_jane_sarcasm" | "gb_jane_confused" | "gb_jane_shameful" | "gb_jane_sad" | "gb_jane_neutral" | "gb_jane_jealousy" | "gb_jane_frustrated" | "gb_jane_curious" | "gb_jane_confident" | "fr_marie_sad" | "fr_marie_neutral" | "fr_marie_happy" | "fr_marie_excited" | "fr_marie_curious" | "fr_marie_angry" (optional) — provider-specific voice identifier
- response_format: "mp3" | "pcm" (optional) — output audio encoding; defaults to pcm

### Response

Success returns raw audio bytes, not JSON.

- `Content-Type` identifies the audio encoding, such as `audio/mpeg` or `audio/pcm`.
- `X-Generation-Id` identifies the billed generation.
- Write the response body directly to an audio file; do not call `response.json()`.

### Examples

#### Text to Speech

```bash
curl https://openrouter.ai/api/v1/audio/speech \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENROUTER_API_KEY" \
  --output output.mp3 \
  -d '{
  "model": "mistralai/voxtral-mini-tts-2603",
  "input": "The warm light flows across the OpenRouter office as the evening settles in and the routing never stops. One interface, hundreds of models. Ready when you are.",
  "voice": "en_paul_excited",
  "response_format": "mp3"
}'
```

### Error differences

- 400 — malformed audio input or an audio option the routed provider does not support
- 502 — the upstream audio operation failed

## Errors

Failures return `{"error": {"code": <number>, "message": <string>}}` with the HTTP status:

- 400 — malformed request or an unsupported parameter
- 401 — missing or invalid API key
- 402 — insufficient credits
- 403 — spend limit reached, key disabled, or access blocked
- 404 — unknown model or no provider can serve the request
- 429 — rate limited; retry with backoff
- 502 — the operation failed upstream; failed generations are not billed

---

Canonical version of this document: https://openrouter.ai/mistralai/voxtral-mini-tts-2603/llms.txt
