size vs image_size vs aspect_ratio: which field wins on Sume images
On POST /v1/images, image_size beats aspect_ratio, size is a tier word that rejects WxH, and resolution is a tier. Which one to send per model.

POST /v1/images has four fields that all sound like they set the output shape: size, image_size, aspect_ratio and resolution. They do different jobs, and sending two of them is where surprises come from.
Sume's rules, from the contract and the public Image API docs (read 2026-10-07): image_size has priority over aspect_ratio. size is tier shorthand only and rejects WxH. resolution is a normalized tier (512, 1K, 2K, 4K; 0.5K is an alias for 512; Soul uses 720p and 1080p). aspect_ratio is a per-model native list, not a shared subset.
The four fields
| Field | Takes | Wins over | Per model |
|---|---|---|---|
| image_size | Named preset, auto, or {width,height} | aspect_ratio | Custom pixels on GPT Image, Seedream, Flux, Qwen, Recraft |
| aspect_ratio | Colon ratio, or auto | nothing | Each model lists its own |
| resolution | 512, 1K, 2K, 4K (Soul: 720p, 1080p) | nothing | Only models with a resolutions descriptor |
| size | Tier word only | nothing | WxH returns 400 unsupported_parameter |
What to send, by model family
For GPT Image 2.5, Seedream, Flux, Qwen and Recraft, send image_size when you need exact pixels and aspect_ratio when a ratio is enough. On GPT, custom pixels need both edges to be a multiple of 16, a maximum edge of 3840, an aspect of at most 3:1, and 655,360 to 8,294,400 pixels.
For the Nano Banana models, there is no free pixel size. Ask for 1080x1350 and Sume sends aspect_ratio: "4:5" plus a job target_pixels note, because the exact 1080x1350 is a documented post-step, not a native size. For Imagen, Grok, Ideogram and Soul, aspect_ratio is the only sizing field; pixel size is snapped to the nearest native ratio.
The catalog is the allowlist. If a model does not list a parameter in supported_parameters, the request fails with 400 unsupported_parameter instead of dropping it. That means sending resolution to a model with no resolution tiers is an error, not a no-op.
Reading the catalog before you send
This prints which sizing fields a model advertises.
import os, requests
H = {"Authorization": "Bearer " + os.environ["SUME_API_KEY"]}
r = requests.get("https://api.sume.com/v1/images/models", headers=H, timeout=30)
for m in r.json()["data"]:
sp = m["supported_parameters"]
print(m["id"], [k for k in ("aspect_ratio", "resolution", "image_size") if k in sp])Source: Sume Image API docs (read 2026-10-07).
Sources
Related posts
More in Developers
- Sora to Sume in Python: a 10% rollout flag with a spend guard
Move video traffic off a dead Sora call one slice at a time. A stable per-user percentage flag, one Sume call, and a cost guard that stops at your daily cap.
- Speaking rate in words per minute from Sume STT word times (Python)
Compute words per minute for a recording from the words[] start and end times Sume STT returns, plus a per-minute pacing table. Offline Python, no API call.
- Speech to text API in Go: transcribe audio with net/http
Transcribe audio in Go using only the standard library: submit to Sume STT, poll the job and print the text. A 30-line program at one cent per audio minute.
- Speech to text API in Node.js: transcribe audio with fetch
Transcribe audio in Node.js with built-in fetch: submit to Sume STT, poll the job and print sentence segments with timestamps. 30 lines, no dependencies.
Written by Sume