Tote bag mockup with an AI image API: your logo on a canvas bag
Send your logo as a reference to GPT Image 2.5 on Sume and ask for a canvas tote on a plain studio set. Check the logo against the original before you list it.

To make a tote bag mockup with an AI image API, host your logo at a public https URL, send it in input_references to GPT Image 2.5 on Sume, and ask for a plain canvas tote with that logo centered on the front. Then compare the logo in the result with your original; a model may redraw it, so treat the output as a concept image, not proof art.
fal lists GPT Image 2.5 as OpenAI's default image model, with natural lighting and rich textures (read 2026-10-06, fal). On Sume it takes up to 16 references, as documented in the Image API docs. Reference URLs must be public https links; private addresses are rejected.
What to put in the prompt
Describe the bag, the surface and the camera, and refer to the logo as the attached image. Keep the scene simple: one bag, one background, soft light. A cluttered lifestyle scene gives the model more chances to distort the logo.
| Part | Example | Reason |
|---|---|---|
| Object | natural canvas tote bag | Sets the product |
| Logo | the attached logo, centered on the front | Ties the reference to a place |
| Scene | plain light grey studio background | Keeps attention on the bag |
| Light | soft daylight from the left | Gives believable shading |
| Ratio | 4:5 | Fits a product card |
The request
The script sends the logo and prints the image URL. Change the colour words for each colourway.
import os
import requests
body = {
"model": "openai/gpt-image-2.5",
"prompt": (
"Product photo of a natural canvas tote bag standing upright on a "
"plain light grey studio background. Place the attached logo "
"centered on the front, unchanged. Soft daylight from the left."
),
"input_references": [
{"type": "image_url", "image_url": {"url": os.environ["LOGO_URL"]}}
],
"aspect_ratio": "4:5",
"quality": "medium",
}
r = requests.post(
"https://api.sume.com/v1/images",
headers={"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"},
json=body,
timeout=60,
)
print(r.status_code)
print(r.json()["data"][0]["url"] if r.status_code == 200 else r.text[:300])Mockup checklist
Review the mockup against this list before it goes on a product page. A mockup is a promise about a physical item, so it should not show anything the bag cannot deliver.
- The logo is your real logo, not a redrawn approximation.
- Its colors match your print file within reason.
- The print area on the bag is plausible for the printer you use.
- The bag, straps and stitching look like the product you actually sell.
- The background does not imply a brand or a person that you do not have rights to.
Cost and iteration
Plan for a few tries per bag color. At GPT Image 2.5 medium, check the endpoint pricing line for the size you pick, and run the first pass at low quality to settle the wording. Keep the prompt that worked beside the logo file, so the next colorway is one command, not a new search for wording.
Several colorways without drift
A common need is the same bag in four colors. Keep the prompt identical except for the color word, keep the logo reference the same, and keep the ratio fixed. That gives you a matching set where only the fabric changes. Generate each color at low quality first to check the wording, then run the final at medium, and open each result next to the original logo before it goes on a page.
Do not expect every run to place the logo at the same height. If the position matters, say where it sits, such as a hand's width below the strap line, or composite the logo yourself so every color has it in exactly the same place.
Where a mockup fits
A generated mockup is good for early listings, social posts and checking whether people like a design before you pay for a print run. It is not a substitute for a sample from your printer, which shows how ink sits on real fabric. Say plainly in your listing which images are illustrations if they differ from the item that ships.
If the logo is altered, you have two options. Ask again with a stronger line such as keep the logo exactly as in the reference, or generate the bag with an empty front and paste the real logo with Pillow. The second route is the one to use when the logo has to be exact, as for a printer's proof. The same split between model art and code appears in AI product photos from a white background.
Sources
Related posts
More in Use cases
- Two-camera podcast clip for Shorts: alternate angles with source_in
Cut between two camera files against one audio spine in Timeline 1.0: equal on-spine starts and source_in keep both angles in sync. Python builder included.
- Two voices, one conversation: Sume TTS jobs joined by concat
Make a two-person dialogue file with Sume: one TTS job per line using two avatar voices, then one Timeline audio concat. Cost, code and the gap.
- UGC-style ad: test five hooks on one body with Timeline plans
Join five 3-second hooks to one 12-second body clip with Timeline 1.0. Plan each cut unbilled, then render the winners at $0.10 a minute.
- UGC-style ad: a music bed that ducks under the voice
Add a looped music bed to a UGC-style ad and lower it under the voice with soundtrack.duck_db in a Timeline 1.0 render. Needs a real voice spine.
Written by Sume