mask_url on ChatGPT Image 2: not listed, only the 2.5 rows take it
Sume lists mask_url only on ChatGPT Image 2.5 Flare and Sunburst. Sending it to ChatGPT Image 2 is rejected. What to do for a masked edit on the older row.

On Sume, mask_url is listed only on the two ChatGPT Image 2.5 rows, openai/gpt-image-2.5 (Flare) and openai/gpt-image-2.5-sunburst. ChatGPT Image 2 (openai/gpt-image-2) takes reference photos but does not list mask_url, so a request that sends one is rejected with 400 unsupported_parameter instead of the mask being ignored.
Why the request fails
The Image API docs say that if a request sets a parameter the selected model does not list, Sume rejects it and does not drop it silently. The mask_url row in the parameter table is described as an optional public HTTPS mask URL for ChatGPT Image 2.5 edits. The background field has the same scope.
| Parameter | ChatGPT Image 2 | ChatGPT Image 2.5 (Flare, Sunburst) |
|---|---|---|
| mask_url | Not listed | Listed |
| background | Not listed | auto, transparent, opaque |
| Reference photos | Up to 10 | Up to 16 |
| quality values | low, medium, high | auto, low, medium, high, xhigh, max |
What OpenAI asks for in a mask
OpenAI says the image and mask must be the same format and size, under 50MB, and that the mask needs an alpha channel. It also says masking is prompt-based: the model uses the mask as guidance and may not follow its exact shape. Those notes are from the OpenAI image guide and apply to the mask you build for the 2.5 rows too.
Options if you are on ChatGPT Image 2
You have two honest paths. Move the edit to a 2.5 row, or describe the region in the prompt and send the photo as a reference.
- Switch the model id to openai/gpt-image-2.5 and keep the mask_url.
- Stay on gpt-image-2 and write the change in words, such as "only change the left cushion".
- Read supported_parameters from GET /v1/images/models before you add a field to a request.
- Check the result outside the intended region either way; a mask is guidance, not a hard boundary.
Sources
Related posts
More in Developers
- MCP outputSchema vs Sume output_schema: who sets the contract
In MCP the server declares a tool's outputSchema. In a Sume Agent Completion you send output_schema per run, and the result can still come back degraded.
- MCP tool-name rules (2025-11-25): do Sume's tool ids comply?
The MCP 2025-11-25 spec says tool names should be 1-128 characters from A-Z, a-z, 0-9, underscore, hyphen and dot. Sume's longest documented id is 36.
- Measure softening and colour creep across AI edit passes in Pillow
Test the no-drift claim on your own photos: edge sharpness and a white-patch colour reading for each pass of an edit chain, in short Python with Pillow.
- Migrate a real-time avatar prototype to Sume async jobs: what changes
Moving from a live avatar session to Sume means replacing a stream with submit, poll and fetch. The code changes, the UX changes, and a Node example that runs.
Written by Sume