Base URL: https://noise-remover.com/api/v1
All requests require JSON or multipart/form-data Get API key
Introduction
Everything you need to integrate noise removal into your application

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.

Fast processing
Under 60s for most files under 10 minutes
Webhook support
Push notifications on job completion (Pro+)
Privacy first
Files deleted immediately after processing
Quick start: Subscribe to an API plan on the pricing page, grab your API key from the dashboard, and make your first request using the examples in the /enhance endpoint section below. You can be live in production the same afternoon.
Authentication
All API requests must include a valid API key

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.

Header format
Authorization: Bearer nr_live_sk_YOUR_API_KEY_HERE
Keep your API key secret. Never include it in client-side JavaScript, public repositories, or any code that is accessible to end users. If your key is compromised, revoke it immediately from your dashboard and generate a new one.
API keys are prefixed with 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.
API Plans
Choose the plan that matches your processing volume
Dev
$19/mo
1,500 minutes/month
  • All 6 presets
  • All output formats
  • 60 req/min rate limit
  • Polling for job status
  • $0.05/min overage
Business
$99/mo
10,000 minutes/month
  • All 6 presets
  • All output formats
  • 300 req/min rate limit
  • Webhooks included
  • $0.03/min overage
  • Priority processing
  • Dedicated support
Need more than 10,000 minutes/month, custom rate limits, or an SLA? Contact us about Enterprise plans.
Base URL & request format
How to structure every API request

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.

PropertyValue
ProtocolHTTPS only. HTTP requests are rejected.
API versionv1 (current, stable)
File uploadsmultipart/form-data
Other requestsapplication/json
DatesISO 8601 (UTC)

Core endpoints

POST /enhance Submit noise removal job

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)
ParameterTypeRequiredDescription
file file required Audio or video file to process. Accepted: MP3, WAV, FLAC, M4A, OGG, AIFF, AAC, MP4, MOV. Max 200MB.
preset string optional Processing preset. One of: auto, podcast, video, call, voiceover, music. Default: auto.
output_format string optional Output file format. One of: wav, mp3, flac, m4a, ogg, aiff. Default: wav.
webhook_url string optional URL to receive a POST notification on job completion. Overrides the default webhook URL configured in your dashboard. Pro+ plans only.
metadata string optional JSON string of arbitrary key-value pairs (max 1KB). Returned unchanged in the job status response. Useful for correlating jobs with your own records.
cURL
Node.js
Python
PHP
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"
Response (202 Accepted)
202 Accepted
{
  "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"
}
GET /job/:job_id Get job status

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
Node.js
Python
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)
Response (200 OK — completed)
200 OK — Job completed
{
  "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"
}
Download URL expires in 1 hour. Download and store the processed file as soon as the job completes. After expiry, the file is permanently deleted and cannot be recovered. Re-process the original file to obtain a new download.
GET /jobs List jobs

Returns a paginated list of your processing jobs, ordered by creation date descending. Useful for dashboards, usage reports, and job management interfaces.

Query parameters
ParameterTypeDefaultDescription
limitinteger20Number of jobs to return. Max: 100.
offsetinteger0Pagination offset.
statusstringFilter by status: pending, processing, completed, failed.
cURL
curl "https://noise-remover.com/api/v1/jobs?limit=20&status=completed" \
  -H "Authorization: Bearer nr_live_sk_YOUR_KEY"
DELETE /job/:job_id Delete job

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
curl -X DELETE https://noise-remover.com/api/v1/job/job_3f8a2c9e \
  -H "Authorization: Bearer nr_live_sk_YOUR_KEY"
200 OK
{ "deleted": true, "job_id": "job_3f8a2c9e" }
GET /usage Get usage stats

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
curl https://noise-remover.com/api/v1/usage \
  -H "Authorization: Bearer nr_live_sk_YOUR_KEY"
200 OK
{
  "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"
}
Presets reference
Choose the preset that matches your audio content type
Preset valueBest forNoise aggressivenessVoice enhancement
autoUnknown content — AI selects optimal settingsAdaptiveAdaptive
podcastSolo recordings, interviews, spoken wordMediumWarm, broadcast-ready
videoYouTube, social media, tutorialsMediumCrisp, punchy
callZoom, phone recordings, heavy noiseMaximumSpeech clarity focused
voiceoverNarration, ads, audiobooksMedium-highStudio-grade presence
musicVocals, acoustic instrumentsLightNatural tone preservation
Webhooks Coming Soon
Receive push notifications on job completion — Pro and Business plans

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.

Configure your webhook URL in your dashboard under API Keys → Webhook settings, or pass a webhook_url parameter per-request to override the default.
Webhook payload (POST to your endpoint)
POST to your webhook URL
{
  "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..."
}

Verifying webhook signatures

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.

Node.js
Python
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
Request frequency limits per API plan
60
requests/minute
Dev plan
120
requests/minute
Pro API plan
300
requests/minute
Business plan

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:

X-RateLimit-Limit:     120
X-RateLimit-Remaining: 87
X-RateLimit-Reset:     1718272260   // Unix timestamp when limit resets
Error codes
Standard error response format and error code reference

All errors return a consistent JSON structure:

Error response structure
{
  "error": {
    "code":    "file_too_large",
    "message": "File size exceeds the 200MB limit for your plan.",
    "status":  413
  }
}
HTTP Error code Description
400invalid_requestMissing or invalid request parameters.
400invalid_presetPreset value is not one of the accepted options.
400invalid_formatOutput format is not one of the accepted options.
401unauthorizedMissing or invalid API key.
402payment_requiredPlan minutes exhausted. Purchase overage or upgrade plan.
403plan_restrictionFeature not available on your current plan (e.g., webhooks on Dev plan).
404job_not_foundJob ID does not exist or belongs to a different account.
408processing_timeoutJob exceeded maximum processing time. Retry with a smaller file.
413file_too_largeFile size exceeds the 200MB limit.
415unsupported_formatUploaded file format is not supported.
422file_corruptedFile appears to be corrupted or unreadable.
422duration_exceededFile duration exceeds the maximum for your plan.
429rate_limit_exceededToo many requests. Check the Retry-After header.
500server_errorUnexpected server error. Retry the request. If persistent, contact support.
503service_unavailableService temporarily unavailable. Retry with exponential backoff.
SDKs & libraries
Official and community integrations
Node.js / JavaScript
Official — noise-remover-node
npm install noise-remover-node
View on GitHub →
Python
Official — noise-remover-python
pip install noise-remover
View on GitHub →
PHP
Community — noise-remover-php
composer require noise-remover/noise-remover-php
View on GitHub →
Go
Community — noise-remover-go
go get github.com/noise-remover/noise-remover-go
View on GitHub →
All SDKs wrap the REST API with language-idiomatic interfaces, automatic retry logic, and type definitions. The REST API is the authoritative source of truth — if an SDK behaviour differs from this documentation, the documentation takes precedence.
API Changelog
Version history and breaking changes
v1.3 June 1, 2025 Latest
  • Added metadata field to job submission and all job responses
  • Webhook signatures now use HMAC-SHA256 (previously HMAC-SHA1)
  • Added estimated_completion field to POST /enhance response
  • Rate limit headers added to all responses
v1.2 March 15, 2025
  • Added M4A, OGG, and AIFF output format support
  • Webhook support launched for Pro API and Business plans
  • Added GET /usage endpoint
v1.0 November 2024
  • Initial public API release
  • POST /enhance, GET /job/:id, GET /jobs, DELETE /job/:id
  • WAV and MP3 output formats

Ready to integrate?

Subscribe to an API plan and get your key instantly. Full documentation above — most integrations go live the same day.

Get API key Talk to us