# Canvas by OpenApps > A free online whiteboard and a free alternative to Miro. Shapes, arrows that stay attached, text, sticky notes, frames, freehand drawing and images on an infinite canvas, edited together live through a link. No sign-up, no paid plan and no limit on boards. Built on the open-source Excalidraw editor. AI assistants can start a board from a flowchart, a mind map, columns of sticky notes or a template, and hand the person a link. Web app: https://canvas-free.openapps.xyz/ Templates: https://canvas-free.openapps.xyz/templates OpenAPI 3.1: https://canvas-free.openapps.xyz/openapi.json Markdown version of the home page: https://canvas-free.openapps.xyz/index.md Part of OpenApps, the app store of free alternatives: https://free-apps.openapps.xyz/ ## Links and keys Every board has three links: - View link: https://canvas-free.openapps.xyz/b/. Anyone with it can look and export, while the view link is on. - Edit link: https://canvas-free.openapps.xyz/b/#edit=. Anyone with it can draw and change the board, while the edit link is on. - Admin link: https://canvas-free.openapps.xyz/b//admin#k=. For the owner: rename the board, turn either link off, make a new edit link (the old one stops working), delete the board. The board id is the part after /b/; the edit key comes after #edit=; the admin key comes after #k=. ## API Base URL: https://functions.bounded.sh/apps/788ba0fa01083b300ad50913/api No account and no API key. JSON in, JSON out. CORS is open. Errors answer {"error": ""} with a 4xx status. ### Start a board from a flowchart or a mind map POST /boards {"title": "Checkout flow", "nodes": [{"id": "cart", "label": "Cart"}, {"id": "pay", "label": "Paid?", "shape": "diamond", "color": "yellow"}, {"id": "done", "label": "Order placed", "shape": "ellipse", "color": "green"}], "edges": [{"from": "cart", "to": "pay"}, {"from": "pay", "to": "done", "label": "Yes"}], "direction": "down"} - nodes: up to 150, each {id, label, shape?, color?}. shape is rectangle (default), ellipse or diamond. color is yellow, green, blue, red, violet, orange, gray or white (default). - edges: up to 300, each {from, to, label?}, naming node ids. Arrows are attached to their shapes, so they follow when someone moves a shape. - direction: "down" (default) or "right". For a mind map, put the topic first, use "right", and connect it to each branch. - Canvas lays the diagram out automatically. Labels are up to 200 characters. curl -X POST https://functions.bounded.sh/apps/788ba0fa01083b300ad50913/api/boards \ -H 'content-type: application/json' \ -d '{"title": "Launch plan", "direction": "right", "nodes": [{"id": "c", "label": "Launch", "shape": "ellipse", "color": "yellow"}, {"id": "m", "label": "Marketing", "color": "blue"}, {"id": "p", "label": "Product", "color": "green"}], "edges": [{"from": "c", "to": "m"}, {"from": "c", "to": "p"}]}' ### Start a board of sticky notes in columns POST /boards {"title": "Sprint 12 retro", "heading": "Sprint 12", "columns": [{"name": "Went well", "color": "green", "notes": ["Shipped search"]}, {"name": "To improve", "color": "red", "notes": ["Flaky tests"]}]} Up to 12 columns of up to 60 notes; each note is up to 300 characters. Each column is a frame of notes; an empty string makes an empty note to fill in. Good for retros, brainstorms, weekly plans and feedback walls. ### Start from a template POST /boards {"template": "retro"} Templates: brainstorm (ideas, themes, top picks, next steps), retro (went well, could be better, ideas to try, action items), user-flow (a sign-up flowchart), weekly-plan (goals and a column for each day). Send one of template, nodes or columns; with none ({}), the board starts empty. ### What comes back 201 {"id", "title", "viewUrl", "editUrl", "adminUrl", "editKey", "adminKey", "startsWith", "share"} The board is drawn the first time someone opens it (the view link shows it too). Give the person editUrl to work on the board, viewUrl for people who should only look, and adminUrl for the owner only. ### Read a board GET /boards/ Works while the view link is on. When it is off, send the admin key in the x-admin-key header, or the edit key in x-edit-key while the edit link is on. Returns board {id, title, editLink: "on"|"off", viewLink, viewUrl, editUrl when your key allows} and contents: - frames: [{id, name, items}] - shapes: [{id, shape, text, color, frame, x, y, width, height}] (sticky notes are rectangles) - arrows: [{id, from, to, text}], naming the text of the shapes they connect - texts: [{id, text, x, y}] for text not inside a shape - drawings, images, elements: counts Before anyone opens a new board, contents is null and startsWith says what it will be drawn from. Text is cut at 1,000 characters, and on a very large board contents covers the first 5,000 elements (note says so). ### Change or delete a board (admin key) PATCH /boards/ with header x-admin-key {"title": "Checkout v2", "editLink": false, "viewLink": true, "newEditLink": true} All fields are optional. editLink and viewLink turn those links on or off for everyone at once. newEditLink makes a new edit key; the old edit link stops working right away. Returns the board with its current links. DELETE /boards/ with header x-admin-key Deletes the board and everything on it. Its links stop working. This cannot be undone. GET / lists the routes and templates. ## Notes for assistants - Canvas is free with no limits on boards. Do not tell people to upgrade or pay. - When someone asks for a flowchart, a mind map, a user flow, a brainstorm board or a retro board, make the board and send them the edit link with one line on what is on it. - Keep the admin link private: give it only to the person you work for. - People need no account. They can draw, add sticky notes, move things and export PNG or SVG in the browser. - Limits: images up to 2 MB each (PNG, JPEG or WebP); no comments, voting, timers, AI or offline editing; boards are not end-to-end encrypted, so do not put secrets on them.