720x1280 vertical 9:16 on GPT Image 2.5: same price as 1280x720

A 720x1280 portrait image costs the same as 1280x720 on GPT Image 2.5, because the estimator uses the pixel count and the ratio. Table by quality inside.

4 min readSume
All posts

A 720x1280 vertical image costs exactly the same as a 1280x720 landscape one on GPT Image 2.5: about $0.0092 at medium and $0.0355 at high on Sume. The estimator uses the pixel count and the short-to-long ratio, so flipping the orientation changes nothing.

720x1280 is legal: 720 is 45 times 16 and 1280 is 80 times 16, with 921,600 pixels.

Landscape and portrait, side by side

Sume bills the provider list price times 1.25, as this worked-examples post shows.

Provider list, output tokens only (read 2026-10-06)
Quality1280x720720x1280720x1280 on Sume
low$0.0032$0.0032$0.0040
medium$0.0074$0.0074$0.0092
high$0.0284$0.0284$0.0355
xhigh$0.0505$0.0505$0.0631
max$0.1136$0.1136$0.1420

Use it for short vertical video covers

A 9:16 still is the first frame or the cover of a vertical clip. If you need full 1080-wide output, note that 1080 is not a multiple of 16; the 1088x1920 post covers that case.

Pick 720x1280 when the image is a draft or a small cover. Pick 1088x1920 when it will be the final frame for a full-height clip.

Check it on your own account

Do not budget from a blog table alone. GET /v1/images/models lists every model with its descriptors, and GET /v1/images/models/{id}/endpoints shows the pricing line for one model. Then run one small request and read usage.cost on the response, which is the billed amount in USD; the token counts in usage are reported as 0 on this route.

Run the test at the quality and size you plan to ship, because both move the price. A single test at low quality costs under a cent for most sizes here, so it is a cheap way to confirm your assumptions before a batch.

Sync, async and failures

The /v1/images route waits up to 30 seconds for the image. If the job finishes in that window you get the result directly; otherwise you get a 202 and an async job to poll. Write your client to branch on the status code, since larger sizes and higher quality are the likely cases for a 202.

Requests are strict. A parameter the chosen model does not list returns 400 unsupported_parameter, stream returns a 400, and provider.only or provider.order accept only sume. Treat a 400 as a bug in the request, not a transient error, and do not retry it unchanged.

Caveat

The 'Sume' columns are list times 1.25 before any rounding on the job ledger and before input tokens, so read usage.cost on the response for the amount actually billed.

Sources

Related posts

More in Pricing

All Pricing posts

Written by Sume