Quickstart
From zero to your first meme in under 60 seconds.
1. Get an API key
API keys are issued from the dashboard. Each key starts with
cam_live_ (production) or cam_test_ (test mode — no credit deduction).
2. List templates
curl https://api.createa.meme/v1/templates \
-H "Authorization: Bearer cam_live_xxxxxxxxxxxxxxxxxxxx"Returns the curated library with box_positions, tags, categories, and trending rank.
3. Caption a template
curl -X POST https://api.createa.meme/v1/meme/caption \
-H "Authorization: Bearer cam_live_xxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"template_id": "tmpl_drake",
"captions": [
{ "text": "Writing documentation", "position": "top" },
{ "text": "Writing memes about documentation", "position": "bottom" }
]
}'/v1/meme/caption returns a single flat meme object under data (it always produces exactly one image). The call is synchronous — it blocks until the image is rendered and uploaded, typically ~1–3s.
{
"success": true,
"data": {
"id": "meme_7xK2p",
"url": "https://<storage-host>.supabase.co/storage/v1/object/public/memes/meme_7xK2p.png",
"template_id": "tmpl_drake",
"width": 717,
"height": 717,
"format": "png",
"file_size_bytes": 312840
},
"meta": {
"request_id": "req_abc123",
"credits_used": 1,
"credits_remaining": 49,
"processing_time_ms": 1840
}
}
credits_remainingsentinel: on unlimited plans this is-1(meaning "not metered"), mirroringcredits_total: -1. Treat any negative value as unlimited — don't display it raw.
4. Let AI do everything
Skip picking a template entirely:
curl -X POST https://api.createa.meme/v1/meme/generate \
-H "Authorization: Bearer cam_live_xxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{ "text": "When the deployment works on the first try" }'The flagship endpoint picks the right template, writes a caption, and renders it. Returns one meme by default — pass "count": 4 to get four variations to pick from (each meme costs 2 credits, so count=4 costs 8 credits).
Unlike caption, generate returns an array under data.memes[] (since count can be > 1). Each element is a full meme object with the chosen template and AI-written caption. It runs an LLM to pick the template and write captions, so it's slower than caption — synchronous, typically ~3–15s depending on model and count. Read data.memes[0].url, not data.url.
{
"success": true,
"data": {
"memes": [
{
"id": "meme_DhUaSekk3a",
"url": "https://<storage-host>.supabase.co/storage/v1/object/public/memes/meme_DhUaSekk3a.png",
"path": "meme_DhUaSekk3a.png",
"template": { "id": "tpl_drake", "name": "Drake Hotline Bling" },
"caption": { "top": "Manually picking a template", "bottom": "Letting the API pick" },
"detected_emotion": "amusement",
"detected_language": "en",
"width": 717, "height": 717, "format": "png",
"file_size_bytes": 476832,
"reasoning": "Drake fits the 'reject X / prefer Y' structure of the prompt."
}
]
},
"meta": {
"request_id": "req_ZgJRh3zNbx-8",
"credits_used": 2,
"credits_remaining": 49,
"processing_time_ms": 12571
}
}Response shapes differ by endpoint. generate returns data.memes[] (an array). caption, ai-image, and remix each return a single flat object under data (data.url). All generation calls are synchronous — they block until the image is ready (1–3s for caption, 3–15s for generate, 10–30s+ for ai-image/remix). For latency-sensitive integrations, ack the user first and fetch the result in the background rather than blocking a webhook on the call.