---
title: "Submit a clean audio job"
method: POST
path: "/v1/clean-audio"
tags: ["Clean Audio"]
---

# Submit a clean audio job

`POST /v1/clean-audio`

Start an asynchronous job that removes background noise from a speech recording — the same model that powers Clean Audio in the VEED editor.

It is built for speech, in any language. Music and sound effects count as noise and are removed. A video file is accepted: its audio track is cleaned, and the result is audio, not video.

**Inputs**

- `audio_url` — public URL of the recording; any file ffmpeg reads (such as MP3, WAV, M4A/AAC, OGG/Opus, FLAC, MP4, MOV or WebM), up to 30 minutes and 512 MB. Split anything longer into separate jobs
- `strength` — optional; how much of the original may remain under speech, between `0` and `1`. Lower keeps more room tone behind the voice
- `target_lufs` — optional; the output's integrated loudness, between `-40` and `-8` LUFS
- `normalize_loudness` — optional; `false` keeps the input level instead of normalizing it
- `output_format` — optional; `flac` or `wav`, both 48 kHz mono 16-bit

**What happens next**

The job is **accepted immediately** — you get `202 Accepted` with a `job_id` and status `PROCESSING`. Processing takes roughly 0.2–0.5× the audio's duration; poll `GET /v1/clean-audio/{job_id}` until the job is `COMPLETED` or `FAILED`.

## Headers

- `X-Veed-Store-IO` '0' | '1'
- `X-Veed-Media-Expiration-Seconds` integer

## Request body

- CleanAudioInput
  - `$schema` string, uri — A URL to the JSON Schema for this object.
  - `audio_url` string, uri, required — URL of the recording to clean: any audio or video file, up to 30 minutes and 512 MB. A video's audio track is used; multi-channel audio is mixed down to mono.
  - `normalize_loudness` boolean — Set to false to skip loudness normalization and keep the input level.
  - `output_format` 'flac' | 'wav' — Container for the 48 kHz mono 16-bit output. FLAC is lossless at about half the size of WAV.
  - `strength` number, double — How much of the original is allowed to remain under speech: the suppression floor is 1 - strength. Lower keeps more room tone behind the voice; silence between words is always fully cleaned.
  - `target_lufs` number, double — Integrated loudness of the output in LUFS (ITU-R BS.1770); true peak is capped at -1.1 dBTP. Ignored when normalize_loudness is false. A null reads as omitted: set normalize_loudness to false to skip normalization.

## Response `202`

Accepted

- ResourceCleanAudioJob
  - `$schema` string, uri — A URL to the JSON Schema for this object.
  - `data` CleanAudioJob, required
    - `credits_charged` integer — Credits charged for the job. Present once the job is COMPLETED and the final charge is known.
    - `credits_estimated` integer — Credits quoted before the job ran. Present only on the response that created the job. This is an estimate, not the price: the charged amount can be higher or lower.
    - `error` JobErrorCleanAudioErrorCode
      - `code` 'input_validation' | 'content_moderation' | 'invalid_file' | 'audio_too_long' | 'transload_failed' | 'generation_failed' | 'timeout' | 'insufficient_credits', required — Stable, machine-readable failure code for this job type.
      - `details` JobErrorDetail[], nullable — Optional structured failure details.
        - `field` string — Dotted path to the offending input, when applicable.
        - `message` string, required — Human-readable explanation of this detail.
        - `type` string, required — The category of this detail entry.
      - `message` string, required — Human-readable failure message.
    - `job_id` string, uuid, required — Stable identifier of the job and of the resource it produces.
    - `result` CleanAudio
      - `audio` File, required
        - `content_type` string — The mime type of the file.
        - `file_name` string — The name of the file.
        - `file_size` integer — The size of the file in bytes.
        - `url` string, required — The URL where the file can be downloaded from.
    - `status` 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'CANCELLED', required — Current lifecycle state of the job.

## Other responses

- `401` — Unauthorized
- `402` — Payment Required
- `422` — Unprocessable Entity
- `429` — Rate limit exceeded
- `500` — Internal Server Error

## Changes

- **2026-10-02** `d0fe74663830` — 1 warning
  - added the new `insufficient_credits` enum value to the `data/error/code` response property for the response status `202`
- **2026-09-30** `2cd55951003c` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/veed/apis/veed-api/changes/v1/clean-audio/post.md)

---

[API](https://skmtc.dev/veed/apis/veed-api.md) · [All operations](https://skmtc.dev/veed/apis/veed-api/llms.txt) · [OpenAPI document](https://skmtc.dev/veed/apis/veed-api/revisions/d0fe74663830?raw)
