Does your Instagram Reel loop? Compare first and last frames

A Reel loops cleanly when its last frame leads into its first. Pull both stills with Sume video_frames, then re-cut the end with video trim.

5 min readSume
All posts

A Reel loops cleanly when the last frame is a natural step before the first frame, so the repeat does not read as a cut. You can check that without watching the clip ten times: pull the first and a near-last still with Sume's video_frames, look at them side by side, and re-cut the end with video_trim until they match.

This is a craft check, not a platform rule. Meta's IG User Media reference, read 2026-10-02, gives only the container limits (3 seconds to 15 minutes); it says nothing about loop behaviour, so this post claims none.

What counts as a clean loop?

Three things should line up between the end and the start: position (the subject sits in the same place), motion (movement continues in the same direction), and light or colour (no sudden change in exposure). Audio matters too, but the picture is where the jump shows first.

Easy loops come from locked-off shots: a product on a turntable, a pour that restarts, a person who ends in the pose they began with. Hard loops are talking heads, where the mouth is mid-word on the final frame.

How do I pull the two frames?

video_frames takes at[] with 1 to 24 values and requires each to be at least 0 and strictly below the clip duration. So to ask for the last frame, subtract a frame from the duration rather than passing the duration itself. At 30 fps, duration - 0.034 is the final frame; duration itself fails with frame_time_out_of_range.

Get the duration from a probe: a video_inspect call with frames: false returns probe facts without stills. Both tools are unbilled.

Loop checklist, Sume video frames docs read 2026-10-02
CompareLook for
Subject positionSame place in frame at 0 s and at the end
Motion directionContinues, does not reverse
Exposure and colourNo visible step between the two stills
Text on screenNot half-animated at the end
curl -X POST https://api.sume.com/v1/video-frames \
  -H "Authorization: Bearer $SUME_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: loop-check-001" \
  -d '{
    "video_url": "https://media.sume.com/artifacts/artf_demo/reel.mp4",
    "at": [0, 7.96],
    "format": "png"
  }'

How do I fix a mismatch?

Move the end point. Video trim takes start and exactly one of end or duration and returns a new MP4; end past the source clamps with a warning. Try ending 0.2 to 0.5 seconds earlier or later, extract the new last frame, and compare again. Each trim is $0.02 and needs its own Idempotency-Key.

Use the default precision: exact so the cut lands where you asked. The result reports actual_start_seconds and duration_seconds, so you can confirm the new length before the next frame pull.

  • Keep the Reel above 3 seconds; very short loops are legal but check Meta's minimum.
  • Trim the end, not the start, if the hook frame is already right.
  • Re-run the frame pull on the new MP4, not the old one.
  • If no cut matches, regenerate or reshoot the ending instead of forcing the trim.

What does Sume not do here?

Sume has no loop blending or cross-dissolve of the end into the start inside a single clip, and no automatic similarity score between two frames. The comparison is yours. What it does give you is cheap, repeatable evidence: two stills at the exact instants you name, and a cut you can redo. See jobs and results for polling.

How do I make the check part of a pipeline?

Treat it as a gate before publishing: probe the duration, pull the two stills, store them next to the job id, and let a human tick a box. Even if a script compares pixels, the final call is a person looking at a phone-sized preview.

Because both tools are unbilled and trim costs $0.02 a try, a few iterations cost almost nothing. The expensive mistake is publishing a loop that jolts on every replay, since a Reel that restarts many times shows the jolt many times.

Sources

Related posts

More in Media tools

All Media tools posts

Written by Sume