For marketplaces & platforms

Your merchants photograph badly. Fix it before it reaches your storefront.

One API call at the moment a merchant uploads. A clean image, a description no other listing on your platform is using, and a warning when the photo isn't the product. The merchant approves it. You store it. Nothing about your listing flow changes.

150 credits to start, no card, and per-merchant usage reported from the first call — so you can check the billing model before you sign anything.

What they uploaded
A bucket hat photographed at home on a kitchen table, lit from one side uneven light
What you publish
The same hat on a plain studio background, centred, with a soft shadow 1024² · studio sweep
and the description it wrote

Reversible cotton bucket hat with a stitched brim and a wide band. Holds its shape after washing. Sold by [MERCHANT], ships from Dallas in 2–3 days.

1 call per listing. Four things come back: images, description, resolution, and a verdict on whether the photo is even the product.
0 seconds of merchant waiting. The work happens while they are still filling in name, price and stock.
0 changes to how a merchant lists. You store their original before we are called, and it stays the fallback.

Where it sits in your flow

Server to server. Your backend holds the key — the platform API returns no CORS headers at all, deliberately, so a key cannot end up in a merchant's browser.

01

Merchant uploads

Your form, unchanged. You store the original first — always.

02

You call us

Hand us the CDN URL you already have. No bytes leave your network by upload.

03

Job ids, immediately

The response is an id, not a picture. The merchant keeps typing.

04

Webhook lands

A signed callback per job. You fetch the result server-side and attach it to the draft.

05

Merchant decides

Keep ours or keep theirs. Their own photo publishes if they prefer it — every time.

If we are down, nothing breaks. The original is already stored by the time you call, so the listing saves exactly as it does today and the merchant never sees an error that belongs to us. We enhance. We do not gate.

Four operations, priced separately

Call the ones you want, on the listings you want. Each is metered per project and attributed per merchant, so you can decide later whether to re-bill stores or absorb it.

Clean the image

Cut the product out, set it on a background you choose, correct the light. You pick the background per category, not per merchant — one look across a catalogue is what makes a grid read as deliberate rather than collected.

10 credits
POST /api/v1/generations
Authorization: Bearer as_live_••••
{
  "capability": "BACKGROUND_REPLACE",
  "params": {
    "sourceKey": "<from /uploads>",
    "prompt": "Warm grey studio",
    "shadow": true,
    "relight": true
  },
  "clientKey": "shop:88213:bg:v1",
  "merchantRef": "store-441"
}

// clientKey is your idempotency key.
// Replay it after a timeout and you
// get the same job back, not a
// second charge.

Write the description

Unique, indexable copy per listing, in structured fields rather than a blob of prose. Blank and duplicated descriptions are the usual reason marketplace pages do not rank — this is a search-traffic change, not a cosmetic one.

2 credits
POST /api/v1/generations
Authorization: Bearer as_live_••••
{
  "capability": "TEXT_GENERATE",
  "params": {
    "sourceKey": "<same upload>",
    "productKey": "sku-88213",
    "productName": "Bucket hat",
    "details": "reversible, cotton",
    "language": "en"
  },
  "clientKey": "shop:88213:copy:v1"
}

// productKey is your listing id.
// Copy is compared against it, so
// a second angle of one product
// never comes back reading like a
// duplicate listing.

Raise the resolution

So a thumbnail survives a product page. Cheap, fast, and no model judgement is involved — worth running unconditionally on anything that arrives below your display size.

3 credits
POST /api/v1/generations
Authorization: Bearer as_live_••••
{
  "capability": "UPSCALE",
  "params": {
    "sourceKey": "…",
    "factor": 2
  },
  "clientKey": "shop:88213:up:v1"
}

Check it is the product

New

A screenshot instead of a photograph. Last week's price list. A person and no product. You hear about it before it goes live — a verdict, the reasons from a fixed list you can put in your own words, and one sentence the merchant can act on. Never a block: a merchant who is told what is wrong fixes it; a merchant who is refused opens a support ticket.

1 credit
POST /api/v1/inspect
Authorization: Bearer as_live_••••
{
  "sourceKey": "…",
  "declared": {
    "category": "bags",
    "name": "Mini handbag"
  },
  "merchantRef": "store-441"
}

// → 200, inline, within 20s
{
  "verdict": "mismatch",
  "confidence": 0.91,
  "saw": "brown sandals on tiles",
  "issues": ["category_mismatch"],
  "advice": "Take a photo of the
    bag itself, on a plain surface."
}

All four are live and metered. The verdicts and the reasons are closed lists — product · mismatch · not_a_product · unclear — so you translate them once and never meet a new string in production. low_resolution comes from the file's own dimensions, not from a model's guess.

One account. A key per environment.

Test keys cannot touch live resources. Keys are stored hashed, scoped to a project, and revocable without a deploy. Usage is metered per project and attributed per merchant from the very first call — so you can see real numbers before you decide who pays for them.

Per project quotas and billing
Per merchant usage, from call one
Marketplace — production
as_live_4f2b••••••••••
Live
Mobile app — staging
as_test_9c71••••••••••
Test
+ New project

One account, many projects, separate keys and quotas for each. Billed on what you actually generate.

See it on your own catalogue, not ours.

Send us a link to your storefront. We run ten of your live listings through and send back a private page comparing them — before and after, with the descriptions beside them. No integration, no signup, nothing to install.

Takes an email and a storefront URL. We approve requests by hand before the link goes out, usually the same day — which is slower than a signup form, and the reason the ten listings are yours rather than ours.

What comes back
  • Ten of your own listings, before and after
  • A written description for each, ready to paste
  • A sandbox key, so your engineers can make the calls themselves
  • A note on where the images go and how long they are kept, for your security review