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}. | Free (rate limited) |
| GET or POST /v1/og | Social card. Fields: title (required), description, eyebrow, site, theme (light, dark, blue, sunset, mint, grape), accent, align, size (og, x, linkedin, square), format, scale. | Free (rate limited) |
| POST /v1/pdf | {html | url, format, landscape, margin, background, cssPageSize, javascript, filename} to application/pdf. | Metered browser render |
| 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. 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. Free API keys (100 a month) are coming with Cuelark accounts; keys will be sent as
Authorization: Bearer <key>. - Bodies: 128 KB for chart and card JSON, 2 MB for HTML. 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.