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.
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"}'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"}'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
| Method | Path | What it does |
|---|---|---|
POST | /panes | Create a pane |
GET | /panes | List your panes |
GET | /panes/:id | Get a pane |
PATCH | /panes/:id | Update a pane |
DELETE | /panes/:id | Delete a pane |
GET | /panes/:id/shares | Who a pane is shared with |
POST | /panes/:id/shares | Ask to share a pane |
DELETE | /panes/:id/shares/:email | Take someone off a pane |
GET | /shared | Panes shared with you |
GET | /health | Check the API is up |
The pane object
id | The pane's id: the last part of its link. |
|---|---|
title | 1 to 200 characters. |
type | html, react or markdown. |
content | The full source, up to 1 MB. Left out of lists. |
visibility | private, unlisted or public. |
version | Goes up by one with each change to the content. |
createdAt, updatedAt | ISO 8601 timestamps. |
url | The share link. |
embedUrl | The 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.
{
"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.
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.
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:
400 | The body is missing or invalid, such as a title that's too long. |
|---|---|
401 | The key is missing, wrong or revoked. |
403 | You can open the pane but not do this, such as a viewer changing it or an editor deleting it. |
404 | No 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.