Seamless loop with Wan 3.0: the same image as first and last frame

Send one image as both start and end frame to ask Wan 3.0 for a loop on Sume, keep it 4 to 6 seconds, and check the join with stills before it repeats.

5 min readSume
All posts

To ask Wan 3.0 for a looping clip on Sume, send the same image URL as the first frame and the last frame, keep the clip short, and describe a motion that returns to where it began. The catalog lists end_frame support for wan-3.0, and the Video Router's image-to-video fields are image_url and the optional end_image_url. Alibaba's Wan 3.0 README (read 2026-10-05) lists native 30 second generation, but for a loop you want the opposite end of the range: Sume's docs show wan-3.0 accepting 2 to 30 seconds, and 4 to 6 is where a return to the start frame is easiest to believe.

Why identical frames work

A first and a last frame constrain the clip at both ends. When the two are the same picture, the model has to leave the picture and come back to it, so the end of the clip is almost the start. That is what makes a repeating background, a product turntable or a breathing effect look continuous when a player repeats it.

  • Choose motion that is naturally periodic: steam rising, a slow camera orbit, leaves moving, a light pulse.
  • Avoid one-way events: a door that opens, a pour, anything that cannot undo itself.
  • Keep the subject centered and the background simple; busy backgrounds drift more.
  • Use the same aspect ratio as the image, so nothing is cropped from the end frames.
  • Keep the audio off or ambient: speech does not loop.

The request

The same URL appears twice. The prompt describes the motion and says that the end returns to the start.

curl -X POST https://api.sume.com/v1/video-router/generate \
  -H "Authorization: Bearer $SUME_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: loop-001" \
  -d '{
    "model": "wan-3.0",
    "prompt": "Steam curls up from the cup and settles, camera drifts a few degrees and returns. The last frame matches the first.",
    "image_url": "https://example.com/cup.png",
    "end_image_url": "https://example.com/cup.png",
    "resolution": "720p",
    "duration": 5,
    "generate_audio": false,
    "mode": "async"
  }'

Check the join before you publish

A loop fails at the seam: a small jump between the last frame and the first. Pull stills at the start and at the very end with video frames, using at with 0 and a time just under the clip length, and compare them side by side. The docs say frames keep the source size unless you set max_edge, so the comparison is at full resolution. If the end frame is not quite the start frame, trim a few frames off the end with video trim (it cuts a [start, end) range into a new MP4) or add a short crossfade when you join the clip to itself with Timeline 1.0.

Loop checks and fixes (read 2026-10-05)
SymptomLikely causeFix
Visible jump at the seamLast frame differs from the firstTrim the end, or crossfade the clip with itself in Timeline
Motion stops dead at the endPrompt did not ask for a returnSay the motion returns to its start pose
Background shifts over timeToo long or too busyShorten to 4 s, simplify the image
Looks fine once, jerky on repeatAudio or fps mismatchMute with generate_audio false; set output fps in Timeline

Repeating it

To make a loop longer than one pass, use Timeline 1.0: put the same clip into several consecutive video[] slots, each with its own start and duration. The docs say the first slot must start at 0 and later starts must increase, and that transitions are allowed only on slots after the first. A dissolve of a fraction of a second at each join hides small seams. Preview the result before you commit it to a page.

Sources

Related posts

More in Media tools

All Media tools posts

Written by Sume