AI shop window decal preview: show vinyl lettering on your glass

See opening hours, a logo and promo vinyl on your shop window before you order: one storefront photo, a mask over the glass, and a Sume edit with quoted text.

4 min readSume
All posts

Vinyl on glass is a text edit

A window decal is mostly words: a name, hours and a short offer. Photograph the front, mask the glass and ask for vinyl lettering with quoted text. The edit shows spacing and contrast before you pay for cutting.

mask_url on ChatGPT Image 2.5 keeps the edit on the glass. OpenAI's guide says the model can still struggle with precise text placement and clarity.

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.

Quote every line and keep it short

Put each line of the decal in quotation marks and say the line order. Keep it to a name and two short lines. State the vinyl color, white or gold, and that reflections in the glass should stay.

import os
import requests

REFS = [
    "https://example.com/storefront.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": "On the front window glass, add white vinyl lettering with "
                  "three lines: \"HOLLOWAY BAKERY\", \"OPEN 7 - 3\", \"FRESH BREAD "
                  "DAILY\". Keep reflections, door, frame and sign unchanged.",
        "aspect_ratio": "auto",
        "mask_url": "https://example.com/window-mask.png",
        "input_references": [
            {"type": "image_url", "image_url": {"url": u}} for u in REFS
        ],
    },
    timeout=60,
)
print(resp.status_code)
print(resp.json())

Proofread against the order

Spelling and hours are the costly errors.

Decal proof checks (OpenAI guide and Sume docs, read 2026-10-03)
CheckWhy
Each line against the orderModel text can contain mistakes
HoursWrong hours are an expensive reprint
ContrastWhite on dark glass, gold on light
Maskalpha channel, same size and format as the photo

Send the sign maker a vector file

The render shows spacing and tone, not cut paths. Send your sign maker the approved text as a vector file or plain text, not the raster output.

Inputs Sume checks before it spends anything

Reference and mask URLs must be public HTTPS; localhost, private-network and non-HTTPS URLs are rejected. Sume also checks every field against the model's catalog entry, so a field the model does not list returns 400 unsupported_parameter instead of being dropped without a word.

If you are unsure which fields a model accepts, GET /v1/images/models lists them, and GET /v1/images/models/{id}/endpoints returns the per-endpoint capabilities and pricing.

Timing and what a call costs

POST /v1/images on Sume waits up to 30 seconds and returns 200 with the image. If the generation is still running at that point you get 202 and a job envelope with a status URL and a result URL instead. The docs name 4K, high quality and large n as the settings most likely to degrade to 202, so branch on the status code, not on the body shape.

Billing is all-or-nothing. A completed generation is billed in full, a failed or cancelled one is not, and usage.cost in the response is the USD amount charged: the provider list price times 1.25.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume