Render API docs
The base URL is https://render.cuelark.com. Send JSON and you get the file back directly in the response body. No account is needed today.
| Endpoint | What it does | Cost |
|---|---|---|
| GET or POST /v1/chart | Chart JSON to PNG or SVG. GET takes ?c=<url-encoded JSON> or flat ?type=&labels=&data=. POST takes {chart, format, scale}. Spec: JSON Schema at /schema/chart.json (palette, subtitle, axis titles, stacked, showValues, prefix/suffix). | Free (rate limited) |
| GET or POST /v1/og | Social card. template (classic, blog, launch, changelog, quote, stat, event, repo, podcast, hiring, minimal) plus its fields: title (required, or stat), description, eyebrow, site, author, role, date, cta, stat, statLabel, version, episode, items and tags (separate with |). Brand: font (sans, serif, mono), theme (light, dark, blue, sunset, mint, grape), accent, align, size (og, x, linkedin, square, portrait, youtube), bg (one color or "from,to" gradient), ink, logo and bgImage (base64 data URLs, POST only), overlay, format, scale. | Free (rate limited) |
| POST /v1/pdf | {markdown | html | url, format, landscape, margin, header, footer, title, background, cssPageSize, javascript, filename} to application/pdf. header/footer are plain text with {page} {pages} {title} {date}; split "left | center | right". | Metered browser render |
| GET /v1/data | ?url=<public JSON or CSV URL> returns the text (max 2 MB, 8 s) so the chart maker can load data from servers without CORS. Private and internal addresses are refused. | Free (rate limited) |
| POST /v1/screenshot | {url | html, width, height, fullPage, format, quality, retina, javascript} to image/png, jpeg or webp. | Metered browser render |
Limits
- All endpoints: 120 requests per minute per IP, or 600 per minute per API key. Cached GET image URLs are served from Cloudflare's cache and don't count.
- Browser renders (PDF, screenshot): 10 per day per IP without a key, plus a shared daily pool. With a free API key: 50 per day per account.
- API keys: create one in your Cuelark account at auth.cuelark.com (scoped to Render) and send
Authorization: Bearer cue_…. MCP clients can also sign in with OAuth; the server publishes/.well-known/oauth-protected-resource/mcp. Signing in is optional. - Bodies: 256 KB for chart JSON, 520 KB for card JSON (logos), 2 MB for HTML or Markdown, 2 MB for /v1/data responses. Pages get 15 seconds to load. Outputs are capped at 12 MB.
- Metered responses include
x-quota-used,x-quota-limitandx-quota-resetsheaders.
Errors
Errors are JSON: {"error":"bad_request","message":"…"}, with status 400 (bad input), 401 (bad key), 413 (too large), 422 (page failed to render), 429 (limit reached; see retry-after) or 502/503 (browser busy).
Security
- URLs must be public http(s) on ports 80 or 443 and resolve to public IP addresses. localhost, private ranges, link-local and cloud metadata addresses are refused.
- Inside rendered pages, requests to private IP ranges and internal hostnames are blocked too.
- Inputs and outputs aren't stored or logged. Counters for the free limits use salted hashes, never raw IP addresses.
JavaScript example
js
// Chart PNG from data
const png = await fetch("https://render.cuelark.com/v1/chart", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ chart: { type: "bar", labels: ["A", "B"], datasets: [{ data: [3, 5] }] }, scale: 2 }),
}).then((r) => r.arrayBuffer());
// Screenshot
const shot = await fetch("https://render.cuelark.com/v1/screenshot", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ url: "https://example.com", width: 1280, height: 800 }),
});python
import requests
r = requests.post("https://render.cuelark.com/v1/pdf", json={"url": "https://example.com", "format": "a4"})
open("page.pdf", "wb").write(r.content)Using an AI assistant? See the MCP server. Copy-paste recipes for n8n, Cursor and Next.js are on the recipes page.