Developers
Developer platform
Tylode has a public REST API, OAuth for third-party apps, outgoing webhooks, an MCP server for AI assistants and in-app plugins. Use them to automate your workspace, connect it to the tools you already use, or build something new on top of your pages, boards, calendar and chats.
What you can build
- Scripts and integrations with the REST API. Read, create, change and delete pages, cards, calendar events, database rows, chat messages, internal mail, My drive files and more, from any language that can send an HTTP request.
- OAuth apps. Let other Tylode users connect your app to their account with limited permissions, instead of asking them for a token that can do everything.
- Webhooks. Get a signed HTTP request on your server whenever a page is created, a card moves, someone posts in a group chat and more. They also work directly with Slack.
- AI assistants through MCP. Connect Claude, Cursor, VS Code or any MCP client so the assistant can read and write your Tylode.
- Plugins. Put your own web page inside Tylode, in an isolated frame that can call the API with the permissions the workspace grants it.
Requirements
| Feature | What you need |
|---|---|
| REST API with a personal access token | Your account on Pro or Premium |
| MCP server | Your account on Pro or Premium (it uses a personal access token) |
| OAuth apps | Anyone can register an app; each person who authorizes it must be on Pro or Premium for its calls to work |
| Webhooks | A workspace on Pro or Premium, and admin rights in it |
| Plugins | Admin rights to install them; anyone in the workspace can use them |
The plan is checked on every request, not only when a token is created. If you move to Free, your tokens stay in place but stop working, and they work again as soon as you're back on Pro. See Plans for prices.
Base URL
All REST endpoints live under:
https://app.tylode.com/api/v1The OAuth endpoints (/oauth/authorize and /api/oauth/token) and the MCP server (/api/mcp) are on the same host, outside /api/v1.
Quickstart
Three steps take you from nothing to your first API response. You need an account on Pro or Premium.
1. Create a token
- In Tylode, open Settings → API and webhooks → API and plugins.
- Under Personal access tokens, type a name (for example, "My script") and click Create token.
- Copy the token that appears. It starts with
tylode_pat_and is shown only once.
Keep it in an environment variable rather than in your code:
export TYLODE_TOKEN="tylode_pat_xxx"More details in Authentication.
2. Find your workspace ID
Almost every endpoint asks for a workspace_id. List your workspaces:
curl https://app.tylode.com/api/v1/workspaces \
-H "Authorization: Bearer $TYLODE_TOKEN"{
"data": [
{
"id": "7c1e2a4b-3f5d-4e8a-9b21-6d0f5c8e1a37",
"name": "Acme",
"slug": "acme",
"plan": "pro",
"role": "owner",
"frozen": false
}
]
}Copy the id of the workspace you want. You can also find it in the app under Settings → Workspace → Workspace details → Workspace ID → Copy.
3. List your pages
curl "https://app.tylode.com/api/v1/pages?workspace_id=7c1e2a4b-3f5d-4e8a-9b21-6d0f5c8e1a37" \
-H "Authorization: Bearer $TYLODE_TOKEN"{
"data": [
{
"id": "2b9d6f1e-8a4c-4f3b-b7e2-51c0d9a8e6f4",
"workspace_id": "7c1e2a4b-3f5d-4e8a-9b21-6d0f5c8e1a37",
"parent_page_id": null,
"title": "Product roadmap",
"icon": "🗺️",
"position": 0
}
]
}The same calls in JavaScript (Node.js 18 or later):
const BASE = "https://app.tylode.com/api/v1";
const headers = { Authorization: `Bearer ${process.env.TYLODE_TOKEN}` };
const { data: workspaces } = await (await fetch(`${BASE}/workspaces`, { headers })).json();
const workspaceId = workspaces[0].id;
const { data: pages } = await (
await fetch(`${BASE}/pages?workspace_id=${workspaceId}`, { headers })
).json();
console.log(pages.map((p) => p.title));From here, create a page with POST /pages (see the Pages API) or jump to the recipes.
Conventions
- JSON in, JSON out. Send bodies as JSON with
Content-Type: application/json. - Successful responses wrap the result in
{ "data": … }. Errors return{ "error": "message" }with a meaningful HTTP status code. See Errors and conventions. - IDs are UUIDs, like
2b9d6f1e-8a4c-4f3b-b7e2-51c0d9a8e6f4. - Timestamps are ISO 8601 in UTC, like
2026-09-23T08:30:00+00:00. - Every request acts as you. The API sees exactly what you can see in the app, with the same permissions. If you can't open a page in Tylode, the API can't read it either, and things you can't see simply don't appear in lists.
- Creating returns
201, everything else that succeeds returns200.
List your workspaces
GET /api/v1/workspaces
Returns the workspaces you belong to, oldest membership first. It's the first call in any integration, because you need a workspace ID for almost everything else.
Scope: none needed. Any OAuth app you've authorized can call it, whatever permissions it was granted, because it only tells the app which workspaces you're in.
Parameters: none.
Response fields
| Field | Type | Description |
|---|---|---|
id | string (UUID) | Workspace ID. Use it as workspace_id in other calls. |
name | string | Workspace name. |
slug | string | Short name of the workspace. |
plan | string | The workspace's plan: free, pro or premium. |
role | string | Your role in it: owner, admin, member or viewer (read-only). |
frozen | boolean | true if the workspace is frozen for you: you can read everything but can't create or edit. See Workspaces. |
Example
curl https://app.tylode.com/api/v1/workspaces \
-H "Authorization: Bearer tylode_pat_xxx"const res = await fetch("https://app.tylode.com/api/v1/workspaces", {
headers: { Authorization: "Bearer tylode_pat_xxx" },
});
const { data } = await res.json();{
"data": [
{
"id": "7c1e2a4b-3f5d-4e8a-9b21-6d0f5c8e1a37",
"name": "Acme",
"slug": "acme",
"plan": "pro",
"role": "owner",
"frozen": false
},
{
"id": "e4a8c2d6-1b3f-4a5e-8c7d-9f0b2e4d6a81",
"name": "Freelance clients",
"slug": "freelance-clients",
"plan": "free",
"role": "member",
"frozen": true
}
]
}Errors: 401 if the token is missing or wrong, 403 if the token's owner isn't on Pro, 429 if you go over the rate limit.
Endpoint index
All paths are relative to https://app.tylode.com/api/v1. The scope column matters only for OAuth apps and plugins; personal access tokens can call everything.
| Method | Path | What it does | Scope | Reference |
|---|---|---|---|---|
| GET | /workspaces | List your workspaces | none | Above |
| GET | /pages | List pages in a workspace | pages:read | Pages |
| POST | /pages | Create a page | pages:write | Pages |
| GET | /pages/:id | Get a page with its content | pages:read | Pages |
| PATCH | /pages/:id | Update title and/or content | pages:write | Pages |
| DELETE | /pages/:id | Move a page to the trash | pages:delete | Pages |
| GET | /databases | List databases and their columns | databases:read | Databases |
| GET | /databases/:id/rows | List rows | databases:read | Databases |
| POST | /databases/:id/rows | Add a row | databases:write | Databases |
| PATCH | /databases/:id/rows/:rowId | Change cells in a row | databases:write | Databases |
| DELETE | /databases/:id/rows/:rowId | Delete a row | databases:delete | Databases |
| GET | /boards | List boards | boards:read | Boards |
| GET | /boards/:id/lists | List a board's lists (columns) | boards:read | Boards |
| GET | /boards/:id/cards | List a board's cards | boards:read | Boards |
| POST | /boards/:id/cards | Create a card | boards:write | Boards |
| PATCH | /boards/:id/cards/:cardId | Change or move a card | boards:write | Boards |
| DELETE | /boards/:id/cards/:cardId | Delete a card | boards:delete | Boards |
| DELETE | /boards/:id | Move a board to the trash | boards:delete | Boards |
| GET | /calendar/events | List events, with recurring ones expanded | calendar:read | Calendar |
| POST | /calendar/events | Create an event | calendar:write | Calendar |
| PATCH | /calendar/events/:id | Change an event | calendar:write | Calendar |
| DELETE | /calendar/events/:id | Delete an event | calendar:delete | Calendar |
| GET | /chats | List your conversations | chats:read | Communication |
| GET | /chats/:id/messages | Read a conversation | chats:read | Communication |
| POST | /chats/:id/messages | Send a message | chats:write | Communication |
| GET | /mail | List internal mail threads | mail:read | Communication |
| POST | /mail | Start a thread | mail:write | Communication |
| GET | /mail/:id | Read a thread | mail:read | Communication |
| POST | /mail/:id | Reply to a thread | mail:write | Communication |
| PATCH | /mail/:id | Mark as read or archive | mail:write | Communication |
| GET | /notifications | List notifications | notifications:read | Communication |
| POST | /notifications | Mark all as read | notifications:write | Communication |
| GET | /whiteboards | List whiteboards | whiteboards:read | Content |
| POST | /whiteboards | Create a whiteboard | whiteboards:write | Content |
| GET | /whiteboards/:id/elements | List a whiteboard's items | whiteboards:read | Content |
| POST | /whiteboards/:id/elements | Add a sticky note, text or shape | whiteboards:write | Content |
| PATCH | /whiteboards/:id/elements/:elementId | Move or change an item | whiteboards:write | Content |
| DELETE | /whiteboards/:id/elements/:elementId | Delete an item | whiteboards:delete | Content |
| DELETE | /whiteboards/:id | Move a whiteboard to the trash | whiteboards:delete | Content |
| GET | /presentations | List your presentations | presentations:read | Content |
| POST | /presentations | Create a presentation | presentations:write | Content |
| GET | /presentations/:id/slides | List slides | presentations:read | Content |
| POST | /presentations/:id/slides | Add a blank slide | presentations:write | Content |
| GET | /presentations/:id/slides/:slideId/elements | List a slide's elements | presentations:read | Content |
| POST | /presentations/:id/slides/:slideId/elements | Add text or a shape to a slide | presentations:write | Content |
| PATCH | /presentations/:id/slides/:slideId/elements/:elementId | Move or change a slide element | presentations:write | Content |
| DELETE | /presentations/:id/slides/:slideId/elements/:elementId | Delete a slide element | presentations:delete | Content |
| DELETE | /presentations/:id/slides/:slideId | Delete a slide | presentations:delete | Content |
| DELETE | /presentations/:id | Move a presentation to the trash | presentations:delete | Content |
| GET | /search | Search the workspace | search:read | Content |
| GET | /storage | List folders and files in My drive | storage:read | Content |
| POST | /storage | Upload a file to My drive | storage:write | Content |
| GET | /storage/:id | Get a file and a download link | storage:read | Content |
| DELETE | /storage/:id | Move a My drive file to the trash | storage:delete | Content |
Related pages
- Authentication: tokens, headers and rate limits.
- Errors and conventions: status codes and limits.
- MCP server: use Tylode from an AI assistant without writing code.