Moving off Image 1.0: quality default flips from low to high
Image 1.0 defaults to quality low. On POST /v1/images with gpt-image-2.5 the default is high: 1 cent becomes 7. Field map and the one line to add to keep costs.

If you migrate from /v1/image-1.0/generate to POST /v1/images and pin ChatGPT Image 2.5, add quality: "low" yourself. Image 1.0 defaults to low; on the new route the docs say that omitting quality for ChatGPT Image 2.5 means high. At 1024-class sizes that is 1 cent versus 7 cents per image, so an unchanged request body can cost seven times as much.
Why the default matters
The docs describe Image 1.0 as a compatibility alias for Image Router Auto that is retiring soon. Its public URLs stay as aliases and return job.model: "sume/auto". For new integrations the docs say to use POST /v1/images with model: "sume/auto" or a catalog id.
The two routes have different defaults, and they look the same in a diff because the field is simply absent from your request. A request body that has worked for months can change price only because the route changed.
| Image 1.0 field | Image API field | Default note |
|---|---|---|
| image_urls (1-10) | input_references | Objects with type image_url |
| num_images (1-4) | n | Per-model ceilings apply |
| mask_image_url | mask_url | ChatGPT Image 2.5 edits |
| quality (default low) | quality | Default high for ChatGPT Image 2.5 |
| format | output_format | png, jpeg, webp |
What the arithmetic looks like
Take ChatGPT Image 2.5 as the example, since Auto routing uses Flare for it. A nightly job of 1,000 images at the low default costs 1,000 x 1 cent = $10. The same body sent to /v1/images on gpt-image-2.5 without quality costs 1,000 x 7 cents = $70. Sending quality: "low" brings it back to $10; sending medium costs $20.
If you intended the higher quality, then 7 cents is a fair price for a final. The point is to choose, not to inherit a default by accident.
Migration checklist
Work through these in order and compare cost before and after.
- Set
qualityexplicitly in every request body. - Replace
image_urlswithinput_referencesobjects:{"type": "image_url", "image_url": {"url": "..."}}. - Replace
num_imageswithn. - Replace
mask_image_urlwithmask_url. - Pin a catalog id if you need the same model next week; Auto does not disclose the family.
- Log
usage.costfor a week and compare it with the old bill.
What stays
Image 1.0 still accepts transparency for stills with transparency: true; the new route handles transparent backgrounds with background: "transparent" on ChatGPT Image 2.5. The legacy Image Router routes keep working but get no new parameters, so the longer you wait the more you lose.
A test before the switch
Run your ten most typical Image 1.0 requests through the new route with quality: "low" and with no quality, and compare usage.cost on both. The first should match the old spend. The second shows the cost of inheriting the default. Keeping both results next to each other in a pull request makes the reason for the explicit field obvious to the next reader.
Dates and routes
The docs call Image 1.0 a compatibility alias that will retire soon, and the legacy POST /v1/image-router/generate and GET /v1/image-router/models routes still work but are deprecated and will not get new parameters. There is no date in the docs, so plan the migration now instead of waiting for a notice. Move the one request template, test it, and then move the rest.
Sources
Related posts
More in Developers
- Music 1.0 or Music Router: which route for new Sume code?
Use POST /v1/music-router/generate for new code. Music 1.0 still works but resolves through the router; every router model bills the same fixed $0.125.
- Music 1.0 to Music Router: what changes in your integration
Sume is retiring Music 1.0 gradually; every request already resolves through the Music Router. New code should call /v1/music-router/generate. What changes.
- Music API 400s: duration and negative_prompt, and the fix
Sume's Music Router returns 400 if you send duration, duration_seconds or a non-empty negative_prompt. The fix for each, and a request that passes validation.
- Music prompt limits: 1-5000 characters and no duration field
Sume's Music Router takes a 1 to 5000 character prompt and rejects duration. How to set length and sections in the prompt text, with a request.
Written by Sume