AI billboard mockup: put your ad on a street photo with two references

Put an existing ad on a billboard in a street photo: two references (photo first, ad second), one Sume image edit call, and a prompt that locks the scene.

4 min readSume
All posts

Two references: the scene and the ad

A pitch deck often needs the campaign on a real billboard, bus shelter or wall. You already have two files: a photo of the location and the finished ad. A reference edit combines them.

On Sume, send both in input_references. The order is the part to control: put the street photo first and the ad second, and say so in the prompt.

The e Image API docs](https://docs.sume.com/models/images) 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. ChatGPT Image 2.5 accepts up to 16 references, so two is well inside the limit.

Say which image is which

Write the prompt like an instruction to a retoucher: image 1 is the street photo, image 2 is the ad artwork; place the artwork on the billboard face in image 1, matching perspective and lighting; leave everything else unchanged. OpenAI's guide notes that when several input images are sent with a mask, the mask applies to the first image, which is another reason the scene photo goes first.

import os
import requests

REFS = [
    "https://example.com/street.jpg",
    "https://example.com/ad.png",
]
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": "Image 1 is a street photo, image 2 is an ad. Place image 2 "
                  "on the billboard face in image 1, matching perspective and "
                  "daylight. Do not change anything else.",
        "aspect_ratio": "auto",
        "input_references": [
            {"type": "image_url", "image_url": {"url": u}} for u in REFS
        ],
    },
    timeout=60,
)
print(resp.status_code)
print(resp.json())

Protect the ad's own text

A model that redraws the billboard face may also redraw the headline on your ad. If the copy is approved wording, check it letter by letter at full size, or composite the original artwork over the billboard region yourself. Reference URLs must be public HTTPS; localhost, private-network and non-HTTPS URLs are rejected.

Billboard edit checklist (Sume docs and OpenAI guide, read 2026-10-03)
CheckWhy
Street photo is reference 1A mask, if used, applies to the first image
Ad is reference 2Named as image 2 in the prompt
aspect_ratio autoResult keeps the shape of the photo
Public HTTPS URLsPrivate and localhost URLs are rejected

Check perspective before you pitch

Look at the billboard corners first. If the ad is skewed or the frame has been redrawn, rerun with a sentence naming the frame: keep the billboard frame, posts and lights exactly as they are. Then confirm the photo's sky and shadows were not touched.

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