Instagram Reels API frame rate 23 to 60: set fps in Sume

Meta's Reels API accepts 23 to 60 fps. Sume trim and Timeline output fps takes 24, 25, 30 or 60, and warns when it resamples. What to pick for a Reel.

5 min readSume
All posts

Instagram's Reels API accepts frame rates from 23 to 60 fps. Sume's exact trim and Timeline 1.0 can output 24, 25, 30 or 60 fps, all inside that range, and if you omit the setting Timeline renders at the rate the sources already run at. The risk is a source below 23 fps, such as a 15 or 20 fps screen capture, which no output setting makes valid by itself.

Meta's number comes from the IG User Media reference (read 2026-10-02), which lists "23-60 FPS". The Sume rules come from Timeline 1.0, video trim and video inspect.

Which frame rates does each Sume tool allow?

The table lists what the docs say each surface does with frame rate. All allowed values are within Meta's 23 to 60 window.

Frame rate handling in Sume tools against Meta's 23 to 60 fps (read 2026-10-02)
ToolFrame rate settingDefault when omitted
Video trim, exactoutput.fps: 24, 25, 30 or 60Inherits the source
Video trim, keyframeNot available (output needs exact)Stream copy, source rate
Timeline 1.0output.fps: 24, 25, 30 or 60Rate of the longest video sources; 30 if none has one
Timeline composeoutput.fps, warns if it differs from the clipThe video layer's own rate

Why does an explicit fps sometimes make motion worse?

A frame rate that differs from the source is met by repeating or dropping a frame every few frames, which the Timeline docs describe as judder on motion. Sume reports it as the warning output_fps_resamples_sources, with the rate the sources wanted. So the best setting for a clip that already runs at 30 fps is no setting at all, or 30.

The one case where you must set it is a mixed timeline in which one slot is below Meta's floor. Then conform to 24 or 30 and accept the resample warning, because a rejected container costs more than a few judder frames.

How do I find a bad frame rate before publishing?

Run a probe-only inspect on each clip. The inspect result's probe includes fps, and frames: false means no stills and no charge. The check below flags any clip outside the Meta window; paste the fps values from the probes.

A 23.976 fps clip is a judgment call. It is above 23 on the number, but the docs do not say how Meta rounds, so if a file is that close to the edge, conform it to 24 with an exact trim and move on.

def fps_ok(fps):
    return 23 <= fps <= 60

clips = {"intro.mp4": 30, "screen.mp4": 15, "b-roll.mp4": 59.94}
for name, fps in clips.items():
    print(name, fps, "ok" if fps_ok(fps) else "conform or replace")

What does a conform call look like?

An exact trim with an output block rewrites the clip at 30 fps. Both start and one of end or duration are required, and the call is a normal job: poll /v1/jobs/:id/status and read /v1/jobs/:id/result, as in Jobs and results. Note that a clip genuinely recorded at 15 fps will be duplicated up to 30 and still look like 15 fps; conforming fixes the metadata, not the motion.

curl -X POST https://api.sume.com/v1/video-trim \
  -H "Authorization: Bearer $SUME_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: reel-fps-conform-001" \
  -d '{"video_url":"https://media.sume.com/artifacts/artf_demo/screen.mp4",
       "start":0,"duration":20,
       "output":{"width":1080,"height":1920,"fps":30}}'

What should I pick for a mixed timeline?

If every clip is 24, 25, 30 or 60 fps, leave output.fps out and let Timeline match the sources; the docs say the longest video sources decide. If clips differ, choose the rate that most of the runtime already uses and accept the warning on the rest. A 30 fps phone clip next to a 24 fps cinematic clip is the common case: pick 30 if the phone footage is most of the cut, 24 if the cinematic footage is.

Do not set 60 just because Meta allows it. A 30 fps source gets every frame repeated, which doubles the data rate pressure without adding smoothness, and the 25 Mbps bitrate cap and 300 MB file cap still apply. Cover them in the 1920 px and 25 Mbps post.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume