Developers
A REST API and an MCP server for your hubs, stacks, and tiles. Build automations, save links from anywhere, or let Claude manage your Zentile for you.
API access is included in the Max plan. Create a key in Settings → Billing → API keys. Each key is shown once at creation — store it somewhere safe. Keys look likeznt_a1b2c3… and can be revoked at any time.
Every request authenticates with a Bearer header:
Authorization: Bearer znt_your_api_key
Quick test
curl https://zentile.app/api/v1/me \
-H "Authorization: Bearer znt_your_api_key"
# → { "userId": "…", "plan": "max" }https://zentile.app/api/v1Content-Type: application/json on writes.{ "error": "message" } with a matching status code (400, 401, 403, 404, 500).sort_order./api/v1/meWho am I? Returns the user id and plan behind the API key.
Response
{ "userId": "uuid", "plan": "max" }/api/v1/workspacesList your workspaces.
Response
{ "workspaces": [ { "id": "uuid", "name": "Personal", "ico": "🏠", "sort_order": 0, "created_at": "…" } ] }/api/v1/hubs?workspaceId=…List hubs. workspaceId is optional — omit it to list every hub you own.
Response
{ "hubs": [ { "id": "uuid", "workspace_id": "uuid", "name": "Research", "ico": "🔬",
"description": null, "public_slug": null, "sort_order": 0, "created_at": "…" } ] }/api/v1/hubsCreate a hub inside a workspace. ico and description are optional.
Request body
{ "workspaceId": "uuid", "name": "Research", "ico": "🔬", "description": "Papers & tools" }Response
201 → { "hub": { "id": "uuid", "name": "Research", … } }/api/v1/hubs/:idOne hub in full — the hub plus its stacks, each stack carrying its tiles.
Response
{ "hub": { "id": "uuid", "name": "Research", …,
"stacks": [ { "id": "uuid", "name": "Papers", …,
"tiles": [ { "id": "uuid", "title": "Attention Is All You Need", "url": "…", … } ] } ] } }/api/v1/hubs/:idUpdate a hub. Send any of name, ico, description.
Request body
{ "name": "Deep Research" }Response
{ "hub": { … } }/api/v1/hubs/:idDelete a hub and everything in it.
Response
{ "ok": true }/api/v1/hubs/:id/publishPublish the hub as a public page. Returns the slug and full URL. Already published? You get the existing slug back.
Response
{ "slug": "brilliant-otter-042", "url": "https://zentile.app/h/brilliant-otter-042" }/api/v1/hubs/:id/publishUnpublish the hub — the public page goes away.
Response
{ "ok": true }/api/v1/stacks?hubId=…List stacks, optionally scoped to a hub.
Response
{ "stacks": [ { "id": "uuid", "hub_id": "uuid", "name": "Daily Tools", "accent": "blue", … } ] }/api/v1/stacksCreate a stack inside a hub. The workspace is derived from the hub automatically.
Request body
{ "hubId": "uuid", "name": "Reading List", "accent": "teal" }Response
201 → { "stack": { … } }/api/v1/stacks/:idUpdate a stack. Send any of name, accent, collapsed, sort_order.
Request body
{ "name": "Read Later", "accent": "purple" }Response
{ "stack": { … } }/api/v1/stacks/:idDelete a stack and its tiles.
Response
{ "ok": true }/api/v1/tiles?stackId=…List tiles, optionally scoped to a stack.
Response
{ "tiles": [ { "id": "uuid", "stack_id": "uuid", "title": "Anthropic Docs", "url": "https://docs.anthropic.com", "emoji": "📚", "note": "", "pinned": false, … } ] }/api/v1/tilesAdd a tile (a saved link) to a stack. url, emoji, and note are optional.
Request body
{ "stackId": "uuid", "title": "Anthropic Docs", "url": "https://docs.anthropic.com", "emoji": "📚" }Response
201 → { "tile": { … } }/api/v1/tiles/:idUpdate a tile. Send any of title, url, emoji, note, pinned, sort_order.
Request body
{ "pinned": true }Response
{ "tile": { … } }/api/v1/tiles/:idDelete a tile.
Response
{ "ok": true }/api/v1/search?q=…Search everything you own: tiles matching by title, url, or note (up to 50), plus hubs and stacks matching by name.
Response
{ "query": "anthropic", "tiles": [ … ], "hubs": [ … ], "stacks": [ … ] }Zentile speaks the Model Context Protocol, so AI assistants like Claude can read and manage your hubs directly. Same API key, same permissions as the REST API.
Endpoint
https://zentile.app/api/mcp
One command in your terminal:
claude mcp add --transport http zentile https://zentile.app/api/mcp \ --header "Authorization: Bearer znt_your_api_key"
list_workspaces— list your workspaceslist_hubs— list hubs, optionally by workspaceget_hub— one hub with all its stacks and tilescreate_hub— create a hub in a workspacecreate_stack— create a stack in a hubadd_tile— save a link into a stacksearch— search tiles, hubs, and stackspublish_hub— publish a hub and get its public URL