{
  "name": "slickfast chart api",
  "docs": "every field is in the chart-spec contract (render-core/SPEC.md); apps/api/API.md covers the HTTP envelope",
  "auth": "API key required — free tier at slickfast.com (Authorization: Bearer <key>, X-API-Key header, or ?key= on GET)",
  "endpoints": {
    "POST /signup/free (JSON body {\"email\":\"you@example.com\"})": "instant free API key — 250 renders/mo, no card, email is not stored",
    "GET /chart.png?spec=<url-encoded JSON>": "PNG image",
    "GET /chart.svg?spec=<url-encoded JSON>": "SVG image",
    "POST /render (JSON body spec; format \"png\"|\"svg\")": "image",
    "POST /live/{name} (JSON body spec)": "create/replace a live chart; returns its permanent view URLs",
    "POST /live/{name}/data (JSON body, shallow-merged over the spec)": "push fresh data — every embed updates",
    "DELETE /live/{name}": "remove a live chart",
    "GET /live/{slug}.png|.svg": "current state of a live chart (keyless; the unguessable slug is the credential)",
    "POST /ephemeral (JSON body spec; ?ttl_days=1-30, default 7)": "frozen snapshot with keyless view URLs — for pasting into chats/docs; expires",
    "GET /e/{slug}.png|.svg": "view an ephemeral snapshot (keyless, immutable, CDN-cached)",
    "GET /live/{slug}.json | /e/{slug}.json": "the spec twin — the machine-readable spec the image renders from (keyless)",
    "POST /trmnl/push (JSON body {spec, webhook_url, device?})": "render at e-ink dimensions and POST the PNG to a TRMNL Webhook Image endpoint",
    "POST /pages (JSON body {\"page\":{...}}; ?ttl_days=)": "publish a designed web page from one pagespec — free keys: up to 5 concurrent Pages (7-day TTL + watermark); Pro 25 / Scale 100, permanent on paid. Returns {url, jsonUrl, specHash} — url prefers pages.slickfast.com when SLICKFAST_PAGES_BASE is set",
    "GET /s/{slug}": "view a published page (keyless) on api.slickfast.com or pages.slickfast.com (same slug); /s/{slug}.json is its pagespec twin",
    "DELETE /pages/{slug}": "revoke a page you published — frees a slot; the URL answers 410 forever after"
  },
  "verification": "every twin and create response carries specHash — the RFC 8785 canonical SHA-256 of the spec; image responses carry it as the x-slickfast-spec-hash header. Verify offline with the CLI: slickfast-mcp verify <spec.json> <hash>",
  "example_spec": {
    "type": "bar",
    "data": {
      "labels": [
        "A",
        "B",
        "C"
      ],
      "series": [
        {
          "values": [
            10,
            20,
            15
          ]
        }
      ]
    }
  }
}