Skip to content

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.

EndpointWhat it doesCost
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

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

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.