Video ads for every market
Render each market's spot in three placement formats from one prompt template. Every cut is its own task, so a slow or failed render never holds up the rest.
Request
POST https://api.tovano.ai/v1/tasks Authorization: Bearer $TOVANO_API_KEY Content-Type: application/json X-Tovano-Customer: client-0482 Idempotency-Key: spring-run-de-DE-9x16 { "model": "video/demo-1", "input": { "prompt": "Six-second product spot: running shoe on a wet city street at dawn. On-screen text in German: \"Leichter. Schneller.\"", "duration": 6, "aspect_ratio": "9:16" }, "webhook_url": "https://ads.example.com/hooks/tovano" }
Response
Waiting for the run to finish.
{
"id": "tsk_539d66257b7f",
"model": "video/demo-1",
"status": "completed",
"customer": "client-0482",
"input": {
"prompt": "Six-second product spot: running shoe on a wet city street at dawn. On-screen text in German: \"Leichter. Schneller.\"",
"duration": 6,
"aspect_ratio": "9:16"
},
"output": {
"video": {
"url": "https://files.tovano.ai/tsk_539d66257b7f/0.mp4?sig=…",
"content_type": "video/mp4"
}
},
"unit": "second",
"units": 6,
"charged_micro": 600000,
"error": null,
"created_at": "2026-11-12T09:14:03Z",
"completed_at": "2026-11-12T09:15:05Z"
}Tasks
24 tasks
-
Completed $1.80
de-DE · 3 cuts
tsk_539d66257b7f · 18 seconds
-
Completed $1.80
fr-FR · 3 cuts
tsk_6d0fe99eee75 · 18 seconds
-
Completed $1.80
es-ES · 3 cuts
tsk_a8aea7ef7037 · 18 seconds
-
Completed $1.80
it-IT · 3 cuts
tsk_320cc1008e81 · 18 seconds
-
Completed $1.80
nl-NL · 3 cuts
tsk_982a0d29ef50 · 18 seconds
-
Completed $1.80
pl-PL · 3 cuts
tsk_b05f5c220584 · 18 seconds
-
Completed $1.80
sv-SE · 3 cuts
tsk_ed3b4ef3ae93 · 18 seconds
-
Completed $1.80
en-GB · 3 cuts
tsk_16c17354a2ff · 18 seconds
Output
Events
- 0:00.0POST /v1/tasks · 8 tasks queued
- 1:02.4tsk_539d66257b7f 3 tasks completed · $1.80
- 1:09.6tsk_a8aea7ef7037 3 tasks completed · $1.80
- 1:14.4tsk_6d0fe99eee75 3 tasks completed · $1.80
- 1:24.0tsk_982a0d29ef50 3 tasks completed · $1.80
- 1:28.8tsk_320cc1008e81 3 tasks completed · $1.80
- 1:31.2tsk_b05f5c220584 3 tasks completed · $1.80
- 1:31.2tsk_ed3b4ef3ae93 3 tasks completed · $1.80
- 1:45.6tsk_16c17354a2ff 3 tasks completed · $1.80
- 1:55.2Done · 24 tasks · $14.40 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
$14.40 for 24 tasks
| Model | Usage | Amount | |
|---|---|---|---|
| Demo Video 1 video/demo-1144 seconds × $0.100 / second | $14.40 | ||
| Total | $14.40 |
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 cut
16:9, 9:16 and 1:1 for each market are separate tasks. Each one is charged for the seconds it delivers: 6 seconds at the per-second price.
- 2
Keys per market and format
The Idempotency-Key names the campaign, market and format. Re-running the batch after a deploy never renders a cut twice.
- 3
Spend per client
The agency's client goes in the customer tag. Per-client spend is one call to /v1/usage, so media invoices carry the real production cost.
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 cut: German market, 9:16 placement. curl https://api.tovano.ai/v1/tasks \ -H "Authorization: Bearer $TOVANO_API_KEY" \ -H "Content-Type: application/json" \ -H "X-Tovano-Customer: client-0482" \ -H "Idempotency-Key: spring-run-de-DE-9x16" \ -d '{ "model": "video/demo-1", "input": { "prompt": "Six-second product spot: running shoe on a wet city street at dawn. On-screen text in German: Leichter. Schneller.", "duration": 6, "aspect_ratio": "9:16" }, "webhook_url": "https://ads.example.com/hooks/tovano" }'
import Tovano from "tovano"; const tovano = new Tovano(); const formats = ["16:9", "9:16", "1:1"]; // markets: [{ locale: "de-DE", language: "German", line: "Leichter. Schneller." }, ...] await Promise.all( markets.flatMap((m) => formats.map((ratio) => tovano.tasks.create( { model: "video/demo-1", input: { prompt: `Six-second product spot: running shoe on a wet city street at dawn. On-screen text in ${m.language}: ${m.line}`, duration: 6, aspect_ratio: ratio, }, customer: "client-0482", webhook_url: "https://ads.example.com/hooks/tovano", }, { idempotencyKey: `spring-run-${m.locale}-${ratio.replace(":", "x")}` }, ), ), ), );
import os, requests KEY = os.environ["TOVANO_API_KEY"] FORMATS = ["16:9", "9:16", "1:1"] for m in markets: # [{"locale": "de-DE", "language": "German", "line": "Leichter. Schneller."}, ...] for ratio in FORMATS: requests.post( "https://api.tovano.ai/v1/tasks", headers={ "Authorization": f"Bearer {KEY}", "Idempotency-Key": f"spring-run-{m['locale']}-{ratio.replace(':', 'x')}", }, json={ "model": "video/demo-1", "input": { "prompt": "Six-second product spot: running shoe on a wet city street at dawn. " f"On-screen text in {m['language']}: {m['line']}", "duration": 6, "aspect_ratio": ratio, }, "customer": "client-0482", "webhook_url": "https://ads.example.com/hooks/tovano", }, ).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.