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.
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.
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.
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.