Transcribe audio
Every recorded conversation is searchable, quotable and analyzable the moment it becomes text, and unsearchable audio otherwise. This endpoint turns a spoken file into written words across more than 90 languages, so what was said stops depending on someone hitting play to find out.
Run it online
Run this on our servers with your account. Free tools run in your browser; this one bills your KIT balance per the price above.
Why speech and text are such different assets
Audio is sequential by nature — to know what's at minute forty, someone has to pass through the first thirty-nine, or scrub blindly hoping to land close. Text has none of that constraint: it can be searched, indexed, skimmed, translated and quoted instantly. audio.transcribe exists to move a recording from the first category into the second without a person typing along as they listen.
What the request and response look like
Send the audio file to POST /audio/transcribe, receive a task_id immediately, and get the transcript back by webhook or a signed link valid for 24 hours once the job completes. It supports audio in more than 90 languages, so a single integration covers a call center in Spanish, a podcast in Portuguese and a conference talk in Japanese without separate configuration per language.
What affects transcript quality
Clear audio with one or two speakers and minimal background noise transcribes most accurately, which is simply the nature of the acoustic problem: overlapping speech, heavy accents unfamiliar to the model, and low-quality microphones all make the signal harder to separate from noise. Recognizing speech has been a research problem since the 1950s and remains genuinely hard in noisy, multi-speaker conditions — expect strong results on clean recordings and a rougher draft on a noisy conference room mic.
Where transcription sits in a bigger workflow
A transcript is rarely the final product; it's the raw material for search, subtitles, compliance records, or further summarization. Because the output is plain text, it feeds directly into whatever comes next — a search index, a document, a translation task — without needing a person to bridge the gap between what was said and what's written down.
How it fits into automated systems
Podcast networks transcribe every new episode the moment it's uploaded to generate a searchable archive and accessible text alongside the audio. Legal and compliance teams transcribe recorded calls to create a written record without a stenographer on staff. Since it's billed per request plus per minute and runs asynchronously, transcribing one voice memo or a day's worth of recorded meetings is the same integration, just a different number of tasks.
What you can do with it
Podcast archive and accessibility
A podcast network transcribes each episode on release to publish a searchable text version alongside the audio for listeners who prefer reading.
Call center quality review
A support team transcribes recorded customer calls so supervisors can search and review conversations by keyword instead of replaying audio.
Multilingual conference coverage
An events company transcribes talks delivered in different languages to produce written coverage without hiring a transcriptionist per language.
Voice memo to notes
A field researcher transcribes voice memos recorded on-site into text notes that get filed and searched later.
FAQ
How do I transcribe audio with the API?
Send the file to POST /audio/transcribe, store the returned task_id, and get the transcript by webhook or a signed link valid for 24 hours.
Is the speech to text API free?
No, there's no free tier or trial. It costs $0.004 per request plus $0.0125 per minute of audio, and a failed job is never charged.
How many languages does it support?
More than 90 languages are supported through the same endpoint, without needing separate configuration per language.
How accurate is the transcript?
Clean audio with clear speech and minimal background noise gives the strongest results; overlapping speakers, heavy noise or unusual accents make the underlying problem harder for any system.
Does it identify different speakers?
This endpoint focuses on converting speech to text; pair it with a diarization task if you need speaker labels attached to each segment.
Can I transcribe long recordings like meetings or webinars?
Yes, it's billed per minute rather than capped at a short fixed length, so it handles anything from a short voice memo to a multi-hour recording.
Can I transcribe many files in bulk?
Yes, submit each audio file as its own async task and collect transcripts by webhook as each one finishes.
Is my audio kept after transcription?
No, audio files and transcripts are deleted after the retention window and are never used to train any model.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, and soon from our app, email and Telegram.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/audio/transcribe \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"audio":"https://ejemplo.com/reunion.mp3"}'const res = await fetch("https://api.kit.forhosting.com/audio/transcribe", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"audio": "https://ejemplo.com/reunion.mp3"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/audio/transcribe",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"audio": "https://ejemplo.com/reunion.mp3"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/audio/transcribe", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"audio":"https://ejemplo.com/reunion.mp3"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"audio":"https://ejemplo.com/reunion.mp3"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/audio/transcribe", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"audio": "https://ejemplo.com/reunion.mp3"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "audio.transcribe",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_mb | 200 |
max_minutes | 180 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
422 | task_failed | The task failed after 3 retries. You are never charged for it. |