Product images for a full catalogue
Send one task per SKU with four images each. Tag every task with the merchant it is for, make retries safe with an idempotency key and collect the files by webhook.
Request
POST https://api.tovano.ai/v1/tasks Authorization: Bearer $TOVANO_API_KEY Content-Type: application/json X-Tovano-Customer: merchant-2291 Idempotency-Key: sku-48213-v3 { "model": "image/demo-1", "input": { "prompt": "Studio product photo on a white seamless background, soft shadow: walnut side table, 45 cm", "size": "1024x1024", "n": 4 }, "webhook_url": "https://shop.example.com/hooks/tovano" }
Response
Waiting for the run to finish.
{
"id": "tsk_166099647f94",
"model": "image/demo-1",
"status": "completed",
"customer": "merchant-2291",
"input": {
"prompt": "Studio product photo on a white seamless background, soft shadow: walnut side table, 45 cm",
"size": "1024x1024",
"n": 4
},
"output": {
"images": [
{
"url": "https://files.tovano.ai/tsk_166099647f94/0.png?sig=…",
"content_type": "image/png"
},
{
"url": "https://files.tovano.ai/tsk_166099647f94/1.png?sig=…",
"content_type": "image/png"
},
{
"url": "https://files.tovano.ai/tsk_166099647f94/2.png?sig=…",
"content_type": "image/png"
},
{
"url": "https://files.tovano.ai/tsk_166099647f94/3.png?sig=…",
"content_type": "image/png"
}
]
},
"unit": "image",
"units": 4,
"charged_micro": 80000,
"error": null,
"created_at": "2026-11-12T09:14:03Z",
"completed_at": "2026-11-12T09:14:14Z"
}Tasks
9 tasks
-
Completed $0.080
SKU 48213 · Walnut side table
tsk_166099647f94 · 4 images
-
Completed $0.080
SKU 48214 · Linen armchair
tsk_ee17a9830e6f · 4 images
-
Completed $0.080
SKU 48215 · Brass floor lamp
tsk_b13bb6b2aa0b · 4 images
-
Completed $0.080
SKU 48216 · Wool rug, 160 × 230 cm
tsk_97c9333980cd · 4 images
-
Completed $0.080
SKU 48217 · Oak bookshelf
tsk_b1acb0902325 · 4 images
-
Failed · not charged $0.000
SKU 48218 · Ceramic vase set
tsk_a98b027f29f8 · 4 images
-
Completed $0.080
SKU 48218 · Ceramic vase set, retry
tsk_6caf0faef919 · 4 images
-
Completed $0.080
SKU 48219 · Steel bar stool
tsk_533c8c353927 · 4 images
-
Completed $0.080
SKU 48220 · Glass pendant light
tsk_9fa289dc727b · 4 images
Output
Events
- 0:00.0POST /v1/tasks · 9 tasks queued
- 0:11.4tsk_166099647f94 completed · $0.080
- 0:13.8tsk_b13bb6b2aa0b completed · $0.080
- 0:14.1tsk_ee17a9830e6f completed · $0.080
- 0:15.3tsk_a98b027f29f8 failed · provider_error · not charged, $0.080 released
- 0:18.0tsk_b1acb0902325 completed · $0.080
- 0:18.3tsk_97c9333980cd completed · $0.080
- 0:22.2tsk_533c8c353927 completed · $0.080
- 0:22.5tsk_9fa289dc727b completed · $0.080
- 0:27.6tsk_6caf0faef919 completed · $0.080
- 0:30.0Done · 9 tasks, 1 failed and not charged · $0.640 charged
A played-back run with realistic requests, responses and charges. No API call is made and no key is used. Times are compressed.
Cost of this run
$0.640 for 9 tasks
| Model | Usage | Amount | |
|---|---|---|---|
| Demo Image 1 image/demo-132 images × $0.020 / image | $0.640 | ||
| Total | $0.640 |
1 task failed and was not charged. Its reserve was released at once.
Unit prices from the model catalogue, in US dollars, excluding tax. Agent jobs are charged per step at each step model's price.
At your volume
What a month costs
List prices. Committed-volume pricing, invoicing and an SLA are agreed in your contract. Talk to sales
How it works
Three calls you would write anyway.
- 1
One task per SKU
Each SKU is one task with n = 4. The Idempotency-Key is built from the SKU and prompt version, so a network retry never makes or bills the images twice.
- 2
Tag the merchant
Send the merchant or brand as the customer tag. Spend per merchant shows up in /v1/usage, ready to bill back.
- 3
Collect by webhook
Results arrive at your webhook, signed. A failed task is released in full and never charged: retry it with a new key.
The code
Copy it, add your key, run it.
The same request in curl, TypeScript and Python. The TypeScript client is tovano on npm.
# One task per SKU. The Idempotency-Key makes retries safe. curl https://api.tovano.ai/v1/tasks \ -H "Authorization: Bearer $TOVANO_API_KEY" \ -H "Content-Type: application/json" \ -H "X-Tovano-Customer: merchant-2291" \ -H "Idempotency-Key: sku-48213-v3" \ -d '{ "model": "image/demo-1", "input": { "prompt": "Studio product photo on a white seamless background, soft shadow: walnut side table, 45 cm", "size": "1024x1024", "n": 4 }, "webhook_url": "https://shop.example.com/hooks/tovano" }'
import Tovano from "tovano"; const tovano = new Tovano(); // reads TOVANO_API_KEY // skus: [{ id, title, merchant }] from your catalogue for (const sku of skus) { await tovano.tasks.create( { model: "image/demo-1", input: { prompt: `Studio product photo on a white seamless background, soft shadow: ${sku.title}`, size: "1024x1024", n: 4, }, customer: sku.merchant, webhook_url: "https://shop.example.com/hooks/tovano", }, { idempotencyKey: `sku-${sku.id}-v3` }, ); }
import os, requests API = "https://api.tovano.ai/v1" KEY = os.environ["TOVANO_API_KEY"] for sku in skus: # [{"id", "title", "merchant"}] from your catalogue r = requests.post( f"{API}/tasks", headers={ "Authorization": f"Bearer {KEY}", "Idempotency-Key": f"sku-{sku['id']}-v3", }, json={ "model": "image/demo-1", "input": { "prompt": f"Studio product photo on a white seamless background, soft shadow: {sku['title']}", "size": "1024x1024", "n": 4, }, "customer": sku["merchant"], "webhook_url": "https://shop.example.com/hooks/tovano", }, ) r.raise_for_status()
More examples
What else teams run at volume.
Run it on your volume, with your contract.
Committed-volume pricing, monthly invoices, higher limits and a named contact for teams that run AI in production.