# Submit a clean audio job

Model: Clean Audio
Endpoint: `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.

**Inputs**

- `audio_url` — public URL of the recording; any audio or video file, up to 30 minutes and 512 MB
- `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`.

## Request body

- `audio_url` · url · 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 · optional — Set to false to skip loudness normalization and keep the input level. Defaults to `true`.
- `output_format` · enum · optional — Container for the 48 kHz mono 16-bit output. FLAC is lossless at about half the size of WAV. Accepts `flac`, `wav`. Defaults to `"flac"`.
- `strength` · number · optional — 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. Between 0 and 1. Defaults to `0.874`.
- `target_lufs` · number · optional — 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. Between -40 and -8. Defaults to `-19`.

## Parameters

- `X-Veed-Store-IO` (header) — Set to `0` to not store this request's and response's bodies. They are then not available in your request logs for debugging.
- `X-Veed-Media-Expiration-Seconds` (header) — Number of seconds before the media URLs returned for this request expire. A value above the maximum is capped rather than rejected.

## Example request

```bash
curl -X POST "https://api.veed.io/v1/clean-audio" \
  -H "Authorization: Bearer $VEED_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "audio_url": "https://static-assets.veed.io/api-examples/clean-audio-input.m4a"
}'
```

## Example response (202)

```json
{
  "data": {
    "credits_charged": 0,
    "credits_estimated": 0,
    "error": {
      "code": "input_validation",
      "details": [
        {
          "field": "<field>",
          "message": "<message>",
          "type": "<type>"
        }
      ],
      "message": "<message>"
    },
    "job_id": "123e4567-e89b-12d3-a456-426614174000",
    "result": {
      "audio": {
        "content_type": "video/mp4",
        "file_name": "<file_name>",
        "file_size": 0,
        "url": "<url>"
      }
    },
    "status": "PROCESSING"
  }
}
```

Rendered page: https://api.veed.io/docs/api/post-v1-clean-audio
