Animate a brand mascot still: which Sume models take a first frame

Almost every Sume video row takes a first frame, except H3 Max Recast and Genjutsu. Grok Imagine Video 1.5 is $0.0125 a second; Omni, Wan and Kling add more.

5 min readSume
All posts

To animate a mascot still, pass it as a first_frame in frame_images. On Sume that works on grok-imagine-video-1.5 (first frame required, $0.0125 a second), gemini-omni-flash-1.1, wan-3.0, kling-3, minimax-h3, minimax-h3-max and the Seedance rows. The two person-swap rows, h3-max-recast and higgsfield-genjutsu, work from a source video and do not.

Choose by what you need beyond the first frame: sound, a last frame, a longer clip or a square ratio. Limits are from the Sume video docs and Video Router guide, read 2026-10-05.

Image-to-video rows compared

Sume bills the provider list price times 1.25 and rounds the job up to the cent, so a one-second figure here is a rate, not a charge.

First-frame animation on Sume (read 2026-10-05)
Model idNeeds a first frameLast frameAudioRate per second
grok-imagine-video-1.5Yes, no text-onlyNoNone$0.0125 at 480p or 720p
wan-3.0NoYesYes$0.0625 at 480p
minimax-h3NoYesStereo, always on$0.0625 at 480p
gemini-omni-flash-1.1NoYesNative, always on$0.0375 at 360p
kling-3NoYesOptional$0.14 without audio

Cheap is not always the point

Grok is the lowest rate on the list: a 6-second loop is $0.075. It has no sound, no last frame and no aspect_ratio option. That suits a silent web loop. For a mascot that has to speak or end on a set pose, use Omni or Wan.

A mascot photo or illustration is also a style anchor. If the mascot appears in several shots, put the same image in input_references on Omni or Wan, which hold up to 10 images, so each clip draws on the same look.

Request

The cheapest route, a silent loop from a still.

import os, time, requests

H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
payload = {
    "model": "grok-imagine-video-1.5",
    "prompt": "The mascot waves and blinks, gentle bounce, plain background",
    "duration": 6,
    "resolution": "720p",
    "frame_images": [
        {"type": "image_url", "image_url": {"url": "https://example.com/mascot.png"}, "frame_type": "first_frame"}
    ],
}
job = requests.post("https://api.sume.com/v1/videos", headers=H, json=payload).json()
while True:
    time.sleep(30)
    s = requests.get(job["polling_url"], headers=H).json()
    if s["status"] in ("completed", "failed", "cancelled"):
        break
print(s["status"], s.get("unsigned_urls"), s.get("usage"))

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume