Stripe product images: build a set of 8 with the Sume image API

Stripe's product object holds up to 8 image URLs. Plan a set of eight shots with Sume, price it by model, and host copies you control before you set the field.

5 min readSume
All posts

Stripe's Product object has an images field that holds a list of up to 8 URLs, meant to be displayed to the customer. Eight AI shots from Sume cost between $0.20 on Qwen Image and $0.80 on Nano Banana 2 at the listed per-image prices, and eight GPT Image 2.5 high renders at 4:5 come to about $0.45 by the repo estimate. Plan the set before you spend it, and put the files on a host you control before you write the URLs into Stripe.

What Stripe documents

Stripe's reference page for the Product object (read 2026-10-03) describes images as an array of strings: a list of up to 8 URLs of images for the product, meant to be displayable to the customer. This post uses only that fact about the field.

A shot list that fills eight slots

Treat the eight slots like a small shoot, not eight versions of the same shot. Edit your own packshot by passing it as an input reference, so the product stays the same across the set. The Image API docs list input_references as an array of public HTTPS image URLs, and the number accepted depends on the model, so check the model's record.

  • 1. Main shot on white, 1:1
  • 2. Three-quarter angle on white, 1:1
  • 3. Detail close-up of texture or label, 1:1
  • 4. Product in a lifestyle scene, 4:5
  • 5. Product with a hand for scale, 4:5
  • 6. Flat lay with the parts or accessories, 1:1
  • 7. Packaging next to the product, 1:1
  • 8. A second lifestyle scene in a different setting, 4:5

Price the set

The per-image prices are the endpoint line on the Sume model record (list x 1.25). GPT Image 2.5 prices are the repo's estimate for the size and quality, read 2026-10-03.

Eight-image set cost on Sume (read 2026-10-03)
ModelPer imageEight images
Qwen Image$0.025$0.20
Flux 2 Pro$0.0375$0.30
Seedream 4.5$0.05$0.40
GPT Image 2.5 high at 4:5 (estimate)$0.0568$0.45
Nano Banana 2$0.10$0.80

Script: eight shots, one list

This sends one call per shot, uses a packshot URL as a reference, and prints a JSON list you can review before anything reaches Stripe. It stops on the first non-200 so you see the status instead of a half set.

import os, json, requests

H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
PACKSHOT = "https://example.com/packshot.png"
SHOTS = ["main shot on a white background", "three-quarter angle on white",
         "close-up of the label and texture", "in a bright kitchen scene",
         "held in one hand for scale", "flat lay with its accessories",
         "next to its box on white", "on a wooden table by a window"]
urls = []
for shot in SHOTS:
    r = requests.post("https://api.sume.com/v1/images", headers=H, timeout=120, json={
        "model": "openai/gpt-image-2.5", "quality": "high",
        "aspect_ratio": "4:5",
        "prompt": f"Keep the product identical to the reference: {shot}",
        "input_references": [{"type": "image_url", "image_url": {"url": PACKSHOT}}]})
    if r.status_code != 200:
        raise SystemExit(f"{shot}: {r.status_code} {r.text[:200]}")
    urls.append(r.json()["data"][0]["url"])
print(json.dumps(urls, indent=1))

Host copies before you set the field

The docs describe data[].url as a Sume-hosted, signed URL. A storefront wants addresses that keep working for as long as the product page exists, so download each file and publish it from your own storage or CDN. Then set that list on the product. Sume does not call Stripe or manage your product catalog.

Sources

Related posts

More in Integrations

All Integrations posts

Written by Sume