GPT Image 2.5 custom size: 3840x2160 passes, 3840x1200 fails

Check a custom image_size for ChatGPT Image 2.5 on Sume before you send it: multiples of 16, 3840 max edge, 3:1 max ratio, 655,360 to 8,294,400 pixels.

4 min readSume
All posts

The four rules

A custom image_size for ChatGPT Image 2.5 on Sume passes when both edges are multiples of 16, the longer edge is at most 3840, the aspect ratio is at most 3:1, and the total is between 655,360 and 8,294,400 pixels. So 3840x2160 passes at exactly 8,294,400 pixels, while 3840x1200 fails on aspect ratio (3.2:1).

The rules come from the Sume Image API docs for the openai/gpt-image-2.5 and openai/gpt-image-2.5-sunburst rows. Named presets, auto and custom pixels are all accepted for image_size; this post is only about custom pixels.

Six custom sizes checked against the four rules (read 2026-10-04)
SizePixelsRatioResult
3840x21608,294,4001.78passes
2048x20484,194,3041.00passes
3840x12804,915,2003.00passes
3840x12004,608,0003.20fails: over 3:1
1024x512524,2882.00fails: under 655,360 pixels
4096x23049,437,1841.78fails: edge over 3840 and pixels over cap

Check before you send

Run the rules locally so a bad size never costs a round trip. The function returns the list of broken rules.

def check(w, h):
    errs = []
    if w % 16 or h % 16:
        errs.append("edges must be multiples of 16")
    if max(w, h) > 3840:
        errs.append("max edge is 3840")
    if max(w, h) / min(w, h) > 3:
        errs.append("aspect over 3:1")
    if not 655_360 <= w * h <= 8_294_400:
        errs.append("pixels outside 655,360-8,294,400")
    return errs or ["ok"]

for size in [(3840, 2160), (2048, 2048), (3840, 1280), (3840, 1200), (1024, 512), (4096, 2304)]:
    print(size, check(*size))

Cost and timing

  • Larger sizes use more output tokens. At quality: max, Sume's estimator prices a 3840x2160 image at about $0.50 including margin; at high and 1024x768 it is about $0.045.
  • If you omit the quality, the default is high. Setting auto reserves the cost of max, so name a quality when you care about the bill.
  • A big, high-quality render can run past the 30-second sync wait. Handle both 200 and 202.

These estimates exclude reference-image input tokens, which add a small amount on edits. The full parameter list is in the Sume Image API docs.

Before a large run

Prices and descriptors change when the catalog changes, so confirm them before you spend. Call GET /v1/images/models/{id}/endpoints for the row you plan to use and read its pricing line and supported_parameters; both come back in one response.

Then run a pilot of three to five images and read usage.cost on each response. Multiply by your planned count for a forecast you can trust. Completed generations are billed in full and failed or cancelled ones are not, so a pilot that errors costs nothing.

For big batches, use mode: "async" or mode: "webhook" with a public HTTPS webhook_url, so no request waits on the 30-second sync limit. Poll GET /v1/jobs/{id}/status and fetch GET /v1/jobs/{id}/result when the job completes.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume