API
On this section
View as Markdown ↗

Lipsync 2.0

Submit a Lipsync 2.0 job

video
audio
produces
video
$0.07per second

Start an asynchronous job that re-renders a source video with the speaker's mouth matched to a new audio track — for dubbing, voice replacement, or a cleaner take.

Inputs

  • video_url — public URL of the source video
  • audio_url — public URL of the new audio track to lip-sync the video to

What happens next

The job is accepted immediately — you get 202 Accepted with a job_id and status PROCESSING. Rendering runs in the background; poll GET /v1/lipsync-2.0/{job_id} until the job is COMPLETED or FAILED.

POST
/v1/lipsync-2.0
Try it ▷

Headers

X-Veed-Store-IOenumoptional

Set to 0 to not store this request's and response's bodies. They are then not available in your request logs for debugging.

Accepts01Defaults to "1".
X-Veed-Media-Expiration-Secondsintegeroptional

Number of seconds before the media URLs returned for this request expire. A value above the maximum is capped rather than rejected.

At most 2592000.Defaults to 86400.

Request body Lipsync20Input ↗

audio_urlurlrequired

URL of the new audio track to lip-sync the video to.

Must be an http(s) URL.
video_urlurlrequired

URL of the source video to dub.

Must be an http(s) URL.

Responses

dataobjectrequiredLipsync20Job ↗
Show 6 nested fields
credits_chargedintegeroptional

Credits charged for the job. Present once the job is COMPLETED and the final charge is known.

credits_estimatedintegeroptional

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.

Failure information. Present once the job has FAILED.

Show 3 nested fields
codeenumrequired

Stable, machine-readable failure code for this job type.

Acceptsinput_validationcontent_moderationinvalid_fileaudio_too_longtransload_failedgeneration_failedtimeout
detailsarray of objectoptionalJobErrorDetail ↗

Optional structured failure details.

Show 3 nested fields
fieldstringoptional

Dotted path to the offending input, when applicable.

messagestringrequired

Human-readable explanation of this detail.

typestringrequired

The category of this detail entry.

messagestringrequired

Human-readable failure message.

job_iduuidrequired

Stable identifier of the job and of the resource it produces.

resultobjectoptionalLipsync20Video ↗

The produced resource. Present once the job is COMPLETED.

Show 1 nested field
videoobjectrequiredFile ↗

Generated re-lip-synced video.

Show 4 nested fields
content_typestringoptional

The mime type of the file.

file_namestringoptional

The name of the file.

file_sizeintegeroptional

The size of the file in bytes.

urlstringrequired

The URL where the file can be downloaded from.

statusenumrequired

Current lifecycle state of the job.

AcceptsPROCESSINGCOMPLETEDFAILEDCANCELLED
X-Request-IDCorrelation id for this request, adopted from the request or minted at the edge.
401UnauthorizedErrorResponse ↗
errorobjectrequiredErrorBody ↗
Show 4 nested fields
codeenumrequired
Acceptsinvalid_requestunauthenticatedinsufficient_tokenspermission_deniednot_foundconflictrate_limitedunavailableinternal
detailsarray of objectoptionalErrorDetail ↗
Show 6 nested fields
fieldstringoptional
messagestringoptional
reasonenumoptional
Acceptsapi_key_expiredapi_key_inactiveapi_key_invalidapi_key_revokedapi_key_workspace_unavailableinsufficient_creditsjob_not_foundoauth_token_invalid
retry_after_msintegeroptional
typestringrequired
valueobjectoptional
messagestringrequired
request_idstringrequired
X-Request-IDCorrelation id for this request, adopted from the request or minted at the edge.
402Payment RequiredErrorResponse ↗
errorobjectrequiredErrorBody ↗
Show 4 nested fields
codeenumrequired
Acceptsinvalid_requestunauthenticatedinsufficient_tokenspermission_deniednot_foundconflictrate_limitedunavailableinternal
detailsarray of objectoptionalErrorDetail ↗
Show 6 nested fields
fieldstringoptional
messagestringoptional
reasonenumoptional
Acceptsapi_key_expiredapi_key_inactiveapi_key_invalidapi_key_revokedapi_key_workspace_unavailableinsufficient_creditsjob_not_foundoauth_token_invalid
retry_after_msintegeroptional
typestringrequired
valueobjectoptional
messagestringrequired
request_idstringrequired
X-Request-IDCorrelation id for this request, adopted from the request or minted at the edge.
422Unprocessable EntityErrorResponse ↗
errorobjectrequiredErrorBody ↗
Show 4 nested fields
codeenumrequired
Acceptsinvalid_requestunauthenticatedinsufficient_tokenspermission_deniednot_foundconflictrate_limitedunavailableinternal
detailsarray of objectoptionalErrorDetail ↗
Show 6 nested fields
fieldstringoptional
messagestringoptional
reasonenumoptional
Acceptsapi_key_expiredapi_key_inactiveapi_key_invalidapi_key_revokedapi_key_workspace_unavailableinsufficient_creditsjob_not_foundoauth_token_invalid
retry_after_msintegeroptional
typestringrequired
valueobjectoptional
messagestringrequired
request_idstringrequired
X-Request-IDCorrelation id for this request, adopted from the request or minted at the edge.
429Rate limit exceededErrorResponse ↗
errorobjectrequiredErrorBody ↗
Show 4 nested fields
codeenumrequired
Acceptsinvalid_requestunauthenticatedinsufficient_tokenspermission_deniednot_foundconflictrate_limitedunavailableinternal
detailsarray of objectoptionalErrorDetail ↗
Show 6 nested fields
fieldstringoptional
messagestringoptional
reasonenumoptional
Acceptsapi_key_expiredapi_key_inactiveapi_key_invalidapi_key_revokedapi_key_workspace_unavailableinsufficient_creditsjob_not_foundoauth_token_invalid
retry_after_msintegeroptional
typestringrequired
valueobjectoptional
messagestringrequired
request_idstringrequired
Retry-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 ↗
errorobjectrequiredErrorBody ↗
Show 4 nested fields
codeenumrequired
Acceptsinvalid_requestunauthenticatedinsufficient_tokenspermission_deniednot_foundconflictrate_limitedunavailableinternal
detailsarray of objectoptionalErrorDetail ↗
Show 6 nested fields
fieldstringoptional
messagestringoptional
reasonenumoptional
Acceptsapi_key_expiredapi_key_inactiveapi_key_invalidapi_key_revokedapi_key_workspace_unavailableinsufficient_creditsjob_not_foundoauth_token_invalid
retry_after_msintegeroptional
typestringrequired
valueobjectoptional
messagestringrequired
request_idstringrequired
X-Request-IDCorrelation id for this request, adopted from the request or minted at the edge.

Example request

terminal
curl -X POST "https://api.veed.io/v1/lipsync-2.0" \
  -H "Authorization: Bearer $VEED_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "audio_url": "https://static-assets.veed.io/api-examples/lipsyncv2-input.mp3",
  "video_url": "https://static-assets.veed.io/api-examples/lipsyncv2-input.mp4"
}'

Example response

HTTP 202
{
  "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": {
      "video": {
        "content_type": "video/mp4",
        "file_name": "<file_name>",
        "file_size": 0,
        "url": "<url>"
      }
    },
    "status": "PROCESSING"
  }
}