Base URL: https://noise-remover.com/api/v1
All requests require JSON or multipart/form-data Get API key

Audio Noise Removal API Documentation

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.

Secure API pipeline transforming noisy audio and video into clean media
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 /external/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/external/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/external/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_3f8a2c9e4d6710ab9281f6458ec31470"
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/external/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_3f8a2c9e4d6710ab9281f6458ec31470"
$ch = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL            => 'https://noise-remover.com/api/v1/external/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_3f8a2c9e4d6710ab9281f6458ec31470"
Response (202 Accepted)
202 Accepted
{
  "job_id":        "job_3f8a2c9e4d6710ab9281f6458ec31470",
  "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 /external/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/external/job/job_3f8a2c9e4d6710ab9281f6458ec31470 \
  -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/external/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/external/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_3f8a2c9e4d6710ab9281f6458ec31470",
  "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_3f8a2c9e4d6710ab9281f6458ec31470?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 /external/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/external/jobs?limit=20&status=completed" \
  -H "Authorization: Bearer nr_live_sk_YOUR_KEY"
DELETE /external/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/external/job/job_3f8a2c9e4d6710ab9281f6458ec31470 \
  -H "Authorization: Bearer nr_live_sk_YOUR_KEY"
200 OK
{ "deleted": true, "job_id": "job_3f8a2c9e4d6710ab9281f6458ec31470" }
GET /external/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/external/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_3f8a2c9e4d6710ab9281f6458ec31470",
  "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_3f8a2c9e4d6710ab9281f6458ec31470?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