createa.meme

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_remaining sentinel: on unlimited plans this is -1 (meaning "not metered"), mirroring credits_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 captionsynchronous, 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.

On this page