Tools & batch
Data charts, stateless re-generation, multi-slide carousels, animated GIFs, bulk generation, and pattern discovery — full parity with everything the Studio web app can do.

Generates a bar/line/donut/KPI chart from data you supply — deterministic, no additional AI call, so it's fast and repeatable.
| Field | Type | Description & options |
|---|---|---|
| chartType | Required | bar, line, donut, or kpi. |
| title / subtitle / unit | String | Chart headline, sub-headline, and an optional unit label (e.g. '$', 'users'). |
| series | Array | bar/line only — flat [{label, value}] array, 2-12 points. |
| slices | Array | donut only — flat [{label, value}] array, 2-8 points. |
| tiles | Array | kpi only — [{value, label, delta?, deltaDirection?}], 1-6 tiles. |
| size | String | Canvas aspect ratio. portraitlandscapesquarestory |
| theme | String | Color mode. light (default)dark |
| style | String | Visual skin. glass (default)flatblueprinteditorial |
| palette | Object | { primary, secondary, bg } hex override for this chart only. |
| brand | Object | Per-request branding override. |
curl -X POST https://api.capci.app/api/v1/chart \
-H "x-api-key: capci_your_api_key" -H "Content-Type: application/json" \
-d '{
"chartType": "bar",
"title": "Quarterly Signups",
"series": [
{"label":"Q1","value":120},{"label":"Q2","value":210},
{"label":"Q3","value":340},{"label":"Q4","value":480}
],
"theme": "dark"
}'
# donut → use "slices" (same {label, value} shape)
# kpi → use "tiles": [{"value":"4.2L","label":"MRR","delta":"+18%","deltaDirection":"up"}]Re-generate content you already hold (from a prior /posts or /chart response) with a different theme, size, or brand — no additional AI call, no charge. Great for reskinning without spending another plan call.
| Field | Type | Description & options |
|---|---|---|
| format | Required | Which pattern this content belongs to (also accepts pattern, so a /posts response can be passed back in unmodified). |
| content | Required | The content object from a prior response, optionally edited. |
| size | String | Override the canvas aspect ratio. |
| theme | String | Override the color mode. |
| brand | Object | Override branding for this re-render only. |
curl -X POST https://api.capci.app/api/v1/render \
-H "x-api-key: capci_your_api_key" -H "Content-Type: application/json" \
-d '{ "format": "listicle", "content": { ... }, "theme": "light", "size": "story" }'Plans a multi-slide swipeable carousel and returns each slide plus an assembled PDF. Portrait or square only.
| Field | Type | Description & options |
|---|---|---|
| prompt | Required | The topic to build a carousel about. |
| size | String | Canvas aspect ratio — carousels don't support landscape/story. portrait (default)square |
| theme | String | Color mode. light (default)dark |
| style | String | Visual skin. glass (default)flatblueprinteditorial |
| brand | Object | Per-request branding override. |
curl -X POST https://api.capci.app/api/v1/carousel \
-H "x-api-key: capci_your_api_key" -H "Content-Type: application/json" \
-d '{ "prompt": "5 simple ways to save more money every month", "size": "portrait" }'
# → { "pattern": "carousel", "slides": ["data:image/png;base64,…", ...], "pdf": "data:application/pdf;base64,…" }Re-generate an edited slide array from a prior /carousel call — no additional AI call, no charge.
| Field | Type | Description & options |
|---|---|---|
| slides | Required | The (possibly edited) slide array from a prior /carousel response. |
| theme | String | Override the color mode. light (default)dark |
| size | String | Override the canvas aspect ratio. portrait (default)square |
# "slides" is the (possibly edited) array from a prior /carousel response
curl -X POST https://api.capci.app/api/v1/carousel/render \
-H "x-api-key: capci_your_api_key" -H "Content-Type: application/json" \
-d '{ "slides": [ ... ], "theme": "dark", "size": "portrait" }'Turns content you already hold — or an existing diagram — into a reveal GIF. Offloads to an async job (poll GET /api/v1/jobs/{id}) for larger renders; otherwise generates inline and returns the GIF directly. Two input modes, pick one.
| Field | Type | Description & options |
|---|---|---|
| format | String | Which pattern this content belongs to. Required together with content; omit when using diagramId. |
| content | Object | The content object to animate. Required together with format; omit when using diagramId. |
| diagramId | String | Animate an existing diagram from /api/v1/diagrams instead of raw content. Cannot be combined with format/content. |
| anim | String | Animation style — flow reveals along the connections/edges, build reveals elements in sequence. flow (default)build |
| speed | String | Playback speed. slownormal (default)fast |
| size | String | Override the canvas aspect ratio. |
| brand | Object | Per-request branding override (ignored when animating an existing diagramId — it keeps its own saved brand). |
# Mode 1 — animate content you already hold (from a prior /posts or /chart call)
curl -X POST https://api.capci.app/api/v1/animate \
-H "x-api-key: capci_your_api_key" -H "Content-Type: application/json" \
-d '{ "format": "listicle", "content": { ... }, "anim": "flow", "speed": "normal" }'
# → { "async": true, "jobId": "…" } when offloaded — poll GET /api/v1/jobs/{jobId}
# → { "gif": "data:image/gif;base64,…" } when generated inline (small/fast payloads)
# Mode 2 — animate an existing diagram by id instead (mutually exclusive with format/content)
curl -X POST https://api.capci.app/api/v1/animate \
-H "x-api-key: capci_your_api_key" -H "Content-Type: application/json" \
-d '{ "diagramId": "DIAGRAM_ID", "anim": "flow", "speed": "fast" }'Bulk / data-merge: one format + a shared base + up to 200 items → N async generations in a single call, billed once for the whole valid batch. If bulk generation is temporarily unavailable, you'll get a 503 batch_unavailable — retry shortly.
| Field | Type | Description & options |
|---|---|---|
| format | Required | Any single-image format (not carousel — no multi-slide support in batch). |
| base | Object | Fields shared by every item. |
| items | Required | Array of per-item overrides merged onto base, up to 200. |
| theme | String | Color mode, applied to every item. light (default)dark |
| size | String | Canvas aspect ratio, applied to every item. portraitlandscapesquarestory |
| brand | Object | Branding override, applied to every item. |
curl -X POST https://api.capci.app/api/v1/batch \
-H "x-api-key: capci_your_api_key" -H "Content-Type: application/json" \
-d '{
"format": "cover",
"base": { "subtitle": "Q3 2026" },
"items": [ { "title": "Region A" }, { "title": "Region B" } ]
}'
# → { "batchId": "…", "total": 2, "skipped": [], "jobIds": [...] }
# poll GET /api/v1/jobs/batch/{batchId}Poll status for an async job created by /animate or /batch. Returns { status: 'queued' | 'rendering' | 'done' | 'failed' } while pending, plus the image(s) once done. Not subject to the 20/min generation rate limit — poll every 2-3s.
# Single job (from /animate)
curl https://api.capci.app/api/v1/jobs/JOB_ID -H "x-api-key: capci_your_api_key"
# Batch (from /batch)
curl https://api.capci.app/api/v1/jobs/batch/BATCH_ID -H "x-api-key: capci_your_api_key"Lists every post format id with its human-readable title and the exact content schema it expects — the machine-readable counterpart to the format pills on the Posts page. Useful if you're building your own prompt/format picker UI against this API.
curl https://api.capci.app/api/schemas -H "x-api-key: capci_your_api_key"