---
url: https://docs.freetheai.org/api/audio-transcriptions.md
description: >-
  POST /v1/audio/transcriptions - turn speech into text in the OpenAI
  Transcriptions format, priced per minute of audio.
---

# Transcription

Turns recorded speech into text in the OpenAI Transcriptions format. Transcription models are paid models from providers: each one's price per minute is on its page at [freetheai.org/models](https://freetheai.org/models?kind=audio).

`POST https://api.freetheai.org/v1/audio/transcriptions`

## Request

A multipart form upload, up to 25 MB.

::: code-group

```bash [curl]
curl https://api.freetheai.org/v1/audio/transcriptions \
  -H "Authorization: Bearer $FTAI_KEY" \
  -F model=MODEL_ID \
  -F file=@meeting.mp3
```

```python [Python]
import os
from openai import OpenAI

client = OpenAI(base_url="https://api.freetheai.org/v1", api_key=os.environ["FTAI_KEY"])

with open("meeting.mp3", "rb") as audio:
    result = client.audio.transcriptions.create(model="MODEL_ID", file=audio)
print(result.text)
```

```ts [TypeScript]
import { createReadStream } from 'node:fs'
import OpenAI from 'openai'

const client = new OpenAI({ baseURL: 'https://api.freetheai.org/v1', apiKey: process.env.FTAI_KEY })

const result = await client.audio.transcriptions.create({ model: 'MODEL_ID', file: createReadStream('meeting.mp3') })
console.log(result.text)
```

:::

| Field | Type | Description |
| --- | --- | --- |
| `model` | string | A transcription model ID from [`GET /v1/models`](/api/models) (`"type": "transcription"`). |
| `file` | file | The recording: WAV, MP3, FLAC, Ogg, M4A, or MP4. |
| `language` | string | Optional. The spoken language as an ISO-639-1 code (`en`, `de`). |
| `prompt` | string | Optional. Text that guides spelling and style. |
| `response_format` | string | Optional. `json` (default), `text`, `verbose_json`, `srt`, or `vtt`. |
| `temperature` | number | Optional. |

You are charged for the length of the recording, counted in whole seconds at the model's price per minute. FreeTheAI reads the length from the file itself before anything is held; a file whose length cannot be read is refused and costs nothing. Replies are not streamed.

## Response

```json
{ "text": "Thanks everyone for joining today." }
```

`verbose_json` adds `language`, `duration`, and timed `segments`; `text`, `srt`, and `vtt` return plain text.

## Errors

| Status | Meaning |
| --- | --- |
| `400` | `the audio length could not be read; send wav, mp3, flac, ogg, m4a, or mp4`, or another field has a value the endpoint does not take. |
| `401` | Missing or invalid API key. |
| `402` | Not enough wallet balance, or the key's budget is used ([paid usage errors](/errors#billing)). |
| `404` | No model has that ID, or none of the providers you follow serve it. |
| `413` | The upload is larger than 25 MB. Send a shorter or more compressed file. |
| `502` / `503` | The provider failed or is busy. Retry; a failed request is not charged. |
