AI kitchen cabinet color preview from a photo of your kitchen

See cabinets in navy, sage or oak before you paint: one kitchen photo, a mask over the cabinet fronts, and one Sume image edit call per color option.

4 min readSume
All posts

One photo, one call per color

Choosing a cabinet color from a paint chip is guesswork. A better preview is your own kitchen with only the cabinet fronts recolored. That is a masked image edit: the photo goes in as the reference, a mask marks the cabinets, and the prompt names the color.

Run one call per option and keep every other part of the request identical, so the three results differ in the one way you care about.

Sume Image API docs list ChatGPT Image 2.5 as openai/gpt-image-2.5 (Flare) and openai/gpt-image-2.5-sunburst. OpenAI's guide says to choose Sunburst where editing precision matters most and Flare for fast everyday generation, so these edits use Sunburst.

Describe the finish, not just the hue

Say matte or satin, say whether the hardware stays, and say that countertops, backsplash, floor and appliances must not change. A color name alone leaves the model free to repaint the walls to match. Mark the cabinet fronts with mask_url, a public HTTPS image URL; Sume accepts it on ChatGPT Image 2.5 only.

import os
import requests

REFS = [
    "https://example.com/kitchen.jpg",
]
resp = requests.post(
    "https://api.sume.com/v1/images",
    headers={"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"},
    json={
        "model": "openai/gpt-image-2.5-sunburst",
        "prompt": "Repaint only the cabinet fronts deep navy with a satin "
                  "finish. Keep hardware, countertops, backsplash, floor and "
                  "appliances unchanged.",
        "aspect_ratio": "auto",
        "mask_url": "https://example.com/cabinet-mask.png",
        "input_references": [
            {"type": "image_url", "image_url": {"url": u}} for u in REFS
        ],
    },
    timeout=60,
)
print(resp.status_code)
print(resp.json())

What the mask has to satisfy

OpenAI's image generation guide lists the mask rules: an alpha channel, the same format and size as the photo, and under 50 MB. It also says masking is prompt-based and the model may not follow the mask shape with complete precision, so expect soft edges.

Cabinet preview, one call per option (Sume docs, read 2026-10-03)
ItemDetail
Calls for three colors3, one per color
Failed callNot billed
Amount chargedusage.cost on each response
Price basisProvider list price x 1.25

Use it as a preview, not a quote

Light, wood grain and the reflections in the room will differ from a real painted door. Treat the render as a way to rule out two colors, then test a sample door in the room before you buy paint for every cabinet.

What happens when a call runs long

Most image calls finish inside the 30-second wait that POST /v1/images holds open. When one does not, Sume answers 202 with a job envelope, and you poll GET /v1/jobs/{id}/status and read GET /v1/jobs/{id}/result. That result uses the standard job shape, not the image body, so check the status code first.

You only pay for a finished image. Failed and cancelled generations are not billed, and a request that ends early because the client disconnected is treated as a failed generation. The charged amount, provider list price times 1.25, comes back in usage.cost.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume