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
- Which Sume API should a workflow agent step call?
A workflow agent step needs a fixed recipe, a clock, or an open task. Pick Format run, Scheduled action or Agent Completion by what you know up front.
- Which Timeline warnings does the free plan call show before rendering?
Timeline plan reports gaps, tail holds, frame snaps and ignored motion, but not short sources, downgraded fades, fps resampling or soundtrack length.
- 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.
Written by Sume