Merge audio
Stitching a dozen voice memos, ad reads or podcast segments into one clean file by hand means opening an editor, dragging waveforms, and hoping nothing shifts out of sync. This merge audio files API takes an ordered list of clips and hands back one continuous track, so the assembly step disappears from your workflow entirely.
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 joining clips is harder than it looks
Two audio files rarely share the exact same sample rate, bit depth or channel layout, which is why a naive drag-and-drop merge in a desktop editor can produce clicks, pitch shifts or silent gaps at the seams. Podcast producers splicing intro music into an episode, IVR teams assembling prompt libraries, and course creators combining lesson segments all hit this same wall: the files sound fine individually but wrong once joined. The merge endpoint normalizes and concatenates the inputs so the seams are clean, without you having to match formats by hand first.
What you send and what you get back
You submit the ordered list of audio files to POST /audio/merge; the request is queued asynchronously and returns a task_id immediately rather than making your application wait on a long render. Once the merge finishes, the single combined file is delivered through a signed webhook or a signed link valid for 24 hours, ready to store, stream or feed into the next step of a pipeline.
Where this fits in real workflows
Merging is the quiet, unglamorous step behind a surprising amount of audio production: an intro jingle joined to spoken content, hold music joined to a recorded IVR prompt, or a set of interview segments joined into one deliverable file. Because it is one call with a predictable per-request plus per-minute price, teams that used to script this with local command-line tools can instead trigger it from wherever their content already lands, and treat the output as just another asset in the pipeline rather than a manual chore.
Access, pricing and current status
Pricing is a flat $0.077 base per request plus $0.0045 per minute of resulting audio, so a short two-minute merge costs a small fraction of joining an hour of content, and a task that fails after automatic retries is never billed. As with every endpoint, calling it requires prepaid balance; without one, the API returns a clean HTTP 402 instead of a partial or degraded result. This endpoint is currently in deployment and will begin accepting jobs soon — the specification above reflects exactly how it will behave at launch.
Data handling
Source clips and the merged output are held only for the retention window needed to deliver your webhook or signed link, then deleted; nothing you upload is ever used to train models. That means you can send sensitive voice recordings or unreleased audio through the merge step without it becoming part of any dataset beyond your own.
What you can do with it
Podcast episode assembly
Join an intro jingle, the recorded interview and an outro sponsor read into one publish-ready episode file.
IVR prompt libraries
Concatenate a greeting, hold music and a closing message into the single audio file a phone system expects for one prompt.
Course lesson stitching
Combine several short recorded segments of a lesson into one continuous file for a learning platform.
Voice memo consolidation
Merge a series of separately recorded voice notes into one chronological track for review or transcription.
FAQ
How do I merge audio files with this API?
Send an ordered list of audio files to POST /audio/merge; it queues asynchronously and returns a task_id, and the concatenated file arrives via webhook or a signed link.
Is the merge audio files API free?
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.
What order do the merged clips play in?
The clips are concatenated in exactly the order you list them in the request, so ordering is entirely under your control.
How much does merging audio cost?
It costs $0.077 per request plus $0.0045 per minute of the resulting audio, so total cost scales with the merged track's length.
Is the audio merge API available now?
It is currently in deployment and will start accepting jobs soon; the endpoint, pricing and delivery method described here are final for launch.
Can I merge files with different formats or sample rates?
Yes, the endpoint is built to normalize differing inputs before concatenating them so the seams between clips stay clean.
How many clips can I merge in one request?
You can submit a list of multiple clips in a single request; each merge is one task_id and one delivered result file.
How do I get the merged file back?
Results are delivered through a signed webhook, the recommended method, or a signed link valid for 24 hours if you prefer to poll.
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/merge \
-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/merge", {
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/merge",
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/merge", 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/merge", 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.merge",
"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. |