Vidu Q4 Image To Video API Documentation

Vidu Q4 Image To Video API Documentation

Playground

Try it on WaveSpeedAI!

Vidu Q4 Image-to-Video animates a single reference image into high-quality AI video with prompt-guided motion, optional audio, 3-16 second duration, and output resolutions from 540P to 4K for product animation, social content, marketing creatives, cinematic visuals, and production workflows. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.

Features

Vidu Q4 Image-to-Video animates a single image into a video of 3 to 16 seconds, up to 4K, with synchronized audio. Describe the motion you want, or leave the prompt out and let the model decide.


Why Choose This?

  • Your image as the first frame — The subject, composition and style of the image carry through the clip.
  • Sound included — Dialogue, effects and ambience are generated together with the picture, and can be switched off for a silent video.
  • Natural camera work — The model can cut between camera positions inside one clip.
  • Five resolutions — 540p, 720p, 1080p, 2K and 4K.
  • Flexible length — Any whole number of seconds from 3 to 16.

Parameters

ParameterRequiredDescription
imageYesThe image to animate: a public URL to a PNG, JPEG or WebP file.
promptNoWhat should happen: the action, camera movement and mood.
resolutionNo540p, 720p, 1080p, 2k or 4k. Default: 720p.
durationNoLength in whole seconds, from 3 to 16. Default: 5.
generate_audioNoGenerate sound with the video. Default: true.
enable_prompt_expansionNoLet the model rewrite your prompt before generating. Default: false.
seedNoFix the seed to compare variations. Omit it, or use -1, for a random seed.

The output keeps the framing of the input image; there is no separate aspect-ratio setting.


How to Use

  1. Choose an image — Use a sharp image with one clear subject.
  2. Write a prompt (optional) — Describe the movement and the camera, for example “the astronaut waves and the camera tilts up”.
  3. Pick resolution and duration — Start at 540p or 720p while you explore, then render the final clip at a higher resolution.
  4. Run — Submit the request and download the video when it finishes.

Pricing

Pricing is based on the selected resolution and video duration.

ResolutionPrice per Second5-Second Video
540p$0.045$0.225
720p$0.095$0.475
1080p$0.12$0.60
2K$0.19$0.95
4K$0.39$1.95

The total is the per-second rate for the selected resolution multiplied by duration (whole seconds, 3 to 16). The default of 720p and 5 seconds costs $0.475. Audio generation and the other settings do not change the price.


Best Use Cases

  • Product animation — Turn a product photo into a short promotional clip.
  • Social content — Add motion to stills for posts, reels and campaigns.
  • Character animation — Bring portraits, illustrations and character art to life.
  • Campaign variations — Produce several video takes from the same key visual.
  • Concept testing — Try out motion and camera ideas from a single frame.

Pro Tips

  • Describe movement and camera direction; the image already shows what is in the frame.
  • Keep the action small enough to finish within the chosen duration.
  • Turn on enable_prompt_expansion for short prompts, and leave it off when you want the model to follow your wording closely.
  • Set generate_audio to false if you plan to add your own soundtrack.
  • A fixed seed makes variations easier to compare, but identical output is not guaranteed.

  • Vidu Q4 Reference-to-Video - Keep characters, products and style consistent from up to 15 reference images, with optional voice references.

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'
{
  "prompt": "A cinematic ocean wave at sunrise, highly detailed",
  "image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
  "resolution": "720p",
  "duration": 5,
  "enable_prompt_expansion": false,
  "generate_audio": true
}
JSON
)

# 1. Submit the prediction once. Never retry this request automatically:
# a retry after an unclear failure can create a second, billed task.
CHECK='The task may already exist. Check History or the predictions list before submitting again.'
if ! SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
  --connect-timeout 10 --max-time 60 \
  -X POST "https://api.wavespeed.ai/api/v3/vidu/q4/image-to-video" \
  -H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
  -H "Content-Type: application/json" \
  -d "${REQUEST_BODY}"); then
  printf 'Submit failed. %s\n' "${CHECK}" >&2
  exit 1
fi

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. %s\n' "${CHECK}" >&2
  exit 1
fi
RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"

# 2. Poll until the prediction reaches a final status.
BODY_FILE=$(mktemp)
trap 'rm -f "${BODY_FILE}"' EXIT
while true; do
  # Transient errors (429, 5xx) are retried, honoring Retry-After.
  HTTP_CODE=$(curl --silent --show-error --fail-with-body \
    --connect-timeout 10 --max-time 60 --retry 5 --retry-delay 2 \
    --output "${BODY_FILE}" --write-out '%{http_code}' \
    "${RESULT_URL}" \
    -H "Authorization: Bearer ${WAVESPEED_API_KEY}" || true)
  case "${HTTP_CODE}" in
    2??) ;;
    000|429|5??)  # dropped connection or temporary error: keep polling
      printf 'Task %s: HTTP %s, polling again in 10s\n' "${PREDICTION_ID}" "${HTTP_CODE}" >&2
      sleep 10; continue ;;
    *) printf 'Task %s: HTTP %s\n' "${PREDICTION_ID}" "${HTTP_CODE}" >&2
      cat "${BODY_FILE}" >&2; exit 1 ;;
  esac
  RESULT=$(jq 'if type == "object" and has("data") then .data else . end' "${BODY_FILE}")
  STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')

  case "${STATUS}" in
    completed) printf '%s\n' "${RESULT}" | jq '.outputs'; break ;;
    failed|cancelled|timeout|deleted)
      printf 'Task %s ended with status %s\n' "${PREDICTION_ID}" "${STATUS}" >&2
      printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
    *) sleep 2 ;;
  esac
done

Retry temporary errors only while polling, never the submit request. Errors, retries and timeouts

Parameters

Task Submission Parameters

Request Parameters

ParameterTypeRequiredDefaultRangeDescription
promptstringYes-The positive prompt for the generation.
imagestringYes-The URL of the image to generate an image from.
resolutionstringNo720p540p, 720p, 1080p, 2k, 4kThe resolution of the generated media.
durationintegerNo53 ~ 16The duration of the generated media in seconds.
enable_prompt_expansionbooleanNofalse-Whether to enable AI prompt rewriting.
generate_audiobooleanNotrue-Whether to generate audio.
seedintegerNo--The random seed to use for the generation. -1 means a random seed will be used.

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.statusstringTask status. completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses.
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.statusstringStatus: completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses
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.