← All updates

Obsidian canvas boards to PDF — POST /api/v1/canvas

Send a JSON Canvas document (an Obsidian .canvas board) and get a tagged, accessible PDF back — cards, connector arrows, groups and images, with overflowing cards continuing on later pages instead of clipping.

apicanvasobsidianaccessibility

Your canvas boards are now a PDF away: POST /api/v1/canvas accepts a JSON Canvas document — the format Obsidian writes for .canvas files — and returns a tagged, accessible PDF. Send the parsed JSON or the raw file text; either works.

The board becomes real document structure, not a screenshot. Text cards run through the same markdown pipeline as /api/v1/md, so headings, lists, tables, images, Mermaid and graph blocks all render at full quality inside a card. Edges become vector connector lines with arrowheads and labels. Groups keep their labels and optional background images, and cards are positioned exactly where the board puts them. Reading order is spatial — groups first, then their contents — so screen readers follow the board's visual logic rather than the order you happened to create nodes in.

Files travel with the request: pass a files map of the paths your board references ({ "photo.png": { "data": "data:image/png;base64,…" } } for images, { "notes/spec.md": { "markdown": "…" } } for notes), and image cards, group backgrounds and note cards resolve to real content. Missing files render as labelled placeholders, never a failed render. Images, Mermaid diagrams and graph blocks inside cards all work.

A card whose content is too tall for its box shrinks to fit; content that still overflows is clipped on the board and continued in a section after it, with "Continued on page N" links in both directions. Nothing silently disappears.

curl -X POST https://makespdf.com/api/v1/canvas \
  -H "Authorization: Bearer $MAKESPDF_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"canvas": {"nodes": [{"id": "n1", "type": "text", "text": "# Hello", "x": 0, "y": 0, "width": 400, "height": 200}], "edges": []}}' \
  -o board.pdf

Authed calls are billed 1 credit per 10 pages on success, like markdown renders, and your rendered boards appear in your render history with the canvas JSON saved alongside. Limits: 25MB request body, 2MB of canvas JSON, 60 images per board, 2,000 renders/hour. When the anonymous promo is on, canvas works without an account too — same limits as anonymous markdown (60/hour, 200/day per IP, 20 pages per render).