Vocal Separation API — Studio-Grade Stems in One REST Call
Split any song into clean vocals + instrumental programmatically. The same 3-model Studio ensemble as our app (SDR 12.97 dB), behind a dead-simple REST API. $0.50 per song, pay-as-you-go — no subscription, no monthly minimum.
Get your API key and make the first call in 2 minutes
🔑 Generate an API keySign in with Google → generate key → top up credits → call the API
Why build on it
🎚️ Studio quality, not toy quality
A weighted ensemble of BS-Roformer + Mel-Band Roformer + MDX23C — SDR 12.97 dB. Cleaner stems than single-model open-source separators.
💵 Pay only for what you run
$0.50 per song-unit from prepaid credits. No monthly seat, no minimum. A cheaper alternative to LALAL.AI / Moises for batch and app workloads.
🧩 Two calls, done
POST a URL or upload a file → poll a job → download stems. No SDK required.
↩️ Fair billing
Credits are reserved when a job starts and automatically refunded if it fails — you never pay for a broken run.
Quickstart
1. Sign in at /account, click Generate API key (looks like vsk_…), and top up credits. 2. Submit a job:
# Submit a separation job
curl -X POST https://aivoiceseparator.com/api/v1/separate \
-H "X-API-Key: vsk_your_key_here" \
-H "Content-Type: application/json" \
-d '{"url": "https://www.youtube.com/watch?v=VIDEO_ID", "output_format": "mp3"}'
# → {"job_id":"a1b2c3","status_url":".../api/v1/jobs/a1b2c3",
# "cost_credits":1,"credit_balance":950}
3. Poll until state is done, then download the stems (download URLs are public + opaque, valid 24 h):
curl https://aivoiceseparator.com/api/v1/jobs/a1b2c3 \
-H "X-API-Key: vsk_your_key_here"
# → {"job_id":"a1b2c3","state":"done","progress":100,"output_format":"mp3",
# "stems":[
# {"name":"vocals","url":".../api/download/a1b2c3/vocals"},
# {"name":"instrumental","url":".../api/download/a1b2c3/instrumental"}]}
Python example
import requests, time
API = "https://aivoiceseparator.com"
H = {"X-API-Key": "vsk_your_key_here"}
job = requests.post(f"{API}/api/v1/separate", headers=H,
json={"url": "https://youtu.be/VIDEO_ID", "output_format": "wav"}).json()
while True:
s = requests.get(f"{API}/api/v1/jobs/{job['job_id']}", headers=H).json()
if s["state"] in ("done", "error"): break
time.sleep(5)
for stem in s["stems"]: # vocals + instrumental
open(stem["name"]+".wav", "wb").write(requests.get(stem["url"]).content)
Endpoints
| Body field | Type | Description |
|---|---|---|
url | string (required) | Any public audio/video URL — a direct file (MP3/WAV/M4A…), an S3/CDN link, or a platform page (YouTube, SoundCloud, TikTok, Bandcamp, Vimeo). Internal/private addresses are refused. To send a local file instead, use /api/v1/separate/upload. |
output_format | string | mp3 (default, 320 kbps), wav, or flac. |
transcribe | boolean | Optional. If true, also generates lyrics (SRT/LRC/TXT) via Whisper. |
Returns { job_id, status_url, cost_credits, credit_balance }. Credits are charged on submit and refunded if the job fails.
Send your own file as multipart/form-data instead of a URL. Fields: file (required), output_format, transcribe. Same response and billing as above.
curl -X POST https://aivoiceseparator.com/api/v1/separate/upload \
-H "X-API-Key: vsk_your_key_here" \
-F "file=@song.mp3" \
-F "output_format=wav"
# → {"job_id":"…","status_url":"…","cost_credits":1,"credit_balance":900}
Poll a job you own. state is one of queued · downloading · processing · done · error. When done, stems holds the download URLs; when error, error holds the reason.
Manage your key from the web (used by the /account page). Generate, view, or revoke.
Pricing
| Clip length | Song-units | Cost |
|---|---|---|
| up to 7 min | 1 | $0.50 |
| 7–14 min | 2 | $1.00 |
| 14–20 min (max) | 3 | $1.50 |
Prepaid credits, topped up on /account. No subscription, no monthly minimum, no per-seat fee. Failed jobs are refunded automatically.
Limits & errors
| Code | Meaning |
|---|---|
401 | Missing / invalid / revoked API key. |
402 | Insufficient credit — top up at /account. |
413 | Clip longer than the 20-minute limit. |
422 | URL couldn't be read (private, region-locked, unsupported host, or a live stream). |
429 | Rate limit — max 30 requests per 10 minutes per key. |
- Output: 2 stems —
vocalsandinstrumental— Studio 3-model ensemble. - Retention: input and output files are auto-deleted after 24 hours. Never used to train models.
- Processing: asynchronous — a 5-minute song completes in roughly 5–6 minutes on our RTX GPU.
FAQ
How is this different from LALAL.AI or Moises's API?
Same category, simpler billing. We're pay-as-you-go at $0.50/song with no subscription or monthly minimum, and our Studio ensemble measures SDR 12.97 dB. Good for batch jobs and apps where you don't want a fixed monthly commitment.
Can I send my own audio file instead of a URL?
Yes — two ways: upload the file (multipart/form-data) to POST /api/v1/separate/upload, or pass any public file URL (an S3/CDN link, a direct .mp3, etc.) to POST /api/v1/separate. Same $0.50/song billing either way. Platform pages (YouTube/SoundCloud/TikTok/…) also work as URLs.
Do I need the API key to download the stems?
No — the download URLs returned by the job are public but opaque (unguessable job id) and expire after 24 hours. Fetch them within that window.
Is there a free trial?
The web app gives you a free run to judge quality. For the API, top up the smallest credit pack ($1 = 2 songs) to test end-to-end before scaling.
What about rate limits and throughput?
30 requests / 10 min per key for submission (burst guard). Jobs run on a single-GPU queue, so heavy batch throughput is sequential — contact us for dedicated capacity.
Ship stem separation into your product today
🔑 Generate an API key$0.50/song · pay-as-you-go · studio-grade · talk to us