Skip to content
view raw .md

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].

GET/v1/plan/boards/BetaAPI keyCLI AuthPage-number pagination

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

NameTypeRequiredDescription
pageintegerOptional1-based page number.
page_sizeintegerOptionalRows per page. Default 50, maximum 100. Out-of-range values are clamped, never rejected: asking for 500 returns 100.
limitintegerOptionalAlias for page_size, translated server-side.
offsetintegerOptionalAlias translated to page server-side.

Filters

NameTypeRequiredDescription
searchstringOptionalMatches title and key. Longer than 256 characters is 400 search_query_too_long, not truncated. q is an alias.
projectarrayOptionalProject uuids. Repeatable; values are OR-ed.

Dates

NameTypeRequiredDescription
start_datestringOptionalCreated-at window start. What the CLI's --since produces.
end_datestringOptionalCreated-at window end. What the CLI's --until produces.

Archived rows

NameTypeRequiredDescription
is_archivedbooleanOptionaltrue returns only archived rows; false (the default) only live ones. Archive is the delete, so archived rows stay readable.
include_archivedbooleanOptionalInclude 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

NameTypeRequiredDescription
uuiduuidRequiredStable public identifier.
keystringRequiredThe board's key: the prefix of its tasks' keys. Renaming it keeps the old key reserved and resolving.
namestringRequiredDisplay name. Max 120 characters.
projectProjectOptionalThe project. See Project.
teamuuid | nullOptionalThe team.
visibilityenumRequiredorg (everyone in the organization) or members (explicit members only). One of org, members.
effective_visibilitystringOptionalWhether 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_scaleenumOptionalHow estimates are expressed on this board. One of none, fibonacci, linear.
default_viewSavedView | nullOptionalThe board's default saved view, or null. See SavedView.
archive_after_daysinteger | nullOptionalArchive done tasks automatically after this many days, or null to keep them.
task_countintegerOptionalNumber of live tasks.
wip_limitsobjectOptionalWork-in-progress limits per column.
is_archivedbooleanOptionalWhether the row is archived. Archive is the delete: archived rows stay readable and restorable.
created_atdate-timeOptionalWhen the row was created.
updated_atdate-timeOptionalWhen the row last changed.
viewerobjectOptionalWhat you can do with this row. Shape: {is_member, can_see_content, can_manage: boolean} (all required).
statesarray<WorkflowState>OptionalThe board's workflow states, in column order. See WorkflowState.

Project object

NameTypeRequiredDescription
uuiduuidRequiredStable public identifier.
namestringRequiredDisplay name. Max 120 characters.
slugstringOptionalURL-friendly name. Max 48 characters.
descriptionstring | nullOptionalFree-form description.
leadUserRef | nullOptionalThe project's lead. See UserRef.
goalsarrayOptionalGoals this project points at. A project can serve several goals. Always present: uuid. Items: {uuid, name}.
goalobjectOptionalThe goal, when there is exactly one. Shape: {uuid, name}|null.
board_countintegerOptionalNumber of live boards in the project.
healthenumOptionalDeclared health. One of not_set, on_track, at_risk, off_track.
start_datedate | nullOptionalPlanned start date.
target_datedate | nullOptionalPlanned end date.
progressProjectProgress | nullOptionalProgress roll-up over the tasks you can see. See ProjectProgress.
is_archivedbooleanRequiredWhether the row is archived. Archive is the delete: archived rows stay readable and restorable.
archived_atdate-time | nullOptionalWhen the row was archived.
created_atdate-timeOptionalWhen the row was created.
updated_atdate-timeOptionalWhen the row last changed.
viewerobjectOptionalWhat you can do with this row. Shape: {can_see_content: boolean, can_manage: boolean} (both required).

SavedView object

NameTypeRequiredDescription
namestringRequiredDisplay name. Max 64 characters.
view_modeenumOptionalHow the filtered set is drawn. Reads always return board for the kanban layout. One of list, board, timeline, calendar.
group_byenumOptionalThe grouping dimension. One of state, owner, priority, category.
sortstringOptionalA sort key, - prefixed for descending.
filtersobjectRequiredThe view's filters, in the shared task filter grammar.
schema_versionintegerOptionalVersion of the view's stored format.
visibilityenumOptionalpersonal (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.
collapsedobject | array | string | number | booleanOptionalClient UI state stored verbatim (which groups are collapsed). Only size and depth are validated.
columnsobject | array | string | number | booleanOptionalClient UI state stored verbatim (which columns are shown). Only size and depth are validated.
uuiduuidOptionalStable public identifier.
scopeenumOptionalWhich container the view belongs to: board or project. Read-only. One of board, project.
boarduuid | nullOptionalThe board's uuid when scope is board; null for a project view. Read-only.
ownerobjectOptionalWho owns the view. Shape: {uuid, name}.
created_atdate-timeOptionalWhen the row was created.
updated_atdate-timeOptionalWhen the row last changed.

WorkflowState object

NameTypeRequiredDescription
uuiduuidRequiredStable public identifier.
namestringRequiredDisplay name. Max 48 characters.
categoryenumRequiredOne of the five fixed categories. It never changes after create. One of backlog, todo, in_progress, done, canceled.
positionintegerRequiredColumn position, left to right. Minimum 0.
colorstringOptionalDisplay color (hex).
is_defaultbooleanOptionalWhether new tasks land in this state by default.
is_archivedbooleanOptionalWhether the row is archived. Archive is the delete: archived rows stay readable and restorable.
task_countintegerOptionalNumber of live tasks.

UserRef object

NameTypeRequiredDescription
uuiduuidRequiredStable public identifier.
namestringOptionalDisplay name.
avatar_urlstring | nullOptional—
has_photobooleanOptional—

ProjectProgress object

NameTypeRequiredDescription
totalintegerRequiredAll tasks counted.
completedintegerRequiredTasks in a done or canceled state.
openintegerOptionalTasks in a backlog, todo or in_progress state.
blockedintegerOptionalTasks with a live blocker.
overdueintegerOptionalOpen tasks past their due date.
percent_completeintegerRequiredcompleted as a percentage of total.

Response

NameTypeRequiredDescription
countintegerRequiredTotal number of rows.
nexturiRequiredURL of the next page, or null.
previousuriRequiredURL of the previous page, or null.
resultsarray<Board>RequiredThe rows on this page. See Board.

Errors

StatusWhen
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan 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"

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.
POST/v1/plan/boards/BetaCLI Auth

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

NameTypeRequiredDescription
Idempotency-KeystringOptionalA 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-NamestringOptionalThe 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

NameTypeRequiredDescription
namestringRequiredDisplay name. Max 120 characters.
keystringRequiredThe board's key, the prefix of its tasks' keys (for example ENG).
projectuuidRequiredThe project.
teamuuid | nullOptionalThe team.
visibilityenumOptionalorg (everyone in the organization) or members (explicit members only). One of org, members.
estimate_scaleenumOptionalHow estimates are expressed on this board. One of none, fibonacci, linear.
archive_after_daysinteger | nullOptionalArchive done tasks automatically after this many days, or null to keep them. Minimum 1.
default_viewSavedView | nullOptionalThe board's default saved view, or null. See SavedView.
agent_namestringOptionalThe 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

NameTypeRequiredDescription
(body)BoardRequiredA Board object.

Errors

StatusWhen
400Validation 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.
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`), or the plan's board ceiling is reached (`task_boards_limit_reached`).
409Another 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"
  }'

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`.
GET/v1/plan/boards/{board_id}/BetaAPI keyCLI Auth

Retrieve a board

One board by uuid. A board you cannot see answers 404, the same as one that does not exist.

Path parameters

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.

Response

NameTypeRequiredDescription
(body)BoardRequiredA Board object.

Errors

StatusWhen
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
404Not 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"

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.
PATCH/v1/plan/boards/{board_id}/BetaCLI Auth

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

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.

Headers

NameTypeRequiredDescription
Idempotency-KeystringOptionalA 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-NamestringOptionalThe 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

NameTypeRequiredDescription
namestringOptionalDisplay name. Max 120 characters.
keystringOptionalThe board's key, the prefix of its tasks' keys (for example ENG).
projectuuidOptionalThe project.
teamuuid | nullOptionalThe team.
visibilityenumOptionalorg (everyone in the organization) or members (explicit members only). One of org, members.
estimate_scaleenumOptionalHow estimates are expressed on this board. One of none, fibonacci, linear.
archive_after_daysinteger | nullOptionalArchive done tasks automatically after this many days, or null to keep them. Minimum 1.
default_viewSavedView | nullOptionalThe board's default saved view, or null. See SavedView.
agent_namestringOptionalThe 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

NameTypeRequiredDescription
(body)BoardRequiredA Board object.

Errors

StatusWhen
400Validation 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.
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
404Not found, or not visible to you. Both cases return the same body.
409Another 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"
  }'

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`.
POST/v1/plan/boards/{board_id}/archive/BetaCLI Auth

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

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.

Query parameters

NameTypeRequiredDescription
dry_runbooleanOptionalPreview 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

NameTypeRequiredDescription
Idempotency-KeystringOptionalA 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-NamestringOptionalThe 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.

NameTypeRequiredDescription
operationstringRequiredThe operation that would run.
dry_runbooleanRequiredAlways true.
reversiblebooleanRequiredWhether the operation can be undone.
restore_pathstring | nullRequiredThe path that would undo it, or null when there is none.
consequencestringRequiredA sentence to show a person before acting. It states the cascade rather than summarising it.
affectsobjectRequiredWhat the operation would touch, as counts (integers) by kind.
would_refusebooleanOptionalWorkflow state archive only: true when the real call would be refused.
refusal_codestringOptionalWorkflow state archive only: the error code the real call would answer with.

Response

NameTypeRequiredDescription
(body)Board | DryRunPreviewRequiredA Board object. With ?dry_run=true, a DryRunPreview object instead.

Errors

StatusWhen
400The agent name is invalid (`invalid_agent_attribution`).
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
403Authenticated 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`).
404Not 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"

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`.
POST/v1/plan/boards/{board_id}/restore/BetaCLI Auth

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

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.

Headers

NameTypeRequiredDescription
Idempotency-KeystringOptionalA 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-NamestringOptionalThe 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

NameTypeRequiredDescription
(body)BoardRequiredA Board object.

Errors

StatusWhen
400The agent name is invalid (`invalid_agent_attribution`).
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`), or no board slot is free (`task_boards_limit_reached`).
403Authenticated 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`).
404Not 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"

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`.
POST/v1/plan/boards/{board_id}/visit/BetaCLI Auth

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

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.

Headers

NameTypeRequiredDescription
X-Dailybot-Agent-NamestringOptionalThe 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

NameTypeRequiredDescription
boarduuidRequiredThe board.
visited_atdate-timeRequiredWhen you last opened the board.

Response

NameTypeRequiredDescription
(body)BoardVisitRequiredA BoardVisit object.

Errors

StatusWhen
400Validation 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.
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
403Authenticated 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`).
404Not 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"

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`.
GET/v1/plan/boards/{board_id}/states/BetaAPI keyCLI Auth

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

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.

Query parameters

NameTypeRequiredDescription
include_archivedbooleanOptionalInclude 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

NameTypeRequiredDescription
(body)array<WorkflowState>RequiredA JSON array of WorkflowState objects.

Errors

StatusWhen
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
404Not 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"

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.
POST/v1/plan/boards/{board_id}/states/BetaCLI Auth

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

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.

Headers

NameTypeRequiredDescription
Idempotency-KeystringOptionalA 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-NamestringOptionalThe 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

NameTypeRequiredDescription
namestringRequiredDisplay name. Max 48 characters.
categoryenumRequiredOne of the five fixed categories. It never changes after create. One of backlog, todo, in_progress, done, canceled.
positionintegerOptionalColumn 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.
colorstringOptionalDisplay color (hex).
is_defaultbooleanOptionalWhether new tasks land in this state by default.
agent_namestringOptionalThe 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

NameTypeRequiredDescription
(body)WorkflowStateRequiredA WorkflowState object.

Errors

StatusWhen
400Validation 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.
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
404Not found, or not visible to you. Both cases return the same body.
409Conflict. 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
  }'

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`.
PATCH/v1/plan/boards/{board_id}/states/{state_id}/BetaCLI Auth

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

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.
state_idstringRequiredThe workflow state's uuid.

Headers

NameTypeRequiredDescription
X-Dailybot-Agent-NamestringOptionalThe 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

NameTypeRequiredDescription
namestringOptionalDisplay name. Max 48 characters.
positionintegerOptionalColumn 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.
colorstringOptionalDisplay color (hex).
agent_namestringOptionalThe 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

NameTypeRequiredDescription
(body)WorkflowStateRequiredA WorkflowState object.

Errors

StatusWhen
400Validation 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.
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
404Not 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"
  }'

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`.
POST/v1/plan/boards/{board_id}/states/{state_id}/archive/BetaCLI Auth

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

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.
state_idstringRequiredThe workflow state's uuid.

Query parameters

NameTypeRequiredDescription
dry_runbooleanOptionalPreview 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

NameTypeRequiredDescription
X-Dailybot-Agent-NamestringOptionalThe 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

NameTypeRequiredDescription
migrate_touuidOptionalAnother live state on the same board that receives every task in the column before it is archived.
agent_namestringOptionalThe 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

NameTypeRequiredDescription
(body)WorkflowState | DryRunPreviewRequiredA WorkflowState object. With ?dry_run=true, a DryRunPreview object instead.

Errors

StatusWhen
400The agent name is invalid (`invalid_agent_attribution`).
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
404Not found, or not visible to you. Both cases return the same body.
409Live 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"
  }'

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`.
POST/v1/plan/boards/{board_id}/states/{state_id}/restore/BetaCLI Auth

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

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.
state_idstringRequiredThe workflow state's uuid.

Headers

NameTypeRequiredDescription
X-Dailybot-Agent-NamestringOptionalThe 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

NameTypeRequiredDescription
(body)WorkflowStateRequiredA WorkflowState object.

Errors

StatusWhen
400The agent name is invalid (`invalid_agent_attribution`).
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
403Authenticated 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`).
404Not 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"

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`.
POST/v1/plan/boards/{board_id}/states/reorder/BetaCLI Auth

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

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.

Headers

NameTypeRequiredDescription
X-Dailybot-Agent-NamestringOptionalThe 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

NameTypeRequiredDescription
orderarrayRequiredEvery live column's uuid exactly once, left to right. Items: uuid.
agent_namestringOptionalThe 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

NameTypeRequiredDescription
(body)array<WorkflowState>RequiredA JSON array of WorkflowState objects.

Errors

StatusWhen
400Validation 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.
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
404Not 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"
    ]
  }'

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`.
GET/v1/plan/boards/{board_id}/board/BetaAPI keyCLI Auth

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

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.

Query parameters

Filters

NameTypeRequiredDescription
group_bystringOptionalGroup 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_stateintegerOptionalHow many tasks to include per column. Maximum 50, tighter than the usual 100 because this read carries labels for every card.
ownerarrayOptionalA 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.
labelarrayOptionalLabel uuids — v4 only, at most 50, matching the shared label filter's existing cap. A non-v4 value is 400 invalid_label_filter.
priorityarrayOptional1=urgent, 2=high, 3=medium, 4=low, 5=none. Repeatable.
blockedbooleanOptionalDerived 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/.
searchstringOptionalMatches title and key. Longer than 256 characters is 400 search_query_too_long, not truncated. q is an alias.

Dates

NameTypeRequiredDescription
due_beforestringOptionalInclusive. 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_afterstringOptionalInclusive.

Headers

NameTypeRequiredDescription
If-None-MatchstringOptionalThe ETag from your previous read. A match answers 304.

BoardSnapshot object

NameTypeRequiredDescription
boardBoardRequiredThe board. See Board.
generated_atdate-timeRequiredWhen the response was computed.
delta_cursordate-timeRequiredPass it as updated_since to the delta feed.
group_bystringOptionalThe grouping dimension.
groupsarrayRequiredOne 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}.
viewerobjectOptionalWhat you can do with this row. Shape: {is_member, can_see_content, can_manage} (all required).

Response

NameTypeRequiredDescription
(body)BoardSnapshotRequiredA BoardSnapshot object.

Errors

StatusWhen
304Not modified: the `If-None-Match` ETag you sent still matches.
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
404Not 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"

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.
GET/v1/plan/boards/{board_id}/delta/BetaAPI keyCLI Auth

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

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.

Query parameters

NameTypeRequiredDescription
updated_sincestringRequiredThe 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.
limitintegerOptionalMaximum entries in changed.

BoardDelta object

NameTypeRequiredDescription
sincedate-timeRequiredThe updated_since you sent.
cursordate-timeRequiredSend it as updated_since on your next poll.
changedarray<Task>RequiredTasks that changed, one entry per task. See Task.
removedarrayRequiredTasks that left the board, with a reason such as archived. Items: {uuid, key, reason}.
statesarray | nullOptionalThe board's workflow states, in column order.
truncatedbooleanRequiredtrue when more changes are waiting: poll again immediately.
poll_after_secondsintegerRequiredWhen to poll next, suggested by the server (15 to 120 seconds). A hint, not enforced. From 15 to 120.

Task object

NameTypeRequiredDescription
uuiduuidRequiredStable public identifier.
keystringRequiredHuman-readable key KEY-n, for example ENG-142. Retired keys keep resolving.
titlestringRequiredThe task's title. Max 255 characters.
descriptionstring | nullOptionalFree-form description.
boarduuidOptionalThe board.
stateWorkflowStateRequiredThe task's workflow state (its column). See WorkflowState.
priorityintegerOptional1 urgent, 2 high, 3 medium, 4 low, 5 none. From 1 to 5.
estimateinteger | nullOptionalEstimate on the board's scale.
ownerUserRef | nullOptionalThe person accountable for the task. See UserRef.
executorActorRef | nullOptionalThe actor doing the work, when different from the owner (for example an agent). See ActorRef.
executorsobject[]OptionalEvery 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_countintegerOptionalNumber of participants.
start_datedate | nullOptionalPlanned start date.
due_datedate | nullOptionalDue date.
milestonenull | {uuid, name, date}OptionalThe milestone this task counts toward. All fields are always present.
parent_tasknull | {uuid, key, title}OptionalThe parent task, for a sub-task. One level of nesting only. All fields are always present.
subtask_countintegerOptionalNumber of sub-tasks.
subtask_done_countintegerOptionalNumber of finished sub-tasks.
attachment_countintegerOptionalNumber of attachments.
open_blocker_countintegerOptionalNumber of live blockers.
labelsarray<Label>OptionalOrganization labels on the task. See Label.
rankstring | nullOptionalOpaque order within the column. Never compute it: move with after / before.
blockedbooleanOptionalTasks with a live blocker.
blocked_sincedate-time | nullOptionalWhen the task became blocked.
completed_atdate-time | nullOptionalWhen it was completed, or null.
is_archivedbooleanRequiredWhether the row is archived. Archive is the delete: archived rows stay readable and restorable.
subscribedbooleanOptionalWhether you watch this task.
versionintegerRequiredIncrements on every write. Send it back as If-Match to refuse a stale update.
created_byActorRef | nullOptionalWho created the row. See ActorRef.
created_atdate-timeOptionalWhen the row was created.
updated_atdate-timeOptionalWhen the row last changed.

ActorRef object

NameTypeRequiredDescription
kindstringRequired—
uuidstringRequiredStable public identifier.
namestringOptionalDisplay name.
usernamestring | nullOptional—
avatar_urlstring | nullOptional—
has_photobooleanOptional—

Label object

NameTypeRequiredDescription
uuiduuidRequiredStable public identifier.
namestringRequiredDisplay name. Max 64 characters.
colorstringOptionalDisplay color (hex).

Response

NameTypeRequiredDescription
(body)BoardDeltaRequiredA BoardDelta object.

Errors

StatusWhen
400The cursor is older than 7 days (`delta_window_expired`): re-read the board snapshot. Also returned for a malformed `updated_since`.
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
404Not 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"

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.
GET/v1/plan/boards/{board_id}/views/BetaCLI AuthPage-number pagination

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

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.

Response

NameTypeRequiredDescription
countintegerRequiredTotal number of rows.
nexturiRequiredURL of the next page, or null.
previousuriRequiredURL of the previous page, or null.
resultsarray<SavedView>RequiredThe rows on this page. See SavedView.

Errors

StatusWhen
400Validation failed, or a filter, sort or `include` value was not recognised. The response `code` says which.
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
403Authenticated 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"

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`.
PUT/v1/plan/boards/{board_id}/views/BetaCLI Auth

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

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.

Headers

NameTypeRequiredDescription
If-MatchstringRequiredThe 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-NamestringOptionalThe 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

NameTypeRequiredDescription
(body)array<SavedView>RequiredA JSON array of SavedView objects.

Errors

StatusWhen
400Validation 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.
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
403Authenticated 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`).
404Not found, or not visible to you. Both cases return the same body.
412The `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"
        ]
      }
    }
  ]'

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`.
GET/v1/plan/boards/{board_id}/mentionables/BetaCLI Auth

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

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.

Query parameters

NameTypeRequiredDescription
qstringOptionalMatches name, handle or external id, never a whole email address.
limitintegerOptionalPage 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.
offsetintegerOptionalRows to skip, over the deterministic full_name, id ordering — so a page boundary can neither drop nor repeat somebody.
kindsstringOptionalComma-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

NameTypeRequiredDescription
limitintegerRequiredPage size applied.
resultsarray<Mentionable>RequiredThe rows on this page. See Mentionable.

Mentionable object

NameTypeRequiredDescription
uuiduuidRequiredThe person's uuid. Key mention chips on it.
namestringRequiredDisplay name. Show it to tell people with the same handle apart.
handlestring | nullRequiredHandle, if the person has one. Not unique within an organization.
avatar_urlstring | nullRequiredAvatar image URL, the same as on a task owner. null on an agent row.
has_photobooleanRequiredfalse means there is no photo: show initials. Always false on an agent row.
kindenumRequiredWhether the row is a person or an agent. One of user, agent.

Response

NameTypeRequiredDescription
(body)MentionableListRequiredA MentionableList object.

Errors

StatusWhen
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
403Authenticated 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`).
404Not 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"

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`.
GET/v1/plan/boards/{board_id}/members/BetaAPI keyCLI AuthPage-number pagination

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

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.

Query parameters

NameTypeRequiredDescription
pageintegerOptional1-based page number.
page_sizeintegerOptionalRows per page. Default 50, maximum 100. Out-of-range values are clamped, never rejected: asking for 500 returns 100.

BoardMember object

NameTypeRequiredDescription
subject_typeenumRequiredOne of user, team.
user_uuiduuid | nullOptionalThe person's user uuid.
uuiduuid | nullOptionalStable public identifier.
full_namestringOptional—
namestringOptionalDisplay name.
roleenum | nullOptionalParticipant role. One of admin, member, guest.
team_uuiduuid | nullOptionalA 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_namestringOptional—
added_atdate-timeRequired—
added_by_uuiduuid | nullOptional—

Response

NameTypeRequiredDescription
countintegerRequiredTotal number of rows.
nexturiRequiredURL of the next page, or null.
previousuriRequiredURL of the previous page, or null.
resultsarray<BoardMember>RequiredThe rows on this page. See BoardMember.

Errors

StatusWhen
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
404Not 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"

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.
POST/v1/plan/boards/{board_id}/members/BetaCLI Auth

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

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.

Headers

NameTypeRequiredDescription
Idempotency-KeystringOptionalA 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-NamestringOptionalThe 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

NameTypeRequiredDescription
user_uuiduuidOptionalThe person's user uuid.
team_uuiduuidOptionalA 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_namestringOptionalThe 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

NameTypeRequiredDescription
(body)BoardMemberRequiredA BoardMember object.

Errors

StatusWhen
400Send exactly one of `user_uuid` and `team_uuid`; both or neither is `invalid_filter_value`. `invalid_agent_attribution` means the agent name is invalid.
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
403Authenticated 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`).
404Not 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"
  }'

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`.
DELETE/v1/plan/boards/{board_id}/members/{user_id}/BetaCLI Auth

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

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.
user_idstringRequiredThe member's user uuid.

Headers

NameTypeRequiredDescription
X-Dailybot-Agent-NamestringOptionalThe 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

StatusWhen
400The agent name is invalid (`invalid_agent_attribution`).
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
403Authenticated 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`).
404Not found, or not visible to you. Both cases return the same body.
409This 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"

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`.
PATCH/v1/plan/boards/{board_id}/members/{user_id}/BetaCLI Auth

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

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.
user_idstringRequiredThe member's user uuid.

Headers

NameTypeRequiredDescription
X-Dailybot-Agent-NamestringOptionalThe 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

NameTypeRequiredDescription
(body)BoardMemberRequiredA BoardMember object.

Errors

StatusWhen
400Validation 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.
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
404Not 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`.
GET/v1/plan/boards/{board_id}/labels/BetaCLI Auth

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

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.

Query parameters

NameTypeRequiredDescription
pageintegerOptional1-based page number.
page_sizeintegerOptionalRows per page. Default 50, maximum 100. Out-of-range values are clamped, never rejected: asking for 500 returns 100.
searchstringOptionalCase-insensitive substring match on the label name only. Empty means no filter; a value that matches nothing returns an empty list.
include_archivedbooleanOptionalInclude 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

NameTypeRequiredDescription
resultsarray<Label>RequiredThe rows on this page.

Errors

StatusWhen
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
404Not 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"

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`.
POST/v1/plan/boards/{board_id}/labels/BetaCLI Auth

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

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.

Headers

NameTypeRequiredDescription
X-Dailybot-Agent-NamestringOptionalThe 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

NameTypeRequiredDescription
namestringRequiredDisplay name.
colorstringOptionalDisplay color (hex).
descriptionstringOptionalFree-form description.
agent_namestringOptionalThe 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

NameTypeRequiredDescription
(body)LabelRequiredA Label object.

Errors

StatusWhen
400Validation 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.
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
404Not 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"
  }'

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`.
GET/v1/plan/views/{view_id}/BetaCLI Auth

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

NameTypeRequiredDescription
view_iduuidRequiredThe saved view's uuid.

Response

NameTypeRequiredDescription
(body)SavedViewRequiredA SavedView object.

Errors

StatusWhen
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
404Not 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"

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`.
PATCH/v1/plan/views/{view_id}/BetaCLI Auth

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

NameTypeRequiredDescription
view_iduuidRequiredThe saved view's uuid.

Headers

NameTypeRequiredDescription
X-Dailybot-Agent-NamestringOptionalThe 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

NameTypeRequiredDescription
namestringOptionalDisplay name. Max 64 characters.
view_modeenumOptionalHow the filtered set is drawn. kanban is accepted as an alias of board. One of list, board, kanban, timeline, calendar.
group_byenumOptionalThe grouping dimension. One of state, owner, priority, category.
sortstringOptionalA sort key, - prefixed for descending.
filtersobjectOptionalThe view's filters, in the shared task filter grammar.
schema_versionintegerOptionalVersion of the view's stored format.
visibilityenumOptionalpersonal, 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.
collapsedobject | array | string | number | booleanOptionalClient UI state stored verbatim (which groups are collapsed). Only size and depth are validated.
columnsobject | array | string | number | booleanOptionalClient UI state stored verbatim (which columns are shown). Only size and depth are validated.
agent_namestringOptionalThe 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

NameTypeRequiredDescription
(body)SavedViewRequiredA SavedView object.

Errors

StatusWhen
400Validation 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.
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
403Authenticated 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`).
404Not 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"

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`.
DELETE/v1/plan/views/{view_id}/BetaCLI Auth

Delete one saved view

Permanent. Deleting a shared or board_default view needs a board manager; otherwise 403 view_visibility_forbidden.

Path parameters

NameTypeRequiredDescription
view_iduuidRequiredThe saved view's uuid.

Headers

NameTypeRequiredDescription
X-Dailybot-Agent-NamestringOptionalThe 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

StatusWhen
400The agent name is invalid (`invalid_agent_attribution`).
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
403Authenticated 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`).
404Not 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"

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`.
GET/v1/plan/boards/{board_id}/attachments/BetaAPI keyCLI AuthPage-number pagination

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

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.

Query parameters

NameTypeRequiredDescription
pageintegerOptional1-based page number.
page_sizeintegerOptionalRows per page. Default 50, maximum 100. Out-of-range values are clamped, never rejected: asking for 500 returns 100.

TaskAttachment object

NameTypeRequiredDescription
uuiduuidRequiredStable public identifier.
filenamestringRequiredFile name.
content_typestringRequiredMIME type.
sizeintegerRequiredSize in bytes.
urlstringRequiredWhere to download the file.
thumbnail_urluri | nullOptionalThumbnail for images.
widthinteger | nullOptional—
heightinteger | nullOptional—
statusenumRequiredCurrent status. One of pending, ready, scanning, rejected.
uploaded_byActorRef | nullOptionalWho uploaded the file. See ActorRef.
executed_by_agentobject | nullOptionalThe 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_atdate-timeRequiredWhen the row was created.

ActorRef object

NameTypeRequiredDescription
kindstringRequired—
uuidstringRequiredStable public identifier.
namestringOptionalDisplay name.
usernamestring | nullOptional—
avatar_urlstring | nullOptional—
has_photobooleanOptional—

Response

NameTypeRequiredDescription
countintegerRequiredTotal number of rows.
nexturiRequiredURL of the next page, or null.
previousuriRequiredURL of the previous page, or null.
resultsarray<TaskAttachment>RequiredThe page of TaskAttachment objects.

Errors

StatusWhen
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
404The 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"

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.
POST/v1/plan/boards/{board_id}/attachments/BetaCLI Auth

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

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.

Headers

NameTypeRequiredDescription
X-Dailybot-Agent-NamestringOptionalThe 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

NameTypeRequiredDescription
filebinaryRequiredThe file, as a multipart part.
captionstringOptionalOptional caption, max 255 characters.

Response

NameTypeRequiredDescription
(body)TaskAttachmentRequiredA TaskAttachment object.

Errors

StatusWhen
400The 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.
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
403You are not an organization administrator (`insufficient_scope`), or you are a guest (`guest_not_allowed`). An agent or organization key is refused here too.
404The 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`.
GET/v1/plan/boards/{board_id}/attachments/{attachment_id}/BetaAPI keyCLI Auth

Retrieve a board attachment

One attachment of the board. Anyone who can see the board can read it.

Path parameters

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.
attachment_iduuidRequiredThe attachment's uuid.

Response

NameTypeRequiredDescription
(body)TaskAttachmentRequiredA TaskAttachment object.

Errors

StatusWhen
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
404The 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.
GET/v1/plan/boards/{board_id}/attachments/{attachment_id}/content/BetaAPI keyCLI Auth

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

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.
attachment_iduuidRequiredThe attachment's uuid.

Response

NameTypeRequiredDescription
(body)binaryRequiredThe file bytes; Content-Type is the attachment's.

Errors

StatusWhen
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
404The board or the attachment does not exist or you cannot see it (`not_found`), never a 403.
409The 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.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: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.
PATCH/v1/plan/boards/{board_id}/attachments/{attachment_id}/BetaCLI Auth

Rename a board attachment

Changes the display file name; the stored bytes do not change.

Path parameters

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.
attachment_iduuidRequiredThe attachment's uuid.

Headers

NameTypeRequiredDescription
X-Dailybot-Agent-NamestringOptionalThe 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

NameTypeRequiredDescription
filenamestringRequiredThe new file name (1–255 characters). The stored bytes do not change.
agent_namestringOptionalThe 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

NameTypeRequiredDescription
(body)TaskAttachmentRequiredA TaskAttachment object.

Errors

StatusWhen
400Validation failed; the response `code` says which field. `invalid_agent_attribution` means the agent name is invalid.
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
403You are not an organization administrator (`insufficient_scope`), or you are a guest (`guest_not_allowed`). An agent or organization key is refused here too.
404The 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`.
DELETE/v1/plan/boards/{board_id}/attachments/{attachment_id}/BetaCLI Auth

Remove an attachment from a board

Removes the attachment from the board. Answers 204.

Path parameters

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.
attachment_iduuidRequiredThe attachment's uuid.

Headers

NameTypeRequiredDescription
X-Dailybot-Agent-NamestringOptionalThe 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

StatusWhen
400Validation failed; the response `code` says which field. `invalid_agent_attribution` means the agent name is invalid.
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
402Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected].
403You are not an organization administrator (`insufficient_scope`), or you are a guest (`guest_not_allowed`). An agent or organization key is refused here too.
404The 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.