Sume /v1/images 400 unsupported_parameter: check descriptors
Sume rejects an image parameter the model does not list. seed, output_compression, pixel size and stream also return 400 in v1. How to preflight it.

POST /v1/images returns 400 unsupported_parameter when a request sets something the chosen model does not list. Sume rejects it rather than silently dropping it. In v1 several fields are in the schema but no model advertises them, so seed, output_compression and explicit pixel size fail for every model.
Fields that fail in v1
The Image API doc marks these as accepted by the schema but not served, so they return an error today.
| Field | Result in v1 |
|---|---|
| seed | 400 unsupported_parameter |
| output_compression | 400 unsupported_parameter |
| size as explicit pixels | 400 unsupported_parameter |
| stream: true | 400 streaming_not_supported |
| non-empty provider.options | 400 unsupported_parameter |
| provider slug other than sume | 400 provider_not_available |
Preflight against the catalog
Each catalog row publishes typed descriptors: enum, range or boolean. Fetch the row and check your request before you send it. This script exits non-zero when a field is not supported, so it can run in CI.
const id = 'bytedance-seed/seedream-4.5';
const want = ['prompt', 'aspect_ratio', 'n'];
const res = await fetch('https://api.sume.com/v1/images/models', {
headers: { Authorization: `Bearer ${process.env.SUME_API_KEY}` },
});
const row = (await res.json()).data.find((m) => m.id === id);
if (!row) throw new Error('model not in catalog');
const miss = want.filter((k) => !(k in row.supported_parameters));
if (miss.length) {
console.error('unsupported:', miss);
process.exit(1);
}Streaming and progress
Every catalog row reports supports_streaming: false, and stream: true returns 400 streaming_not_supported. For progress, submit with mode: "async" and read GET /v1/jobs/:id/events, or use a webhook for the terminal event. mode: "subscribe" is an alias of sync and gives a single bounded wait.
Edits and references
Reference images go in input_references, and the count a model accepts is a range descriptor on that field. An edit with a mask uses mask_url, which must be a public HTTPS URL and applies to ChatGPT Image 2.5 edits. Check the field exists on the row before you send it.
Related posts
More in Developers
- Instagram 4:5 feed video from a 3:4 Sume render: the crop fractions
Sume models list 3:4 but not 4:5. Render 3:4, then crop 3.125% off the top and bottom with video-filter. Check the program free before the $0.02 encode.
- Timeline invalid_fit 400: fit must be cover, contain, stretch or blur
invalid_fit means video[].fit is not cover, contain, stretch or blur. Cover is the default, so omit the field if you want it. details.allowed lists values.
- Timeline invalid_fps 400: output.fps must be 24, 25, 30 or 60
invalid_fps rejects any output.fps outside 24, 25, 30 and 60. Omit the field to match the source frame rate; details.allowed lists the accepted values.
- Timeline invalid_transition_type: why xfade is rejected (use fade)
transition.type accepts fade, wipeleft, wiperight, slideup, slidedown and dissolve. xfade is the internal ffmpeg name, so it returns invalid_transition_type.
Written by Sume