Vidu Q4 Image to Video API
vidu/q4/image-to-videoVidu Q4 Image to Video turns one start image and an optional motion prompt into a 3–16 second clip at 540p up to 4K. Your image sets the opening frame, so subject, setting and aspect ratio carry through while the prompt directs movement and camera.
Drag and drop files, paste from clipboard, or provide a URL. Required. One JPEG, PNG or WebP start image.
1/1 files added
REST API
Quick Start
Make your first Vidu Q4 image-to-video request in three steps; the example returns a task_id for result retrieval.
Connect to the Vidgo API
Create an API key, keep it on your server, and send it in the Authorization header as a Bearer token.
- Endpoint
- POST
https://api.vidgo.ai/api/generate/submit - Authentication
- Authorization: Bearer VIDGO_API_KEY
Submit one generation task
Run the short example with one public start image. The prompt is optional.
curl --request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "vidu/q4/image-to-video",
"input": {
"image_urls": [
"https://cdn.vidgo.ai/apis/models/vidu/q4/image-to-video/v1/01/input-01.png"
],
"prompt": "The potter keeps her hands on the spinning clay as the vase rises slowly between her fingers. Wet clay glistens under warm window light, a few droplets fly from the wheel, and the camera pushes in gently toward her focused face. Keep her apron, hair and the studio shelves exactly as in the image.",
"duration": 5,
"resolution": "720p"
}
}'Wait for the result
Use the returned task_id to check the same task until it reaches finished or failed. On success, read data.files[].file_url.
Track status
GET https://api.vidgo.ai/api/generate/status/{task_id}Poll about every 2 seconds while the status is not_started or running. Stop on finished or failed; on success, read data.files[].file_url. For long-running jobs, increase the interval gradually, or add callback_url to the submit request to receive the final result asynchronously.
not_startedrunningfinishedfailed{
"code": 200,
"data": {
"task_id": "TESKIPR1CD1BRKFB",
"status": "not_started",
"created_time": "2026-11-05T07:09:55"
}
}{
"code": 200,
"data": {
"task_id": "TESKIPR1CD1BRKFB",
"status": "finished",
"files": [
{
"file_url": "https://cdn.vidgo.ai/apis/models/vidu/q4/image-to-video/v2/01/output-01.mp4",
"file_type": "video"
}
],
"created_time": "2026-11-05T07:09:55",
"error_message": null,
"progress": 100
}
}Complete runnable example
Open this after the three-step flow is clear. It combines submission, polling, terminal-state handling, and result extraction in one script.
set -euo pipefail
: "${VIDGO_API_KEY:?Set VIDGO_API_KEY in your environment}"
REQUEST_BODY=$(cat <<'JSON'
{
"model": "vidu/q4/image-to-video",
"input": {
"image_urls": [
"https://cdn.vidgo.ai/apis/models/vidu/q4/image-to-video/v1/01/input-01.png"
],
"prompt": "The potter keeps her hands on the spinning clay as the vase rises slowly between her fingers. Wet clay glistens under warm window light, a few droplets fly from the wheel, and the camera pushes in gently toward her focused face. Keep her apron, hair and the studio shelves exactly as in the image.",
"duration": 5,
"resolution": "720p"
}
}
JSON
)
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
--request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data "$REQUEST_BODY")
TASK_ID=$(printf '%s' "$SUBMIT_RESPONSE" | jq -r '.data.task_id // .task_id // empty')
if [ -z "$TASK_ID" ]; then
printf 'Submit response did not include task_id:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
while true; do
STATUS_RESPONSE=$(curl --silent --show-error --fail-with-body \
--url "https://api.vidgo.ai/api/generate/status/$TASK_ID" \
--header "Authorization: Bearer $VIDGO_API_KEY")
STATUS=$(printf '%s' "$STATUS_RESPONSE" | jq -r '.data.status // .status // empty')
case "$STATUS" in
finished)
printf '%s' "$STATUS_RESPONSE" | jq -r '(.data.files // .files // [])[]?.file_url'
break
;;
failed)
printf '%s' "$STATUS_RESPONSE" | jq -r '.data.error_message // .error_message // "Generation failed"' >&2
exit 1
;;
not_started|running)
sleep 2
;;
*)
printf 'Unexpected task status: %s
' "$STATUS" >&2
exit 1
;;
esac
doneRequest Parameters
model and callback_url belong at the request root; generation parameters belong inside input.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| model | string | Yes | — | Fixed to vidu/q4/image-to-video. |
| callback_url | string (URL) | No | — | A public HTTP(S) URL for receiving task completion notifications. |
| input | object | Yes | — | Generation parameters: one start image in image_urls plus an optional prompt; the output follows the image's aspect ratio. |
| input.image_urls | string[] | Yes | — | Exactly one public HTTP(S) image URL used as the start frame. |
| input.prompt | string | No | "" | Motion and camera description, up to 5,000 characters. |
| input.duration | integer | No | 5 | Output length in whole seconds, 3–16. Integer strings such as "5" are also accepted. |
| input.resolution | string | No | 720p | Output resolution: 540p, 720p, 1080p, 2k or 4k (case-insensitive). The rate per second follows this value. |
| input.enable_safety_checker | boolean | No | — | Set true or false to control the content safety checker; omit it to keep the model default. |
Response Fields
Submission returns the task identity immediately. Status responses add progress, output files, or a failure message as the task advances.
| Field | Type | Description |
|---|---|---|
| code | integer | Application result code. Successful responses use 0 or 200. |
| message | string | Human-readable response or error message when present. |
| data.task_id | string | Task identifier used in the status endpoint path. |
| data.status | string | Current state: not_started, running, finished, or failed. |
| data.created_time | string | Task creation time in date-time format. |
| data.progress | number | Completion percentage when the provider reports progress. |
| data.files[] | array | Generated output files returned after a successful task. |
| data.files[].file_url | string | Public URL of the generated video. |
| data.files[].file_type | string | Generated file type, such as video. |
| data.files[].watermark_url | string | null | Watermarked output URL when one is available. |
| data.error_message | string | null | Failure detail when status is failed. |
Task Lifecycle
Treat not_started and running as non-terminal states. finished and failed are terminal alternatives; stop polling when either is returned.
not_startedThe task has been accepted and is queued to start.
runningThe video is being generated. Continue polling the status endpoint.
finishedThe task is complete. Read the video URL from data.files[].file_url.
failedGeneration failed. Read data.error_message for details and stop polling.
Polling and Errors
- Authentication401 indicates a missing or invalid Bearer API Key. Check your key in the dashboard before retrying.
- Validation400 indicates invalid parameters. Check that image_urls holds exactly one URL and only image-to-video fields are sent.
- Polling intervalPoll the status every 2 seconds. For longer tasks, use exponential backoff to gradually increase the interval to 5 seconds.
- Terminal statesPoll only while the status is not_started or running. Stop immediately on finished or failed.
- Callback optionProvide callback_url to receive an automatic notification when generation finishes, without continuous polling.
Model Specifications
| Specification | Value | Description |
|---|---|---|
| Model | vidu/q4/image-to-video | Model identifier for asynchronous Vidu Q4 image-to-video generation. |
| Input mode | 1 start image + optional prompt | The output follows the image's aspect ratio. |
| Duration | 3–16 | Whole seconds; defaults to 5. |
| Resolution | 540p | 720p | 1080p | 2k | 4k | Defaults to 720p. |
| Pricing | 9 / 19 / 24 / 38 / 78 credits/s | 540p / 720p / 1080p / 2k / 4k, multiplied by duration. |
Related Models
Vidu Q4 Image to Video API FAQ
What is the Vidu Q4 Image to Video API?
Vidu Q4 Image to Video is a ShengShu Technology model for animating a still image into video. It generates 3–16 second clips from one start frame and an optional prompt, with five resolution tiers from 540p to 4K. Because generation begins on your image, the subject, composition and aspect ratio carry into the motion that the prompt describes. You can call it programmatically or try it from the playground above.
Can Vidu Q4 Image to Video output 4K?
Yes. Set resolution to 4k for 78 credits per second, or 2k for 38. The default is 720p, and 540p and 1080p are also available; the full table is in Usage and billing.
How long can a Vidu Q4 Image to Video clip be?
Any whole number of seconds from 3 to 16, with 5 as the default. The cost scales with the length you set.
Does Vidu Q4 Image to Video keep my image's aspect ratio?
Yes. The clip follows the shape of the start image, so crop the image to 9:16, 1:1 or 16:9 before uploading to get that format.
Is a prompt required for Vidu Q4 Image to Video?
The prompt is optional and accepts up to 5,000 characters. Adding one lets you direct which elements move, the camera path and the final pose.
Which Vidu Q4 endpoint should I use for voice references?
Use Vidu Q4 Reference to Video. It accepts up to 12 reference images and 3 reference audio clips, a fixed aspect ratio and optional generated audio. Image to Video is built around a single start frame.
How much does a 5-second Vidu Q4 Image to Video clip cost?
At the default 720p it costs 19 × 5 = 95 credits ($0.475). At 540p it is 45 credits, and at 4K it is 390 credits.
Which images work best with Vidu Q4 Image to Video?
Use a sharp image with a clear subject and room for the planned movement, such as space in front of a walking character. Clean edges and even lighting give the motion a stable starting point.















