Virtual try-on for a sofa in a room photo: image edit with Sume
ChatGPT Try On covers clothes and accessories. For a sofa or wall art in a room photo, use gpt-image-2.5 with input_references and an optional mask_url on Sume.

For furniture or wall art in a customer's room, ChatGPT's Try On is not the tool, because OpenAI describes it for clothing and accessories (read 2026-10-03, OpenAI help page). On Sume, use an image edit: send the room photo and the product photo as input_references to openai/gpt-image-2.5, ask for the item to be placed, and add an optional mask_url for the spot where it should go.
This is a preview, not a measurement. The model does not know your sofa is 2.1 metres wide or the wall is 3 metres long, so state the size in the prompt and tell shoppers plainly that the picture is a rendering.
Prompt for placement
Name the two images by role: image 1 is the room, image 2 is the product. Say where it goes (against the left wall, under the window), what must stay (floor, lighting, everything else in the room), and how big it is relative to something visible, such as the door or a rug. Relative scale beats a number in centimetres, because the model reasons from what it can see.
The Sume docs say mask_url is an optional public HTTPS mask for ChatGPT Image 2.5 edits. It must be reachable the same way as the images. The docs do not describe a mask convention in the guide text, so read the API reference and test on one image before you generate a hundred.
| Field | Value | Note |
|---|---|---|
model | openai/gpt-image-2.5 | Up to 16 references |
input_references | Room first, product second | Public HTTPS only |
mask_url | Optional | Public HTTPS; test the convention first |
aspect_ratio | auto | Keeps the room's framing |
quality | high by default | Lower for drafts |
The call
The same shape as a garment edit works; only the wording changes.
curl -X POST https://api.sume.com/v1/images \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-image-2.5",
"prompt": "Image 1 is a living room. Image 2 is a grey three-seat sofa. Place the sofa against the back wall, centred under the window, about as wide as the window plus a third. Keep the room, light and floor unchanged.",
"aspect_ratio": "auto",
"input_references": [
{"type": "image_url", "image_url": {"url": "https://cdn.example.com/rooms/17.jpg"}},
{"type": "image_url", "image_url": {"url": "https://cdn.example.com/sku/sofa-3s.jpg"}}
]
}'What can go wrong
Shadows and perspective are the usual tells. A sofa with a shadow that falls the wrong way, or legs that do not meet the floor plane, reads as fake at once. Look at the contact points before anything else. If the product photo has a background, say so and ask for it to be ignored, or send a cut-out; Sume's Image API supports background: transparent for generated stills, which is a separate step you can run on the product shot first.
If the room photo comes from a customer upload, it has to reach you as a public HTTPS URL before Sume can read it. A private upload that is not fetchable gives an image_not_fetchable error, covered in the error post. For the aspect handling, see aspect ratio auto versus omitted.
Last, do not use a render to promise fit. Say "preview" next to the picture and link to the real dimensions.
Testing on a handful of rooms
Before you offer this on a product page, try it on rooms that look like your customers' rooms: a dark room, a small room with a steep angle, a room with a patterned rug. Each stresses a different part of the edit. Dark rooms hide shadow errors, steep angles break perspective, and rugs tempt the model to redraw the floor.
Write down a pass rule you can apply quickly. For example: contact shadows present, scale plausible against a door or window, nothing else in the room changed. Anything that fails goes back for one retry with the failing point named in the prompt, and a second failure goes to a human. That keeps cost and review time bounded.
Remember that the Sume result URL is a Sume-hosted file you can store next to the customer's request. If you show it back to the customer, say it is a generated preview and show the product's real dimensions beside it.
Sources
Related posts
More in Use cases
- Gameplay Shorts after YouTube's originality update: what pages say
YouTube's reused-content pages don't name gameplay. What they say about your own footage plus commentary, and how to cut highlight Shorts where you talk.
- Storyboard panels as Gemini Omni Flash reference images, in order
Feed storyboard panels to Gemini Omni Flash 1.1 as reference images and ask it to follow the story in order. Tag syntax, 10-image limit, and what to verify.
- Edit an existing ad video with Gemini Omni Flash on Sume
Sume's Video Router takes a video_url for video edit on gemini-omni-flash-1.1. How to send an edit request and why sume/auto won't tell you the model.
- GivingTuesday 2026 is December 1: a 30-second appeal video plan
A small nonprofit can make a 30-second appeal from five photos with music and captions for about $0.43 in render, music and caption fees.
Written by Sume