On this section
Clean Audio Video
Submit a clean audio (video) job
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 jobsstrength— optional; how much of the original may remain under speech, between0and1. Lower keeps more room tone behind the voicetarget_lufs— optional; the output's integrated loudness, between-40and-8LUFSnormalize_loudness— optional;falsekeeps 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-IOenumoptionalSet to 0 to not store this request's and response's bodies. They are then not available in your request logs for debugging.
01Defaults to "1".X-Veed-Media-Expiration-SecondsintegeroptionalNumber of seconds before the media URLs returned for this request expire. A value above the maximum is capped rather than rejected.
86400.Request body CleanAudioVideoInput ↗
normalize_loudnessbooleanoptionalSet to false to skip loudness normalization and keep the input level.
true.strengthnumberoptionalHow 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.
0.874.target_lufsnumberoptionalIntegrated 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.
-19.video_urlurlrequiredURL 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.
Responses
Show 6 nested fields
credits_chargedintegeroptionalCredits charged for the job. Present once the job is COMPLETED and the final charge is known.
credits_estimatedintegeroptionalCredits 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.
Failure information. Present once the job has FAILED.
Show 3 nested fields
codeenumrequiredStable, machine-readable failure code for this job type.
input_validationcontent_moderationinvalid_fileaudio_too_longtransload_failedgeneration_failedtimeoutinsufficient_creditsOptional structured failure details.
Show 3 nested fields
fieldstringoptionalDotted path to the offending input, when applicable.
messagestringrequiredHuman-readable explanation of this detail.
typestringrequiredThe category of this detail entry.
messagestringrequiredHuman-readable failure message.
job_iduuidrequiredStable identifier of the job and of the resource it produces.
The produced resource. Present once the job is COMPLETED.
Show 1 nested field
The input video with its audio track replaced by the denoised one. The picture is copied unchanged; the audio is 48 kHz mono, AAC in an MP4 for H.264, HEVC, AV1 or MPEG-4 input, Opus in a WebM for VP8 or VP9.
Show 4 nested fields
content_typestringoptionalThe mime type of the file.
file_namestringoptionalThe name of the file.
file_sizeintegeroptionalThe size of the file in bytes.
urlstringrequiredThe URL where the file can be downloaded from.
statusenumrequiredCurrent lifecycle state of the job.
PROCESSINGCOMPLETEDFAILEDCANCELLEDX-Request-IDCorrelation id for this request, adopted from the request or minted at the edge.401UnauthorizedErrorResponse ↗
Show 4 nested fields
codeenumrequiredinvalid_requestunauthenticatedinsufficient_tokenspermission_deniednot_foundconflictrate_limitedunavailableinternalShow 6 nested fields
fieldstringoptionalmessagestringoptionalreasonenumoptionalapi_key_expiredapi_key_inactiveapi_key_invalidapi_key_revokedapi_key_workspace_unavailableinsufficient_creditsjob_not_foundoauth_token_invalidretry_after_msintegeroptionaltypestringrequiredvalueobjectoptionalmessagestringrequiredrequest_idstringrequiredX-Request-IDCorrelation id for this request, adopted from the request or minted at the edge.402Payment RequiredErrorResponse ↗
Show 4 nested fields
codeenumrequiredinvalid_requestunauthenticatedinsufficient_tokenspermission_deniednot_foundconflictrate_limitedunavailableinternalShow 6 nested fields
fieldstringoptionalmessagestringoptionalreasonenumoptionalapi_key_expiredapi_key_inactiveapi_key_invalidapi_key_revokedapi_key_workspace_unavailableinsufficient_creditsjob_not_foundoauth_token_invalidretry_after_msintegeroptionaltypestringrequiredvalueobjectoptionalmessagestringrequiredrequest_idstringrequiredX-Request-IDCorrelation id for this request, adopted from the request or minted at the edge.422Unprocessable EntityErrorResponse ↗
Show 4 nested fields
codeenumrequiredinvalid_requestunauthenticatedinsufficient_tokenspermission_deniednot_foundconflictrate_limitedunavailableinternalShow 6 nested fields
fieldstringoptionalmessagestringoptionalreasonenumoptionalapi_key_expiredapi_key_inactiveapi_key_invalidapi_key_revokedapi_key_workspace_unavailableinsufficient_creditsjob_not_foundoauth_token_invalidretry_after_msintegeroptionaltypestringrequiredvalueobjectoptionalmessagestringrequiredrequest_idstringrequiredX-Request-IDCorrelation id for this request, adopted from the request or minted at the edge.429Rate limit exceededErrorResponse ↗
Show 4 nested fields
codeenumrequiredinvalid_requestunauthenticatedinsufficient_tokenspermission_deniednot_foundconflictrate_limitedunavailableinternalShow 6 nested fields
fieldstringoptionalmessagestringoptionalreasonenumoptionalapi_key_expiredapi_key_inactiveapi_key_invalidapi_key_revokedapi_key_workspace_unavailableinsufficient_creditsjob_not_foundoauth_token_invalidretry_after_msintegeroptionaltypestringrequiredvalueobjectoptionalmessagestringrequiredrequest_idstringrequiredRetry-AfterSeconds until the rate limit resets.X-RateLimit-ClassThe rate-limit class that was hit (read, mutation, ai-generation).X-RateLimit-LimitRequest budget for the matched class.X-RateLimit-RemainingRemaining requests in the current window.X-RateLimit-ResetUnix time (seconds) when the budget resets.X-Request-IDCorrelation id for this request, adopted from the request or minted at the edge.500Internal Server ErrorErrorResponse ↗
Show 4 nested fields
codeenumrequiredinvalid_requestunauthenticatedinsufficient_tokenspermission_deniednot_foundconflictrate_limitedunavailableinternalShow 6 nested fields
fieldstringoptionalmessagestringoptionalreasonenumoptionalapi_key_expiredapi_key_inactiveapi_key_invalidapi_key_revokedapi_key_workspace_unavailableinsufficient_creditsjob_not_foundoauth_token_invalidretry_after_msintegeroptionaltypestringrequiredvalueobjectoptionalmessagestringrequiredrequest_idstringrequiredX-Request-IDCorrelation id for this request, adopted from the request or minted at the edge.Example request
curl -X POST "https://api.veed.io/v1/clean-audio-video" \
-H "Authorization: Bearer $VEED_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"video_url": "https://static-assets.veed.io/api-examples/clean-audio-video-input.mp4"
}'Example response
{
"data": {
"job_id": "123e4567-e89b-12d3-a456-426614174000",
"status": "PROCESSING",
"credits_estimated": 2
}
}