EnoughStack
Tasks

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.

Base URL and authentication
https://enoughstack-app-7r9ib.ondigitalocean.app/api/public/v1
Authorization: Bearer ms_live_…   # create a key under API keys
Find the board and its lists
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" }, ...] }
Create a card from a support ticket
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.

Manage API keys

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 docs

Conventions

Errors
Always {"error": {"code", "message"}}. Codes include unauthenticated, insufficient_scope, not_found, validation_error.
Pagination
Lists return paging.next; pass it back as starting_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"]
  }
}