Veed Lipsync V2 API Documentation

Veed Lipsync V2 API Documentation

Playground

Try it on WaveSpeedAI!

VEED Lipsync V2 generates production-quality lip-synced videos from a source video and a replacement audio track, matching mouth movements to the new audio for dubbing, localization, creator content, and talking-video workflows. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.

Features

VEED Lipsync V2 generates production-quality lip-synced video from a source video and replacement audio track. Upload a video with a visible speaker, provide the new audio, and the model produces a video where the mouth movement follows the supplied audio.


Why Choose This?

  • Production-quality lipsync Generate natural mouth movement that follows the replacement audio track.

  • Simple video-to-video workflow Provide one source video and one audio file without extra tuning parameters.

  • Audio-driven duration The output video follows the uploaded audio duration.

  • Standard video output The generated video is returned as a URL in the standard WaveSpeed prediction response.


Parameters

ParameterRequiredDescription
videoYesSource video containing the face to be lip-synced.
audioYesAudio track that drives the mouth movement.

How to Use

  1. Upload source video - Provide a video with a clear, visible face.
  2. Upload audio - Provide the replacement audio track.
  3. Submit - Generate the lip-synced video.
  4. Review output - The result is returned as a video URL.

Pricing

Pricing is $0.075 per second of uploaded audio duration, rounded up to the next full second.

Audio DurationPrice
5s$0.375
10s$0.75
30s$2.25
60s$4.50

Best Use Cases

  • Video dubbing - Replace speech while keeping the original speaker video.
  • Localization - Create translated versions of existing presenter videos.
  • Dialogue replacement - Update spoken lines without reshooting footage.
  • Marketing content - Adapt spokesperson videos for different messages.
  • Education and training - Reuse presenter footage with new narration.

Pro Tips

  • Use clear audio with minimal background noise.
  • Use a source video where the mouth is visible and well-lit.
  • Avoid heavy face occlusion or fast camera movement for best results.
  • Match the style and pacing of the audio to the source footage when possible.
  • Ensure both URLs are publicly accessible.

Authentication

For authentication details, please refer to the Authentication Guide.

API Endpoints

Submit Task & Query Result

set -euo pipefail

export WAVESPEED_API_KEY="your-api-key"

REQUEST_BODY=$(cat <<'JSON'
{
  "audio": "https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3",
  "video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4"
}
JSON
)

# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
  -X POST "https://api.wavespeed.ai/api/v3/veed/lipsync-v2" \
  -H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
  -H "Content-Type: application/json" \
  -d "${REQUEST_BODY}")

TASK=$(printf '%s' "${SUBMIT_RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "${TASK}" | jq -r '.id // empty')
if [ -z "${PREDICTION_ID}" ]; then
  printf 'Submission response did not contain a prediction id
' >&2
  exit 1
fi
RESULT_URL=$(printf '%s' "${TASK}" | jq -r '.urls.get // empty')
if [ -z "${RESULT_URL}" ]; then RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"; fi

# 2. Poll until the prediction finishes.
while true; do
  RESPONSE=$(curl --silent --show-error --fail-with-body \
    "${RESULT_URL}" \
    -H "Authorization: Bearer ${WAVESPEED_API_KEY}")
  RESULT=$(printf '%s' "${RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
  STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')

  case "${STATUS}" in
    completed) printf '%s\n' "${RESULT}" | jq '.outputs'; break ;;
    failed|cancelled|timeout) printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
    created|processing) sleep 2 ;;
    *) printf 'Unexpected status: %s
' "${STATUS}" >&2; exit 1 ;;
  esac
done

Parameters

Task Submission Parameters

Request Parameters

ParameterTypeRequiredDefaultRangeDescription
audiostringYes--Input audio URL. The output video follows the audio duration.
videostringYes-Input video URL containing the face to be lip-synced.

Response Parameters

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., “success”)
data.idstringUnique identifier for the prediction, Task Id
data.modelstringModel ID used for the prediction
data.outputsarrayOutput values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed)
data.urlsobjectObject containing related API endpoints
data.urls.getstringURL to retrieve the prediction result
data.statusstringStatus of the task: created, processing, completed, or failed
data.created_atstringISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”)
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds

Result Request Parameters

ParameterTypeRequiredDefaultDescription
idstringYes-Task ID

Result Response Parameters

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., “success”)
dataobjectThe prediction data object containing all details
data.idstringUnique identifier for the prediction
data.modelstringModel ID used for the prediction
data.outputsarray<string | object>Array of generated outputs (empty when status is not completed). Items are usually URL strings, but may be text strings or structured result objects, depending on the model.
data.urlsobjectObject containing related API endpoints
data.urls.getstringURL to poll for the prediction result
data.statusstringStatus: created, processing, completed, or failed
data.created_atstringISO timestamp of when the request was created
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds
© 2026 WaveSpeedAI. All rights reserved.