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

# Submit a clean audio (video) job

`POST /v1/clean-audio-video`

## Request

- Base URL: `https://api.veed.io`
- URL: `https://api.veed.io/v1/clean-audio-video`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/veed/apis/veed-api/docs/v1/clean-audio-video/post.ts> (a function with typed inputs; its response is checked against the schema)

Start an asynchronous job that removes background noise from speech, with the same model that powers Clean Audio in the VEED editor. Keeps the picture as it is and replaces only the audio track.

It is built for speech, in any language. Music and sound effects count as noise and are removed. The video stream is copied, not re-encoded, so its frames, resolution and bitrate are the input's.

**Inputs**

- `video_url` — public URL of the video; MP4, MOV, MKV or WebM with an H.264, HEVC, AV1, MPEG-4, VP8 or VP9 video stream and an audio track, up to 30 minutes and 2 GB. Only the first audio track is kept: other audio tracks and subtitles are dropped. 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

The result is an MP4 with AAC audio for H.264, HEVC, AV1 or MPEG-4 input, and a WebM with Opus audio for VP8 or VP9 input. The cleaned track is 48 kHz mono.

**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-video/{job_id}` until the job is `COMPLETED` or `FAILED`.

## Headers

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

## Request body

- CleanAudioVideoInput
  - `$schema` string, uri: A URL to the JSON Schema for this object.
  - `normalize_loudness` boolean: Set to false to skip loudness normalization and keep the input level.
  - `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.
  - `video_url` string, uri, required: URL of the video to clean: MP4, MOV, MKV or WebM with an H.264, HEVC, AV1, MPEG-4, VP8 or VP9 video stream and an audio track, up to 30 minutes and 2 GB. Only the first audio track is kept.

## Response `202`

Accepted

- ResourceCleanAudioVideoJob
  - `$schema` string, uri: A URL to the JSON Schema for this object.
  - `data` CleanAudioVideoJob, 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` CleanAudioVideo
      - `video` 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-16** `5391bbfa1626`: 5 warning
  - added the new `model_access_required` enum value to the `error/details/items/reason` response property for the response status `401`
  - added the new `model_access_required` enum value to the `error/details/items/reason` response property for the response status `402`
  - added the new `model_access_required` enum value to the `error/details/items/reason` response property for the response status `422`
  - added the new `model_access_required` enum value to the `error/details/items/reason` response property for the response status `429`
  - …1 more
- **2026-10-13** `6375856c2f90`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/veed/apis/veed-api/changes/v1/clean-audio-video/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/b55472650209?raw)
