Plan · Boards
Boards and their workflow states, the one-call board snapshot, the delta feed, members, labels and saved views. Part of the Dailybot Plan API (Beta).
On this page
Beta
Plan is in beta. Everything under /plan in the web app, the CLI and agent skill commands for projects, goals, boards and tasks, and the /v1/plan/ public API may change before general availability. Want to try it with your team? Write to [email protected].
List boards
The boards you can see, as a page. Filter by project, search with search, by dates with start_date / end_date, and bring archived boards with include_archived. An agent or organization key sees organization-visible boards only; a personal key sees what its person sees.
Query parameters
Pagination
| Name | Type | Required | Description |
|---|---|---|---|
| page | integer | Optional | 1-based page number. |
| page_size | integer | Optional | Rows per page. Default 50, maximum 100. Out-of-range values are clamped, never rejected: asking for 500 returns 100. |
| limit | integer | Optional | Alias for page_size, translated server-side. |
| offset | integer | Optional | Alias translated to page server-side. |
Filters
| Name | Type | Required | Description |
|---|---|---|---|
| search | string | Optional | Matches title and key. Longer than 256 characters is 400 search_query_too_long, not truncated. q is an alias. |
| project | array | Optional | Project uuids. Repeatable; values are OR-ed. |
Dates
| Name | Type | Required | Description |
|---|---|---|---|
| start_date | string | Optional | Created-at window start. What the CLI's --since produces. |
| end_date | string | Optional | Created-at window end. What the CLI's --until produces. |
Archived rows
| Name | Type | Required | Description |
|---|---|---|---|
| is_archived | boolean | Optional | true returns only archived rows; false (the default) only live ones. Archive is the delete, so archived rows stay readable. |
| include_archived | boolean | Optional | Include archived rows alongside live ones. Distinct from is_archived, which selects one set or the other: include_archived=true is the union. Lists return live rows unless you opt in. |
Board object
| Name | Type | Required | Description |
|---|---|---|---|
| uuid | uuid | Required | Stable public identifier. |
| key | string | Required | The board's key: the prefix of its tasks' keys. Renaming it keeps the old key reserved and resolving. |
| name | string | Required | Display name. Max 120 characters. |
| project | Project | Optional | The project. See Project. |
| team | uuid | null | Optional | The team. |
| visibility | enum | Required | org (everyone in the organization) or members (explicit members only). One of org, members. |
| effective_visibility | string | Optional | Whether the board is effectively visible to the whole organization (org) or only to members (members). A board inside a members project is members here, while visibility stays the board's own stored setting. |
| estimate_scale | enum | Optional | How estimates are expressed on this board. One of none, fibonacci, linear. |
| default_view | SavedView | null | Optional | The board's default saved view, or null. See SavedView. |
| archive_after_days | integer | null | Optional | Archive done tasks automatically after this many days, or null to keep them. |
| task_count | integer | Optional | Number of live tasks. |
| wip_limits | object | Optional | Work-in-progress limits per column. |
| is_archived | boolean | Optional | Whether the row is archived. Archive is the delete: archived rows stay readable and restorable. |
| created_at | date-time | Optional | When the row was created. |
| updated_at | date-time | Optional | When the row last changed. |
| viewer | object | Optional | What you can do with this row. Shape: {is_member, can_see_content, can_manage: boolean} (all required). |
| states | array<WorkflowState> | Optional | The board's workflow states, in column order. See WorkflowState. |
Project object
| Name | Type | Required | Description |
|---|---|---|---|
| uuid | uuid | Required | Stable public identifier. |
| name | string | Required | Display name. Max 120 characters. |
| slug | string | Optional | URL-friendly name. Max 48 characters. |
| description | string | null | Optional | Free-form description. |
| lead | UserRef | null | Optional | The project's lead. See UserRef. |
| goals | array | Optional | Goals this project points at. A project can serve several goals. Always present: uuid. Items: {uuid, name}. |
| goal | object | Optional | The goal, when there is exactly one. Shape: {uuid, name}|null. |
| board_count | integer | Optional | Number of live boards in the project. |
| health | enum | Optional | Declared health. One of not_set, on_track, at_risk, off_track. |
| start_date | date | null | Optional | Planned start date. |
| target_date | date | null | Optional | Planned end date. |
| progress | ProjectProgress | null | Optional | Progress roll-up over the tasks you can see. See ProjectProgress. |
| is_archived | boolean | Required | Whether the row is archived. Archive is the delete: archived rows stay readable and restorable. |
| archived_at | date-time | null | Optional | When the row was archived. |
| created_at | date-time | Optional | When the row was created. |
| updated_at | date-time | Optional | When the row last changed. |
| viewer | object | Optional | What you can do with this row. Shape: {can_see_content: boolean, can_manage: boolean} (both required). |
SavedView object
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | Required | Display name. Max 64 characters. |
| view_mode | enum | Optional | How the filtered set is drawn. Reads always return board for the kanban layout. One of list, board, timeline, calendar. |
| group_by | enum | Optional | The grouping dimension. One of state, owner, priority, category. |
| sort | string | Optional | A sort key, - prefixed for descending. |
| filters | object | Required | The view's filters, in the shared task filter grammar. |
| schema_version | integer | Optional | Version of the view's stored format. |
| visibility | enum | Optional | personal (default) is yours alone. shared and board_default (the default view for that board or project) are readable by everyone who can see the board or project. Setting them needs a board manager on board views, and project oversight (an organization admin or a manager of all teams) on project views; otherwise 403 view_visibility_forbidden. One of personal, shared, board_default. |
| collapsed | object | array | string | number | boolean | Optional | Client UI state stored verbatim (which groups are collapsed). Only size and depth are validated. |
| columns | object | array | string | number | boolean | Optional | Client UI state stored verbatim (which columns are shown). Only size and depth are validated. |
| uuid | uuid | Optional | Stable public identifier. |
| scope | enum | Optional | Which container the view belongs to: board or project. Read-only. One of board, project. |
| board | uuid | null | Optional | The board's uuid when scope is board; null for a project view. Read-only. |
| owner | object | Optional | Who owns the view. Shape: {uuid, name}. |
| created_at | date-time | Optional | When the row was created. |
| updated_at | date-time | Optional | When the row last changed. |
WorkflowState object
| Name | Type | Required | Description |
|---|---|---|---|
| uuid | uuid | Required | Stable public identifier. |
| name | string | Required | Display name. Max 48 characters. |
| category | enum | Required | One of the five fixed categories. It never changes after create. One of backlog, todo, in_progress, done, canceled. |
| position | integer | Required | Column position, left to right. Minimum 0. |
| color | string | Optional | Display color (hex). |
| is_default | boolean | Optional | Whether new tasks land in this state by default. |
| is_archived | boolean | Optional | Whether the row is archived. Archive is the delete: archived rows stay readable and restorable. |
| task_count | integer | Optional | Number of live tasks. |
UserRef object
ProjectProgress object
| Name | Type | Required | Description |
|---|---|---|---|
| total | integer | Required | All tasks counted. |
| completed | integer | Required | Tasks in a done or canceled state. |
| open | integer | Optional | Tasks in a backlog, todo or in_progress state. |
| blocked | integer | Optional | Tasks with a live blocker. |
| overdue | integer | Optional | Open tasks past their due date. |
| percent_complete | integer | Required | completed as a percentage of total. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| count | integer | Required | Total number of rows. |
| next | uri | Required | URL of the next page, or null. |
| previous | uri | Required | URL of the previous page, or null. |
| results | array<Board> | Required | The rows on this page. See Board. |
Errors
| Status | When |
|---|---|
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
curl -sS "https://api.dailybot.com/v1/plan/boards/" \
-H "X-API-KEY: $DAILYBOT_API_KEY"dailybot plan board list --json{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"uuid": "00000000-0000-4000-8000-000000000002",
"key": "ENG",
"name": "Engineering",
"project": {
"uuid": "00000000-0000-4000-8000-000000000001",
"name": "Platform",
"is_archived": false
},
"team": null,
"visibility": "org",
"estimate_scale": "fibonacci",
"default_view": null,
"archive_after_days": null,
"task_count": 12,
"wip_limits": {},
"is_archived": false,
"created_at": "2026-09-25T10:14:02Z",
"updated_at": "2026-09-25T10:14:02Z",
"viewer": {},
"states": []
}
]
}Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:read`.
- Rate limit: 120 reads per minute per actor.
- Works with a login session, a CLI user token, a personal API key, or an agent or organization key. A personal key sees what its person sees; an agent or organization key acts as a system actor and sees organization-visible boards only.
Create a board and seed its five default states
Creates a board inside a project and seeds its five default workflow states. The board key prefixes every task key (ENG-142) and must be unique (409 duplicate_board_key). Every non-guest member can call it (with a login session or a personal API key); an agent or organization key cannot. The plan's board limit answers 402 task_boards_limit_reached.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | Optional | A key you generate for this intent. A replay with the same key and body returns the first response without a second side effect and carries Idempotency-Replayed: true. Keys are kept for 24 hours. The same key with a different body is 409 idempotency_key_payload_mismatch; a repeat while the first call is still running gets 409 idempotency_in_progress for up to 120 seconds. |
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | Required | Display name. Max 120 characters. |
| key | string | Required | The board's key, the prefix of its tasks' keys (for example ENG). |
| project | uuid | Required | The project. |
| team | uuid | null | Optional | The team. |
| visibility | enum | Optional | org (everyone in the organization) or members (explicit members only). One of org, members. |
| estimate_scale | enum | Optional | How estimates are expressed on this board. One of none, fibonacci, linear. |
| archive_after_days | integer | null | Optional | Archive done tasks automatically after this many days, or null to keep them. Minimum 1. |
| default_view | SavedView | null | Optional | The board's default saved view, or null. See SavedView. |
| agent_name | string | Optional | The name of the agent that executed this write on the person's behalf (max 128 characters, blank means no agent). Takes priority over the X-Dailybot-Agent-Name header. See Agent attribution. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | Board | Required | A Board object. |
Errors
| Status | When |
|---|---|
| 400 | Validation failed, or a filter, sort or `include` value was not recognised. The response `code` says which. `invalid_agent_attribution` means the agent name is invalid. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`), or the plan's board ceiling is reached (`task_boards_limit_reached`). |
| 409 | Another board already uses this key (`duplicate_board_key`). |
curl -sS -X POST "https://api.dailybot.com/v1/plan/boards/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"name": "Engineering",
"key": "ENG",
"project": "00000000-0000-4000-8000-000000000001",
"visibility": "org",
"estimate_scale": "fibonacci"
}'dailybot plan board create --name "Engineering"Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:admin` — container writes. A non-guest member can call it with a login session or a personal API key (a key with explicit Plan scopes needs `tasks:write`, which covers it); an agent or organization key gets `403 insufficient_scope`.
- Rate limit: 60 writes per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key. An agent or organization key gets `403 insufficient_scope`.
Retrieve a board
One board by uuid. A board you cannot see answers 404, the same as one that does not exist.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | Board | Required | A Board object. |
Errors
| Status | When |
|---|---|
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 404 | Not found, or not visible to you. Both cases return the same body. |
curl -sS "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/" \
-H "X-API-KEY: $DAILYBOT_API_KEY"dailybot plan board get 00000000-0000-4000-8000-000000000002Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:read`.
- Rate limit: 120 reads per minute per actor.
- Works with a login session, a CLI user token, a personal API key, or an agent or organization key. A personal key sees what its person sees; an agent or organization key acts as a system actor and sees organization-visible boards only.
Update a board, including renaming its key
Renaming key retires the previous key and keeps it reserved, so ENG-142 typed years later still resolves. Switching visibility to members adds you as a member, because a members-only board with no members would be visible to nobody.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | Optional | A key you generate for this intent. A replay with the same key and body returns the first response without a second side effect and carries Idempotency-Replayed: true. Keys are kept for 24 hours. The same key with a different body is 409 idempotency_key_payload_mismatch; a repeat while the first call is still running gets 409 idempotency_in_progress for up to 120 seconds. |
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | Optional | Display name. Max 120 characters. |
| key | string | Optional | The board's key, the prefix of its tasks' keys (for example ENG). |
| project | uuid | Optional | The project. |
| team | uuid | null | Optional | The team. |
| visibility | enum | Optional | org (everyone in the organization) or members (explicit members only). One of org, members. |
| estimate_scale | enum | Optional | How estimates are expressed on this board. One of none, fibonacci, linear. |
| archive_after_days | integer | null | Optional | Archive done tasks automatically after this many days, or null to keep them. Minimum 1. |
| default_view | SavedView | null | Optional | The board's default saved view, or null. See SavedView. |
| agent_name | string | Optional | The name of the agent that executed this write on the person's behalf (max 128 characters, blank means no agent). Takes priority over the X-Dailybot-Agent-Name header. See Agent attribution. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | Board | Required | A Board object. |
Errors
| Status | When |
|---|---|
| 400 | Validation failed, or a filter, sort or `include` value was not recognised. The response `code` says which. `invalid_agent_attribution` means the agent name is invalid. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 404 | Not found, or not visible to you. Both cases return the same body. |
| 409 | Another board already uses this key (`duplicate_board_key`). |
curl -sS -X PATCH "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"key": "PLAT"
}'dailybot plan board update 00000000-0000-4000-8000-000000000002 --key PLATTry it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:admin` — container writes. A non-guest member can call it with a login session or a personal API key (a key with explicit Plan scopes needs `tasks:write`, which covers it); an agent or organization key gets `403 insufficient_scope`.
- Rate limit: 60 writes per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key. An agent or organization key gets `403 insufficient_scope`.
Archive a board, cascading to its tasks
Archives the board and, with it, its tasks. The board key stays reserved, so it is never reused. Send ?dry_run=true first to see the consequence without archiving; restore the board with the restore endpoint.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| dry_run | boolean | Optional | Preview the consequence without performing it. The response has the same shape, {operation, dry_run, reversible, restore_path, consequence, affects}, but nothing is written and no event is emitted. Show consequence to a person before acting. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | Optional | A key you generate for this intent. A replay with the same key and body returns the first response without a second side effect and carries Idempotency-Replayed: true. Keys are kept for 24 hours. The same key with a different body is 409 idempotency_key_payload_mismatch; a repeat while the first call is still running gets 409 idempotency_in_progress for up to 120 seconds. |
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
DryRunPreview object
What the call answers with ?dry_run=true: the consequence, without performing it. Nothing is written and no event is emitted.
| Name | Type | Required | Description |
|---|---|---|---|
| operation | string | Required | The operation that would run. |
| dry_run | boolean | Required | Always true. |
| reversible | boolean | Required | Whether the operation can be undone. |
| restore_path | string | null | Required | The path that would undo it, or null when there is none. |
| consequence | string | Required | A sentence to show a person before acting. It states the cascade rather than summarising it. |
| affects | object | Required | What the operation would touch, as counts (integers) by kind. |
| would_refuse | boolean | Optional | Workflow state archive only: true when the real call would be refused. |
| refusal_code | string | Optional | Workflow state archive only: the error code the real call would answer with. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | Board | DryRunPreview | Required | A Board object. With ?dry_run=true, a DryRunPreview object instead. |
Errors
| Status | When |
|---|---|
| 400 | The agent name is invalid (`invalid_agent_attribution`). |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | Authenticated but not allowed: missing scope (`insufficient_scope`, which is also what an agent or organization key gets on an operation that needs a person, and what a personal key gets when its explicit Plan scopes do not cover the endpoint) or a guest account (`guest_not_allowed`). |
| 404 | Not found, or not visible to you. Both cases return the same body. |
curl -sS -X POST "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/archive/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN"dailybot plan board archive 00000000-0000-4000-8000-000000000002 --dry-runTry it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:admin` — container writes. A non-guest member can call it with a login session or a personal API key (a key with explicit Plan scopes needs `tasks:write`, which covers it); an agent or organization key gets `403 insufficient_scope`.
- Rate limit: 60 writes per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key. An agent or organization key gets `403 insufficient_scope`.
Restore an archived board
Inverse of archive. The board key was never retired — it stays reserved through archive and restore. Tasks that cascaded on archive stay archived; restore them with POST …/tasks/{task_id}/restore/. Restore consumes one board-creation entitlement slot (archive frees one).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | Optional | A key you generate for this intent. A replay with the same key and body returns the first response without a second side effect and carries Idempotency-Replayed: true. Keys are kept for 24 hours. The same key with a different body is 409 idempotency_key_payload_mismatch; a repeat while the first call is still running gets 409 idempotency_in_progress for up to 120 seconds. |
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | Board | Required | A Board object. |
Errors
| Status | When |
|---|---|
| 400 | The agent name is invalid (`invalid_agent_attribution`). |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`), or no board slot is free (`task_boards_limit_reached`). |
| 403 | Authenticated but not allowed: missing scope (`insufficient_scope`, which is also what an agent or organization key gets on an operation that needs a person, and what a personal key gets when its explicit Plan scopes do not cover the endpoint) or a guest account (`guest_not_allowed`). |
| 404 | Not found, or not visible to you. Both cases return the same body. |
curl -sS -X POST "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/restore/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN"dailybot plan board restore 00000000-0000-4000-8000-000000000002Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:admin` — container writes. A non-guest member can call it with a login session or a personal API key (a key with explicit Plan scopes needs `tasks:write`, which covers it); an agent or organization key gets `403 insufficient_scope`.
- Rate limit: 60 writes per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key. An agent or organization key gets `403 insufficient_scope`.
Record that the caller opened a board (HomePulse recent_boards)
Upserts the caller's last visit timestamp for this board. Repeated POSTs update visited_at and never create duplicate rows. Requires a person: a login session or a personal API key (agent and organization keys are refused). Authorization matches board read access — missing and cross-org boards share the same 404.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
BoardVisit object
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | BoardVisit | Required | A BoardVisit object. |
Errors
| Status | When |
|---|---|
| 400 | Validation failed, or a filter, sort or `include` value was not recognised. The response `code` says which. `invalid_agent_attribution` means the agent name is invalid. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | Authenticated but not allowed: missing scope (`insufficient_scope`, which is also what an agent or organization key gets on an operation that needs a person, and what a personal key gets when its explicit Plan scopes do not cover the endpoint) or a guest account (`guest_not_allowed`). |
| 404 | Not found, or not visible to you. Both cases return the same body. |
curl -sS -X POST "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/visit/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN"{
"board": "00000000-0000-4000-8000-000000000002",
"visited_at": "2026-09-25T10:14:02Z"
}Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:write`.
- Rate limit: 60 writes per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key. An agent or organization key gets `403 insufficient_scope`.
List a board's workflow states, in column order
The board's workflow states (its columns), ordered by position. Each has a category (such as in_progress) that stays stable when a state is renamed. Add include_archived=true to see archived states.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| include_archived | boolean | Optional | Include archived rows alongside live ones. Distinct from is_archived, which selects one set or the other: include_archived=true is the union. Lists return live rows unless you opt in. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | array<WorkflowState> | Required | A JSON array of WorkflowState objects. |
Errors
| Status | When |
|---|---|
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 404 | Not found, or not visible to you. Both cases return the same body. |
curl -sS "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/states/" \
-H "X-API-KEY: $DAILYBOT_API_KEY"dailybot plan board states 00000000-0000-4000-8000-000000000002 --include-archived[
{
"uuid": "00000000-0000-4000-8000-000000000003",
"name": "In Progress",
"category": "in_progress",
"position": 2,
"color": "#2563eb",
"is_default": false,
"is_archived": false,
"task_count": 12
}
]Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:read`.
- Rate limit: 120 reads per minute per actor.
- Works with a login session, a CLI user token, a personal API key, or an agent or organization key. A personal key sees what its person sees; an agent or organization key acts as a system actor and sees organization-visible boards only.
Add a workflow state to a board
category is one of five fixed values and never changes after create; name is free and can be renamed. The category is what "is this finished?" is answered from.
position inserts at that place, 1-based among live columns: the column that held it and everything after it shift right. A position past the end lands at the end.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | Optional | A key you generate for this intent. A replay with the same key and body returns the first response without a second side effect and carries Idempotency-Replayed: true. Keys are kept for 24 hours. The same key with a different body is 409 idempotency_key_payload_mismatch; a repeat while the first call is still running gets 409 idempotency_in_progress for up to 120 seconds. |
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | Required | Display name. Max 48 characters. |
| category | enum | Required | One of the five fixed categories. It never changes after create. One of backlog, todo, in_progress, done, canceled. |
| position | integer | Optional | Column position among live columns, 1-based, left to right. 0 and 1 both mean the first column, and a value past the end lands last. Omit it to append the new state at the end. Minimum 0. |
| color | string | Optional | Display color (hex). |
| is_default | boolean | Optional | Whether new tasks land in this state by default. |
| agent_name | string | Optional | The name of the agent that executed this write on the person's behalf (max 128 characters, blank means no agent). Takes priority over the X-Dailybot-Agent-Name header. See Agent attribution. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | WorkflowState | Required | A WorkflowState object. |
Errors
| Status | When |
|---|---|
| 400 | Validation failed, or a filter, sort or `include` value was not recognised. The response `code` says which. `invalid_agent_attribution` means the agent name is invalid. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 404 | Not found, or not visible to you. Both cases return the same body. |
| 409 | Conflict. The response `code` says which (for example `version_conflict`). |
curl -sS -X POST "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/states/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "In review",
"category": "in_progress",
"position": 3
}'dailybot plan board state create 00000000-0000-4000-8000-000000000002 -n "In review" --category in_progress --position 3{
"uuid": "00000000-0000-4000-8000-000000000003",
"name": "In Progress",
"category": "in_progress",
"position": 2,
"color": "#2563eb",
"is_default": false,
"is_archived": false,
"task_count": 12
}Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:admin` — container writes. A non-guest member can call it with a login session or a personal API key (a key with explicit Plan scopes needs `tasks:write`, which covers it); an agent or organization key gets `403 insufficient_scope`.
- Rate limit: 60 writes per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key. An agent or organization key gets `403 insufficient_scope`.
Rename, recolour or reorder a workflow state
Allowed fields are name, color and position only. Unknown fields are refused with 400 (never silently ignored). category cannot change after create.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
| state_id | string | Required | The workflow state's uuid. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | Optional | Display name. Max 48 characters. |
| position | integer | Optional | Column position among live columns, 1-based, left to right. 0 and 1 both mean the first column, and a value past the end lands last. Minimum 0. |
| color | string | Optional | Display color (hex). |
| agent_name | string | Optional | The name of the agent that executed this write on the person's behalf (max 128 characters, blank means no agent). Takes priority over the X-Dailybot-Agent-Name header. See Agent attribution. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | WorkflowState | Required | A WorkflowState object. |
Errors
| Status | When |
|---|---|
| 400 | Validation failed, or a filter, sort or `include` value was not recognised. The response `code` says which. `invalid_agent_attribution` means the agent name is invalid. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 404 | Not found, or not visible to you. Both cases return the same body. |
curl -sS -X PATCH "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/states/00000000-0000-4000-8000-000000000003/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Code review"
}'dailybot plan board state update 00000000-0000-4000-8000-000000000002 00000000-0000-4000-8000-000000000003 --name "Code review"Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:admin` — container writes. A non-guest member can call it with a login session or a personal API key (a key with explicit Plan scopes needs `tasks:write`, which covers it); an agent or organization key gets `403 insufficient_scope`.
- Rate limit: 60 writes per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key. An agent or organization key gets `403 insufficient_scope`.
Retire a column
Refused with 409 state_in_use while live tasks still sit in the column, unless the body names migrate_to — another live state on the same board that receives every card in one bulk update before the column is archived.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
| state_id | string | Required | The workflow state's uuid. |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| dry_run | boolean | Optional | Preview the consequence without performing it. The response has the same shape, {operation, dry_run, reversible, restore_path, consequence, affects}, but nothing is written and no event is emitted. Show consequence to a person before acting. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
| migrate_to | uuid | Optional | Another live state on the same board that receives every task in the column before it is archived. |
| agent_name | string | Optional | The name of the agent that executed this write on the person's behalf (max 128 characters, blank means no agent). Takes priority over the X-Dailybot-Agent-Name header. See Agent attribution. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | WorkflowState | DryRunPreview | Required | A WorkflowState object. With ?dry_run=true, a DryRunPreview object instead. |
Errors
| Status | When |
|---|---|
| 400 | The agent name is invalid (`invalid_agent_attribution`). |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 404 | Not found, or not visible to you. Both cases return the same body. |
| 409 | Live tasks still sit in the column (`state_in_use`). Send `migrate_to` to move them first. |
curl -sS -X POST "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/states/00000000-0000-4000-8000-000000000003/archive/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"migrate_to": "00000000-0000-4000-8000-000000000004"
}'dailybot plan board state archive 00000000-0000-4000-8000-000000000002 00000000-0000-4000-8000-000000000003 --migrate-to 00000000-0000-4000-8000-000000000004 --yesTry it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:admin` — container writes. A non-guest member can call it with a login session or a personal API key (a key with explicit Plan scopes needs `tasks:write`, which covers it); an agent or organization key gets `403 insufficient_scope`.
- Rate limit: 60 writes per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key. An agent or organization key gets `403 insufficient_scope`.
Restore a retired column
Inverse of archive. The column returns after the live columns, and a second POST on a live column is a 200 no-op. Read it back with GET …/states/?include_archived=true while it is still retired.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
| state_id | string | Required | The workflow state's uuid. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | WorkflowState | Required | A WorkflowState object. |
Errors
| Status | When |
|---|---|
| 400 | The agent name is invalid (`invalid_agent_attribution`). |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | Authenticated but not allowed: missing scope (`insufficient_scope`, which is also what an agent or organization key gets on an operation that needs a person, and what a personal key gets when its explicit Plan scopes do not cover the endpoint) or a guest account (`guest_not_allowed`). |
| 404 | Not found, or not visible to you. Both cases return the same body. |
curl -sS -X POST "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/states/00000000-0000-4000-8000-000000000003/restore/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN"dailybot plan board state restore 00000000-0000-4000-8000-000000000002 00000000-0000-4000-8000-000000000003Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:admin` — container writes. A non-guest member can call it with a login session or a personal API key (a key with explicit Plan scopes needs `tasks:write`, which covers it); an agent or organization key gets `403 insufficient_scope`.
- Rate limit: 60 writes per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key. An agent or organization key gets `403 insufficient_scope`.
Reorder every live column on a board in one call
Body { "order": [state_uuid, …] } must list every live column on the board exactly once, in the desired left-to-right order. Partial lists, unknown uuids and duplicates return 400 states_reorder_invalid. Emits state.reordered for each column. To set a board-level default view (or clear it), use PATCH /boards/{board_id}/ with default_view — there is no separate make-default endpoint.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
| order | array | Required | Every live column's uuid exactly once, left to right. Items: uuid. |
| agent_name | string | Optional | The name of the agent that executed this write on the person's behalf (max 128 characters, blank means no agent). Takes priority over the X-Dailybot-Agent-Name header. See Agent attribution. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | array<WorkflowState> | Required | A JSON array of WorkflowState objects. |
Errors
| Status | When |
|---|---|
| 400 | Validation failed, or a filter, sort or `include` value was not recognised. The response `code` says which. `invalid_agent_attribution` means the agent name is invalid. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 404 | Not found, or not visible to you. Both cases return the same body. |
curl -sS -X POST "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/states/reorder/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"order": [
"00000000-0000-4000-8000-000000000003",
"00000000-0000-4000-8000-000000000004"
]
}'dailybot plan board state reorder 00000000-0000-4000-8000-000000000002 00000000-0000-4000-8000-000000000003 00000000-0000-4000-8000-000000000004Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:admin` — container writes. A non-guest member can call it with a login session or a personal API key (a key with explicit Plan scopes needs `tasks:write`, which covers it); an agent or organization key gets `403 insufficient_scope`.
- Rate limit: 60 writes per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key. An agent or organization key gets `403 insufficient_scope`.
The whole board — states and their tasks — in one round trip
One call renders a board: one entry in groups per column, in column order, each with its first tasks in rank order, the column's true task_count and has_more. Page the rest of a column with GET /v1/plan/tasks/?board=…&state=….
Store delta_cursor and switch to the delta feed for every later read. Answers If-None-Match with 304. …/snapshot/ is an alias with the same response. Unknown query parameters and invalid filter values are 400 invalid_filter_value.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
Query parameters
Filters
| Name | Type | Required | Description |
|---|---|---|---|
| group_by | string | Optional | Group the snapshot by another dimension instead of workflow state. Grouping exists on the snapshot only: grouping a paginated list would fork its envelope. |
| tasks_per_state | integer | Optional | How many tasks to include per column. Maximum 50, tighter than the usual 100 because this read carries labels for every card. |
| owner | array | Optional | A user uuid, me, or unowned. Repeatable; values are OR-ed, tokens included: owner=me&owner=unowned returns your tasks and the unowned ones. me with an agent or organization key is 400 actor_required. |
| label | array | Optional | Label uuids — v4 only, at most 50, matching the shared label filter's existing cap. A non-v4 value is 400 invalid_label_filter. |
| priority | array | Optional | 1=urgent, 2=high, 3=medium, 4=low, 5=none. Repeatable. |
| blocked | boolean | Optional | Derived from relations, not from a status. This is the query the product answers with a link rather than a state.
blocked=true means a live blocker: a blocks relation whose source task is neither archived nor in a terminal category. A blocker that is itself done or canceled blocks nothing and does not match.
Orthogonal to lifecycle. A finished task can still carry a live blocker, so blocked=true alone returns terminal rows too. Work a person can act on is blocked=true&state=open — that combination is what reproduces the blocked tile on GET /v1/plan/pulse/. |
| search | string | Optional | Matches title and key. Longer than 256 characters is 400 search_query_too_long, not truncated. q is an alias. |
Dates
| Name | Type | Required | Description |
|---|---|---|---|
| due_before | string | Optional | Inclusive. Alone, this means overdue or due by that date - it does not exclude work that is already finished.
Overdue is spelled due_before=<today>&state=open. That pairing is the supported spelling, it is what reproduces the overdue tile on GET /v1/plan/pulse/, and there is deliberately no state=overdue sugar: state is a lifecycle dimension and overdue is a date one, so a single spelling keeps the two from drifting. state=overdue answers 400 invalid_filter_value, which is evidence about that spelling and not about the capability. |
| due_after | string | Optional | Inclusive. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| If-None-Match | string | Optional | The ETag from your previous read. A match answers 304. |
BoardSnapshot object
| Name | Type | Required | Description |
|---|---|---|---|
| board | Board | Required | The board. See Board. |
| generated_at | date-time | Required | When the response was computed. |
| delta_cursor | date-time | Required | Pass it as updated_since to the delta feed. |
| group_by | string | Optional | The grouping dimension. |
| groups | array | Required | One entry per column (or group), in order. Always present: key, task_count, has_more, tasks. Items: {key: string, name: string, category: string|null, position: integer|null, color: string|null, task_count: integer, has_more: boolean, tasks: array}. |
| viewer | object | Optional | What you can do with this row. Shape: {is_member, can_see_content, can_manage} (all required). |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | BoardSnapshot | Required | A BoardSnapshot object. |
Errors
| Status | When |
|---|---|
| 304 | Not modified: the `If-None-Match` ETag you sent still matches. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 404 | Not found, or not visible to you. Both cases return the same body. |
curl -sS "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/board/?tasks_per_state=25" \
-H "X-API-KEY: $DAILYBOT_API_KEY"dailybot plan board snapshot 00000000-0000-4000-8000-000000000002 --json{
"board": {
"uuid": "00000000-0000-4000-8000-000000000100",
"key": "ENG",
"name": "Engineering",
"visibility": "org",
"estimate_scale": "fibonacci",
"project": {
"uuid": "00000000-0000-4000-8000-000000000101",
"name": "Platform"
}
},
"generated_at": "2026-08-29T10:14:02.113954Z",
"delta_cursor": "2026-08-29T10:14:02.113954Z",
"group_by": "state",
"groups": [
{
"key": "00000000-0000-4000-8000-000000000102",
"name": "In Progress",
"category": "in_progress",
"position": 2,
"color": "#f59e0b",
"task_count": 137,
"has_more": true,
"tasks": [
{
"uuid": "00000000-0000-4000-8000-000000000103",
"key": "ENG-142",
"title": "Ship the delta feed",
"state": {
"uuid": "00000000-0000-4000-8000-000000000102",
"name": "In Progress",
"category": "in_progress"
},
"priority": 2,
"estimate": 3,
"rank": "aU",
"version": 7,
"open_blocker_count": 1,
"participant_count": 3,
"owner": {
"uuid": "00000000-0000-4000-8000-000000000104",
"name": "Ada L."
},
"executor": null,
"due_date": "2026-09-04",
"labels": [
{
"uuid": "00000000-0000-4000-8000-000000000105",
"name": "backend",
"color": "#2563eb"
}
],
"is_archived": false,
"updated_at": "2026-08-29T10:12:44.201113Z"
}
]
}
]
}Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:read`.
- Rate limit: 120 reads per minute per actor.
- Works with a login session, a CLI user token, a personal API key, or an agent or organization key. A personal key sees what its person sees; an agent or organization key acts as a system actor and sees organization-visible boards only.
What changed on this board since a timestamp. NOT pagination
A change feed, not a page: no count, next or previous. Send the cursor from your previous response (or the snapshot's delta_cursor) verbatim as updated_since; never compute it from your own clock.
Delivery is at-least-once, so a row written in the same instant as your cursor is sent again rather than lost. Entries are compacted to one per task (the current row wins). states is null unless a column was created, renamed, reordered or archived; when it is set, replace your whole column list.
Poll again after poll_after_seconds (15 s, doubling to 120 s while the board is quiet, reset on any change). Pause while the page is hidden and refresh when it becomes visible. If truncated is true, poll again immediately. Cursors older than 7 days return 400 delta_window_expired: re-read the snapshot. Polling is the v1 transport.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| updated_since | string | Required | The cursor from your previous delta, or the delta_cursor from a board snapshot. Older than 7 days is refused with delta_window_expired. since is accepted as a deprecated alias for older clients; send updated_since. |
| limit | integer | Optional | Maximum entries in changed. |
BoardDelta object
| Name | Type | Required | Description |
|---|---|---|---|
| since | date-time | Required | The updated_since you sent. |
| cursor | date-time | Required | Send it as updated_since on your next poll. |
| changed | array<Task> | Required | Tasks that changed, one entry per task. See Task. |
| removed | array | Required | Tasks that left the board, with a reason such as archived. Items: {uuid, key, reason}. |
| states | array | null | Optional | The board's workflow states, in column order. |
| truncated | boolean | Required | true when more changes are waiting: poll again immediately. |
| poll_after_seconds | integer | Required | When to poll next, suggested by the server (15 to 120 seconds). A hint, not enforced. From 15 to 120. |
Task object
| Name | Type | Required | Description |
|---|---|---|---|
| uuid | uuid | Required | Stable public identifier. |
| key | string | Required | Human-readable key KEY-n, for example ENG-142. Retired keys keep resolving. |
| title | string | Required | The task's title. Max 255 characters. |
| description | string | null | Optional | Free-form description. |
| board | uuid | Optional | The board. |
| state | WorkflowState | Required | The task's workflow state (its column). See WorkflowState. |
| priority | integer | Optional | 1 urgent, 2 high, 3 medium, 4 low, 5 none. From 1 to 5. |
| estimate | integer | null | Optional | Estimate on the board's scale. |
| owner | UserRef | null | Optional | The person accountable for the task. See UserRef. |
| executor | ActorRef | null | Optional | The actor doing the work, when different from the owner (for example an agent). See ActorRef. |
| executors | object[] | Optional | Every agent that has executed a write on this task on someone's behalf, newest first: {uuid, name, username, avatar, first_at, last_at}. Separate from executor, which stays the current ball-holder. Only on task detail and single-task write responses; omitted on list rows. |
| participant_count | integer | Optional | Number of participants. |
| start_date | date | null | Optional | Planned start date. |
| due_date | date | null | Optional | Due date. |
| milestone | null | {uuid, name, date} | Optional | The milestone this task counts toward. All fields are always present. |
| parent_task | null | {uuid, key, title} | Optional | The parent task, for a sub-task. One level of nesting only. All fields are always present. |
| subtask_count | integer | Optional | Number of sub-tasks. |
| subtask_done_count | integer | Optional | Number of finished sub-tasks. |
| attachment_count | integer | Optional | Number of attachments. |
| open_blocker_count | integer | Optional | Number of live blockers. |
| labels | array<Label> | Optional | Organization labels on the task. See Label. |
| rank | string | null | Optional | Opaque order within the column. Never compute it: move with after / before. |
| blocked | boolean | Optional | Tasks with a live blocker. |
| blocked_since | date-time | null | Optional | When the task became blocked. |
| completed_at | date-time | null | Optional | When it was completed, or null. |
| is_archived | boolean | Required | Whether the row is archived. Archive is the delete: archived rows stay readable and restorable. |
| subscribed | boolean | Optional | Whether you watch this task. |
| version | integer | Required | Increments on every write. Send it back as If-Match to refuse a stale update. |
| created_by | ActorRef | null | Optional | Who created the row. See ActorRef. |
| created_at | date-time | Optional | When the row was created. |
| updated_at | date-time | Optional | When the row last changed. |
ActorRef object
Label object
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | BoardDelta | Required | A BoardDelta object. |
Errors
| Status | When |
|---|---|
| 400 | The cursor is older than 7 days (`delta_window_expired`): re-read the board snapshot. Also returned for a malformed `updated_since`. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 404 | Not found, or not visible to you. Both cases return the same body. |
curl -sS "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/delta/?updated_since=2026-09-25T10:14:02.113954Z" \
-H "X-API-KEY: $DAILYBOT_API_KEY"dailybot plan tasks changes 00000000-0000-4000-8000-000000000002 --updated-since 2026-09-25T10:14:02.113954Z --json{
"since": "2026-08-29T10:14:02.113954Z",
"cursor": "2026-08-29T10:19:44.902311Z",
"changed": [
{
"uuid": "00000000-0000-4000-8000-000000000100",
"key": "ENG-142",
"title": "Ship the delta feed",
"state": {
"uuid": "00000000-0000-4000-8000-000000000101",
"name": "Done",
"category": "done"
},
"priority": 2,
"rank": "b0",
"version": 9,
"is_archived": false,
"updated_at": "2026-08-29T10:19:44.902311Z"
}
],
"removed": [
{
"uuid": "00000000-0000-4000-8000-000000000102",
"key": "ENG-77",
"reason": "archived"
}
],
"states": null,
"truncated": false,
"poll_after_seconds": 15
}Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:read`.
- Rate limit: 240 delta polls per minute per actor.
- Works with a login session, a CLI user token, a personal API key, or an agent or organization key. A personal key sees what its person sees; an agent or organization key acts as a system actor and sees organization-visible boards only.
The caller's saved views for this board
Your saved views for this board. Views are personal. Needs a person: agent and organization keys are refused; a personal API key works.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| count | integer | Required | Total number of rows. |
| next | uri | Required | URL of the next page, or null. |
| previous | uri | Required | URL of the previous page, or null. |
| results | array<SavedView> | Required | The rows on this page. See SavedView. |
Errors
| Status | When |
|---|---|
| 400 | Validation failed, or a filter, sort or `include` value was not recognised. The response `code` says which. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | Authenticated but not allowed: missing scope (`insufficient_scope`, which is also what an agent or organization key gets on an operation that needs a person, and what a personal key gets when its explicit Plan scopes do not cover the endpoint) or a guest account (`guest_not_allowed`). |
curl -sS "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/views/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN"dailybot plan board views 00000000-0000-4000-8000-000000000002 --etag{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"name": "My open work",
"view_mode": "list",
"group_by": "state",
"sort": "-updated_at",
"filters": {},
"schema_version": 1,
"visibility": "personal",
"collapsed": {},
"columns": {}
}
]
}Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:read`.
- Rate limit: 120 reads per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key. An agent or organization key gets `403 insufficient_scope`.
Replace the caller's saved views for this board
Replaces your whole saved-view array, which is why If-Match is required: without it, two concurrent saves would silently drop one another's view.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| If-Match | string | Required | The ETag you received from GET .../views/, quoted. Required, because this PUT replaces the whole array: without a precondition two concurrent saves silently drop one another's view. A stale validator is 412 precondition_failed; a missing one is 428 precondition_required. |
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | array<SavedView> | Required | A JSON array of SavedView objects. |
Errors
| Status | When |
|---|---|
| 400 | Validation failed, or a filter, sort or `include` value was not recognised. The response `code` says which. `invalid_agent_attribution` means the agent name is invalid. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | Authenticated but not allowed: missing scope (`insufficient_scope`, which is also what an agent or organization key gets on an operation that needs a person, and what a personal key gets when its explicit Plan scopes do not cover the endpoint) or a guest account (`guest_not_allowed`). |
| 404 | Not found, or not visible to you. Both cases return the same body. |
| 412 | The `If-Match` validator is stale (`precondition_failed`). Read again and retry. |
| 428 | `If-Match` is required (`precondition_required`). |
curl -sS -X PUT "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/views/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN" \
-H "If-Match: $VIEWS_ETAG" \
-H "Content-Type: application/json" \
-d '[
{
"name": "My open work",
"view_mode": "board",
"group_by": "state",
"sort": "-updated_at",
"filters": {
"owner": [
"me"
],
"state": [
"open"
]
}
}
]'dailybot plan board view save 00000000-0000-4000-8000-000000000002 -f views.json --fetch-etag[
{
"name": "My open work",
"view_mode": "list",
"group_by": "state",
"sort": "-updated_at",
"filters": {},
"schema_version": 1,
"visibility": "personal",
"collapsed": {},
"columns": {}
}
]Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:write`.
- Rate limit: 60 writes per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key. An agent or organization key gets `403 insufficient_scope`.
Search people mentionable on a board
The roster for owner and participant pickers, searchable with q (name, handle or external id, never a whole email address). Do not use the members list for pickers: it only lists explicit grants and is often empty on organization-visible boards.
People who cannot see the board never appear, even when they match q, matching the rule that refuses them as owner or participant (participant_cannot_access_board). limit (default 25) and offset page the whole roster in a stable order.
Rows are {uuid, name, handle, avatar_url, has_photo, kind}, with no email. avatar_url and has_photo mean the same as on a task owner: when has_photo is false, show initials; on an agent row they are null and false. Key mention chips on uuid, never handle: handle is not unique within an organization, so show name to disambiguate. kinds=agent lists the workspace's agents, but an agent cannot be mentioned yet; do not build a mention from an agent row.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| q | string | Optional | Matches name, handle or external id, never a whole email address. |
| limit | integer | Optional | Page size. Clamped to the maximum the response echoes; garbage is ignored rather than refused, because this is a type-ahead control and a 400 here would break the picker on a stray keystroke. |
| offset | integer | Optional | Rows to skip, over the deterministic full_name, id ordering — so a page boundary can neither drop nor repeat somebody. |
| kinds | string | Optional | Comma-separated user, agent. Absent means users only, so a caller that does not ask for agents sees exactly what it saw before. An unrecognised token is dropped, not refused. |
MentionableList object
| Name | Type | Required | Description |
|---|---|---|---|
| limit | integer | Required | Page size applied. |
| results | array<Mentionable> | Required | The rows on this page. See Mentionable. |
Mentionable object
| Name | Type | Required | Description |
|---|---|---|---|
| uuid | uuid | Required | The person's uuid. Key mention chips on it. |
| name | string | Required | Display name. Show it to tell people with the same handle apart. |
| handle | string | null | Required | Handle, if the person has one. Not unique within an organization. |
| avatar_url | string | null | Required | Avatar image URL, the same as on a task owner. null on an agent row. |
| has_photo | boolean | Required | false means there is no photo: show initials. Always false on an agent row. |
| kind | enum | Required | Whether the row is a person or an agent. One of user, agent. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | MentionableList | Required | A MentionableList object. |
Errors
| Status | When |
|---|---|
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | Authenticated but not allowed: missing scope (`insufficient_scope`, which is also what an agent or organization key gets on an operation that needs a person, and what a personal key gets when its explicit Plan scopes do not cover the endpoint) or a guest account (`guest_not_allowed`). |
| 404 | Not found, or not visible to you. Both cases return the same body. |
curl -sS "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/mentionables/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN"dailybot plan board mentionables 00000000-0000-4000-8000-000000000002 -q ada{
"limit": 25,
"results": [
{
"uuid": "00000000-0000-4000-8000-00000000000c",
"name": "Ada L.",
"handle": "ada",
"avatar_url": "https://example.com/avatars/ada.png",
"has_photo": true,
"kind": "user"
},
{
"uuid": "00000000-0000-4000-8000-000000000012",
"name": "Grace H.",
"handle": null,
"avatar_url": null,
"has_photo": false,
"kind": "user"
}
]
}Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:read`.
- Rate limit: 120 reads per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key. An agent or organization key gets `403 insufficient_scope`.
Members of a board
Explicit membership grants only, never the full organization roster, so organization-visible boards often return an empty list. Use it to manage who may see a members-only board; for pickers use …/mentionables/. An organization admin can read this list without gaining sight of the board's tasks.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| page | integer | Optional | 1-based page number. |
| page_size | integer | Optional | Rows per page. Default 50, maximum 100. Out-of-range values are clamped, never rejected: asking for 500 returns 100. |
BoardMember object
| Name | Type | Required | Description |
|---|---|---|---|
| subject_type | enum | Required | One of user, team. |
| user_uuid | uuid | null | Optional | The person's user uuid. |
| uuid | uuid | null | Optional | Stable public identifier. |
| full_name | string | Optional | — |
| name | string | Optional | Display name. |
| role | enum | null | Optional | Participant role. One of admin, member, guest. |
| team_uuid | uuid | null | Optional | A team's uuid, instead of user_uuid. It creates one live team grant: whoever joins the team later is in, and whoever leaves is out. |
| team_name | string | Optional | — |
| added_at | date-time | Required | — |
| added_by_uuid | uuid | null | Optional | — |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| count | integer | Required | Total number of rows. |
| next | uri | Required | URL of the next page, or null. |
| previous | uri | Required | URL of the previous page, or null. |
| results | array<BoardMember> | Required | The rows on this page. See BoardMember. |
Errors
| Status | When |
|---|---|
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 404 | Not found, or not visible to you. Both cases return the same body. |
curl -sS "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/members/" \
-H "X-API-KEY: $DAILYBOT_API_KEY"dailybot plan board members 00000000-0000-4000-8000-000000000002{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"subject_type": "user",
"user_uuid": "00000000-0000-4000-8000-00000000000c",
"uuid": "00000000-0000-4000-8000-00000000000c",
"full_name": "Ada L.",
"name": "Ada L.",
"role": "admin",
"team_uuid": null,
"team_name": "example",
"added_at": "2026-09-25T10:14:02Z",
"added_by_uuid": null
}
]
}Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:read`.
- Rate limit: 120 reads per minute per actor.
- Works with a login session, a CLI user token, a personal API key, or an agent or organization key. A personal key sees what its person sees; an agent or organization key acts as a system actor and sees organization-visible boards only.
Add a member to a board
The deliberate, visible way to give a person (user_uuid) or a team (team_uuid) sight of a members-only board: send exactly one of them; both or neither is 400 invalid_filter_value. A team grant is live: whoever joins the team later is in, and whoever leaves is out. It writes a board.member_added event the board's members can see. Adding an existing member returns 200 with the existing row. There are no board-level roles. Every non-guest member can call it (with a login session or a personal API key); an agent or organization key gets 403 insufficient_scope.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | Optional | A key you generate for this intent. A replay with the same key and body returns the first response without a second side effect and carries Idempotency-Replayed: true. Keys are kept for 24 hours. The same key with a different body is 409 idempotency_key_payload_mismatch; a repeat while the first call is still running gets 409 idempotency_in_progress for up to 120 seconds. |
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
| user_uuid | uuid | Optional | The person's user uuid. |
| team_uuid | uuid | Optional | A team's uuid, instead of user_uuid. It creates one live team grant: whoever joins the team later is in, and whoever leaves is out. |
| agent_name | string | Optional | The name of the agent that executed this write on the person's behalf (max 128 characters, blank means no agent). Takes priority over the X-Dailybot-Agent-Name header. See Agent attribution. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | BoardMember | Required | A BoardMember object. |
Errors
| Status | When |
|---|---|
| 400 | Send exactly one of `user_uuid` and `team_uuid`; both or neither is `invalid_filter_value`. `invalid_agent_attribution` means the agent name is invalid. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | Authenticated but not allowed: missing scope (`insufficient_scope`, which is also what an agent or organization key gets on an operation that needs a person, and what a personal key gets when its explicit Plan scopes do not cover the endpoint) or a guest account (`guest_not_allowed`). |
| 404 | Not found, or not visible to you. Both cases return the same body. |
curl -sS -X POST "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/members/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"user_uuid": "00000000-0000-4000-8000-00000000000c"
}'dailybot plan board member add 00000000-0000-4000-8000-000000000002 00000000-0000-4000-8000-00000000000cTry it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:admin` — container writes. A non-guest member can call it with a login session or a personal API key (a key with explicit Plan scopes needs `tasks:write`, which covers it); an agent or organization key gets `403 insufficient_scope`.
- Rate limit: 60 writes per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key. An agent or organization key gets `403 insufficient_scope`.
Remove a member from a board
Emits board.member_removed. Removing the last member of a members-only board is refused with 409 last_grant_cannot_be_removed, because a private board with no members would be readable by nobody. Needs a person: agent and organization keys are refused; a personal API key works.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
| user_id | string | Required | The member's user uuid. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Errors
| Status | When |
|---|---|
| 400 | The agent name is invalid (`invalid_agent_attribution`). |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | Authenticated but not allowed: missing scope (`insufficient_scope`, which is also what an agent or organization key gets on an operation that needs a person, and what a personal key gets when its explicit Plan scopes do not cover the endpoint) or a guest account (`guest_not_allowed`). |
| 404 | Not found, or not visible to you. Both cases return the same body. |
| 409 | This is the last member of a members-only board (`last_grant_cannot_be_removed`). |
curl -sS -X DELETE "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/members/00000000-0000-4000-8000-00000000000c/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN"dailybot plan board member remove 00000000-0000-4000-8000-000000000002 00000000-0000-4000-8000-00000000000c --yesTry it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:admin` — container writes. A non-guest member can call it with a login session or a personal API key (a key with explicit Plan scopes needs `tasks:write`, which covers it); an agent or organization key gets `403 insufficient_scope`.
- Rate limit: 60 writes per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key. An agent or organization key gets `403 insufficient_scope`.
Inspect a board membership grant (role is read-only)
Board membership has no role column — org roles plus board visibility are the access model. Sending role returns 400. An empty PATCH returns the current grant row.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
| user_id | string | Required | The member's user uuid. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | BoardMember | Required | A BoardMember object. |
Errors
| Status | When |
|---|---|
| 400 | Validation failed, or a filter, sort or `include` value was not recognised. The response `code` says which. `invalid_agent_attribution` means the agent name is invalid. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 404 | Not found, or not visible to you. Both cases return the same body. |
curl -sS -X PATCH "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/members/00000000-0000-4000-8000-00000000000c/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN"Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:admin` — container writes. A non-guest member can call it with a login session or a personal API key (a key with explicit Plan scopes needs `tasks:write`, which covers it); an agent or organization key gets `403 insufficient_scope`.
- Rate limit: 60 writes per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key. An agent or organization key gets `403 insufficient_scope`.
List organization labels (board access gate)
The organization's labels, behind this board's access check, so board settings can manage them without leaving the Plan API. Apply labels to cards with task PATCH, the labels batch endpoint or bulk set_labels.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| page | integer | Optional | 1-based page number. |
| page_size | integer | Optional | Rows per page. Default 50, maximum 100. Out-of-range values are clamped, never rejected: asking for 500 returns 100. |
| search | string | Optional | Case-insensitive substring match on the label name only. Empty means no filter; a value that matches nothing returns an empty list. |
| include_archived | boolean | Optional | Include archived rows alongside live ones. Distinct from is_archived, which selects one set or the other: include_archived=true is the union. Lists return live rows unless you opt in. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| results | array<Label> | Required | The rows on this page. |
Errors
| Status | When |
|---|---|
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 404 | Not found, or not visible to you. Both cases return the same body. |
curl -sS "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/labels/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN"dailybot plan board labels 00000000-0000-4000-8000-000000000002{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"uuid": "00000000-0000-4000-8000-00000000000b",
"name": "backend",
"color": "#2563eb"
}
]
}Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:read`.
- Rate limit: 120 reads per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key. An agent or organization key gets `403 insufficient_scope`.
Create an organization label
Creates an organization label from a board's settings, behind that board's access check. The label belongs to the organization, so every board can use it.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | Required | Display name. |
| color | string | Optional | Display color (hex). |
| description | string | Optional | Free-form description. |
| agent_name | string | Optional | The name of the agent that executed this write on the person's behalf (max 128 characters, blank means no agent). Takes priority over the X-Dailybot-Agent-Name header. See Agent attribution. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | Label | Required | A Label object. |
Errors
| Status | When |
|---|---|
| 400 | Validation failed, or a filter, sort or `include` value was not recognised. The response `code` says which. `invalid_agent_attribution` means the agent name is invalid. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 404 | Not found, or not visible to you. Both cases return the same body. |
curl -sS -X POST "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/labels/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "backend",
"color": "#2563eb"
}'dailybot plan board label create 00000000-0000-4000-8000-000000000002 -n backend --color "#2563eb"{
"uuid": "00000000-0000-4000-8000-00000000000b",
"name": "backend",
"color": "#2563eb"
}Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:write`.
- Rate limit: 60 writes per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key. An agent or organization key gets `403 insufficient_scope`.
One saved view by uuid
Readable when it is your own view, or a shared or board_default view on a board you can see. Anything else, including another person's personal view, is 404, never 403.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| view_id | uuid | Required | The saved view's uuid. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | SavedView | Required | A SavedView object. |
Errors
| Status | When |
|---|---|
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 404 | Not found, or not visible to you. Both cases return the same body. |
curl -sS "https://api.dailybot.com/v1/plan/views/{view_id}/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN"dailybot plan tasks view get 00000000-0000-4000-8000-000000000010 --jsonTry it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:read`.
- Rate limit: 120 reads per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key. An agent or organization key gets `403 insufficient_scope`.
Edit one saved view
Partial: only the fields you send change; unknown fields are refused. Making a view shared or board_default, or editing one that already is, needs a board manager; otherwise 403 view_visibility_forbidden.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| view_id | uuid | Required | The saved view's uuid. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | Optional | Display name. Max 64 characters. |
| view_mode | enum | Optional | How the filtered set is drawn. kanban is accepted as an alias of board. One of list, board, kanban, timeline, calendar. |
| group_by | enum | Optional | The grouping dimension. One of state, owner, priority, category. |
| sort | string | Optional | A sort key, - prefixed for descending. |
| filters | object | Optional | The view's filters, in the shared task filter grammar. |
| schema_version | integer | Optional | Version of the view's stored format. |
| visibility | enum | Optional | personal, shared or board_default. shared and board_default need a board manager on board views and project oversight (an organization admin or a manager of all teams) on project views; otherwise 403 view_visibility_forbidden. One of personal, shared, board_default. |
| collapsed | object | array | string | number | boolean | Optional | Client UI state stored verbatim (which groups are collapsed). Only size and depth are validated. |
| columns | object | array | string | number | boolean | Optional | Client UI state stored verbatim (which columns are shown). Only size and depth are validated. |
| agent_name | string | Optional | The name of the agent that executed this write on the person's behalf (max 128 characters, blank means no agent). Takes priority over the X-Dailybot-Agent-Name header. See Agent attribution. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | SavedView | Required | A SavedView object. |
Errors
| Status | When |
|---|---|
| 400 | Validation failed, or a filter, sort or `include` value was not recognised. The response `code` says which. `invalid_agent_attribution` means the agent name is invalid. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | Authenticated but not allowed: missing scope (`insufficient_scope`, which is also what an agent or organization key gets on an operation that needs a person, and what a personal key gets when its explicit Plan scopes do not cover the endpoint) or a guest account (`guest_not_allowed`). |
| 404 | Not found, or not visible to you. Both cases return the same body. |
curl -sS -X PATCH "https://api.dailybot.com/v1/plan/views/{view_id}/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN"dailybot plan tasks view update 00000000-0000-4000-8000-000000000010 --view-mode kanban --group-by ownerTry it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:write`.
- Rate limit: 60 writes per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key. An agent or organization key gets `403 insufficient_scope`.
Delete one saved view
Permanent. Deleting a shared or board_default view needs a board manager; otherwise 403 view_visibility_forbidden.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| view_id | uuid | Required | The saved view's uuid. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Errors
| Status | When |
|---|---|
| 400 | The agent name is invalid (`invalid_agent_attribution`). |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | Authenticated but not allowed: missing scope (`insufficient_scope`, which is also what an agent or organization key gets on an operation that needs a person, and what a personal key gets when its explicit Plan scopes do not cover the endpoint) or a guest account (`guest_not_allowed`). |
| 404 | Not found, or not visible to you. Both cases return the same body. |
curl -sS -X DELETE "https://api.dailybot.com/v1/plan/views/{view_id}/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN"dailybot plan tasks view delete 00000000-0000-4000-8000-000000000010 --yesTry it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:write`.
- Rate limit: 60 writes per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key. An agent or organization key gets `403 insufficient_scope`.
List a board's attachments
The board's ready attachments, ordered by position, as a page. Anyone who can see the board can list them; a board you cannot see is 404. Each url is a download link: do not store it, keep the attachment uuid and read it again when you need the file.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| page | integer | Optional | 1-based page number. |
| page_size | integer | Optional | Rows per page. Default 50, maximum 100. Out-of-range values are clamped, never rejected: asking for 500 returns 100. |
TaskAttachment object
| Name | Type | Required | Description |
|---|---|---|---|
| uuid | uuid | Required | Stable public identifier. |
| filename | string | Required | File name. |
| content_type | string | Required | MIME type. |
| size | integer | Required | Size in bytes. |
| url | string | Required | Where to download the file. |
| thumbnail_url | uri | null | Optional | Thumbnail for images. |
| width | integer | null | Optional | — |
| height | integer | null | Optional | — |
| status | enum | Required | Current status. One of pending, ready, scanning, rejected. |
| uploaded_by | ActorRef | null | Optional | Who uploaded the file. See ActorRef. |
| executed_by_agent | object | null | Optional | The agent that executed this on behalf of the person, or null when no agent was named: an object with uuid, name, username and avatar. The person in the author field is still the author; the agent is shown as the one who executed it. |
| created_at | date-time | Required | When the row was created. |
ActorRef object
Response
| Name | Type | Required | Description |
|---|---|---|---|
| count | integer | Required | Total number of rows. |
| next | uri | Required | URL of the next page, or null. |
| previous | uri | Required | URL of the previous page, or null. |
| results | array<TaskAttachment> | Required | The page of TaskAttachment objects. |
Errors
| Status | When |
|---|---|
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 404 | The board does not exist or you cannot see it (`not_found`), never a 403. |
curl -sS "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/attachments/" \
-H "X-API-KEY: $DAILYBOT_API_KEY"{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"uuid": "00000000-0000-4000-8000-000000000009",
"filename": "roadmap.pdf",
"content_type": "application/pdf",
"size": 48213,
"url": "https://media.dailybot.com/\u2026",
"url_expires_at": null,
"content_url": "/v1/plan/boards/00000000-0000-4000-8000-000000000002/attachments/00000000-0000-4000-8000-000000000009/content/",
"thumbnail_url": null,
"width": null,
"height": null,
"status": "ready",
"uploaded_by": {
"kind": "user",
"uuid": "00000000-0000-4000-8000-000000000001",
"name": "Ana"
},
"created_at": "2026-09-30T14:00:00Z"
}
]
}Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:read`.
- Rate limit: 120 reads per minute per actor.
- Works with a login session, a CLI user token, a personal API key, or an agent or organization key. A personal key sees what its person sees; an agent or organization key acts as a system actor and sees organization-visible boards only.
Upload an attachment to a board
Attach a file to a board in one request. Send multipart/form-data with the file field and an optional caption; there is no presign flow here. The limit is 5 MiB: a larger file is 400 attachment_too_large, with extra.max_size_bytes. The file type is checked from its content, with the same policy as project attachments (400 attachment_invalid_type).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
| file | binary | Required | The file, as a multipart part. |
| caption | string | Optional | Optional caption, max 255 characters. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | TaskAttachment | Required | A TaskAttachment object. |
Errors
| Status | When |
|---|---|
| 400 | The file is missing, too large (`attachment_too_large`) or of a refused type (`attachment_invalid_type`), or the board holds the maximum number of attachments (`attachment_limit_reached`). `invalid_agent_attribution` means the agent name is invalid. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | You are not an organization administrator (`insufficient_scope`), or you are a guest (`guest_not_allowed`). An agent or organization key is refused here too. |
| 404 | The board does not exist or you cannot see it (`not_found`), never a 403. |
curl -sS -X POST "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/attachments/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN" \
-F "file=@./roadmap.pdf" \
-F "caption=Q4 roadmap"Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:admin` — container writes. A non-guest member can call it with a login session or a personal API key (a key with explicit Plan scopes needs `tasks:write`, which covers it); an agent or organization key gets `403 insufficient_scope`.
- Rate limit: 60 writes per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key. An agent or organization key gets `403 insufficient_scope`.
Retrieve a board attachment
One attachment of the board. Anyone who can see the board can read it.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
| attachment_id | uuid | Required | The attachment's uuid. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | TaskAttachment | Required | A TaskAttachment object. |
Errors
| Status | When |
|---|---|
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 404 | The board or the attachment does not exist or you cannot see it (`not_found`), never a 403. |
curl -sS "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/attachments/00000000-0000-4000-8000-000000000009/" \
-H "X-API-KEY: $DAILYBOT_API_KEY"Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:read`.
- Rate limit: 120 reads per minute per actor.
- Works with a login session, a CLI user token, a personal API key, or an agent or organization key. A personal key sees what its person sees; an agent or organization key acts as a system actor and sees organization-visible boards only.
Download a board attachment's bytes
The file bytes, with the recorded content type, through the API rather than the media link. An attachment whose upload is not complete yet is 409 attachment_not_ready.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
| attachment_id | uuid | Required | The attachment's uuid. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | binary | Required | The file bytes; Content-Type is the attachment's. |
Errors
| Status | When |
|---|---|
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 404 | The board or the attachment does not exist or you cannot see it (`not_found`), never a 403. |
| 409 | The attachment is not ready yet (`attachment_not_ready`). |
curl -sS "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/attachments/00000000-0000-4000-8000-000000000009/content/" \
-H "X-API-KEY: $DAILYBOT_API_KEY" \
-o roadmap.pdfTry it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:read`.
- Rate limit: 120 reads per minute per actor.
- Works with a login session, a CLI user token, a personal API key, or an agent or organization key. A personal key sees what its person sees; an agent or organization key acts as a system actor and sees organization-visible boards only.
Rename a board attachment
Changes the display file name; the stored bytes do not change.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
| attachment_id | uuid | Required | The attachment's uuid. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
| filename | string | Required | The new file name (1–255 characters). The stored bytes do not change. |
| agent_name | string | Optional | The name of the agent that executed this write on the person's behalf (max 128 characters, blank means no agent). Takes priority over the X-Dailybot-Agent-Name header. See Agent attribution. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | TaskAttachment | Required | A TaskAttachment object. |
Errors
| Status | When |
|---|---|
| 400 | Validation failed; the response `code` says which field. `invalid_agent_attribution` means the agent name is invalid. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | You are not an organization administrator (`insufficient_scope`), or you are a guest (`guest_not_allowed`). An agent or organization key is refused here too. |
| 404 | The board or the attachment does not exist or you cannot see it (`not_found`), never a 403. |
curl -sS -X PATCH "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/attachments/00000000-0000-4000-8000-000000000009/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"filename": "roadmap-q4.pdf"
}'Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:admin` — container writes. A non-guest member can call it with a login session or a personal API key (a key with explicit Plan scopes needs `tasks:write`, which covers it); an agent or organization key gets `403 insufficient_scope`.
- Rate limit: 60 writes per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key. An agent or organization key gets `403 insufficient_scope`.
Remove an attachment from a board
Removes the attachment from the board. Answers 204.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| board_id | string | Required | The board's uuid. |
| attachment_id | uuid | Required | The attachment's uuid. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Errors
| Status | When |
|---|---|
| 400 | Validation failed; the response `code` says which field. `invalid_agent_attribution` means the agent name is invalid. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | You are not an organization administrator (`insufficient_scope`), or you are a guest (`guest_not_allowed`). An agent or organization key is refused here too. |
| 404 | The board or the attachment does not exist or you cannot see it (`not_found`), never a 403. |
curl -sS -X DELETE "https://api.dailybot.com/v1/plan/boards/00000000-0000-4000-8000-000000000002/attachments/00000000-0000-4000-8000-000000000009/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN"Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:admin` — container writes. A non-guest member can call it with a login session or a personal API key (a key with explicit Plan scopes needs `tasks:write`, which covers it); an agent or organization key gets `403 insufficient_scope`.
- Rate limit: 60 writes per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key. An agent or organization key gets `403 insufficient_scope`.
This page is the reference for Plan · Boards. Every endpoint lives under https://api.dailybot.com/v1/plan/ and answers JSON.
Authenticate with a login session or a CLI user token (Authorization: Bearer …), or with an API key (X-API-KEY). A personal API key acts as its person and can do everything that person can do in Dailybot; an agent or organization key never acts as a person and is refused on the endpoints that need one. On an endpoint, the API key badge means an agent or organization key is accepted too. See Authentication for Plan, Authentication and Errors for the rules shared by every Dailybot API.
New to Plan? Read the overview for the model: projects, boards, workflow states, keys, ordering, versions and archive.