Instagram Reels API aspect ratio: 0.01:1 to 10:1, 9:16 advised

Meta's Reels API accepts any aspect ratio from 0.01:1 to 10:1 and only recommends 9:16. See what each ratio rule says and check a clip with video inspect.

4 min readSume
All posts

Instagram's Reels API does not require 9:16. Meta's IG User Media reference says the required aspect ratio for a Reel is between 0.01:1 and 10:1, and that Meta recommends 9:16 "to avoid cropping or blank space". A 16:9 file or a 1:1 file is inside the required range, so the ratio rule alone will not reject it; the recommendation is about how the video is displayed (read 2026-10-02).

The reference page is the only vendor source for this post. Sume's side comes from the video inspect and Timeline 1.0 docs.

What ratio range does each Instagram surface accept?

The same page lists separate specifications for Reels, Stories and images, and the numbers are not the same. Stories video starts at 0.1:1, not 0.01:1, and feed images have a much narrower window.

Aspect ratio rules on Meta's IG User Media page (read 2026-10-02)
SurfaceRequired ratioRecommended
Reels video0.01:1 to 10:19:16
Stories video0.1:1 to 10:19:16
Feed image4:5 to 1.91:1Not stated

If 16:9 passes, why does Meta recommend 9:16?

Meta's stated reason is cropping and blank space. The page does not describe exactly how a 16:9 Reel is shown, so treat the recommendation as a display preference rather than a hard rule, and look at a test publish on your own account before you batch anything.

The same page says the Reel cover is cropped to the middle 9:16 rectangle when the cover image is another shape, and cropped to the middle 1:1 square if you share the Reel to the feed. Keep faces and text near the center of the frame if the clip will do both.

How do I check a clip's ratio before publishing?

Run video inspect with frames: false. Probe and stills are unbilled, and the probe returns width, height and rotation separately, so read all three. The sketch below swaps width and height for a quarter-turn rotation. That swap is my reading of the field, not something the docs spell out, so confirm it on a phone-shot file.

If a clip is outside 9:16 and you want the recommended shape, regenerate at 9:16 or build the cut in Timeline, whose default output is 1080x1920.

import hashlib, os, time, requests
BASE = "https://api.sume.com"
H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}

def probe(video_url):
    key = "probe-" + hashlib.sha256(video_url.encode()).hexdigest()[:24]
    r = requests.post(f"{BASE}/v1/video-inspect", headers={**H, "Idempotency-Key": key},
                      json={"video_url": video_url, "frames": False}, timeout=60)
    r.raise_for_status()
    rid = r.json()["data"]["video_inspect_id"]
    while True:
        d = requests.get(f"{BASE}/v1/video-inspect/{rid}", headers=H, timeout=30).json()["data"]
        if d["resource_status"] == "ready":
            return d["probe"]
        if d["resource_status"] in ("failed", "canceled"):
            raise RuntimeError(d["error"])
        time.sleep(2)

p = probe("https://media.sume.com/artifacts/artf_demo/talk.mp4")
w, h = (p["height"], p["width"]) if p["rotation"] in (90, 270, -90) else (p["width"], p["height"])
ratio = w / h
print(f"{w}x{h} ratio {ratio:.4f}", "in range" if 0.01 <= ratio <= 10 else "OUT of range",
      "| 9:16" if abs(ratio - 9 / 16) < 0.01 else "| not 9:16")

What should I do?

Treat 9:16 as the default and the 0.01:1 to 10:1 range as the refusal boundary. Probe each file, log the ratio next to the container id, and send only files that pass. Put the file at a URL Meta can fetch, because the page says Meta fetches video_url from a public server.

Sources

Related posts

More in Integrations

All Integrations posts

Written by Sume