Shorts thumbnail 2160x3840 hits GPT Image 2.5's 8,294,400 px cap

YouTube's Shorts thumbnail size, 2160x3840, is exactly 8,294,400 pixels, the top of Sume's GPT Image 2.5 custom range. 1080x1920 is not legal; 1088x1920 is.

5 min readSume
All posts

YouTube's Shorts thumbnail size is 2160 x 3840, and 2160 x 3840 is 8,294,400 pixels, which is exactly the top of the custom size range in Sume's GPT Image 2.5 docs (655,360 to 8,294,400). It is also legal on every other rule: both edges are multiples of 16 (135 x 16 and 240 x 16), the longest edge is 3840, and the ratio is 1.78:1, well under 3:1.

The common Shorts size people type, 1080 x 1920, is not legal, because 1080 is not a multiple of 16. The nearest legal sizes are 720 x 1280, 1088 x 1920, 1440 x 2560 and the full 2160 x 3840.

What the YouTube page says

YouTube's thumbnail help page gives Shorts thumbnails a 9:16 ratio at 2160 x 3840, with a minimum height of 640 pixels. It lists the file-size limits for all thumbnail types as 2 MB for video thumbnails on mobile and 50 MB for video, Shorts and podcast thumbnails on desktop, and names JPG or PNG as example formats.

So the floor is low: a 640-pixel-tall vertical image meets the stated minimum, and 720 x 1280 is a legal size that is already double it. The full-size image is for when you want the one winning cover to be as sharp as YouTube suggests.

9:16 candidates against Sume's custom size rule (docs read 2026-10-03)
SizePixelsBoth edges multiples of 16Legal
720 x 1280921,600yes (45 x 80)yes
1080 x 19202,073,600no (1080 / 16 = 67.5)no
1088 x 19202,088,960yes (68 x 120)yes, 0.5667 vs 0.5625 ratio
1440 x 25603,686,400yes (90 x 160)yes
2160 x 38408,294,400yes (135 x 240)yes, exactly the cap

Why this size goes async

Sume's Image API blocks for up to 30 seconds and then returns a 202 job envelope if the image is not ready. The docs name the slow configurations most likely to hit that: 4K, high quality and a large n. A 2160 x 3840 request at high quality is two of the three, so submit it with mode: "async" from the start and poll the job instead of holding a request open.

The script below does that: it submits, polls status_url until terminal is true, and then reads result_url. The docs tell you to poll rather than resubmit, because a repeated paid request is a second generation. If you do retry a submit after a client timeout, reuse the same Idempotency-Key, as described in Jobs and results.

import os
import time
import requests

H = {"Authorization": "Bearer " + os.environ["SUME_API_KEY"]}
body = {
    "model": "openai/gpt-image-2.5",
    "prompt": "Vertical Shorts thumbnail, host pointing up at a bold shape",
    "image_size": {"width": 2160, "height": 3840},
    "quality": "high",
    "mode": "async",
}
job = requests.post("https://api.sume.com/v1/images", headers=H, json=body, timeout=60).json()["data"]
while True:
    s = requests.get(job["status_url"], headers=H, timeout=30).json()
    s = s.get("data", s)
    if s.get("terminal"):
        break
    time.sleep(s.get("next_poll_after_seconds") or 5)
print(s.get("sume_status"))
if s.get("sume_status") == "completed":
    print(requests.get(job["result_url"], headers=H, timeout=30).json())

Price it before you commit

The fal page for this model lists $0.40026 for 3840 x 2160 at max quality, and $0.00402 for 1024 x 768 at low, which is its own list range and not a Sume price. Sume's docs add that auto quality reserves max, so an unpinned request can hold more than you expect. Set quality yourself, draft at 720 x 1280, and only render 2160 x 3840 for the cover you will publish.

The pixel count of 8,294,400 is the same as a 3840 x 2160 landscape frame, so the 3840 x 2160 figure on the fal page is the nearest list reference. It is a different canvas shape, so treat it as a ballpark and read the endpoint pricing line for your own number.

Sources

Related posts

More in Media tools

All Media tools posts

Written by Sume