Audio to a blog post
The spoken and the written word aren't the same thing, so a raw transcript dropped into a blog reads like exactly what it is — a transcript. This endpoint takes recorded audio and restructures it into an article, with the false starts, filler words and conversational rhythm smoothed into readable prose.
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.
What breaks when you publish a transcript as a post
Speech repeats itself, circles back and trails off mid-thought in ways that work fine out loud and read as sloppy on a page. A transcript pasted straight into a blog forces readers to mentally edit as they go, which is why most raw-transcript posts get skimmed and abandoned rather than read. Turning talk into an article means restructuring around ideas, not just cleaning up sentences, and that rewrite is what this endpoint does automatically.
How the conversion works
Call POST /audio/to-blog with the recording, and the task transcribes it internally before reorganizing the content into an article with headings, paragraph breaks and a coherent flow — the shape of something written to be read, not heard. Because it's asynchronous, you send the file once and the finished draft arrives at your webhook, or sits at a signed link for 24 hours for you to retrieve.
Repurposing audio into text isn't new, just slower before
Interview-based journalism has always involved turning a recorded conversation into prose — a reporter listens back, picks the useful parts, and writes around them, discarding most of the actual transcript. This endpoint automates that same editorial judgment: what to keep, how to structure it, and how to phrase it for reading rather than listening, applied consistently at whatever volume you need.
Who this saves real hours for
Podcasters who want a companion post for each episode without writing one from scratch, video creators repurposing a talk-to-camera into a blog for SEO, and businesses turning recorded webinars or expert interviews into content marketing all use this the same way — as the first draft of an article they'd otherwise pay a writer to produce from a recording.
Fitting it into a content pipeline
This slots naturally after recording and before publishing: feed it the audio, get back a draft article, and route it to an editor or a CMS for final review. Pair it with the Show Notes API when you need both a short episode description and a full-length article from the same source file, so one recording produces the whole spread of content a release calendar actually needs.
What you can do with it
Podcast companion articles
Turn each episode into a written piece for the blog, giving search engines something to index beyond an audio player embed.
Webinar and talk repurposing
Convert a recorded webinar or conference talk into an article, extending its reach to people who'll never watch the full recording.
Interview-based content marketing
Record a conversation with an expert or customer and get a publishable article back, instead of a staff writer spending hours transcribing and rewriting.
Multilingual content teams
Generate an article draft from spoken content quickly enough to keep pace with a publishing calendar that spans several shows or channels.
FAQ
How is the audio to blog post API different from a plain transcript?
A transcript records what was said word for word, while this endpoint restructures that content into an article with headings and paragraph flow meant to be read, not just a cleaned-up recording of speech.
Does the article need editing before I publish it?
Treat it as a strong first draft — most teams do a pass for house style and tone, but the structure, headings and substance are already handled.
Can I try this for free first?
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 price calculated?
A base fee per request plus a per-minute rate on the audio's length, both published on this page, and nothing is charged for a task that fails after retries.
What length of audio works best?
Both short clips and long recordings are supported; price scales with minutes, so a 10-minute clip and a 90-minute talk are both handled, just at different cost.
Will it keep my original speaking voice or tone?
It aims to preserve the substance and viewpoint of what was said while adapting the phrasing for reading, so the article reflects the content rather than mimicking spoken cadence.
How do I get the finished article?
Via a signed webhook when the task completes, or a signed link valid for 24 hours if you'd rather retrieve it on your own schedule.
Is my recording stored after the article is generated?
No, audio is deleted after the retention period and never used to train models, so nothing from your recording persists past producing the article.
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/to-blog \
-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/to-blog", {
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/to-blog",
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/to-blog", 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/to-blog", 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.to_blog",
"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. |