The noise-remover.com REST API lets you integrate professional AI background noise removal and voice enhancement directly into your application, workflow, or platform. The same AI that powers our Studio — all six presets, all six output formats, the same quality — available programmatically at scale.
Authenticate every request by including your API key as a Bearer token in the Authorization header. API keys are generated in your dashboard after subscribing to an API plan.
Authorization: Bearer nr_live_sk_YOUR_API_KEY_HERE
nr_live_sk_ for production keys. Test your integration with the Dev plan before moving to production. All plans use live keys — there is no separate sandbox environment.https://noise-remover.com/api/v1
All API endpoints are relative to this base URL. Requests that submit files use multipart/form-data encoding. Requests that do not include file uploads accept and return application/json. All responses are returned as JSON.
Submits an audio or video file for AI noise removal and voice enhancement. Returns a job ID immediately — processing is asynchronous. Use GET /job/:id to poll for completion or configure a webhook (Pro+ plans) to receive a callback.
Request parameters (multipart/form-data)curl -X POST https://noise-remover.com/api/v1/enhance \ -H "Authorization: Bearer nr_live_sk_YOUR_KEY" \ -F "file=@/path/to/recording.mp3" \ -F "preset=podcast" \ -F "output_format=wav"
const FormData = require('form-data'); const fetch = require('node-fetch'); const fs = require('fs'); const form = new FormData(); form.append('file', fs.createReadStream('./recording.mp3')); form.append('preset', 'podcast'); form.append('output_format', 'wav'); form.append('metadata', JSON.stringify({ episode_id: 'ep-042' })); const res = await fetch('https://noise-remover.com/api/v1/enhance', { method: 'POST', headers: { 'Authorization': 'Bearer nr_live_sk_YOUR_KEY', ...form.getHeaders() }, body: form }); const data = await res.json(); console.log(data.job_id); // "job_3f8a2c9e"
import requests API_KEY = "nr_live_sk_YOUR_KEY" with open("recording.mp3", "rb") as f: response = requests.post( "https://noise-remover.com/api/v1/enhance", headers={"Authorization": f"Bearer {API_KEY}"}, files={"file": f}, data={ "preset": "podcast", "output_format": "wav", "metadata": '{"episode_id": "ep-042"}' } ) data = response.json() print(data["job_id"]) # "job_3f8a2c9e"
$ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => 'https://noise-remover.com/api/v1/enhance', CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Authorization: Bearer nr_live_sk_YOUR_KEY'], CURLOPT_POSTFIELDS => [ 'file' => new CURLFile('/path/to/recording.mp3'), 'preset' => 'podcast', 'output_format' => 'wav', ], ]); $result = json_decode(curl_exec($ch), true); echo $result['job_id']; // "job_3f8a2c9e"
{
"job_id": "job_3f8a2c9e",
"status": "pending",
"preset": "podcast",
"output_format": "wav",
"file_duration": null, // set once processing starts
"metadata": { "episode_id": "ep-042" },
"created_at": "2025-06-13T10:30:00Z",
"estimated_completion": "2025-06-13T10:31:00Z"
}
Returns the current status and details of a processing job. Poll this endpoint every 3–5 seconds until status is completed or failed. On completion, the response includes a time-limited download URL for the processed file. Do not poll more frequently than every 3 seconds to stay within rate limits.
curl https://noise-remover.com/api/v1/job/job_3f8a2c9e \ -H "Authorization: Bearer nr_live_sk_YOUR_KEY"
// Poll until complete async function waitForJob(jobId) { while (true) { const res = await fetch(`https://noise-remover.com/api/v1/job/${jobId}`, { headers: { 'Authorization': 'Bearer nr_live_sk_YOUR_KEY' } }); const job = await res.json(); if (job.status === 'completed') return job.download_url; if (job.status === 'failed') throw new Error(job.error_message); await new Promise(r => setTimeout(r, 3000)); // wait 3s } }
import time, requests def wait_for_job(job_id, api_key): url = f"https://noise-remover.com/api/v1/job/{job_id}" headers = {"Authorization": f"Bearer {api_key}"} while True: job = requests.get(url, headers=headers).json() if job["status"] == "completed": return job["download_url"] if job["status"] == "failed": raise Exception(job["error_message"]) time.sleep(3)
{
"job_id": "job_3f8a2c9e",
"status": "completed",
"preset": "podcast",
"output_format": "wav",
"file_duration": 1844, // seconds (30m 44s)
"minutes_used": 30.73,
"download_url": "https://noise-remover.com/api/v1/audio/download/job_3f8a2c9e.wav?token=...",
"download_expires": "2025-06-13T11:30:00Z", // 1 hour from completion
"metadata": { "episode_id": "ep-042" },
"created_at": "2025-06-13T10:30:00Z",
"completed_at": "2025-06-13T10:30:52Z"
}
Returns a paginated list of your processing jobs, ordered by creation date descending. Useful for dashboards, usage reports, and job management interfaces.
Query parameterscurl "https://noise-remover.com/api/v1/jobs?limit=20&status=completed" \ -H "Authorization: Bearer nr_live_sk_YOUR_KEY"
Immediately and permanently deletes a job record and any associated files. Completed jobs are automatically deleted after the 1-hour download window, but you can trigger immediate deletion earlier using this endpoint.
curl -X DELETE https://noise-remover.com/api/v1/job/job_3f8a2c9e \ -H "Authorization: Bearer nr_live_sk_YOUR_KEY"
{ "deleted": true, "job_id": "job_3f8a2c9e" }
Returns your current billing period usage — minutes consumed, minutes remaining, overage, and billing reset date. Use this to build usage dashboards or trigger alerts when approaching your plan limit.
curl https://noise-remover.com/api/v1/usage \ -H "Authorization: Bearer nr_live_sk_YOUR_KEY"
{
"plan": "api_pro",
"minutes_included": 4000,
"minutes_used": 1847.3,
"minutes_remaining": 2152.7,
"overage_minutes": 0,
"overage_cost": "$0.00",
"period_start": "2025-06-01T00:00:00Z",
"period_end": "2025-06-30T23:59:59Z"
}
Instead of polling GET /job/:id, configure a webhook URL and we will POST a notification to your endpoint when each job completes (or fails). Webhooks are available on Pro API and Business plans.
webhook_url parameter per-request to override the default.{
"event": "job.completed", // or "job.failed"
"job_id": "job_3f8a2c9e",
"status": "completed",
"preset": "podcast",
"output_format": "wav",
"file_duration": 1844,
"minutes_used": 30.73,
"download_url": "https://noise-remover.com/api/v1/audio/download/job_3f8a2c9e.wav?token=...",
"download_expires": "2025-06-13T11:30:52Z",
"metadata": { "episode_id": "ep-042" },
"timestamp": "2025-06-13T10:30:52Z",
"signature": "sha256=a3f2c9e1b8d4..."
}
Every webhook includes a signature field — an HMAC-SHA256 hash of the raw request body, signed with your webhook secret (found in your dashboard). Always verify this signature before processing the payload.
const crypto = require('crypto'); function verifyWebhook(rawBody, signature, secret) { const expected = 'sha256=' + crypto .createHmac('sha256', secret) .update(rawBody) .digest('hex'); return crypto.timingSafeEqual( Buffer.from(expected), Buffer.from(signature) ); }
import hmac, hashlib, secrets def verify_webhook(raw_body: bytes, signature: str, secret: str) -> bool: expected = "sha256=" + hmac.new( secret.encode(), raw_body, hashlib.sha256 ).hexdigest() return secrets.compare_digest(expected, signature)
Rate limits apply across all endpoints. When you exceed the limit, requests return HTTP 429 with a Retry-After header indicating how many seconds to wait before retrying.
Rate limit headers are included in every response:
All errors return a consistent JSON structure:
{
"error": {
"code": "file_too_large",
"message": "File size exceeds the 200MB limit for your plan.",
"status": 413
}
}
metadata field to job submission and all job responsesestimated_completion field to POST /enhance responseSubscribe to an API plan and get your key instantly. Full documentation above — most integrations go live the same day.