xAI's Grok Imagine video model: text-to-video and image-to-video under one model name, with a native synced audio track (dialogue / sound effects / ambience), any duration from 1 to 15 seconds, three per-second pricing tiers (480p / 720p / 1080p), and watermark-free output. Generation is fast — a 4-second clip comes back in roughly 30-70 seconds in our production tests. It runs on the same unified video endpoint as VEO, Kling and Seedance on apimodels.app, so switching models is a one-string change and one API key covers everything.
| Resolution | Rate | 4s | 8s | 15s |
|---|---|---|---|---|
| 480p | $0.0294/s | $0.12 | $0.24 | $0.44 |
| 720p | $0.0529/s | $0.21 | $0.42 | $0.79 |
| 1080p | $0.0882/s | $0.35 | $0.71 | $1.32 |
Cost = rate × duration in seconds. Text-to-video and image-to-video cost the same; reference images add nothing. Failed tasks are not billed.
POST /api/v1/video/generations — async: create, then poll the same endpoint for the result.
# Step 1: Create task (text-to-video; add "images" for image-to-video)
curl -X POST https://api.apimodels.app/v1/video/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "grok-imagine-video-1.5",
"prompt": "A calm coastal shoreline at sunset, camera slowly pushing forward",
"resolution": "720p",
"duration": 10,
"aspect_ratio": "16:9"
}'
# Step 2: Poll status
curl "https://api.apimodels.app/v1/video/generations?task_id=TASK_ID" \
-H "Authorization: Bearer YOUR_API_KEY"| Field | Required | Type | Description |
|---|---|---|---|
| model | Yes | string | grok-imagine-video-1.5 |
| prompt | No | string | Text description (optional when reference images are given — send at least one of prompt / images). Up to 4096 characters; for 1080p clips of 10-15s keep it within 2048, longer prompts are served by the other channel and render slower |
| images | No | string[] | Reference images, up to 7; http(s) URLs or base64 / data URLs both work. At 1080p only one image is accepted (used as the start frame); for 2+ images use 720p or 480p |
| resolution | No | string | "480p", "720p" (default), "1080p". 1080p is available for text-to-video and single-image image-to-video only; multi-image reference-to-video is capped at 720p by the model |
| duration | No | number | 1-15 seconds, default 10 |
| aspect_ratio | No | string | "16:9" (default), "9:16", "1:1", "3:2", "2:3" |
| callback_url | No | string | Webhook URL called when the task completes |
The create call returns data.taskId right away and the video renders in the background. GET the same endpoint with that task_id and read data.state: pending means still running, completed puts the MP4 URL (H.264 video + AAC audio) in data.resultUrls[0], and failed puts the reason in data.failMsg. To skip polling, pass callback_url and we POST you when the task finishes.
Every row below is a hard limit of the model or its upstream, not something the platform adds; requests that exceed one are rejected with a 400 at creation (no task, no charge) instead of failing mid-way.
| Item | Limit | Notes |
|---|---|---|
| Prompt length | Up to 4096 characters | Counted in characters (CJK and Latin count the same). 1080p requests of 10-15 seconds are served first by the per-clip channel, which accepts at most 2048 characters; longer prompts still render but move to the per-second channel and take longer. Over 4096 is a 400. |
| Prompt content | Only what the model needs | Storyboard beats, camera, dialogue, style and character looks are effective; instructions written for humans ("do not read the notes below", "output spec", "language policy") are not understood by the model — they only burn the character budget and dilute the real directions. To get a specific length set the duration parameter; do not write "exactly 15 seconds" in prose. |
| Reference images | Up to 7; exactly 1 at 1080p | 480p / 720p use reference mode (subject and composition preserved). 1080p only has single-image start-frame mode: the clip starts from that image; two or more images return a 400 — switch to 720p. |
| Reference image reachability | Must be downloadable at submission | We copy the image to our own storage the moment the task is created, so your link expiring afterwards does not affect generation. Short-lived signed URLs (a few minutes) are fine as long as they are still valid when you call; if unsure, send base64. |
| Duration | Integer 1-15 s, default 10 | Output length equals the requested duration. 1080p at 10-15 seconds is the cheapest combination (per-clip pricing, below the per-second rate); 1080p under 10 seconds is billed per second. |
| Resolution | 480p / 720p / 1080p | Only these three lowercase values. See the 1080p image rule above; the 720p cap for multi-image reference is a model limit no channel can bypass. |
| Aspect ratio | 16:9 / 9:16 / 1:1 / 3:2 / 2:3 | In 1080p single-image mode, omitting aspect_ratio follows the reference image; otherwise the default is 16:9. |
| Reference video | Not enabled | Sending video / video_url etc. returns an explicit 400. |
| Audio | Generated natively with the frames | Put the dialogue language and lines in the prompt; uploading audio or choosing a voice is not supported, and per-line lip-sync timing is not guaranteed. |
| Turnaround | ~30-70 s for a 4-second clip; ~2.5-3 min for 1080p 10-15 s | Measured medians; longer at peak times. Results are kept for 7 days. |
Parameter problems come back synchronously as a 400 at creation ({"code": 400, "msg": "..."}) — no task is created and nothing is charged. The msg strings are verbatim below, safe to match on.
| msg | Cause / fix |
|---|---|
prompt or a reference image is required | Neither prompt nor images was sent; provide at least one. |
prompt is N characters; at most 4096 are accepted on this model — shorten it | Prompt longer than 4096 characters. Storyboards, dialogue and production notes add up fast — trimming to 2048 or fewer is the safe target. |
resolution must be one of 480p / 720p / 1080p (got "...") | Unrecognized resolution; only these three lowercase values are accepted. |
duration must be 1-15 seconds (got ...) | Duration outside 1-15 seconds. |
at most 7 reference images are supported (got N) | More than 7 reference images. |
1080p supports text-to-video and single-image image-to-video only; multi-image reference-to-video is capped at 720p by the model (got N images) — set "resolution": "720p" or send a single image | Two or more images at 1080p. Set resolution to 720p, or keep a single image. |
reference-video editing is not enabled on this model yet — pass reference images instead | A reference video was sent (video / video_url etc.); video editing is not enabled on this model yet. |
Tasks that fail during generation (upstream error, timeout, etc.) end in state failed with the reason in data.failMsg, and the charge is refunded automatically.
Yes. On apimodels.app you POST to /api/v1/video/generations with model "grok-imagine-video-1.5", a prompt and/or reference images, then poll the same endpoint with the returned task_id until data.state is "completed" — data.resultUrls[0] is the MP4 (H.264 video + AAC audio). It is the same request shape as VEO, Kling and Seedance here, so switching models is a one-string change, and one API key covers all of them.
It is billed per second by resolution: 480p at $0.0294/s, 720p at $0.0529/s, 1080p at $0.0882/s — so a 4-second 480p clip is about $0.12 and a 15-second 1080p clip about $1.32. Note the defaults: omitting resolution and duration gives you 720p and 10 seconds (about $0.53), because that is the shape both of our channels can serve — ask for 480p or a shorter clip explicitly and you get it, it just runs on a single channel. Text-to-video and image-to-video cost the same; reference images add nothing. Failed tasks are not billed.
It produces a native synced audio track (dialogue, sound effects, ambience) alongside the frames — the MP4 you download already carries H.264 video plus AAC audio, no separate dubbing step. Output is watermark-free; we frame-checked both text-to-video and image-to-video results in production before listing it.