Largest square GPT Image 2.5 takes on Sume: 2880x2880
2880x2880 is exactly 8,294,400 pixels, the top of the GPT Image 2.5 custom-size box on Sume. 2896x2896 is over. 4K UHD lands on the same cap.
The largest square you can request from GPT Image 2.5 on Sume is 2880x2880. That is 8,294,400 pixels, exactly the documented maximum. The next multiple of 16, 2896x2896, is 8,386,816 pixels and is over. Note that 3840x2160 (4K UHD) lands on the same 8,294,400 total, so the cap is a pixel count and not a 3840-by-3840 box.
The three limits that interact
The documented custom-size rules (as of 2026-10-08) are: Both edges must be multiples of 16, the longest edge is at most 3840, the aspect ratio is at most 3:1, and the total is 655,360 to 8,294,400 pixels. For a square, the pixel total is the limit that bites first. The 3840 edge limit would allow a 3840x3840 square on its own, but that is 14,745,600 pixels.
2880 is 180 x 16 and 2880 squared is 8,294,400, so the cap and the multiple-of-16 rule line up with no gap.
| Size | Pixels | Legal | Note |
|---|---|---|---|
| 2880x2880 | 8,294,400 | yes | exactly 8,294,400, the cap |
| 2896x2896 | 8,386,816 | no | 8,386,816, over the cap |
| 3840x2160 | 8,294,400 | yes | 16:9 UHD, also exactly 8,294,400 |
| 3072x2688 | 8,257,536 | yes | 8,257,536, under the cap |
Latency and the 202 path
Sume's Image API docs say slow configurations, such as 4K, high quality and a large n, are the most likely to degrade to a 202 job envelope. A maximum-size call can therefore return a job instead of an image. Check the status code, not the body shape, and fall back to the job result endpoint when you receive 202.
Pricing for GPT Image 2.5 follows image tokens, and the docs state that auto size reserves the upper bound of output tokens. For a fixed size at the cap, read the reserve in the endpoint record before you run a batch.
Check it
Use the same validator before any large request.
def legal(w, h):
px = w * h
return (w % 16 == 0 and h % 16 == 0 and max(w, h) <= 3840
and max(w, h) / min(w, h) <= 3 and 655_360 <= px <= 8_294_400)
for w, h in [(2880, 2880), (2896, 2896), (3840, 2160), (3072, 2688)]:
print(w, h, w * h, legal(w, h))The largest size at other ratios
Only 16:9 and its tall twin reach the cap exactly at a 3840 edge. Other ratios stop earlier because the whole-number multiple that keeps both edges at multiples of 16 jumps in steps. The table shows the largest legal size per ratio.
| Ratio | Largest size | Pixels |
|---|---|---|
| 1:1 | 2880x2880 | 8,294,400 |
| 4:3 | 3264x2448 | 7,990,272 |
| 3:2 | 3504x2336 | 8,185,344 |
| 16:9 | 3840x2160 | 8,294,400 |
| 5:4 | 3200x2560 | 8,192,000 |
| 4:5 | 2560x3200 | 8,192,000 |
| 9:16 | 2160x3840 | 8,294,400 |
| 1:2 | 1920x3840 | 7,372,800 |
When you need more than the cap
If a print job needs a square larger than 2880x2880, one GPT call cannot provide it. Generate at the cap and resample with your own tooling. Do not assume a model upscales for you. Sume's image rows return what the model renders, and the cap is a documented property of the GPT custom-size box rather than a plan limit.
Other rows have their own limits. The catalog lists resolution tiers for Nano Banana 2.1 and Pro (512, 1K, 2K, 4K), so check the row you plan to use before you assume that a 4K output is possible there.
Sources
Related posts
More in Developers
- List your Sume Formats in Python and keep the video ones
Page through GET /v1/formats with next_cursor, keep io.output_kind video, and print each vanity_invoke_url. A runnable snippet with field caveats.
- List Sume jobs for one run_id and count them by status (curl and jq)
GET /v1/jobs filters by run_id, scope and status and returns up to 100 rows. A short curl and jq script gives a count per status for one run.
- Log requested vs stored model ids to find retired ids still in config
Sume runs a retired image id as its successor and stores the successor on the job. Compare the two ids after each submit to find stale config.
- Log the Sume request_id in Python JSON logs, no keys or URLs
A small logging helper for failed /v1/videos calls: keep error.code, request_id and job id, and leave out the API key and signed media URLs.
Written by Sume