# Create transcription

> Transcribe an audio file to text, uploaded as multipart form data or as base64 JSON.

`POST https://api.numes.ai/api/v1/audio/transcriptions`

Source: https://0.0.0.0:3000/docs/api-reference/media/create-transcription
Authorization: Bearer inference key

Send exactly one audio file, either as a multipart `file` part or as JSON `file`/`audio` objects with base64 `data` and a `format`. `response_format` is `json` (default) or `verbose_json`; both return `text` and `usage` only, without word or segment timestamps. `prompt` is accepted but has no effect. Guide: [Speech and transcription](/docs/multimodal/speech).

```request
{
  "method": "POST",
  "path": "/audio/transcriptions",
  "body": {
    "model": "author/transcription-model",
    "audio": { "data": "UklGRiQAAABXQVZFZm10IBAAAAABAAEA…", "format": "wav" },
    "language": "en"
  }
}
```

```json title="Response 200"
{
  "text": "Your build finished successfully.",
  "usage": {
    "type": "duration",
    "seconds": 2.4,
    "input_audio_seconds": 2.4,
    "output_tokens": 6,
    "cost": 0.0004
  }
}
```

The same request as multipart form data:

```bash
curl https://api.numes.ai/api/v1/audio/transcriptions \
  -H "Authorization: Bearer $NUMES_API_KEY" \
  -F model=author/transcription-model \
  -F file=@meeting.wav \
  -F response_format=json
```

## Headers

- `X-Request-Id` (string; Length 1–128): Correlation ID, not an idempotency key. Inference request IDs recorded with a generation are unique per account. A traffic-admitted request reusing a recorded ID returns 400 invalid_request. Traffic admission rejection takes precedence over this conflict, including for reused IDs; it performs no generation lookup and writes no generation, result or attempt. Rate-limit rejection returns 429 rate_limited with Retry-After; an inference limiter outage retains 500 server.

## Request body (multipart/form-data)

- `file` (file; required)
- `model` (string; required; Length ≤ 393; Pattern ^[a-z0-9][a-z0-9._-]{0,99}/[A-Za-z0-9][A-Za-z0-9._:-]{0,291}$)
- `language` (string)
- `prompt` (string)
- `response_format` (enum<string>; default "json"; one of json, verbose_json)
- `temperature` (number; Range 0–1)
- `timestamp_granularities` (array<enum<string>>; one of word, segment; Items ≤ 2)

## Request body (application/json)

- `model` (string; required; Length ≤ 393; Pattern ^[a-z0-9][a-z0-9._-]{0,99}/[A-Za-z0-9][A-Za-z0-9._:-]{0,291}$)
- `file` (object)
  - `data` (string; required; Encoding base64)
  - `format` (enum<string>; required; one of wav, mp3, flac, m4a, ogg, webm, aac, aiff, pcm16, pcm24)
- `audio` (object)
  - `data` (string; required; Encoding base64)
  - `format` (enum<string>; required; one of wav, mp3, flac, m4a, ogg, webm, aac, aiff, pcm16, pcm24)
- `language` (string)
- `prompt` (string; Length ≤ 4,096)
- `response_format` (enum<string>; default "json"; one of json, verbose_json)
- `temperature` (number; Range 0–1)
- `timestamp_granularities` (array<enum<string>>; one of word, segment; Items ≤ 2)

## Response 200 (application/json)

- `text` (string; required)
- `usage` (object; required)
  - `type` (string; required)
  - `seconds` (number; required; Range ≥ 0)
  - `input_audio_seconds` (number; required; Range ≥ 0)
  - `output_tokens` (integer; required; Range ≥ 0)
  - `cost` (number; required; Range ≥ 0)

## Response 503 (application/json)

- `error` (object; required)
  - `code` (integer; required)
  - `message` (string; required)
  - `metadata` (object)
- `openrouter_metadata` (object)

## Response default (application/json)

- `error` (object; required)
  - `code` (integer; required)
  - `message` (string; required)
  - `metadata` (object)
- `openrouter_metadata` (object)
