Action items
A conversation ends and everyone nods along to commitments that, three days later, nobody quite remembers making. This endpoint listens once and hands back exactly the to-dos, so they don't have to survive on memory alone.
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 specific gap this fills
A meeting summary tells you what a conversation was about; it doesn't reliably tell you who has to do what by when. Those are different extraction problems, and squeezing both out of one generic summary tends to bury the action items under context nobody needs later. audio.action_items is scoped to only that: commitments made out loud, attributed to whoever made them.
How a request flows
POST the recording to /audio/action-items and receive a task_id right away, while the audio is processed off the request thread. The result — a list of action items, each tied to a speaker where the audio makes that clear — arrives at your webhook or through a signed link valid for 24 hours, ready to drop into whatever tracks work for your team.
Why spoken commitments are slippery to extract
People rarely state a task the way a project manager would write it. They say 'I'll circle back on that' or 'someone should probably check the numbers,' and a useful extraction has to recognize those as commitments without inventing specificity that was never spoken — a deadline that wasn't given, an owner who wasn't named. We surface exactly what the conversation supports; vague commitments come back as vague, not silently sharpened into something more confident than the recording actually was.
What it deliberately leaves out
This isn't a full transcript and it isn't a narrative summary — it's a working list, stripped of the discussion that led to each item. If you need the reasoning behind a decision as well as the resulting task, pair it with audio.summarize or a transcription task rather than expecting one endpoint to do both jobs well.
How teams actually use it
The natural home for the output is wherever your team already tracks work — feed it into a task board, drop it at the top of the follow-up email, or attach it to the calendar event for the next check-in. Because it's billed per request plus per minute and runs async, it fits equally well as a one-off after an important client call or as a standing job wired into every recurring internal meeting.
What you can do with it
Post-call follow-ups
A sales rep gets a list of commitments made on a discovery call and pastes it straight into the CRM's next-steps field.
Standing team meetings
A team wires the endpoint into its recurring meeting recording so action items land in the project board automatically every week.
Client project accountability
An agency extracts action items from client calls so nothing verbally agreed to gets lost between the call and the next status update.
Interview and consultation follow-through
A consultant pulls action items out of a client consultation to build the engagement's initial task list without re-listening to the call.
FAQ
How do I extract action items from a meeting recording via API?
Send the recording to POST /audio/action-items, keep the returned task_id, and get the list of action items by webhook or a signed link valid for 24 hours.
Is the action items API free to use?
No, there is no free tier or trial. It's priced at $0.004 per request plus $0.0185 per minute, and a failed task is never charged.
How is this different from meeting minutes?
Meeting minutes cover decisions, owners and next steps as a fuller record; this endpoint is scoped narrowly to the actionable to-do list on its own.
Does it assign a due date to each item?
Only when one was actually stated in the recording — it won't invent a deadline that wasn't spoken.
Can it tell who is responsible for each item?
It attributes items to speakers when that's clear from the audio; ambiguous ownership is reflected as ambiguous rather than guessed.
What if the conversation had no real commitments?
You'll get back an honestly short or empty list rather than manufactured tasks that were never actually agreed to.
Can I run it on long calls or all-day sessions?
Yes, it processes asynchronously and bills per minute, so length isn't a barrier — you're notified by webhook once results are ready.
Is the audio kept after processing?
No, audio and results are deleted after the retention window and are never used for training.
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/action-items \
-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/action-items", {
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/action-items",
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/action-items", 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/action-items", 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.action_items",
"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. |