Customer support & sales
Cut handle time. Agents stop saying "can you repeat that?". Recorded conversations become legible for QA. Higher CSAT, lower escalation rate.
One API request removes background noise, hum, traffic, keyboards, fans and crowd chatter from any voice stream. Plug it into your contact center, recording pipeline, transcription engine or voice AI — without rebuilding a thing.
Designed for teams that ship voice products
The problem
Every barking dog, traffic hum, keyboard click and crowd chatter that bleeds into your audio costs your team something: a frustrated customer, a misheard transcript, a refunded order, a missed sale. Most voice apps just live with it because building a real fix means months of audio research, GPUs, and edge cases.
Use cases
Drop the API into an existing voice flow without touching the rest of your stack. Streaming for live audio, batch for recordings — same API, same results.
Cut handle time. Agents stop saying "can you repeat that?". Recorded conversations become legible for QA. Higher CSAT, lower escalation rate.
Doctors hear patient details the first time. Waiting-room chatter, traffic, breathing artifacts — gone. Cleaner recordings simplify clinical review.
Creators record from anywhere — bedrooms, hotel rooms, cafes. Your platform delivers broadcast-quality audio without asking them to buy a studio.
Meetings sound like everyone's in the same quiet room. Dogs, doorbells, construction outside — suppressed in real time, no client install.
Drop in front of any speech-to-text or voice-agent stack. Cleaner input means dramatically higher accuracy on noisy real-world recordings.
Students join from anywhere. Background TV, siblings, traffic — cleaned before the lecturer or the captioner has to deal with it.
What you get
Standard REST and WebSocket. No custom protocols, no SDK lock-in, no audio engineering required. If you can curl an API, you can ship this.
Stream 10-millisecond audio frames over WebSocket and get clean audio back in the same connection. Suitable for live conversations, voice agents, and interactive recording UIs.
Audio is never used to train anything. Batch files are encrypted at rest and auto-deleted on a schedule you control. SOC 2 alignment in progress.
Usage-based pricing on actual audio seconds processed — not seats, not connections, not minimums. Generous free tier for development and small teams.
How it works
You send audio. We clean it. You get audio back. Pick the mode that matches your product — live streaming for interactive flows, batch for files at rest. Both share the same authentication, the same pricing, and the same quality.
Stream raw audio frames over a secure WebSocket, or POST a file (WAV, MP3, FLAC, OGG) to a one-shot endpoint. Authenticated with a Bearer key.
A purpose-built noise-cancellation engine isolates the human voice and suppresses everything else: hum, hiss, traffic, keyboards, fans, background chatter. Speech-aware, not just a filter.
Streaming: a clean frame for every frame you sent, in order. Batch: a URL to download the processed file when it's done. Same sample rate in, same out.
Live audio, in and out, on a single WebSocket. Use it when latency matters: live conversations, voice agents, live captions.
Upload a file, get a clean file back. Use it for recordings, voicemails, podcasts, archive processing.
Quickstart
You will need an API key. Request one here — we onboard beta partners individually.
Export your API key. Keep it server-side — never ship it in browser JavaScript or a mobile binary.
# export your key once per shell export NC_API_KEY="sk_your_api_key_here" export NC_BASE_URL="https://api-noise-cancellation.us.tech"
Ask the API for an upload URL. The response contains a pre-signed URL valid for 15 minutes — you upload directly to storage from anywhere with internet access.
# 1. Ask for an upload URL RESP=$(curl -sS -X POST "$NC_BASE_URL/v1/enhance" \ -H "authorization: Bearer $NC_API_KEY" \ -H "content-type: application/json" \ --data '{"content_type": "audio/wav"}') JOB_ID=$(echo "$RESP" | jq -r .job_id) UPLOAD_URL=$(echo "$RESP" | jq -r .upload_url) # 2. Upload your audio directly to the pre-signed URL curl -sS -X PUT "$UPLOAD_URL" \ -H "content-type: audio/wav" \ --data-binary @my-recording.wav
Kick the job, poll for completion, and download.
# 3. Start the job (queues for processing) curl -sS -X POST "$NC_BASE_URL/v1/enhance/$JOB_ID/start" \ -H "authorization: Bearer $NC_API_KEY" # 4. Poll until done while true; do STATE=$(curl -sS "$NC_BASE_URL/v1/jobs/$JOB_ID" \ -H "authorization: Bearer $NC_API_KEY") STATUS=$(echo "$STATE" | jq -r .status) [ "$STATUS" = "completed" ] && break [ "$STATUS" = "failed" ] && exit 1 sleep 2 done # 5. Download the cleaned audio DL=$(echo "$STATE" | jq -r .download_url) curl -sS -o cleaned.wav "$DL"
That's the whole batch flow.
No queues to manage, no servers to provision, no audio-engineering background needed. Same shape works for short clips and long recordings alike, up to the per-file size limit.
Streaming
For live conversations and voice agents, open a WebSocket and stream raw 10‑millisecond PCM-16 audio frames. You get a cleaned frame back for every frame you send, in order, on the same connection.
wss://api-noise-cancellation.us.tech/v1/stream
Send your key as a header on the upgrade request, or append ?api_key=<key> for browsers.
import asyncio, os, websockets async def clean_stream(mic_frames): """Yield cleaned 10ms PCM-16 frames for each frame from `mic_frames`.""" url = "wss://api-noise-cancellation.us.tech/v1/stream" headers = {"authorization": f"Bearer {os.environ['NC_API_KEY']}"} async with websockets.connect(url, extra_headers=headers) as ws: async def send_loop(): async for frame in mic_frames: # 960 bytes/frame await ws.send(frame) send_task = asyncio.create_task(send_loop()) try: async for clean_frame in ws: # clean PCM-16 yield clean_frame finally: send_task.cancel()
1000Normal close1008Concurrency limit / policy1011Server backpressure4401Invalid or missing API keyAPI reference
Base URL: https://api-noise-cancellation.us.tech. All endpoints require Authorization: Bearer <key> except /healthz and /readyz.
/v1/enhance
Reserve a job & get an upload URL
{ "content_type": "audio/wav" }
Accepted: audio/wav, audio/mpeg, audio/flac, audio/ogg.
{ "job_id": "5aef129a-...", "upload_url": "https://...", "upload_expires_in_sec": 900, "content_type": "audio/wav" }
/v1/enhance/{job_id}/start
Queue the uploaded audio for processing
job_id — the id returned by /v1/enhance.
400 nothing uploaded yet404 wrong owner / not found409 already started / completed{ "job_id": "5aef129a-...", "status": "queued" }
/v1/jobs/{job_id}
Poll status & collect the download URL
pending_uploadqueuedprocessingcompletedfailed{ "job_id": "5aef129a-...", "status": "completed", "created_at": "2026-05-11T18:45:26Z", "completed_at": "2026-05-11T18:45:30Z", "download_url": "https://...", "download_expires_in_sec": 3600 }
/v1/stream
Bidirectional real-time streaming
Each WebSocket message is a single 480-sample PCM-16 frame (960 bytes). Send and receive frames in any order; cleaned frames return in send order. See the streaming guide for example code.
/healthz
·
/readyz
Liveness & readiness
No auth required. /readyz also reports backing-store health.
$ curl https://api-noise-cancellation.us.tech/readyz {"status":"ok","db":"ok","redis":"ok"}
SDKs
Sync & async, mic helper, batch one-liner
# install pip install noise-cancellation # clean a file end-to-end from noise_cancellation import Client Client(api_key="sk_...").enhance_file( "in.wav", "out.wav", )
Server-side & AudioWorklet
// install (preview) npm install @noise-cancellation/sdk // clean a file end-to-end import { Client } from "@noise-cancellation/sdk"; await new Client({ apiKey: "sk_..." }) .enhanceFile("in.wav", "out.wav");
Errors & limits
All errors return a JSON body with a detail field. Authentication failures use HTTP 401 for REST and close code 4401 for WebSocket.
400Malformed request body401Invalid / missing API key404Job not found / not yours409Job state conflict413File exceeds 100 MB cap429Rate limit exceeded5xxServer error — retry with backoffHigher tiers and custom limits available on request.
Burst-friendly with token-bucket smoothing.
~ 30 minutes of 48 kHz mono WAV.
Configurable per workspace.
FAQ
Beta access is free for development and small production traffic. Tell us a little about what you're building and we'll get you a key.