We use cookies. Cookies and browser storage keep you signed in and remember your preferences. With your permission we also measure how the site is used. You can any time. See our cookie policy.

Transcription (STT)

Endpoints

Transcription (STT)

Turn audio into text with POST /audio/transcriptions on api14, with supported formats, language options and response formats.

Try it in the playground

Turn speech into text (speech-to-text, STT) with Whisper, GPT-4o Transcribe, Deepgram, Voxtral and other transcription models. The endpoint follows OpenAI's POST /audio/transcriptions, so client.audio.transcriptions.create(...) works unchanged.

POST https://api14.com/api/v1/audio/transcriptions

Request

Send multipart/form-data with the audio file (what the OpenAI SDKs do), or a JSON body.

FieldTypeRequiredDescription
filefileyesAudio file: mp3, mp4, m4a, wav, webm, ogg, flac.
modelstringyesA transcription model id, e.g. openai/whisper-1.
languagestringnoISO-639-1 code (en, de), improves accuracy and speed.
promptstringnoVocabulary hints or the previous segment's text.
response_formatstringnojson (default), text, srt, vtt, verbose_json where supported.
temperaturenumbernoSampling temperature, 0–1.

The request body limit is 25 MB by default. Larger files return 413 payload_too_large, split long recordings into chunks.

Multipart with cURL

curl https://api14.com/api/v1/audio/transcriptions \
  -H "Authorization: Bearer sk-api14-..." \
  -F model=openai/whisper-1 \
  -F file=@meeting.mp3 \
  -F language=en

JSON body

JSON is accepted too, with the audio as base64 for models that support it:

{
  "model": "openai/whisper-1",
  "input_audio": { "data": "<base64>", "format": "mp3" },
  "language": "en"
}

Example

import fs from "node:fs";
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api14.com/api/v1",
  apiKey: process.env.API14_API_KEY,
});

const result = await client.audio.transcriptions.create({
  model: "openai/whisper-1",
  file: fs.createReadStream("audio.mp3"),
});
console.log(result.text);

Response

{
  "text": "Thanks everyone for joining. Let's start with the roadmap.",
  "usage": { "type": "duration", "seconds": 42, "cost": 0.0042 }
}

With response_format: "text", srt or vtt the body is plain text instead of JSON.

Pricing

Transcription is billed at the model's listed price, shown as "$ / minute" (or per token for token-priced models). The charge is returned in usage.cost and debited from your USD balance.

Errors

StatusCodeWhen
400invalid_bodyThe multipart body could not be parsed.
400model_requiredThe model field is missing.
402insufficient_balanceYour USD balance is $0.
404model_not_foundUnknown or disabled model id.
413payload_too_largeFile exceeds the body size limit.

See Errors.