First and last frame video API call: Wan 3.0, 6 s at 720p, $0.75
A working first-frame and last-frame request for Sume's /v1/videos: Wan 3.0, 6 seconds, 720p, $0.75. Which rows accept last_frame and which do not.

To make a video that starts on one image and ends on another, send both in frame_images on POST /v1/videos, one entry with frame_type: "first_frame" and one with "last_frame". On wan-3.0 at 720p a 6-second clip costs 6 x $0.125 = $0.75. Each image URL must be reachable over public HTTPS.
The request
This script submits the job, polls every 15 seconds and prints the download URL. It stops on failed or cancelled. Set SUME_API_KEY and replace the two image URLs first.
import os, time, requests
H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
frame = lambda url, kind: {"type": "image_url", "image_url": {"url": url}, "frame_type": kind}
body = {
"model": "wan-3.0",
"prompt": "The shop window slowly fills with snow as dusk turns to night",
"duration": 6,
"resolution": "720p",
"aspect_ratio": "16:9",
"frame_images": [
frame("https://example.com/day.png", "first_frame"),
frame("https://example.com/night.png", "last_frame"),
],
}
job = requests.post("https://api.sume.com/v1/videos", headers=H, json=body, timeout=60).json()
while True:
time.sleep(15)
s = requests.get(job["polling_url"], headers=H, timeout=60).json()
if s["status"] == "completed":
print(s["unsigned_urls"][0])
break
if s["status"] in ("failed", "cancelled"):
print(s.get("error"))
breakWhich Sume rows take a last frame
supported_frame_images in GET /v1/videos/models is the authoritative list. From the Video Router catalog, rows with an end frame are the Seedance family, Kling 3, Wan 3.0, MiniMax H3, MiniMax H3 Max and Gemini Omni Flash 1.1. Grok Imagine Video 1.5 takes a first frame only, and the two source-video rows, H3 Max Recast and Higgsfield Genjutsu, take no frame images.
| Row | Duration (s) | Last frame |
|---|---|---|
| seedance-2.5 | 4-30 | yes |
| seedance-2 / 2-mini / 2-fast | 4-15 | yes |
| kling-3 | 4-15 | yes |
| wan-3.0 | 2-30 | yes |
| minimax-h3 / minimax-h3-max | 5-15 | yes |
| gemini-omni-flash-1.1 | 3-10 | yes |
| grok-imagine-video-1.5 | 4-15 | no |
Rules worth remembering
If you send both frame_images and input_references, Sume processes the request as image-to-video and frame_images controls the mode. Some rows are stricter: the catalog shows MiniMax H3 forbidding first and last frame with reference roles in one call, so send one mode per request.
The last frame is a target, not a guarantee. If the two images differ a lot, the model invents the transition, so keep subject and camera angle close.
Cost of the pair
The two stills are inputs, so they add nothing to the price. The clip is billed on its output length and resolution, which is why the cost line at the top is only 6 x $0.125. At 480p the same request is 6 x $0.0625 = $0.375, shown as $0.38; at 1080p it is 6 x $0.25 = $1.50.
Make the two images match in size and framing. A first frame shot wide and a last frame shot tight forces the model to invent a camera move, and the result is less predictable than a small change between two frames.
Sources
Related posts
More in Developers
- Five status vocabularies on the Sume and OpenRouter video APIs
Sume job status, the queue-shaped field, /v1/videos status, webhook delivery status and OpenRouter status differ in spelling. One TypeScript map fixes it.
- FLUX 3 Image rewrites your instruction: result.prompt vs Sume's rows
BFL's FLUX 3 Image expands an edit instruction into a detailed prompt and returns it in result.prompt. What to log, and what Sume's rows return instead.
- FLUX 3 Image has no negative prompt: what to write, and Sume's rows
BFL's FLUX 3 Image has no negative_prompt field; it wants the positive version. The replacement table, a runnable rewriter, and Sume's image rows' fields.
- FLUX.3 not on Sume yet: detect it via /v1/images/models, fall back
Sume does not list FLUX.3. A Python script reads /v1/images/models, uses FLUX.3 if it appears, else Nano Banana 2.1 at 2K for $0.15. BFL 2k is $0.100.
Written by Sume