Search words in audio
Scrubbing through an hour of audio to find the one moment someone said a name or a product term is a waste of anyone's afternoon. This audio search API listens for the words you specify and returns every occurrence with a precise timestamp, so you jump straight to the moment instead of hunting for it.
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.
The problem with long recordings
Audio is opaque to search in a way text never is: you cannot skim a two-hour call the way you skim a page. Compliance teams, journalists and podcast editors have historically solved this by transcribing everything first and searching the text, which works but adds a full transcription step and cost even when all you need is three timestamps. This endpoint skips that detour — it listens directly for the keywords or phrases you give it and reports back where in the audio each one occurs.
What you send and what comes back
You submit the audio file along with the list of keywords or phrases to spot; the task queues asynchronously and returns a task_id immediately. When processing finishes, results arrive by signed webhook or a signed link valid for 24 hours, listing each match with its timestamp in the recording and the matched term, so you can build a clickable index or jump list without manually scrubbing anything.
A close cousin of keyword spotting
This is the same underlying idea broadcasters and call centers have used for years under the name 'keyword spotting' — a lighter, faster alternative to full transcription when you only care whether and when specific terms occur. Because it does not need to transcribe every word in the recording, it can focus computation on detecting your target list, which is exactly the right tool when the question is 'did they mention the product name' rather than 'what did they say for two hours.'
Fitting it into a pipeline
Teams typically call this endpoint right after a recording lands — a support call, a podcast upload, a compliance recording — and use the returned timestamps to drive a highlight reel, a compliance flag, or a jump-to-mention player. Pricing is a flat per-request base plus a per-minute rate on the audio's length, so a five-minute clip costs a fraction of a sixty-minute one, and a failed task, after automatic retries, is never billed.
Access and data handling
The endpoint requires prepaid balance, same as the rest of the API; without it, requests return HTTP 402 rather than degrading quietly. Uploaded audio and search results are removed once the retention window passes and are never used to train models — you receive exactly the timestamps you asked for, through your webhook or a temporary signed link, and nothing is retained beyond that.
What you can do with it
Compliance keyword flags
Scan recorded calls for specific regulated terms and get timestamps so a reviewer only listens to the seconds that matter.
Podcast mention finder
Search an archive of episodes for every time a guest or product name was mentioned to build a searchable mention index.
Newsroom quote sourcing
Locate the exact moment a spokesperson said a specific phrase in a long press-conference recording without listening start to finish.
Support call spot-checks
Find every call where a competitor's name came up so a sales team can review those specific moments.
FAQ
How does the audio search API find keywords?
It listens directly to the audio for the specific words or phrases you provide and returns a timestamp for every occurrence, without producing a full transcript.
What formats does the audio search API accept?
It accepts standard compressed and uncompressed audio formats commonly produced by recording and call-center systems.
Is there a free trial for the audio keyword search?
There's no free tier — free tiers get abused and slow everyone down. Access runs on a prepaid ForHosting KIT balance: top up from $10.00 (it never expires) and each request is charged at its published price, so a call with no balance returns HTTP 402. No subscription, no tokens, no invented credits, and a failed task is never charged.
How is the audio search API priced?
It costs $0.002 per request plus $0.0055 per minute of audio, so cost scales directly with the recording's length.
How accurate is keyword spotting compared to full transcription?
It is optimized to detect the terms you specify reliably, but it is not a transcript; for full readable text of everything said, use a transcription endpoint instead.
Can I search for multiple keywords at once?
Yes, you submit a list of keywords or phrases in a single request and get back timestamps for every match across the list.
How do I get the results back?
The task runs asynchronously and returns a task_id right away; matches with timestamps are delivered via a signed webhook or a signed link valid 24 hours.
Can I bulk-search a large audio archive?
Yes, submit one request per file and each is queued independently, so you can process an archive in parallel and collect timestamps as results complete.
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/search \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"audio":"https://ejemplo.com/audio.mp3"}'const res = await fetch("https://api.kit.forhosting.com/audio/search", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"audio": "https://ejemplo.com/audio.mp3"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/audio/search",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"audio": "https://ejemplo.com/audio.mp3"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/audio/search", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"audio":"https://ejemplo.com/audio.mp3"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"audio":"https://ejemplo.com/audio.mp3"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/audio/search", 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/audio.mp3"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "audio.search",
"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. |