Turn rows into
finished creative.
Generate personalized image and video batches from CSV or JSON while keeping row-level results, validation and failures understandable.
1042-DEBerlin€79ready1042-GBLondon£69ready1042-NOOslokr 899ready1042-FRParis—checkBring the rows.
Skip the repeated setup.
Upload a CSV in Studio or send a JSON array through the API. Column names map to published fields, while batch defaults fill values shared by every row.
market,price,productImage
DE,€79,media_1042
GB,£69,media_1042[{ "market": "DE", "price": "€79" }, { "market": "GB", "price": "£69" }]Studio suggests matching columns and lets you ignore data the visual does not need.
Campaign, language or media can be applied once and overridden only where needed.
Stable media references replace repeated base64 payloads and oversized rows.
Check the data
before compute starts.
Required values, types and media references are validated against the pinned template version. Valid rows continue while a bad row stays visible with a useful reason.
- Required and typed fields
- Media references and output kind
- Exact published template version
001DEcarry-light.webp€79valid002GBcarry-light.webp£69valid003NOcarry-light.webpkr 899valid004FRmissing€75invalid005NLcarry-light.webp€82valid006DKcarry-light.webpkr 610valid#0468completedoutput-0468.webp#0469completedoutput-0469.webp#0470renderingFrame 84 / 180#0471failedMedia could not be readOne batch.
Independent outcomes.
A batch is not one opaque job. Every row moves through queued, rendering, completed or failed states independently, so partial success remains useful.
From a short list
to thousands of outputs.
Batch size follows the active plan. Large feeds can be divided into traceable runs with stable caller keys, predictable status and no duplicate submissions.
Take the files.
Keep the operational record.
Studio packages successful artifacts with human-readable and machine-readable reports. API workflows can follow batch status and hand completed results to the next system.
Completed files in one Studio download.
Every row with status, render ID and error.
Structured results for downstream processing.
Submit the rows.
Keep the request responsive.
The API returns an asynchronous batch immediately. Poll its operation ID for row-level results or cancel work that should no longer continue.
- JSON items or CSV in one request
- Batch and row idempotency keys
- Version-pinned execution
- Row-level status and artifact references
curl -X POST "$JSONCUT_API/api/v2/templates/$TEMPLATE_ID/bulk-renders" \
-H "X-API-Key: $JSONCUT_API_KEY" \
-H "Idempotency-Key: autumn-launch-2026" \
-H "Content-Type: application/json" \
-d '{
"version": 12,
"defaults": { "campaign": "Autumn 2026" },
"items": [
{ "idempotencyKey": "sku-1042-de", "values": { "market": "DE", "price": "€79" } },
{ "idempotencyKey": "sku-1042-en", "values": { "market": "GB", "price": "£69" } }
],
"output": { "kind": "image", "format": "webp" }
}'curl -X POST "$JSONCUT_API/api/v2/templates/$TEMPLATE_ID/bulk-renders" \
-H "X-API-Key: $JSONCUT_API_KEY" \
-H "Idempotency-Key: autumn-launch-2026" \
-H "Content-Type: application/json" \
-d '{
"version": 12,
"defaults": { "campaign": "Autumn 2026" },
"items": [
{ "idempotencyKey": "sku-1042-de", "values": { "market": "DE", "price": "€79" } },
{ "idempotencyKey": "sku-1042-en", "values": { "market": "GB", "price": "£69" } }
],
"output": { "kind": "image", "format": "webp" }
}'{
"success": true,
"data": {
"id": "bulk-41f9...",
"templateVersion": 12,
"status": "queued",
"totalItems": 2,
"validItems": 2,
"completedItems": 0,
"failedItems": 0
}
}{
"success": true,
"data": {
"id": "bulk-41f9...",
"templateVersion": 12,
"status": "queued",
"totalItems": 2,
"validItems": 2,
"completedItems": 0,
"failedItems": 0
}
}Bring the next dataset.
Keep every result visible.
Start with a published image or video template, then move from one reviewed result to a controlled production run.
Open JsonCut Studio