YOUR SCRIPT. OUR SCREENSHOT.
Make a scene.
With an API.
Send the cast, the messages, the plot twist.
Get a PNG, PDF carousel, or editable project back.
Included in every active plan. Monthly, annual, lifetime, and trials.
Get your API key ↓ OpenAPI specification ↗THE BACKSTAGE PASS
Your API keys
Checking your account…
Continue with GoogleChoose an active plan to create and use keys. You can still revoke existing keys.
Copy your key now.
It’s shown only once. TextPuppet stores a hash, so we can’t show it again.
One request. One screenshot.
Create a key above, then set TEXTPUPPET_API_KEY as a secret in your server’s environment. This example makes a fictional iMessage conversation.
curl --fail https://textpuppet.com/api/v1/render \
-H "Authorization: Bearer $TEXTPUPPET_API_KEY" \
-H "Content-Type: application/json" \
--output mockup.png \
--data '{
"template": "imessage",
"participants": [{"name":"You"}, {"name":"Boss"}],
"messages": [
{"sender":1,"text":"How is the deck looking?","time":"9:41 AM"},
{"sender":0,"text":"Slide 4 is a raccoon holding a calculator.","status":"delivered"}
],
"settings": {"theme":"dark","sceneWidth":390},
"format": "png",
"scale": 2
}'Use format: "pdf" for a carousel, or "project" for portable, editable JSON. Scale is 1× or 2×. Renders return file bytes directly; they don’t save a draft.
Pick a layout. Bring your own story.
11 native layouts: LinkedIn, Gmail, Reddit, WhatsApp, Slack, X messages, iMessage / SMS, Instacart shopper chat, YouTube, Taplio, and Trellus. Each has its own settings. Fetch an example before building a new format.
Website imports happen through the Chrome extension and Studio. The API renders native layouts; it doesn’t visit arbitrary website URLs.
| Method & path | What it does |
|---|---|
GET /api/v1/account | Current plan and usage limits |
GET /api/v1/templates | Layouts and supported settings |
GET /api/v1/templates/{template} | Starter example; omit masked photo/image fields or upload your own |
POST /api/v1/render | One-request PNG, PDF, or project export |
POST /api/v1/images | Upload a raster image as {"data_url":"data:image/png;base64,…"} |
DELETE /api/v1/images/{id} | Delete your uploaded image |
POST /api/v1/mockups | Save a mockup; same input as render, without format/scale |
GET /api/v1/mockups | List your API and MCP mockups |
GET /api/v1/mockups/{id} | Read its current revision |
PATCH /api/v1/mockups/{id} | Apply changes with expected_revision |
POST /api/v1/mockups/{id}/export | Export with {"format":"png","scale":2} |
DELETE /api/v1/mockups/{id} | Delete your mockup |
Images and edits
Upload PNG, JPEG, WebP, or GIF files up to 4 MB. Put the returned image_reference in a participant’s photo, a message’s image, or a supported image src field. Images belong to your account. Remote image URLs and SVG uploads aren’t accepted.
{
"expected_revision": 1,
"changes": {
"messages": [
{"id":"message-1","sender":1,"text":"Did the raccoon approve it?"},
{"id":"message-2","sender":0,"text":"He wants more charts.","status":"read"}
]
}
}Read before editing. Send the complete messages or participants array, and merge nested settings with the existing object. Omit attached image fields to preserve them. A stale revision returns 409. Saved responses include a Studio link to open an editable copy; use Save to account there if you want to keep working online.
Limits, without surprises
The API and MCP share 120 requests per minute, 60 exports per hour, and one concurrent export per account. Saved mockups and images expire after 30 days: up to 150 objects, 100 MB total, and 20 saves/uploads per minute. JSON request bodies can be up to 7 MB. Mockups allow up to 200 messages. PNGs are limited to 12,000 pixels tall and 40 megapixels at the chosen scale; PDFs to 30 slides. Shared rendering capacity can limit exports below your account quota; temporary launch throttles retry automatically, and a busy renderer returns 429 with Retry-After.
All plans have the same API access and limits. Access stops when a trial or paid period ends; lifetime licenses, including redeemed free licenses, stay active. Keys don’t provide access to billing or browser-only drafts.
Failures return {"error":{"code":"…","message":"…"}}. 401 means a missing, invalid, or revoked key; 402 means your plan has ended; 409 means a conflicting edit or running export; 429 means a rate or storage limit. Honor Retry-After, retry transient errors with a delay, and avoid repeating creates if you’re unsure whether a save succeeded. Browser requests from other origins are blocked; call from your server.
Want to describe a mockup in natural language instead? Connect TextPuppet to your assistant with MCP.