AI tote bag mockup: design file plus blank bag as 2 references

Make a tote bag mockup with the Sume image API: send a blank-bag photo and your design as two references, keep the text yours, and compare the price per mockup.

5 min readSume
All posts

Send two input_references to an edit-capable model: a photo of a blank tote and your artwork. Then ask for the artwork printed on the bag at a set position. On Sume that costs $0.025 per mockup on Qwen Image, $0.0375 on Flux 2 Pro and $0.05 on Seedream 4.5, all edit-capable (catalog read 2026-10-03). Check the printed art against your file, since the model repaints it.

The two-reference pattern

The docs describe input_references as an array of public HTTPS image URLs. Put the blank bag first and the artwork second, and say so in the prompt: the first image is the blank tote, the second is the print. The Image API docs note that a model whose references limit is zero rejects references, so use a row that lists them.

  • Blank bag: a clean front-on photo with even light, any color you plan to sell.
  • Artwork: a flat PNG on a plain ground, large enough to read.
  • Prompt: say where the print sits, how big it is, and the scene around the bag.
  • Ratio: 4:5 for feeds, 1:1 for shop pages.

Text on the bag

If the print has words, expect drift. OpenAI's image guide (read 2026-10-03) says its models can still struggle with precise text placement and clarity. The practical route is to keep the words in the artwork file you supply, check every letter on the result, and rerun when it is off. For a wordmark that must be exact, composite your own file on top of the render with Pillow instead of trusting the model.

Prices for a mockup

Prices are the per-image endpoint prices on the Sume catalog (read 2026-10-03). A mockup is one image, so cost per mockup equals the price.

Cost to mock up a tote on Sume (read 2026-10-03)
ModelPer mockupTen colorwaysEdits with image_urls
Qwen Image$0.025$0.25yes
Flux 2 Pro$0.0375$0.375yes
Seedream 4.5$0.05$0.50yes
Nano Banana 2$0.10$0.10 x 10 = $1.00yes

Script for ten colorways

This loops over blank-bag photos, one per color (two are listed; add the rest), sends the same artwork each time and saves the results by name. It stops on a non-200 so you see the status.

import os, requests

H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
ART = "https://example.com/art.png"
BAGS = {"natural": "https://example.com/bag-natural.png",
        "black": "https://example.com/bag-black.png"}
for name, bag in BAGS.items():
    r = requests.post("https://api.sume.com/v1/images", headers=H, timeout=120, json={
        "model": "qwen/qwen-image", "aspect_ratio": "4:5",
        "prompt": "Image 1 is a blank tote, image 2 is the print. Put the print "
                  "centered on the bag front, same size, on a plain studio floor.",
        "input_references": [{"type": "image_url", "image_url": {"url": u}} for u in (bag, ART)]})
    if r.status_code != 200:
        raise SystemExit(f"{name}: {r.status_code} {r.text[:200]}")
    img = requests.get(r.json()["data"][0]["url"], timeout=60).content
    open(f"tote-{name}.png", "wb").write(img)
    print(name, r.json().get("usage"))

What Sume does not do

Sume does not hold your print files or send anything to a print partner. Keep production files at the sizes your print partner asks for; a mockup is for the product page, not for the press.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume