Xound

Xound Developer API

Programmatic audio & video enhancement — noise removal and studio-grade speech restoration, billed per processed audio-minute.

Base URLhttps://api.xound.io
AuthAuthorization: Bearer sk_live_…
Content inmultipart/form-data (file upload)
Content outaudio/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_xxxxxxxxxxxxxxxxxxxx

Quickstart

# 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.wav

Python 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):

ValueDescription
mp3(default)Compact, ready to publish.
wavUncompressed 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.

FieldTypeReqDefaultNotes
filefileAudio .mp3 .wav .m4a .flac .ogg · Video .mp4 .mov
enhancerstringclassicclassic or studio (see Enhancers)
formatstringmp3mp3 or wav (24-bit/48 kHz, audio only)
strengthnumber1000–100. classic: noise-attenuation limit. studio: 100 = voice only, lower keeps % of background.
loudnessboolfalseNormalize to lufs.
lufsstring-18Target 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

CodeMeaning
401Missing or invalid API key
402No active subscription — subscribe at /developers
400Unsupported file format, or invalid format
404Job 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.