DocsOverviewGetting startedPricingAuthentication & conceptsPostsDiagramsBrand & assetsTools & batchErrorsMCP server

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.

Example KPI chart with three metric tiles
A /chart response — chartType: "kpi", generated deterministically from the data in this page’s code sample.
POST/api/v1/chartIncluded · Developer plan

Generates a bar/line/donut/KPI chart from data you supply — deterministic, no additional AI call, so it's fast and repeatable.

FieldTypeDescription & options
chartTypeRequired
bar, line, donut, or kpi.
title / subtitle / unitString
Chart headline, sub-headline, and an optional unit label (e.g. '$', 'users').
seriesArray
bar/line only — flat [{label, value}] array, 2-12 points.
slicesArray
donut only — flat [{label, value}] array, 2-8 points.
tilesArray
kpi only — [{value, label, delta?, deltaDirection?}], 1-6 tiles.
sizeString
Canvas aspect ratio.
portraitlandscapesquarestory
themeString
Color mode.
light (default)dark
styleString
Visual skin.
glass (default)flatblueprinteditorial
paletteObject
{ primary, secondary, bg } hex override for this chart only.
brandObject
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"}]
POST/api/v1/renderFree

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.

FieldTypeDescription & options
formatRequired
Which pattern this content belongs to (also accepts pattern, so a /posts response can be passed back in unmodified).
contentRequired
The content object from a prior response, optionally edited.
sizeString
Override the canvas aspect ratio.
themeString
Override the color mode.
brandObject
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" }'
POST/api/v1/carouselIncluded · Developer plan

Plans a multi-slide swipeable carousel and returns each slide plus an assembled PDF. Portrait or square only.

FieldTypeDescription & options
promptRequired
The topic to build a carousel about.
sizeString
Canvas aspect ratio — carousels don't support landscape/story.
portrait (default)square
themeString
Color mode.
light (default)dark
styleString
Visual skin.
glass (default)flatblueprinteditorial
brandObject
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,…" }
POST/api/v1/carousel/renderFree

Re-generate an edited slide array from a prior /carousel call — no additional AI call, no charge.

FieldTypeDescription & options
slidesRequired
The (possibly edited) slide array from a prior /carousel response.
themeString
Override the color mode.
light (default)dark
sizeString
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" }'
POST/api/v1/animateIncluded · Developer plan

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.

Can take up to a couple of minutes for large animations — build your integration around the async jobId path, not just the inline one.
FieldTypeDescription & options
formatString
Which pattern this content belongs to. Required together with content; omit when using diagramId.
contentObject
The content object to animate. Required together with format; omit when using diagramId.
diagramIdString
Animate an existing diagram from /api/v1/diagrams instead of raw content. Cannot be combined with format/content.
animString
Animation style — flow reveals along the connections/edges, build reveals elements in sequence.
flow (default)build
speedString
Playback speed.
slownormal (default)fast
sizeString
Override the canvas aspect ratio.
brandObject
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" }'
POST/api/v1/batchIncluded · Developer plan

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.

FieldTypeDescription & options
formatRequired
Any single-image format (not carousel — no multi-slide support in batch).
baseObject
Fields shared by every item.
itemsRequired
Array of per-item overrides merged onto base, up to 200.
themeString
Color mode, applied to every item.
light (default)dark
sizeString
Canvas aspect ratio, applied to every item.
portraitlandscapesquarestory
brandObject
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}
GET/api/v1/jobs/{id} · /api/v1/jobs/batch/{batchId}Free · unlimited polling

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"
GET/api/schemasFree

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"