Animate the exact single chestnut alpaca in this first frame. In one continuous five-second locked-off wildlife shot, it gives one brief natural shake of its neck and torso, sending a modest spray of fine water droplets outward from its wet wool, then settles and stands quietly. All four hooves remain planted. Preserve its face, long neck, two ears, four legs, chestnut coat pattern and body proportions. Wool moves with the body; droplets fall naturally under gravity. Keep the stone wall and distant cloudy Andean slopes unchanged. Natural speed, no slow motion, no cuts, no new animals or transformation. Audio: a short soft wet-fur rustle during the shake and gentle highland wind, no human speech or music. No text, logos or watermark.
Grok Imagine Video 1.5 Image to Video API
xai/grok-imagine-video-v1.5/image-to-videoGrok Imagine Video 1.5 Image to Video animates a first-frame image with coherent motion, synchronized sound, and output up to 1080p. Guide the subject’s action and camera movement with a prompt, then choose a duration of 1–15 seconds.
Drag and drop files, paste from clipboard, or provide a URL. Upload one JPG, JPEG, PNG, or WebP first frame, up to 10 MB, or enter a publicly accessible HTTP(S) image URL.
1/1 files added
Examples
Developer integration
Quick Start
Submit a request to the generation endpoint, then query the video using its task ID. Choose cURL, JavaScript, or Python for the example.
Set up authentication
Configure VIDGO_API_KEY on your server and pass it as a Bearer token in the Authorization header.
- Submission endpoint
- POST
https://api.vidgo.ai/api/generate/submit - Authentication
- Authorization: Bearer VIDGO_API_KEY
Submit the generation request
Send model and input in a POST request to the generation endpoint. Save the returned task_id after a successful submission.
REQUEST_BODY=$(cat <<'JSON'
{
"model": "xai/grok-imagine-video-v1.5/image-to-video",
"input": {
"prompt": "One continuous FOUR-SECOND real-time shot of this exact boxer and heavy bag. ONE JAB TOTAL. During the first second she extends ONLY the glove nearest the bag straight forward, contacts the bag once, and returns the same glove to her chin. The other glove stays touching her cheek for the entire shot and never punches. During seconds two through four she holds her guard and makes no further attacks while watching the bag gently swing and settle. Preserve the same face, curly hair, grey top, dark red gloves, two arms and single hanging bag attached to its chain. Locked camera. A compact deliberate training movement, stable anatomy and equipment. Audio: one soft padded impact exactly at the single contact, then a light chain rattle, natural breathing and quiet gym ambience. No speech, music, cut, text or branding.",
"image_urls": [
"https://cdn.vidgo.ai/apis/models/xai/grok-imagine-video-v1.5/image-to-video/v1/01/input.png"
],
"resolution": "720p",
"duration": 4
}
}
JSON
)
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")
CODE=$(printf '%s' "$RESPONSE" | jq -r '.code // empty')
if [ "$CODE" != "0" ] && [ "$CODE" != "200" ]; then
printf 'API error: %s
' "$RESPONSE" >&2
exit 1
fi
printf '%s
' "$RESPONSE"Check execution status
Send a GET request using task_id until the status becomes finished or failed.
Task lookup
GET https://api.vidgo.ai/api/generate/status/{task_id}Replace {task_id} in the URL with the identifier from the submission response and query using the same Bearer token.
not_startedrunningfinishedfailed{
"code": 200,
"data": {
"task_id": "task-grok-video-15-example",
"status": "not_started",
"created_time": "2026-09-27T00:00:00Z"
}
}{
"code": 200,
"data": {
"task_id": "task-unified-...",
"status": "finished",
"files": [
{
"file_url": "https://storage.vidgo.ai/generated/video.mp4",
"file_type": "video"
}
],
"created_time": "2026-08-22T10:00:00Z",
"progress": 100,
"error_message": null
}
}Read the video file
On completion, read the video URL from data.files. On failure, read data.error_message and review the request.
set -euo pipefail
: "${VIDGO_API_KEY:?Set VIDGO_API_KEY in your environment}"
REQUEST_BODY=$(cat <<'JSON'
{
"model": "xai/grok-imagine-video-v1.5/image-to-video",
"input": {
"prompt": "One continuous FOUR-SECOND real-time shot of this exact boxer and heavy bag. ONE JAB TOTAL. During the first second she extends ONLY the glove nearest the bag straight forward, contacts the bag once, and returns the same glove to her chin. The other glove stays touching her cheek for the entire shot and never punches. During seconds two through four she holds her guard and makes no further attacks while watching the bag gently swing and settle. Preserve the same face, curly hair, grey top, dark red gloves, two arms and single hanging bag attached to its chain. Locked camera. A compact deliberate training movement, stable anatomy and equipment. Audio: one soft padded impact exactly at the single contact, then a light chain rattle, natural breathing and quiet gym ambience. No speech, music, cut, text or branding.",
"image_urls": [
"https://cdn.vidgo.ai/apis/models/xai/grok-imagine-video-v1.5/image-to-video/v1/01/input.png"
],
"resolution": "720p",
"duration": 4
}
}
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')
BUSINESS_CODE=$(printf '%s' "$SUBMIT_RESPONSE" | jq -r '.code // empty')
if [ "$BUSINESS_CODE" != "0" ] && [ "$BUSINESS_CODE" != "200" ]; then
printf 'Submit failed:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
if [ -z "$TASK_ID" ]; then
printf 'Submit response did not include task_id:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
START_TIME=$(date +%s)
POLL_DELAY=2
while true; do
if [ $(( $(date +%s) - START_TIME )) -ge 600 ]; then
printf 'Timed out after 600 seconds
' >&2
exit 1
fi
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')
BUSINESS_CODE=$(printf '%s' "$STATUS_RESPONSE" | jq -r '.code // empty')
if [ "$BUSINESS_CODE" != "0" ] && [ "$BUSINESS_CODE" != "200" ]; then
printf 'Status request failed:
%s
' "$STATUS_RESPONSE" >&2
exit 1
fi
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 "$POLL_DELAY"
if [ "$POLL_DELAY" -lt 10 ]; then POLL_DELAY=$((POLL_DELAY + 1)); fi
;;
*)
printf 'Unexpected task status: %s
' "$STATUS" >&2
exit 1
;;
esac
doneRequest Parameters
Place these parameters inside the request’s input object and set model to this page’s model identifier.
| Field | Type | Required | Default | Usage and values |
|---|---|---|---|---|
| prompt | string | Yes | — | Describe subject motion, camera movement, and sound in 1–4096 characters. |
| image_urls | array<string> | Yes | — | Provide exactly one publicly accessible HTTP(S) image URL as the first frame. The image determines the video aspect ratio. |
| resolution | string | No | 720p | Choose 480p, 720p, or 1080p. Default: 720p. |
| duration | integer | No | 6 | Set an integer from 1 to 15 seconds. Default: 6. |
Response Fields
The submission response identifies the task. Status responses provide its execution state and video files.
| Field | Type | Usage and values |
|---|---|---|
| code | integer | Application result code; 0 or 200 indicates a successful request. |
| data.task_id | string | Identifier of the generation task, used for subsequent status checks. |
| data.status | string | Task state: not_started, running, finished, or failed. |
| data.files | array<object> | Files returned on completion. Read file_url from entries whose file_type is video. |
| data.error_message | string | null | Error details for a failed task, used to review assets or adjust the request. |
Task Lifecycle
Save the task_id from submission and use that identifier to follow the task until it finishes or fails.
not_startedThe task has been created and is waiting to start.
runningThe task is processing; continue checking the same task.
finishedThe task is complete; read the video URL from files.
failedThe task failed; read error_message and review the input.
Status Checks and Error Handling
- Keep the same task IDAfter receiving task_id, use it to check progress. If a network error interrupts a status check, retry the check for that same task.
- Review the request by fieldCheck the required fields, types, and allowed values. Use a publicly accessible image URL.
- Inspect the completion responseWhen the status is finished, read the video file entry. If file_url is missing, retain task_id and the response for troubleshooting.
Model Specifications
| Specification | Value | Details |
|---|---|---|
| Input | One image and a motion prompt | The image is the first frame and determines the video aspect ratio. |
| Duration | 1–15 seconds | Integer seconds; default: 6. |
| Resolution | 480p / 720p / 1080p | Default: 720p. |
| Audio | Synchronized audio | Describe sound effects, ambience, or dialogue in the prompt. |
Related Models
Grok Imagine Video 1.5 Image to Video API frequently asked questions
What is the Grok Imagine Video 1.5 Image to Video API?
Grok Imagine Video 1.5 Image to Video API is an xAI model that animates a single first-frame image into a video. It combines coherent motion, synchronized sound, and output up to 1080p. The image establishes the subject and composition, while a prompt guides action and camera movement over 1–15 seconds. Use the API documentation to integrate it or try the playground above.
How does Grok Imagine Video 1.5 animate the first-frame subject?
The image supplies the starting frame. Describe the action that follows, including its direction, pace, and camera movement. A clear subject and complete silhouette give the model a defined visual starting point.
Does Grok Imagine Video 1.5 generate synchronized sound?
Yes. Sound effects, ambience, and dialogue are generated with the video. Specify the sound source and timing in the motion prompt, such as fabric moving during a turn or footsteps following a stride.
How does Grok Imagine Video 1.5 handle video aspect ratio?
The first-frame image determines the video aspect ratio. Prepare a portrait image for a vertical composition or a landscape image for a wide shot, then choose the output resolution.
Can Grok Imagine Video 1.5 create 15-second clips?
Yes. Set Duration to 15, or choose any integer from 1 to 15. The default is 6 seconds. Plan the duration around the action, such as a quick gesture or a longer camera move.
Can Grok Imagine Video 1.5 produce 1080p video?
Yes. Select 1080p in Resolution. The other choices are 480p and 720p, with 720p selected by default. The displayed cost updates with resolution and duration.















