quality on Flux or Seedream returns 400 on Sume: which rows take it

Only GPT Image 2.5, GPT Image 2 and Ideogram 4.5 list quality on POST /v1/images. Send it to Flux, Seedream or Qwen and you get 400 unsupported_parameter.

5 min readSume
All posts

On POST /v1/images, quality is accepted by only some rows. In the Sume catalog the rows that list a quality parameter are ChatGPT Image 2.5 (and its Sunburst variant), ChatGPT Image 2 and Ideogram 4.5. Send quality to Flux 2 Pro, Flux 2 Flex, Seedream, Qwen, Recraft V4, Nano Banana or Imagen and the request fails with 400 unsupported_parameter. Nothing is billed for a rejected request.

Which rows list it

The Image API docs say a parameter a model does not list is rejected, and that the model's supported_parameters descriptor is the source of truth. The catalog code only fills a quality enum for the rows below.

Rows that list quality on POST /v1/images, as of 2026-10-08
Rowquality valuesDefault
ChatGPT Image 2.5 and Sunburstauto, low, medium, high, xhigh, maxhigh
ChatGPT Image 2low, medium, highnot documented
Ideogram 4.5low, medium, highmedium
Flux 2 Pro, Flux 2 Flex, Qwen Image, Qwen Image Max, Recraft V4, Seedream 4, 4.5, 5 Litenot listed400 if sent

The fix is in the request, not the model

If you want a cheaper or better tier on a row without quality, pick a different row. Flux 2 Pro costs $0.0375 and Flux 2 Flex costs $0.0625 per image at one fixed tier each. Seedream 5 Lite is $0.04375. These are flat prices with no tier to choose.

Resolution works the same way. It is listed only on Nano Banana, Imagen 4 Ultra, Soul and Ideogram 4.5. On other rows you choose a size with image_size or aspect_ratio instead.

Build the body from the descriptor

Rather than keep a table in your own code, read supported_parameters and drop what is not there. This function filters a body to the keys a model lists.

import os, requests

H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
r = requests.get("https://api.sume.com/v1/images/models", headers=H, timeout=30)
r.raise_for_status()
CATALOG = {m["id"]: m["supported_parameters"] for m in r.json()["data"]}

def fit(model: str, body: dict) -> dict:
    keep = set(CATALOG[model]) | {"model"}
    return {k: v for k, v in body.items() if k in keep}

body = {"model": "black-forest-labs/flux.2-pro", "prompt": "a mug", "quality": "high"}
print(fit(body["model"], body))

Silent dropping has a cost too

The filter hides the difference. If your app shows a quality control, hide it for rows without the parameter instead of dropping the value silently, or users will think they chose high and got the only tier on offer.

What a 400 looks like in practice

The error code is unsupported_parameter and the message names the field. Because the check runs before generation, the call is not queued and not billed, so a wrong body costs you a round trip and nothing else.

A common cause is a UI that shares one settings panel across models. Switch the model and the panel keeps the old quality value. Clear or hide any field that the new row does not list, and test the switch from GPT Image 2.5 to Flux 2 Pro with quality set, since that is the case that breaks.

  • Rows without quality can still differ in price: $0.025 to $0.09375 across the flat rows.
  • Rows with quality price by tier (Ideogram 4.5) or by tokens (GPT Image 2.5).
  • Quality is also a field on Image 1.0, where low is the default.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume