docs / Developers
Public API
Build your own integrations against Coalface Tasks — org-scoped bearer keys, per-key scopes and signed webhooks.
The public API is the same surface our own integrations are built on. Use it to read and write your workspace’s data — boards, tasks, subtasks, notes and more — from your own code.
Base URL: https://app.coalfacetasks.com/api/public/v1
Format: JSON in, JSON out, UTF-8. All times are ISO-8601 UTC.
Versioning: the major version is in the path (/v1). Additive changes (new fields, new endpoints) won’t break you; breaking changes ship under a new version.
Authentication
Every request carries an API key as a bearer token:
Authorization: Bearer ctk_a1b2c3d4_<48-hex-secret>
Create keys in Settings → API. A key:
- belongs to one workspace — it can only ever touch that workspace’s data;
- carries a set of scopes — see below;
- is shown once, at creation. We store only a hash of it. Lose it and you revoke and mint a new one.
The workspace is resolved from the key, so it’s never in the URL. Revoked keys stop working immediately.
Scopes
Scopes are <resource>:<read|write>. write covers create, update and delete — it does not imply read. Grant a key the least it needs.
| Resource | Scopes |
|---|---|
| Boards | boards:read, boards:write |
| Columns | columns:read, columns:write |
| Tasks | tasks:read, tasks:write |
| Subtasks | subtasks:read, subtasks:write |
| Notes | notes:read, notes:write |
| Members | members:read, members:write |
| Labels | labels:read, labels:write |
| Webhooks | webhooks:read, webhooks:write |
Responses
Success returns { "data": ... }. List endpoints add a pagination block.
{ "data": { "id": "…", "title": "Ship v1" } }
Errors return { "error": { "code": "…", "message": "…" } } with a stable code:
| Status | code |
Meaning |
|---|---|---|
| 400 | validation_error |
Malformed body or an invalid field |
| 401 | unauthorized |
Missing, malformed, unknown or revoked key |
| 403 | forbidden |
Valid key, but missing the required scope |
A first request
List your tasks:
curl https://app.coalfacetasks.com/api/public/v1/tasks \
-H "Authorization: Bearer ctk_a1b2c3d4_<secret>"
Create one:
curl -X POST https://app.coalfacetasks.com/api/public/v1/tasks \
-H "Authorization: Bearer ctk_a1b2c3d4_<secret>" \
-H "Content-Type: application/json" \
-d '{ "board_id": "…", "title": "Written from the API" }'
Webhooks
Rather than poll, subscribe to webhooks and we’ll push events to your endpoint: task.created, task.updated, task.completed, task.deleted, task.assigned and note.added.
Each delivery is signed — an X-CFT-Signature header over the payload and a timestamp — so you can verify it came from us. Manage subscriptions in Settings → API.
Connecting Zapier
Zapier is just a consumer of this API. Use a key with the scopes your Zap needs, and subscribe to webhooks for the events you want to trigger on — there’s a Set up for Zapier preset in the API settings that pre-fills the common events.
Using AI clients (MCP)
If you want your own AI client — Claude, Cursor and others — to read and update tasks, the MCP server runs on top of this same API and uses these same keys and scopes.
The short version: mint a scoped key in Settings → API, send it as a bearer token, and read or write your workspace’s data. Subscribe to signed webhooks for push updates.
last updated 27 July 2026