Boards API
REST API reference for boards, lists, labels, and the activity log. For the product overview and UI walkthrough, see Boards.
Boards, lists, labels, and the activity log are all available via the Flokan public API, so you can manage your kanban from your own scripts, n8n flows, or any HTTP client.
Authentication
All requests require a workspace API key minted in Workspace Settings → API Keys. Pass the key in the Authorization header:
Authorization: Bearer flk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxThe key must include the boards scope, and the workspace's plan must include the Boards & Sheets feature.
Base URL
https://app.flokan.com/api/v1Resolving boards by short ID
Every endpoint that accepts a :boardId in the path also accepts the board's short ID (e.g. MKT-7) in place of the UUID. The API resolves both, so the same URL works for human-readable links and machine-generated UUIDs.
Boards
GET /boards — List boards
Query params
| Param | Type | Notes |
|---|---|---|
page | integer | Default 1 |
per_page | integer | Default 50, max 100 |
type | string | kanban or spreadsheet |
search | string | Case-insensitive name match |
Response 200
{
"success": true,
"data": [
{
"id": "f24a8c52-...",
"short_id": "MKT-1",
"name": "Marketing Pipeline",
"type": "kanban",
"workspace_id": "...",
"background_image": null,
"background_color": "#0F172A",
"profile_image": null,
"activity_enabled": true,
"linked_files_enabled": true,
"description": "Q2 launch board",
"position": 0,
"created_by": "...",
"created_at": "2026-04-12T09:00:00.000Z",
"updated_at": "2026-04-12T09:00:00.000Z"
}
],
"meta": { "page": 1, "per_page": 50, "total": 1, "total_pages": 1 }
}POST /boards — Create a board
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
name | string | yes | 1–200 characters |
type | string | no | kanban (default) or spreadsheet |
description | string | no | Up to 5000 characters |
background_image | string | no | URL up to 2000 characters |
background_color | string | no | Up to 50 characters |
profile_image | string | no | URL up to 2000 characters |
activity_enabled | boolean | no | Default true |
linked_files_enabled | boolean | no | Default true |
The user who created the API key is automatically added as a board member.
Response 201 — same shape as the list item above.
GET /boards/:boardId — Get a board
Returns the board record plus aggregate counts:
{
"success": true,
"data": {
"id": "f24a8c52-...",
"short_id": "MKT-1",
"name": "Marketing Pipeline",
"list_count": 5,
"member_count": 4,
"card_count": 23
}
}PUT /boards/:boardId — Update a board
Request body — all fields optional. Allowed: name, description, background_image, background_color, profile_image, activity_enabled, linked_files_enabled, position.
DELETE /boards/:boardId — Delete a board
Soft-deletes the board (and cascades archives its lists/cards) via a safe RPC.
{ "success": true, "data": { "id": "...", "deleted": true } }Lists
GET /boards/:boardId/lists — List the columns of a board
Each list includes a card_count (non-archived cards). Sorted by column_index then position.
POST /boards/:boardId/lists — Create a list
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
title | string | yes | 1–500 characters |
column_index | integer | no | 0–999999. Omit to let the server pick the next column. |
background_color | string | no | Up to 50 characters |
GET /boards/:boardId/lists/:listId — Get one list
Returns the list with card_count.
PUT /boards/:boardId/lists/:listId — Update a list
Allowed fields: title, position, column_index, background_color.
DELETE /boards/:boardId/lists/:listId — Delete a list
Cascades to all cards in the list.
PUT /boards/:boardId/lists/reorder — Bulk reorder lists in a column
Request body
{ "list_ids": ["uuid1", "uuid2", "uuid3"] }All list_ids must share the same column_index. To move a list between columns, use PUT /lists/:listId first. Returns all lists on the board after the reorder.
Labels
GET /boards/:boardId/labels — List labels
POST /boards/:boardId/labels — Create a label
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
name | string | yes | 1–100 characters, unique per board |
color | string | yes | 1–50 characters (hex or named) |
Returns 409 if a label with the same name already exists on the board.
PUT /boards/:boardId/labels/:labelId — Rename or recolor a label
DELETE /boards/:boardId/labels/:labelId — Delete a label
Also unassigns the label from every card it was attached to.
Activity
GET /boards/:boardId/activity — Read the activity log
Query params
| Param | Type | Notes |
|---|---|---|
limit | integer | Default 50, max 100 |
offset | integer | Default 0 |
card_id | uuid | Filter to one card |
Each entry contains action_type, details, user_id, and created_at.
Errors
All error responses use the envelope { "success": false, "error": "..." }. Common status codes:
| Code | Meaning |
|---|---|
400 | Validation error (bad UUID, missing required field, list spans multiple columns on reorder, …) |
401 | Missing or invalid API key |
403 | Missing boards scope or feature not enabled on the workspace plan |
404 | Board, list, or label not found in this workspace |
409 | Duplicate label name on the same board |
429 | Rate limit exceeded — see Retry-After header and X-RateLimit-* headers |
500 | Unexpected server error |
Rate limits
Every response carries X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers. The per-minute limit is determined by the workspace's billing plan.