Studio / docs

Integration reference

Built for connected tools

Connect your application to the deck engine.

Use MCP when an assistant should reason about a deck and edit it conversationally. Use REST when your application needs predictable endpoints, webhooks, or direct control over generation.

01 / Quickstart

Choose the connection your app needs.

Create a key

Make a workspace key with decks:read and/or decks:write scopes.

Connect

Use OAuth for hosted MCP clients or a Bearer key for your own backend.

Work the deck

Create a plan, adjust slides, generate, then return a permanent file URL.

02 / Authentication

One workspace, two auth paths.

API keys act for the workspace that created them. Keep them server-side, never expose them in a browser bundle, and request only the scopes your integration needs.

Bearer API key

Best for your own backend, automation, and REST calls.

Authorization: Bearer sk_live_…

OAuth 2.1 + PKCE

Best for hosted assistants that discover and authorize the MCP server.

GET /.well-known/oauth-protected-resource
Verify a key
curl https://your-domain.example/api/v1/me \
  -H "Authorization: Bearer sk_live_…"

03 / MCP integration

Let an agent operate the whole workflow.

The advanced server is the best fit when the other application should inspect a plan, change a caption, replay a slide, or ask for a new version. The simple server exposes only the shortest path from request to finished file.

MCP connection URL
https://your-domain.example/api/mcp/advanced
ToolWhat it does
make_deckCreate, render, wait, and publish a finished deck in one call.
get_deckRead the current plan, slide statuses, images, and export links.
edit_slideChange the caption or visual prompt for one slide.
regenerate_slideReplay one slide with a correction note.
revert_slideRestore the previous image without spending credits.
refine_deckAsk the planner to rewrite the deck from feedback.
Agent workflow: edit and replay
1. get_deck({ id: "deck-id" })
2. edit_slide({ id, position: 2, caption: "Updated copy" })
3. regenerate_slide({ id, position: 2, note: "Keep the layout; fix the percentage." })
4. get_deck_files({ id })

04 / REST API

Predictable HTTP for production systems.

Import the OpenAPI document into your HTTP client or build directly against the versioned routes. Every deck starts as a plan and can finish asynchronously through polling or a webhook.

OpenAPI schema
GET https://your-domain.example/api/openapi.json
POST /api/v1/decks — plan and optionally start generationGET /api/v1/decks/{id} — read progress and slide dataPATCH /api/v1/decks/{id}/slides/{n} — edit a slidePOST /api/v1/decks/{id}/wait — wait for all pages to settlePOST /api/v1/decks/{id}/files — publish permanent PDF and ZIP URLsPOST /api/v1/decks/{id}/remake — render the same plan in another format
Create a deck
curl -X POST https://your-domain.example/api/v1/decks \
  -H "Authorization: Bearer sk_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Why mid-market CFOs stall on AI",
    "mode": "slide",
    "slides": 8,
    "quality": "low"
  }'

05 / Edit and replay

Reload, modify, regenerate, or undo.

A deck remains addressable after it is created. Read it again at any time, update the exact caption or visual prompt, replay only the affected slide, and revert if the new image is worse.

Reload

get_deck returns the current deck state, including pending, done, error, and blocked slides.

Modify

edit_slide changes text or the image prompt. Without regenerate, the current image is preserved and marked stale.

Replay

regenerate_slide redraws one page with its current instructions plus an optional correction note.

Undo

revert_slide restores the previous image and costs no credits.

REST: edit one slide
curl -X PATCH https://your-domain.example/api/v1/decks/deck-id/slides/2 \
  -H "Authorization: Bearer sk_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "caption": "The corrected caption",
    "imagePrompt": "Keep the same composition; use a warmer chart",
    "regenerate": true
  }'

06 / Webhooks

Stop polling when your system is event-driven.

Pass an HTTPS webhookUrl when you create a deck. You will receive deck.planned, deck.completed, and deck.failed events. Verify the timestamp and HMAC signature before processing the payload.

Create with a webhook
POST https://your-domain.example/api/v1/decks

{
  "content": "Quarterly product review",
  "mode": "slide",
  "webhookUrl": "https://your-app.example/hooks/studio"
}

For the full endpoint list and response shapes, open the developer reference. This page is the integration-first guide.