Source from URL or base64
Pass the image as a URL (use upload-media for local files) or base64-encoded bytes — both go in the `image` field.
Animate an image into a short video (Google Veo, async/delayed)
Async image-to-video generation using Google Veo. Provide a source image (URL or base64) plus an optional motion-guidance prompt; choose model (`veo (Audio)` or `veo fast (Audio)`), resolution (512P / 1080P), duration (4s / 8s), and aspect_ratio (16:9 / 9:16). `media-video-from-image` is **is_delayed:true** — the gateway returns 202 + a gateway job_id immediately. The worker calls the upstream, which queues a task in a dedicated video worker pool, and the gateway worker polls the upstream's `/api/video/status/{job_id}` automatically. Pricing: $1.50/second of generated video (catalog rate). For a 4s video that's $6 per generation.
Pass the image as a URL (use upload-media for local files) or base64-encoded bytes — both go in the `image` field.
An optional `prompt` field steers how the image should animate. If omitted, the upstream applies its default motion model.
Two model options: `veo (Audio)` (default, includes audio) and `veo fast (Audio)` (faster).
Gateway returns 202 + job.id; worker calls upstream, upstream returns its own job_id, worker polls upstream's /api/video/status/{job_id} until complete. 600s timeout (10 min).
$1.50/s — 4s = $6, 8s = $12. usage.units = duration in seconds.
Take a still product photo and animate it into a looping hero video for landing pages.
Add subtle motion to portraits, landscapes, art for social posts.
Animate concept art / mood boards before commissioning real production.
Use aspect_ratio: 9:16 to generate portrait-format videos from existing portraits.
Input
image (URL or base64) + optional prompt + optional model/resolution/duration/aspect_ratio
Output
Initial 202 + gateway job_id; eventual result_data carries the video URL + duration + metadata
Prerequisites
If your image is local, use upload-media to get a public_url.
{ "media_type": "image", "filename": "source.png", "content_type": "image/png" }Response
{
"status": "success",
"data": {
"upload_url": "https://s3.eu-central-1.wasabisys.com/.../source.png?...",
"public_url": "https://s3.eu-central-1.wasabisys.com/.../source.png?..."
}
}PUT your file to upload_url, then use public_url as the `image` field below.
POST image (URL or base64) + optional prompt + optional parameters. The gateway returns 202 + job.id immediately.
{
"image": "https://s3.eu-central-1.wasabisys.com/.../source.png?...",
"prompt": "Gentle camera push-in, mist drifting, water reflections shimmering",
"model": "veo (Audio)",
"resolution": "1080P",
"duration": "4s",
"aspect_ratio": "16:9"
}Response
{
"status": "accepted",
"message": "Job queued for processing",
"job": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "queued",
"service": "media-video-from-image",
"created_at": "2026-04-27T10:30:00Z"
}
}Save the gateway job.id and poll GET /v2/jobs/{job_id}. Worker handles upstream + upstream-status polling automatically.
Standard async-job polling.
GET /v2/jobs/{job_id}Response
{
"id": "550e8400-...",
"status": "completed",
"service_name": "media-video-from-image",
"created_at": "2026-04-27T10:30:00Z",
"completed_at": "2026-04-27T10:33:42Z",
"result_data": {
"status": "success",
"video_url": "https://s3.example.com/.../video.mp4",
"duration_seconds": 4.0,
"model": "veo (Audio)",
"resolution": "1080P",
"aspect_ratio": "16:9"
},
"units_consumed": 4.0,
"token_cost": 6.0
}Billing: 4s × $1.50 = $6.00. result_data shape comes from the upstream — typical fields shown.
Async image-to-video via Google Veo. Returns 202 + gateway job_id. The worker handles upstream POST + status polling. Billed per second of generated video.
/v1/proxy/media-video-from-image
Per second of generated video. Async — billing happens once when the gateway job completes.
| Service | Unit | Price |
|---|---|---|
| Video from Image | second | $1.50/second |
A: Async, typically 1-5 minutes for 4s/1080P. Up to 10 minutes (600s) before the gateway times out.
A: Use upload-media first to get a public_url, then pass that as `image`. Or base64-encode it and pass directly.
A: Not strictly — the upstream will crop/letterbox to fit. Matching helps avoid unwanted cropping.
A: Upstream Pydantic expects exact string values '4s' or '8s'. Passing 4 (int) returns a 400.
A: No — as of 2026-04-27, the worker detects upstream failures (HTTP 4xx/5xx or {status:'error'} envelope) and skips billing for FAILED jobs.
1.1 (2026-04-27)
1.0 (2026-01-26)