Three field-tested motion prompts for veo-3.1-lite/image-to-video, each with the source still, the real rendered clip, and the exact cost.
Choose a model, enter your prompt, and see the result.
HiAPI Blog
HiAPI
Generate it with HiAPI
generate_audio: true) — no separate voice/sound pass needed.generate_audio on, and 1080p jumps from $0.10/s to $0.14/s. Turn it off for silent product loops./v1/tasks endpoint you'll call yourself — nothing here is a platform showcase asset.Each recipe follows the same two-step loop:
gpt-image-2/text-to-image). The still is the first frame — whatever composition, lighting, and subject pose you lock in here is what the video will animate away from.veo-3.1-lite/image-to-video along with a motion prompt describing what should change over the next few seconds — a turn, an opening lid, a camera push. The model doesn't invent a new scene; it animates the one you gave it.A few things we learned probing the schema before spending on real clips:
image_url takes a single string, not an array — one reference image per clip, no multi-image blending.aspect_ratio field. The rendered video keeps the source image's framing.duration only accepts 4, 6, or 8 — asking for 5 or 10 gets rejected outright.generate_audio is a plain boolean, and it changes the price tier (see the cost table below), so decide upfront whether the clip needs sound.Source still — studio portrait, three-quarter angle, neutral expression:

The woman slowly turns her head and shoulders to face the camera directly, her expression shifting from neutral calm into a warm, genuine smile as she makes eye contact with the lens. Her curly auburn hair sways gently with the motion. Soft ambient studio room tone, a faint exhale of breath audible as she smiles.
veo-3.1-lite/image-to-video · 6s · 720p · generate_audio: true · $0.60
Why it works: the prompt gives the model exactly one motion (a turn) and exactly one expression change (neutral to smile) — it doesn't ask for anything the source pose can't support. Naming the audio explicitly ("soft ambient studio room tone," "faint exhale") matters here: without a cue, generate_audio: true tends to default to generic ambience instead of a sound that matches the visual beat.
Source still — closed earbuds case on a marble pedestal:

The charging case lid slowly lifts open on its hinge as the case rotates gently clockwise on the marble pedestal, revealing the earbuds nestled inside. The studio rim light glints across the matte black surface as it turns. Camera stays locked off, subject motion only.
veo-3.1-lite/image-to-video · 4s · 1080p · generate_audio: false · $0.40
Why it works: e-commerce loops rarely need sound — most shoppers watch product videos muted — so this one turns audio off entirely and keeps the clip short (4s) with a single compound motion (open + rotate). Calling out "camera stays locked off" stops the model from adding a drifting dolly move you didn't ask for, which is a common failure mode on product shots.
Source still — misty lake pier at dawn:

The camera slowly pushes forward along the wooden pier toward the empty bench as the morning mist drifts and thins across the lake surface, sunlight beginning to break through the pink sky and catch the ripples on the water. A faint ambient soundscape of birdsong and gentle water lapping against the pier posts.
veo-3.1-lite/image-to-video · 6s · 720p · generate_audio: true · $0.60
Why it works: environment shots benefit from combining a camera motion (push-in) with an environmental motion (mist thinning, light shifting) — one alone reads as static, both together reads as a living scene. The ambient audio cue ("birdsong," "water lapping") keeps the soundtrack tied to what's visible instead of generic background noise.
veo-3.1-lite/image-to-video prices by resolution and whether audio is on, verified against the live /api/pricing endpoint:
| Resolution | Audio | Price per second | 6s clip cost |
|---|---|---|---|
| 720p | off | $0.06/s | $0.36 |
| 720p | on | $0.10/s | $0.60 |
| 1080p | off | $0.10/s | $0.60 |
| 1080p | on | $0.14/s | $0.84 |
Two takeaways: staying at 720p and turning audio off is the cheapest way to iterate on a prompt before committing to a longer or higher-resolution render. And going from 720p to 1080p with audio on nearly doubles the per-second rate ($0.14 vs. $0.10 silent-720p) — save the 1080p+audio combo for the clip you're actually going to ship.
import time
import requests
API_BASE = "https://api.hiapi.ai/v1/tasks"
TOKEN = "YOUR_HIAPI_API_KEY"
def submit(prompt, image_url, duration=6, resolution="720p", generate_audio=True):
resp = requests.post(
API_BASE,
headers={"Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json"},
json={
"model": "veo-3.1-lite/image-to-video",
"input": {
"prompt": prompt,
"image_url": image_url,
"duration": duration,
"resolution": resolution,
"generate_audio": generate_audio,
},
},
timeout=30,
)
resp.raise_for_status()
return resp.json()["data"]["taskId"]
def poll(task_id, interval=8, timeout=300):
deadline = time.time() + timeout
while time.time() < deadline:
r = requests.get(f"{API_BASE}/{task_id}",
headers={"Authorization": f"Bearer {TOKEN}"}, timeout=30)
data = r.json()["data"]
if data["status"] == "success":
return data["output"][0]["url"]
if data["status"] in ("failed", "error"):
raise RuntimeError(f"task failed: {data}")
time.sleep(interval)
raise TimeoutError("task did not finish in time")
task_id = submit(
prompt="The subject slowly turns toward camera and smiles.",
image_url="https://your-public-image-url.jpg",
duration=6,
resolution="720p",
generate_audio=True,
)
video_url = poll(task_id)
# output URLs are time-limited — download the bytes immediately
video_bytes = requests.get(video_url, timeout=60).content
with open("clip.mp4", "wb") as f:
f.write(video_bytes)
The output URL expires — download and store the bytes as soon as the task reports success, don't keep a long-lived reference to it.
If you're new to hiapi's task-based generation flow, the model detail page for veo-3.1-lite/image-to-video has the current schema reference, and the pricing page always reflects the live per-model rates rather than a snapshot. If you're building out a broader image-to-video prompt library, our Grok Imagine 1.5 image-to-video recipes piece covers a different model with its own motion-prompt patterns and cost tradeoffs.
| Field | Type | Values | Notes |
|---|---|---|---|
prompt | string | free text | describes the motion/change, not the whole scene |
image_url | string | public URL | single image only, no array |
duration | integer | 4, 6, 8 | other values are rejected |
resolution | string | "720p", "1080p" | no 480p tier |
generate_audio | boolean | true / false | changes the price tier |
Generate a clean source still, write a motion prompt that names exactly one or two changes you want, and decide upfront whether the clip needs sound — that's the whole workflow. Head to the veo-3.1-lite/image-to-video model page to grab your API key and start rendering.