Turn plans into shipped work with boards, tasks and due dates.
Tasks API
Boards, lists and cards from your own code: open a card when a customer reports something, move it when it ships, and listen for card events with webhooks.
Getting started
Open a card when something comes in, move it when it ships, and let webhooks tell your code what changed.
https://enoughstack-app-7r9ib.ondigitalocean.app/api/public/v1 Authorization: Bearer ms_live_… # create a key under API keys
curl https://enoughstack-app-7r9ib.ondigitalocean.app/api/public/v1/boards/brd_0001 \
-H "Authorization: Bearer $ENOUGHSTACK_API_KEY"
{ "id": "brd_0001", "name": "Framecast 2.1",
"lists": [{ "id": "lis_0001", "name": "Backlog", ... }, ...],
"labels": [{ "id": "lbl_0001", "name": "Bug", "color": "red" }, ...] }curl -X POST https://enoughstack-app-7r9ib.ondigitalocean.app/api/public/v1/boards/brd_0001/cards \
-H "Authorization: Bearer $ENOUGHSTACK_API_KEY" \
-H "Content-Type: application/json" \
-d '{"list_id": "lis_0001", "name": "Export fails for Northwind",
"label_ids": ["lbl_0001"], "due_at": "2026-10-20T17:00:00Z"}'Requests act as the workspace owner, so every board is reachable. Move the card with POST /cards/{card_id}/move and mark it done with PATCH {"completed": true}; a list set to complete cards does that on its own.
Boards
- GET
/boardsYour open boards; add ?archived=true for closed onesread - GET
/boards/{board_id}One board with its lists and labelsread - GET
/boards/{board_id}/cardsOpen cards; filter by list_id, member_id or completedread
Cards
- POST
/boards/{board_id}/cardsCreate a card in a listwrite - GET
/cards/{card_id}One cardread - PATCH
/cards/{card_id}Change its name, dates, labels, members, status or completionwrite - POST
/cards/{card_id}/moveMove it to a list, top or bottomwrite
API keys
Every request carries a key with the read or write scope. Keys are created under Developers and shown once.
Interactive docs
Every endpoint with request and response schemas, generated from the API itself. Use “Authorize” with one of your keys to try requests.
Open API docsConventions
- Errors
- Always
{"error": {"code", "message"}}. Codes includeunauthenticated,insufficient_scope,not_found,validation_error. - Pagination
- Lists return
paging.next; pass it back asstarting_after. Up to 100 items per page. - Webhooks
- Each delivery carries
X-EnoughStack-Signature: sha256=…, an HMAC of the raw body with the endpoint secret. Respond 2xx within 10 seconds. - Versioning
- The version is in the path (
/v1). Fields are only ever added.
Webhook payload
POST https://your-app.example/hooks
X-EnoughStack-Signature: sha256=…
{
"event": "contact.created",
"created_at": "2026-10-06T09:14:02Z",
"data": {
"id": "ct_0231",
"list_id": "lst_audience",
"email_address": "maya@northwind.studio",
"status": "subscribed",
"tags": ["customer", "team"]
}
}