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.
POST
https://api.freetheai.org/v1/audio/transcriptionsRequest
A multipart form upload, up to 25 MB.
bash
curl https://api.freetheai.org/v1/audio/transcriptions \
-H "Authorization: Bearer $FTAI_KEY" \
-F model=MODEL_ID \
-F [email protected]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
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 ("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). |
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. |

