Docs

REST API

Everything the MCP tools do, over HTTPS, for scripts and your own apps. It takes the same personal API key.

Quick start

Create a pane. The answer is the new pane, with its link in url.

Terminalcurl
curl -s https://openpane.oblaidish.com/api/v1/panes -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" -d '{"title":"Hello","type":"markdown","content":"# Hello from Openpane"}'
TerminalPowerShell
Invoke-RestMethod -Method Post -Uri https://openpane.oblaidish.com/api/v1/panes -Headers @{ Authorization = "Bearer YOUR_API_KEY" } -ContentType "application/json" -Body '{"title":"Hello","type":"markdown","content":"# Hello from Openpane"}'
app.jsJavaScript
const res = await fetch("https://openpane.oblaidish.com/api/v1/panes", {
  method: "POST",
  headers: { Authorization: "Bearer YOUR_API_KEY", "Content-Type": "application/json" },
  body: JSON.stringify({ title: "Hello", type: "markdown", content: "# Hello from Openpane" }),
});
console.log((await res.json()).url);

Base URL and keys

Every path below is under https://openpane.oblaidish.com/api/v1. Send your key with each request, as Authorization: Bearer YOUR_API_KEY. Make keys on the API keys page. Getting an unlisted or public pane needs no key.

Call the API from a server or a script. It doesn't answer cross-origin requests from browsers, and a key in a web page would be anyone's.

Endpoints

MethodPathWhat it does
POST/panesCreate a pane
GET/panesList your panes
GET/panes/:idGet a pane
PATCH/panes/:idUpdate a pane
DELETE/panes/:idDelete a pane
GET/panes/:id/sharesWho a pane is shared with
POST/panes/:id/sharesAsk to share a pane
DELETE/panes/:id/shares/:emailTake someone off a pane
GET/sharedPanes shared with you
GET/healthCheck the API is up

The pane object

idThe pane's id: the last part of its link.
title1 to 200 characters.
typehtml, react or markdown.
contentThe full source, up to 1 MB. Left out of lists.
visibilityprivate, unlisted or public.
versionGoes up by one with each change to the content.
createdAt, updatedAtISO 8601 timestamps.
urlThe share link.
embedUrlThe pane alone, for other sites, while it's unlisted or public.

Panes

POST /panes

Body: title, type and content, and optionally visibility, which defaults to private. Answers 201 with the pane.

Response201 Created
{
  "id": "k7m2xq9fha",
  "title": "Hello",
  "type": "markdown",
  "content": "# Hello from Openpane",
  "visibility": "private",
  "version": 1,
  "createdAt": "2026-11-04T09:30:00.123456+00:00",
  "updatedAt": "2026-11-04T09:30:00.123456+00:00",
  "url": "https://openpane.oblaidish.com/p/k7m2xq9fha",
  "embedUrl": "https://openpane.oblaidish.com/p/k7m2xq9fha/embed"
}

GET /panes

Your panes, most recently updated first, without their content: { "panes": [...] }. Each has sharedWith, how many people and companies it's shared with. ?limit= takes 1 to 200 (50 if you leave it out).

GET /panes/:id

One pane, with its content. Private panes answer only their owner and the people they're shared with; everyone else gets 404.

PATCH /panes/:id

Send any of title, type, content and visibility; the rest stay as they are. Changing the content saves a new version. Editors change everything but visibility. Answers with the pane.

Terminalcurl
curl -s -X PATCH https://openpane.oblaidish.com/api/v1/panes/PANE_ID \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"content":"# Hello again"}'

DELETE /panes/:id

Deletes the pane for good (owners only). Answers 204, and its link and embeds stop working.

Sharing

GET /panes/:id/shares

Owners only: shares, each with email, role, createdAt, expiresAt and, on Pro, openedAt; and pending, the shares waiting for your approval.

POST /panes/:id/shares

Body: emails (up to 10 at a time on Free and 50 on Pro; @acme.com for everyone at a company, on Pro), and optionally role (viewer, or editor on Pro), notify (default true) and expiresAt (ISO 8601, within a year, on Pro). Nothing is shared yet: it answers 202 with an approvalUrl, and you approve it on the pane's Share page. See When your AI shares.

Terminalcurl
curl -s -X POST https://openpane.oblaidish.com/api/v1/panes/PANE_ID/shares \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"emails":["sam@example.com"]}'

DELETE /panes/:id/shares/:email

Takes someone off, or a company (@acme.com), with no approval needed. Encode the address in the path. Answers 204.

GET /shared

An array of the panes other people shared with you, newest first, each with sharedBy, sharedAt, role and expiresAt. ?limit= works as for /panes.

Errors

Errors answer with { "error": "..." } and a status:

400The body is missing or invalid, such as a title that's too long.
401The key is missing, wrong or revoked.
403You can open the pane but not do this, such as a viewer changing it or an editor deleting it.
404No such pane, or a private one you can't open.

GET /health

Answers { "ok": true } while the API is up. It needs no key.

JavaScript SDK

A typed client, OpenpaneClient, isn't on npm yet. Until it is, any HTTP client works with the endpoints above.

REST API reference · Openpane docs