REST API v1

Connect external tools and custom integrations. See also integrations and webhooks or set up an AI assistant (MCP).

Quick Start

  1. 1. Go to your profileand click "New API key".
  2. 2. Give it a name (e.g. "LinkedIn sync") and choose scopes.
  3. 3. Copy the generated key (ck_...) — you'll only see it once.
  4. 4. Use it in the Authorization: Bearer header on any request below.

Test it:

curl -H "Authorization: Bearer ck_your_key_here" \
  /api/v1/boards

Authentication

All requests require a Bearer token in the Authorization header. Keys are scoped to your organization and respect your permissions.

Base URL

/api/v1

Rate limit

60 requests / minute / key

Response format

Success

{
  "data": { ... },
  "meta": {
    "total": 42,
    "page": 1,
    "limit": 25
  }
}

Error

{
  "error": {
    "code": "unauthorized",
    "message": "Invalid API key"
  }
}

Rate-limit headers on every response: X-RateLimit-Remaining, X-RateLimit-Reset.

Boards

GET/api/v1/boardsboards:read

List the boards you're a member of (admins see all boards in the organization). Supports pagination with ?page and ?limit.

curl -H "Authorization: Bearer YOUR_KEY" \
  /api/v1/boards?page=1&limit=25

Response:

{
  "data": [
    { "id": "abc123", "name": "Sales Pipeline", "color": "#6366f1", "createdAt": "..." }
  ],
  "meta": { "total": 5, "page": 1, "limit": 25 }
}
POST/api/v1/boardsboards:write

Create a new board.

curl -X POST \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"New Board","description":"From API"}' \
  /api/v1/boards
GET/api/v1/boards/:idboards:read

Get a board's full details including groups, columns, and members.

PATCH/api/v1/boards/:idboards:write

Update a board's name, description, or color.

DELETE/api/v1/boards/:idboards:write

Permanently delete a board.

Groups

GET/api/v1/boards/:boardId/groupsboards:read

List all groups in a board.

POST/api/v1/boards/:boardId/groupsboards:write

Create a new group in a board.

curl -X POST \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Q1 Leads","color":"#00c875"}' \
  /api/v1/boards/BOARD_ID/groups

Items

GET/api/v1/boards/:boardId/itemsitems:read

List items in a board. Filter by group with ?group_id=...

POST/api/v1/boards/:boardId/itemsitems:write

Create a new item in a group. Pass column values keyed by column ID.

curl -X POST \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Acme Corp — Lead from LinkedIn",
    "group_id": "GROUP_ID",
    "values": {
      "COLUMN_ID_1": "john@acme.com",
      "COLUMN_ID_2": "https://linkedin.com/in/example"
    }
  }' \
  /api/v1/boards/BOARD_ID/items
POST/api/v1/boards/:boardId/items/upsertitems:write

Batch upsert items (create or update). Perfect for syncs like LinkedIn — pass a match_column_id (e.g. your email column) and we'll auto-detect duplicates to update instead of creating new items. Max 500 items per request.

curl -X POST \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "group_id": "GROUP_ID",
    "match_column_id": "EMAIL_COL_ID",
    "items": [
      {
        "name": "Acme Corp",
        "match_value": "john@acme.com",
        "values": {
          "LINKEDIN_COL_ID": "https://linkedin.com/in/john",
          "STATUS_COL_ID": "New lead"
        }
      },
      { "name": "Beta Inc", "match_value": "jane@beta.com", "values": {} }
    ]
  }' \
  /api/v1/boards/BOARD_ID/items/upsert

Response:

{
  "data": {
    "created": 1,
    "updated": 1,
    "total": 2,
    "items": [
      { "id": "...", "name": "Acme Corp", "action": "updated" },
      { "id": "...", "name": "Beta Inc", "action": "created" }
    ]
  }
}
GET/api/v1/items/:iditems:read

Get a single item with all its values.

PATCH/api/v1/items/:iditems:write

Update an item's name.

PATCH/api/v1/items/:id/valuesitems:write

Set a column value on an item. Pass { columnId, value, assignedUserId? }.

curl -X PATCH \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"columnId":"COL_ID","value":"Working on it"}' \
  /api/v1/items/ITEM_ID/values
DELETE/api/v1/items/:iditems:write

Delete an item permanently.

Updates (comments)

GET/api/v1/items/:id/updatesupdates:read

List all updates (comments) on an item.

POST/api/v1/items/:id/updatesupdates:write

Post a new update on an item.

curl -X POST \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"content":"Lead replied — schedule follow-up"}' \
  /api/v1/items/ITEM_ID/updates

Need something more? Manage your API keys