Xound Developer API
Programmatic audio & video enhancement — noise removal and studio-grade speech restoration, billed per processed audio-minute.
| Base URL | https://api.xound.io |
|---|---|
| Auth | Authorization: Bearer sk_live_… |
| Content in | multipart/form-data (file upload) |
| Content out | audio/mpeg, audio/wav, or video/mp4 |
Processing is asynchronous: start a job, poll its status, then download the result. A job's status moves queued → running → done (or error); progress is 0–100.
Authentication
Every /v1 request needs your secret API key as a bearer token. Create and manage keys in the developer dashboard (passwordless sign-in). Keep the key secret — it grants billable processing.
Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxQuickstart
# 1) Start a job — the response includes status_url + result_url
curl https://api.xound.io/v1/enhance \
-H "Authorization: Bearer $XOUND_API_KEY" \
-F "file=@input.wav" \
-F "enhancer=classic" \
-F "format=wav"
# → {
# "job_id": "9f2c…", "status": "processing", "is_video": false,
# "format": "wav",
# "status_url": "https://api.xound.io/v1/jobs/9f2c…",
# "result_url": "https://api.xound.io/v1/jobs/9f2c…/result"
# }
# 2) Poll the status every ~2s until result_available == true
curl https://api.xound.io/v1/jobs/9f2c… \
-H "Authorization: Bearer $XOUND_API_KEY"
# → { "status": "running", "progress": 80, "result_available": false, … }
# 3) Download the enhanced file
curl https://api.xound.io/v1/jobs/9f2c…/result \
-H "Authorization: Bearer $XOUND_API_KEY" -o output.wavPython example
import time, requests
API_KEY = "sk_live_…"
H = {"Authorization": f"Bearer {API_KEY}"}
# Start a job
r = requests.post("https://api.xound.io/v1/enhance", headers=H,
files={"file": open("input.wav", "rb")},
data={"enhancer": "classic", "format": "wav"}).json()
# Poll until ready
while True:
s = requests.get(r["status_url"], headers=H).json()
if s["error"]:
raise RuntimeError(s["error"])
if s["result_available"]:
break
time.sleep(2)
# Download the result
open("output.wav", "wb").write(requests.get(r["result_url"], headers=H).content)Enhancers
Pick a model per request with enhancer:
classic default
Removes noise, hum and background while preserving the original voice character and stereo image. Best when you want the recording to sound like itself, just clean — podcasts, interviews, calls, field recordings. Works on audio and video; supports WAV output.
studio
Rebuilds the voice for a clean, studio-grade result even from heavily degraded, muffled or low-bitrate recordings, and can remove music/ambience entirely. Output is 48 kHz mono. Best when maximum voice clarity matters more than preserving the exact original signal.
Output formats
Set format for audio inputs (video always returns mp4):
| Value | Description |
|---|---|
mp3(default) | Compact, ready to publish. |
wav | Uncompressed 24-bit / 48 kHz PCM, without added EQ/compression — ideal for studio pipelines. |
POST /v1/enhance
Start an enhancement job. Returns immediately with a job_id.
| Field | Type | Req | Default | Notes |
|---|---|---|---|---|
file | file | ✅ | — | Audio .mp3 .wav .m4a .flac .ogg · Video .mp4 .mov |
enhancer | string | ❌ | classic | classic or studio (see Enhancers) |
format | string | ❌ | mp3 | mp3 or wav (24-bit/48 kHz, audio only) |
strength | number | ❌ | 100 | 0–100. classic: noise-attenuation limit. studio: 100 = voice only, lower keeps % of background. |
loudness | bool | ❌ | false | Normalize to lufs. |
lufs | string | ❌ | -18 | Target LUFS when loudness=true (e.g. -14). |
Response 200 — includes status_url and result_url so you don't build them yourself.
GET /v1/jobs/{job_id}
Poll this for progress. A job is finished when result_available is true (or error is non-null). 404 if the job isn't owned by your key.
{
"job_id": "9f2c…",
"status": "running", // queued | running | done | error
"progress": 80, // 0–100
"media_duration_s": 42.1,
"result_available": false,
"error": null
}GET /v1/jobs/{job_id}/result
Streams the processed file. Content type follows the request: audio/mpeg, audio/wav, or video/mp4. 404 until ready or after the 3-day retention window.
GET /v1/account
Your account and usage in the current billing period.
{
"account_id": "…",
"email": "you@company.com",
"plan": "starter",
"usage": { "periodMinutes": 128.4, "totalMinutes": 640.0, "jobCount": 92 }
}Errors
| Code | Meaning |
|---|---|
401 | Missing or invalid API key |
402 | No active subscription — subscribe at /developers |
400 | Unsupported file format, or invalid format |
404 | Job not found, not ready, or expired (3-day retention) |
Billing
Metered by processed audio-minute. Monthly plans include a minute allotment; usage beyond it is billed as overage. See xound.io/api for tiers, or manage your plan in the dashboard.