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.

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.
| Size | Pixels | Ratio | Result |
|---|---|---|---|
| 3840x2160 | 8,294,400 | 1.78 | passes |
| 2048x2048 | 4,194,304 | 1.00 | passes |
| 3840x1280 | 4,915,200 | 3.00 | passes |
| 3840x1200 | 4,608,000 | 3.20 | fails: over 3:1 |
| 1024x512 | 524,288 | 2.00 | fails: under 655,360 pixels |
| 4096x2304 | 9,437,184 | 1.78 | fails: 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; athighand 1024x768 it is about $0.045. - If you omit the quality, the default is
high. Settingautoreserves the cost ofmax, 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
- One config file for gpt-image ids before December 1
OpenAI retires gpt-image-1-mini, gpt-image-1.5 and chatgpt-image-latest on 2026-12-01. Keep image ids in one map, and test Flare and Sunburst on Sume now.
- Graceful shutdown for a Node webhook receiver: 503 while draining
On SIGTERM, refuse new Sume webhooks with 503, finish the in-flight write, then exit. Sume retries non-2xx responses 10 times, so deploys lose nothing.
- Grok Imagine video API: 15 s, 5 references, request-ID polling
xAI's video guide for grok-imagine-video-1.5 lists up to 15 seconds, up to 5 reference images and async polling by request ID. The same loop on Sume jobs.
- Hangfire AutomaticRetry for Sume: stable key, no double bill
Hangfire retries failed jobs 10 times by default. Cap attempts on a Sume submit job and send one stable Idempotency-Key so a retry never makes a second job.
Written by Sume