Which Sume image models accept the quality parameter?
Only five Sume image rows list quality: ChatGPT Image 2, both ChatGPT Image 2.5 ids, Ideogram V3 and Ideogram 4.5. Every other row returns 400 if you send it.

Five rows of the Sume image catalog list a quality parameter, read 2026-10-03: ChatGPT Image 2, ChatGPT Image 2.5 (both the Flare and Sunburst ids), Ideogram V3 and Ideogram 4.5. The other rows list none, so a request that sets quality on them is rejected with 400 unsupported_parameter. The ChatGPT Image 2.5 rows add xhigh and max to the usual three words.
The Sume code comments record that this tripped up Sume's own presets once: Nano Banana 2 and Pro advertise no quality, and a default quality preset turned every request to those families into a 400. The rule to take from it is to read the descriptor before you send the field.
The five rows
The Image API page lists the public vocabulary as auto, low, medium, high, xhigh or max, catalog-gated per model.
| Model | Catalog id | Allowed values |
|---|---|---|
| ChatGPT Image 2 | openai/gpt-image-2 | low, medium, high |
| ChatGPT Image 2.5 | openai/gpt-image-2.5 | auto, low, medium, high, xhigh, max |
| ChatGPT Image 2.5 Sunburst | openai/gpt-image-2.5-sunburst | auto, low, medium, high, xhigh, max |
| Ideogram V3 | ideogram/ideogram-v3 | low, medium, high |
| Ideogram 4.5 | ideogram/ideogram-v4.5 | low, medium, high |
What quality changes
- ChatGPT Image 2.5: quality changes the output-token estimate and so the price per image. Omitted quality defaults to
highon Sume, andautoreservesmax. - Ideogram 4.5: quality sets the per-image price, at $0.03, $0.06 or $0.22 at the provider list for low, medium and high, before Sume's margin. Omitted defaults to
medium. - Ideogram V3: the catalog says quality maps to the provider's rendering speed; the catalog price is one flat number.
Guarding the field in code
Send quality only when the descriptor lists it and lists your word. Otherwise omit the field and let the model's default apply.
import os
import requests
headers = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
models = requests.get("https://api.sume.com/v1/images/models", headers=headers, timeout=30).json()["data"]
want = "low"
for m in models:
q = m["supported_parameters"].get("quality")
print(m["id"], "send" if q and want in q["values"] else "omit")Sources
Related posts
More in Developers
- Windmill run_wait_result vs a Sume async submit: pick one per job
Windmill advises async mode and offers run_wait_result for short jobs. Sume mirrors that split: async submit plus polling for long work, sync only for short.
- Windmill sync returns 200 on error: check Sume's failed flag too
Windmill's sync webhook returns HTTP 200 with the error as JSON by default. Do not trust the status code alone for Sume jobs: read terminal, failed and sync.
- Crash-safe Sume submit: write the intent row and key first
If your process dies after a Sume submit but before storing the job id, a pre-written intent row and Idempotency-Key let the retry return the original job.
- YouTube Analytics creatorContentType: split Shorts from long-form
The creatorContentType dimension separates SHORTS from VIDEO_ON_DEMAND in YouTube Analytics API reports. How to use it on clips you generated with Sume.
Written by Sume