Skip to content
view raw .md

Plan · Tasks

Create, read, update, move, archive and restore tasks, one at a time or in bulk, plus relations, labels, participants and subscriptions. 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/{board_id}/tasks/BetaAPI keyCLI AuthPage-number pagination

List tasks on one board (alias of `GET /v1/plan/tasks/?board=`)

Convenience alias for clients that nest under the board URL. Same paginated Task envelope and shared filter grammar as GET /v1/plan/tasks/?board={board_id}. The path board_id wins over a conflicting board= query parameter. Prefer this or ?board= for flat lists; use GET …/boards/{id}/board/ for the denser snapshot UI.

Path parameters

NameTypeRequiredDescription
board_idstringRequiredThe board's uuid.

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.
key_prefixstringOptionalSelect the tasks of every board a key has ever named, retired keys included: ?key_prefix=ENG. An unknown prefix returns an empty list.
statearrayOptionalRepeatable; values are OR-ed. Each value is either a workflow-state uuid or one of two lifecycle tokens: - open - the state categories that are not terminal: backlog, todo, in_progress. - done - the terminal categories: done, canceled. The tokens are decided by state.category alone and never consult completed_at, so a client that classifies rows by the category on the state chip agrees with this filter by construction. Mixing is allowed: a uuid and a token in the same request are OR-ed like any other repeated value. Any other value is 400 invalid_filter_value with extra.parameter: "state" - including overdue, which is not a lifecycle state. Overdue is a due-date question: see due_before.
categoryarrayOptionalThe five fixed state categories. There is no blocked category — blocked-ness is a relation; use blocked=true.
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.
parentstringOptionalA parent task uuid, or none for top-level tasks only. parent_task is accepted as an alias of this parameter (same value). Sending both with conflicting values is 400 invalid_filter_value.
parent_taskstringOptionalAlias of parent — preferred by some Web clients. Same grammar (uuid or none). Do not send both with different values.
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/.
goalstringOptionalRepeatable. Matches a task's own goal, or the goal it inherits from its project when it has none, the same rule every progress roll-up uses.
teamstringOptionalRepeatable. The board's team. It narrows what you see and never widens it.
participantstringOptionalRepeatable. Somebody on the card, owner or not.
created_bystringOptionalRepeatable. Who opened the card.
estimate_minintegerOptionalMinimum estimate, inclusive, in the units stored on the task (no conversion from the board's scale).
estimate_maxintegerOptionalMaximum estimate, inclusive, in the units stored on the task (no conversion from the board's scale).

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.
start_afterstringOptionalA date (YYYY-MM-DD): tasks whose start_date is on or after it, inclusive. A bad value is 400 invalid_filter_value.
start_beforestringOptionalA date (YYYY-MM-DD): tasks whose start_date is on or before it, inclusive. A bad value is 400 invalid_filter_value.
completed_afterstringOptionalA date (YYYY-MM-DD): tasks completed on or after it, inclusive (the date of completed_at). A bad value is 400 invalid_filter_value.
completed_beforestringOptionalA date (YYYY-MM-DD): tasks completed on or before it, inclusive (the date of completed_at). A bad value is 400 invalid_filter_value.
has_due_datebooleanOptionalfalse is the planner's first question: what is not scheduled.
has_start_datebooleanOptionaltrue keeps tasks with a start_date; false keeps tasks without one.
has_datesbooleanOptionalBoth scheduling edges at once. has_dates=false means neither a start date nor a due date (the unscheduled tray). has_dates=true means at least one, which is not the same as has_due_date=true.
updated_sincestringOptionalA timestamp filter on this paginated list: it returns {count, next, previous, results}, never a cursor. For a change feed use the board delta endpoint.
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.

Sorting & expansion

NameTypeRequiredDescription
sortstringOptionalOne field, optionally --prefixed. Every ordering appends a stable internal tiebreak so a row cannot appear on two pages. An unsupported value is 400 invalid_sort, never a silent fallback.

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.

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—

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
countintegerRequiredTotal number of rows.
nexturiRequiredURL of the next page, or null.
previousuriRequiredURL of the previous page, or null.
resultsarray<Task>RequiredThe rows on this page. See Task.

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].
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/tasks/?state=open" \
  -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}/tasks/BetaAPI keyCLI Auth

Create a task on this board (alias of `POST /v1/plan/tasks/`)

Same create semantics as POST /v1/plan/tasks/ with the board taken from the path (board in the body is optional and overridden). Idempotency-Key is optional and recommended.

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
milestoneuuid | nullOptionalNot accepted on create yet (501 not_implemented): set the milestone with PATCH after creating the task.
titlestringRequiredThe task's title. Max 255 characters.
descriptionstring | nullOptionalFree-form description. Max 50000 characters.
priorityintegerOptional1 urgent, 2 high, 3 medium, 4 low, 5 none. From 1 to 5.
estimateinteger | nullOptionalEstimate on the board's scale.
ownerstring | nullOptionalThe owner's user uuid. The person must already be able to see the board (400 participant_cannot_access_board otherwise).
start_datedate | nullOptionalPlanned start date.
due_datedate | nullOptionalDue date.
parent_taskuuid | nullOptionalThe parent task, for a sub-task. One level of nesting only.
label_uuidsarrayOptionalLabel uuids to set on the task. Items: uuid.
afteruuid | nullOptionalPlace the pin just below this pin.
beforeuuid | nullOptionalPlace the pin just above this pin.
versionintegerOptionalThe version you loaded. A stale value is 409 version_conflict.
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)TaskRequiredA Task 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].
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/tasks/" \
  -H "X-API-KEY: $DAILYBOT_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Ship the delta feed",
    "priority": 2
  }'

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.
  • 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/tasks/BetaAPI keyCLI AuthPage-number pagination

List tasks with the shared filter grammar

Multi-value semantics are OR within a parameter and AND across parameters. An unknown parameter is ignored; an unparseable value of a known parameter is 400 invalid_filter_value.

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.
boardarrayOptionalBoard uuids or board keys (ENG). Repeatable; values are OR-ed. Keys resolve within your organization only; a key that names no board of yours contributes nothing and never returns a 404. Retired keys keep resolving.
key_prefixstringOptionalSelect the tasks of every board a key has ever named, retired keys included: ?key_prefix=ENG. An unknown prefix returns an empty list.
projectarrayOptionalProject uuids. Repeatable; values are OR-ed.
statearrayOptionalRepeatable; values are OR-ed. Each value is either a workflow-state uuid or one of two lifecycle tokens: - open - the state categories that are not terminal: backlog, todo, in_progress. - done - the terminal categories: done, canceled. The tokens are decided by state.category alone and never consult completed_at, so a client that classifies rows by the category on the state chip agrees with this filter by construction. Mixing is allowed: a uuid and a token in the same request are OR-ed like any other repeated value. Any other value is 400 invalid_filter_value with extra.parameter: "state" - including overdue, which is not a lifecycle state. Overdue is a due-date question: see due_before.
categoryarrayOptionalThe five fixed state categories. There is no blocked category — blocked-ness is a relation; use blocked=true.
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.
parentstringOptionalA parent task uuid, or none for top-level tasks only. parent_task is accepted as an alias of this parameter (same value). Sending both with conflicting values is 400 invalid_filter_value.
parent_taskstringOptionalAlias of parent — preferred by some Web clients. Same grammar (uuid or none). Do not send both with different values.
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/.
goalstringOptionalRepeatable. Matches a task's own goal, or the goal it inherits from its project when it has none, the same rule every progress roll-up uses.
teamstringOptionalRepeatable. The board's team. It narrows what you see and never widens it.
participantstringOptionalRepeatable. Somebody on the card, owner or not.
created_bystringOptionalRepeatable. Who opened the card.
estimate_minintegerOptionalMinimum estimate, inclusive, in the units stored on the task (no conversion from the board's scale).
estimate_maxintegerOptionalMaximum estimate, inclusive, in the units stored on the task (no conversion from the board's scale).

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.
start_afterstringOptionalA date (YYYY-MM-DD): tasks whose start_date is on or after it, inclusive. A bad value is 400 invalid_filter_value.
start_beforestringOptionalA date (YYYY-MM-DD): tasks whose start_date is on or before it, inclusive. A bad value is 400 invalid_filter_value.
completed_afterstringOptionalA date (YYYY-MM-DD): tasks completed on or after it, inclusive (the date of completed_at). A bad value is 400 invalid_filter_value.
completed_beforestringOptionalA date (YYYY-MM-DD): tasks completed on or before it, inclusive (the date of completed_at). A bad value is 400 invalid_filter_value.
has_due_datebooleanOptionalfalse is the planner's first question: what is not scheduled.
has_start_datebooleanOptionaltrue keeps tasks with a start_date; false keeps tasks without one.
has_datesbooleanOptionalBoth scheduling edges at once. has_dates=false means neither a start date nor a due date (the unscheduled tray). has_dates=true means at least one, which is not the same as has_due_date=true.
updated_sincestringOptionalA timestamp filter on this paginated list: it returns {count, next, previous, results}, never a cursor. For a change feed use the board delta endpoint.
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.

Sorting & expansion

NameTypeRequiredDescription
sortstringOptionalOne field, optionally --prefixed. Every ordering appends a stable internal tiebreak so a row cannot appear on two pages. An unsupported value is 400 invalid_sort, never a silent fallback.

Response

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

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].
curl -sS "https://api.dailybot.com/v1/plan/tasks/?board=ENG&state=open&owner=me" \
  -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/tasks/BetaAPI keyCLI Auth

Create a task

The key (ENG-143) is allocated from the board's counter and never reused, even after archive.

When owner is set, that person must already be able to see the board; otherwise the call is refused with 400 participant_cannot_access_board and nothing is written.

Placement is relative: after or before names a visible task in the target column (at most one of them); omit both to append at the end. Raw rank is never accepted.

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
boarduuidRequiredThe board: its uuid or its key (ENG).
milestoneuuid | nullOptionalNot accepted on create yet (501 not_implemented): set the milestone with PATCH after creating the task.
titlestringRequiredThe task's title. Max 255 characters.
descriptionstring | nullOptionalFree-form description. Max 50000 characters.
priorityintegerOptional1 urgent, 2 high, 3 medium, 4 low, 5 none. From 1 to 5.
estimateinteger | nullOptionalEstimate on the board's scale.
ownerstring | nullOptionalThe owner's user uuid. The person must already be able to see the board (400 participant_cannot_access_board otherwise).
start_datedate | nullOptionalPlanned start date.
due_datedate | nullOptionalDue date.
parent_taskuuid | nullOptionalThe parent task, for a sub-task. One level of nesting only.
label_uuidsarrayOptionalLabel uuids to set on the task. Items: uuid.
afteruuid | nullOptionalPlace the pin just below this pin.
beforeuuid | nullOptionalPlace the pin just above this pin.
versionintegerOptionalThe version you loaded. A stale value is 409 version_conflict.
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)TaskRequiredA Task 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].
409Conflict. The response `code` says which (for example `version_conflict`).
422The request could not be applied (`column_too_large`).
curl -sS -X POST "https://api.dailybot.com/v1/plan/tasks/" \
  -H "X-API-KEY: $DAILYBOT_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "board": "00000000-0000-4000-8000-000000000002",
    "title": "Ship the delta feed",
    "priority": 2,
    "due_date": "2026-10-15"
  }'

Try it

This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.

  • Scope: `tasks:write`.
  • Rate limit: 60 writes 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/tasks/bulk/BetaAPI keyCLI Auth

Create, or apply one operation to, up to 100 tasks

Registered BEFORE the {task_id} detail route, or bulk parses as an identifier. Atomicity is per item, not per batch: the response reports each item separately and the HTTP status describes whether the batch was accepted, not whether every item succeeded. Idempotency-Key is required — a bulk move that half-applies twice is a corrupted board. The restore operation is the batch form of POST .../tasks/{task_id}/restore/ and obeys the same rules.

Query parameters

NameTypeRequiredDescription
dry_runbooleanOptionalRun the call and roll it back. Answers {operation, dry_run, reversible, consequence, affects{tasks}, items[{index, task, key, changes{field:{from,to}}}], refused[{index, code, detail}]}. No Idempotency-Key needed.

Headers

NameTypeRequiredDescription
Idempotency-KeystringRequiredRequired on bulk: a batch that half-applies twice is a corrupted board. Missing is 400 idempotency_key_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.

Request body

NameTypeRequiredDescription
operationenumRequiredThe operation to apply. One of move, update, archive, restore, create, set_labels. Aliases: set_owner, set_priority, set_due_date, set_parent (→ update); delete (→ archive).
boarduuidOptionalThe board. Required when operation is create.
itemsarray (max 100): mutate items {task (uuid or KEY-n, required), state, after, before, owner, priority 1-5, due_date, version, label_uuids (or labels), parent_task}; create items {title (≤512, required), description, state, owner, priority, estimate, start_date, due_date, external_id}RequiredUp to 100 items.
positionenumOptionalcreate only: where the new tasks land in each column. start puts them at the top, in item order; end at the bottom. One of start, end. Default end.
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.

BulkResponse object

NameTypeRequiredDescription
succeededintegerRequiredItems that succeeded.
failedintegerRequiredItems that failed.
resultsarrayRequiredThe rows on this page. Always present: task, status. Items: {task: string, status: string, version: integer|null, code: string|null, detail: string|null, extra: object, external_id?: string, key?: string}.

Response

NameTypeRequiredDescription
(body)BulkResponseRequiredA BulkResponse object.

Errors

StatusWhen
400Missing `Idempotency-Key` (`idempotency_key_required`), more than 100 items (`too_many_items`), or an invalid payload. `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].
409The same `Idempotency-Key` is still running (`idempotency_in_progress`) or was used with a different body (`idempotency_key_payload_mismatch`).
429Rate limit reached. Wait the number of seconds in `Retry-After`.
curl -sS -X POST "https://api.dailybot.com/v1/plan/tasks/bulk/" \
  -H "X-API-KEY: $DAILYBOT_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "operation": "create",
    "board": "00000000-0000-4000-8000-000000000002",
    "items": [
      {
        "title": "Write the migration guide",
        "external_id": "row-1"
      },
      {
        "title": "Record the demo",
        "external_id": "row-2"
      }
    ]
  }'

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: 30 bulk calls 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/tasks/{task_id}/BetaAPI keyCLI Auth

Retrieve a task by uuid or by KEY-n

Address the task by uuid or by key. An archived task stays readable by anyone who can see its board; no include_archived is needed on a direct read. The ETag carries the task's version.

Path parameters

NameTypeRequiredDescription
task_idstringRequiredA task uuid or its key, such as ENG-142, including a key retired by a board rename. Resolution is scoped to your organization first, so another organization's key is a 404 identical to a missing one. Numeric ids are never accepted.

Query parameters

NameTypeRequiredDescription
includestringOptionalComma-separated embed tokens on task detail. Allowed: children, relations, participants, attachments, comment_count, activity, comments. Each collection embed is the first page of the matching list endpoint (activity matches /tasks/{id}/activity/; comments matches /tasks/{id}/comments/). Unknown tokens return 400 invalid_filter_value. An empty value (?include=) is treated as no embeds (200). Embeds do not change the task ETag (version-only).

Headers

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

Response

NameTypeRequiredDescription
(body)TaskRequiredA Task 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/tasks/ENG-142/?include=relations,participants" \
  -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/tasks/{task_id}/BetaAPI keyCLI Auth

Update a task

Send If-Match with the version you loaded to detect a lost update. Without it the write is last-write-wins and still returns the new version. Unknown body fields return 400 (never a silent 200). is_archived is not accepted on PATCH — use POST …/archive/ or POST …/restore/.

Path parameters

NameTypeRequiredDescription
task_idstringRequiredA task uuid or its key, such as ENG-142, including a key retired by a board rename. Resolution is scoped to your organization first, so another organization's key is a 404 identical to a missing one. Numeric ids are never accepted.

Headers

NameTypeRequiredDescription
If-MatchstringOptionalThe version you loaded, as a quoted validator (or send it as the body field version). A stale value is 409 version_conflict with extra.current_version; sending both with different values is 400 version_precondition_ambiguous. Omitting it is last-write-wins.
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
boarduuidOptionalThe board.
milestoneuuid | nullOptionalThe milestone this task counts toward.
titlestringOptionalThe task's title. Max 255 characters.
descriptionstring | nullOptionalFree-form description. Max 50000 characters.
priorityintegerOptional1 urgent, 2 high, 3 medium, 4 low, 5 none. From 1 to 5.
estimateinteger | nullOptionalEstimate on the board's scale.
ownerstring | nullOptionalThe owner's user uuid. The person must already be able to see the board (400 participant_cannot_access_board otherwise).
start_datedate | nullOptionalPlanned start date.
due_datedate | nullOptionalDue date.
parent_taskuuid | nullOptionalThe parent task, for a sub-task. One level of nesting only.
label_uuidsarrayOptionalLabel uuids to set on the task. Items: uuid.
afteruuid | nullOptionalPlace the pin just below this pin.
beforeuuid | nullOptionalPlace the pin just above this pin.
versionintegerOptionalThe version you loaded. A stale value is 409 version_conflict.
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)TaskRequiredA Task 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.
409The task changed since you loaded it (`version_conflict`); `extra.current_version` carries the new version.
curl -sS -X PATCH "https://api.dailybot.com/v1/plan/tasks/ENG-142/" \
  -H "X-API-KEY: $DAILYBOT_API_KEY" \
  -H 'If-Match: "7"' \
  -H "Content-Type: application/json" \
  -d '{
    "owner": "00000000-0000-4000-8000-00000000000c",
    "due_date": "2026-10-22"
  }'

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.
  • 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.
DELETE/v1/plan/tasks/{task_id}/BetaAPI keyCLI Auth

Archive a task (DELETE alias)

DELETE is an alias for archive — the task and its sub-tasks are archived (204). Already-archived tasks return 204 idempotently. Prefer POST …/archive/ when you need the archived body echoed. Concurrency (If-Match) is not applied on this alias; use PATCH for versioned updates before archiving if needed.

Path parameters

NameTypeRequiredDescription
task_idstringRequiredA task uuid or its key, such as ENG-142, including a key retired by a board rename. Resolution is scoped to your organization first, so another organization's key is a 404 identical to a missing one. Numeric ids are never accepted.

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].
404Not found, or not visible to you. Both cases return the same body.
curl -sS -X DELETE "https://api.dailybot.com/v1/plan/tasks/ENG-142/" \
  -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:write`.
  • Rate limit: 60 writes 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/tasks/{task_id}/children/BetaAPI keyCLI AuthPage-number pagination

List direct sub-tasks of a task

Paginated task cards (same shape as the task list / board snapshot). Default order is created_at (rank is column-scoped, so children in different states are not sibling-ranked). Pass ?sort=rank or ?ordering=rank when all children share a column. Unsupported sort values are 400 invalid_sort (never silently ignored). Sibling drag uses POST …/move/ with after / before. One nesting level only — grandchildren refused on write with subtask_depth_exceeded.

Path parameters

NameTypeRequiredDescription
task_idstringRequiredA task uuid or its key, such as ENG-142, including a key retired by a board rename. Resolution is scoped to your organization first, so another organization's key is a 404 identical to a missing one. Numeric ids are never accepted.

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.
sortstringOptionalOne field, optionally --prefixed. Every ordering appends a stable internal tiebreak so a row cannot appear on two pages. An unsupported value is 400 invalid_sort, never a silent fallback.
orderingstringOptionalWeb alias for sort on the children list. Same allow-list and refusal semantics — unsupported values are 400 invalid_sort, never silently ignored. Do not send both parameters with conflicting values.

Response

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

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/tasks/ENG-142/children/" \
  -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/tasks/{task_id}/archive/BetaAPI keyCLI Auth

Archive a task and its sub-tasks

Archiving nulls the task's rank, so it leaves every board ordering without leaving the table. Relations and participants are kept.

Path parameters

NameTypeRequiredDescription
task_idstringRequiredA task uuid or its key, such as ENG-142, including a key retired by a board rename. Resolution is scoped to your organization first, so another organization's key is a 404 identical to a missing one. Numeric ids are never accepted.

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)Task | DryRunPreviewRequiredA Task 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.
409Conflict. The response `code` says which (for example `version_conflict`).
curl -sS -X POST "https://api.dailybot.com/v1/plan/tasks/ENG-142/archive/" \
  -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:write`.
  • Rate limit: 60 writes 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/tasks/{task_id}/duplicate/BetaAPI keyCLI Auth

Duplicate a task on the same board

Creates a new task in the same column. Default include copies title, description, and labels. Emits task.created.

Path parameters

NameTypeRequiredDescription
task_idstringRequiredA task uuid or its key, such as ENG-142, including a key retired by a board rename. Resolution is scoped to your organization first, so another organization's key is a 404 identical to a missing one. Numeric ids are never accepted.

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
includearrayOptionalWhat to copy. Default: title, description, labels. Items: enum title|description|labels|priority|estimate|owner|start_date|due_date.
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)TaskRequiredA Task 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].
403The task is archived (`task_delete_forbidden`): restore it before duplicating it.
404Not found, or not visible to you. Both cases return the same body.
curl -sS -X POST "https://api.dailybot.com/v1/plan/tasks/ENG-142/duplicate/" \
  -H "X-API-KEY: $DAILYBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "include": [
      "title",
      "description",
      "labels"
    ]
  }'

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.
  • 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/tasks/{task_id}/move-board/BetaAPI keyCLI Auth

Move a task to another board

Body requires board (target board uuid). Target column resolution: explicit state, or state_map from source column uuid → target column uuid, or same category on the target board. Emits task.moved (with from_board_uuid when crossing boards). Invalid mappings return 400 move_board_state_invalid.

Path parameters

NameTypeRequiredDescription
task_idstringRequiredA task uuid or its key, such as ENG-142, including a key retired by a board rename. Resolution is scoped to your organization first, so another organization's key is a 404 identical to a missing one. Numeric ids are never accepted.

Headers

NameTypeRequiredDescription
If-MatchstringOptionalThe version you loaded, as a quoted validator (or send it as the body field version). A stale value is 409 version_conflict with extra.current_version; sending both with different values is 400 version_precondition_ambiguous. Omitting it is last-write-wins.
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
boarduuidRequiredThe board.
stateuuidOptionalThe task's workflow state (its column).
state_mapobjectOptionalSource column uuid → target column uuid.
versionintegerOptionalThe version you loaded. A stale value is 409 version_conflict.
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)TaskRequiredA Task 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.
409The task changed since you loaded it (`version_conflict`).
curl -sS -X POST "https://api.dailybot.com/v1/plan/tasks/ENG-142/move-board/" \
  -H "X-API-KEY: $DAILYBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "board": "00000000-0000-4000-8000-000000000012"
  }'

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.
  • 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/tasks/{task_id}/move/BetaAPI keyCLI Auth

Move a task to a state and a position, relatively

The only way to change a task's state. The position is a neighbour, not a number, so two people dragging the same card at once both produce a valid order. At most one of after / before may be set; both null appends to the end of the column. One write, one task.moved event. Send If-Match (or version) to refuse a stale move.

Path parameters

NameTypeRequiredDescription
task_idstringRequiredA task uuid or its key, such as ENG-142, including a key retired by a board rename. Resolution is scoped to your organization first, so another organization's key is a 404 identical to a missing one. Numeric ids are never accepted.

Headers

NameTypeRequiredDescription
If-MatchstringOptionalThe version you loaded, as a quoted validator (or send it as the body field version). A stale value is 409 version_conflict with extra.current_version; sending both with different values is 400 version_precondition_ambiguous. Omitting it is last-write-wins.
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
stateuuidRequiredThe task's workflow state (its column).
boarduuid | nullOptionalThe board.
afteruuid | nullOptionalPlace the pin just below this pin.
beforeuuid | nullOptionalPlace the pin just above this pin.
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)TaskRequiredA Task 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.
409The task changed since you loaded it (`version_conflict`), or a named neighbour moved away (`rank_neighbor_missing`). The response names the column's current head and tail so you can retry.
422The request could not be applied (`column_too_large`).
curl -sS -X POST "https://api.dailybot.com/v1/plan/tasks/ENG-142/move/" \
  -H "X-API-KEY: $DAILYBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "state": "00000000-0000-4000-8000-000000000004",
    "after": null,
    "before": null
  }'

Try it

This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.

  • Scope: `tasks:write`.
  • Rate limit: 60 writes 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/tasks/{task_id}/relations/BetaAPI keyCLI AuthPage-number pagination

A task's relations, both directions

blocked_by is not stored — it is the inverse read of blocks, so there is exactly one row per fact and the two directions cannot disagree. The direction field tells you which side you are on.

Path parameters

NameTypeRequiredDescription
task_idstringRequiredA task uuid or its key, such as ENG-142, including a key retired by a board rename. Resolution is scoped to your organization first, so another organization's key is a 404 identical to a missing one. Numeric ids are never accepted.

TaskRelation object

NameTypeRequiredDescription
uuiduuidRequiredStable public identifier.
relation_typeenumRequiredblocks, relates_to or duplicates. New types may be added: ignore ones you do not recognise. One of blocks, relates_to, duplicates.
directionenum | nullRequiredoutgoing when this task is the source, incoming when it is the target. One of outgoing, incoming.
other_taskobjectRequiredThe task on the other side. Shape: {uuid, key, title, state_category}.
created_atdate-timeOptionalWhen the row was created.

Response

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

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/tasks/ENG-142/relations/" \
  -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/tasks/{task_id}/relations/BetaAPI keyCLI Auth

Link two tasks

Links this task to another one. Send relation_type (blocks, relates_to or duplicates) and target_task, a task uuid or a key like ENG-142; a task you cannot see is 404. kind and target are deprecated aliases of those two fields: sending an alias and its field with different values is 400. A link that already exists or would create a cycle is 409.

Path parameters

NameTypeRequiredDescription
task_idstringRequiredA task uuid or its key, such as ENG-142, including a key retired by a board rename. Resolution is scoped to your organization first, so another organization's key is a 404 identical to a missing one. Numeric ids are never accepted.

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
relation_typeenumRequiredblocks, relates_to or duplicates. New types may be added: ignore ones you do not recognise. Required, or its deprecated alias kind. One of blocks, relates_to, duplicates.
target_taskstringRequiredThe other task: its uuid or a key like ENG-142. A task you cannot see is 404. Required, or its deprecated alias target.
kindenumOptionalDeprecated alias of relation_type, kept for older clients. Send relation_type instead; both with different values is 400. One of blocks, relates_to, duplicates.
targetstringOptionalDeprecated alias of target_task, kept for older clients. Send target_task instead; both with different values is 400.
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)TaskRelationRequiredA TaskRelation object.

Errors

StatusWhen
400Missing type or target, an alias that disagrees with its field, or an invalid 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].
404Not found, or not visible to you. Both cases return the same body.
409The link already exists (`relation_exists`) or would create a cycle (`relation_cycle`).
curl -sS -X POST "https://api.dailybot.com/v1/plan/tasks/ENG-142/relations/" \
  -H "X-API-KEY: $DAILYBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "relation_type": "blocks",
    "target_task": "ENG-150"
  }'

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.
  • 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.
DELETE/v1/plan/tasks/{task_id}/relations/{relation_id}/BetaAPI keyCLI Auth

Unlink two tasks

Emits task.unrelated on the task event stream (not relation_removed). Activity enrichment maps it to changes[{field: related, from: …, to: null}].

Path parameters

NameTypeRequiredDescription
task_idstringRequiredA task uuid or its key, such as ENG-142, including a key retired by a board rename. Resolution is scoped to your organization first, so another organization's key is a 404 identical to a missing one. Numeric ids are never accepted.
relation_idstringRequiredThe relation'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].
404Not found, or not visible to you. Both cases return the same body.
curl -sS -X DELETE "https://api.dailybot.com/v1/plan/tasks/ENG-142/relations/00000000-0000-4000-8000-00000000000a/" \
  -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:write`.
  • Rate limit: 60 writes 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/tasks/{task_id}/labels/batch/BetaAPI keyCLI Auth

Attach, detach or replace a task's labels

Labels are the organization-wide taxonomy shared with forms and check-ins; there is no plan-only label vocabulary. At most 50 labels per task.

Path parameters

NameTypeRequiredDescription
task_idstringRequiredA task uuid or its key, such as ENG-142, including a key retired by a board rename. Resolution is scoped to your organization first, so another organization's key is a 404 identical to a missing one. Numeric ids are never accepted.

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
modeenumRequiredadd, remove or replace. One of add, remove, replace.
label_uuidsarrayRequiredLabel uuids to set on the task. 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
labelsarray<Label>RequiredOrganization labels on the task.

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.
429Rate limit reached. Wait the number of seconds in `Retry-After`.
curl -sS -X POST "https://api.dailybot.com/v1/plan/tasks/ENG-142/labels/batch/" \
  -H "X-API-KEY: $DAILYBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "mode": "add",
    "label_uuids": [
      "00000000-0000-4000-8000-00000000000b"
    ]
  }'

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.
  • 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/tasks/{task_id}/subscription/BetaCLI Auth

Subscribe to task notifications (watcher role)

The only way to set the task's subscribed field (sending subscribed in a task PATCH is 400). Returns {"subscribed": true}, so no re-read is needed.

Path parameters

NameTypeRequiredDescription
task_idstringRequiredA task uuid or its key, such as ENG-142, including a key retired by a board rename. Resolution is scoped to your organization first, so another organization's key is a 404 identical to a missing one. Numeric ids are never accepted.

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
subscribedbooleanRequiredWhether you watch this task.

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.
curl -sS -X POST "https://api.dailybot.com/v1/plan/tasks/ENG-142/subscription/" \
  -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/tasks/{task_id}/subscription/BetaCLI Auth

Remove a watcher subscription

Clears the caller's watcher subscription. Returns 204 (empty body). Re-GET the task for subscribed: false, or update client state locally.

Path parameters

NameTypeRequiredDescription
task_idstringRequiredA task uuid or its key, such as ENG-142, including a key retired by a board rename. Resolution is scoped to your organization first, so another organization's key is a 404 identical to a missing one. Numeric ids are never accepted.

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].
404Not found, or not visible to you. Both cases return the same body.
curl -sS -X DELETE "https://api.dailybot.com/v1/plan/tasks/ENG-142/subscription/" \
  -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`.
POST/v1/plan/tasks/{task_id}/restore/BetaAPI keyCLI Auth

Restore an archived task

The mirror of archive: same scope, same credentials, same idempotency. The task returns at the end of its column, because its old neighbours are gone. Restoring a live task is a no-op 200.

Path parameters

NameTypeRequiredDescription
task_idstringRequiredA task uuid or its key, such as ENG-142, including a key retired by a board rename. Resolution is scoped to your organization first, so another organization's key is a 404 identical to a missing one. Numeric ids are never accepted.

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)TaskRequiredA Task 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].
404Not found, or not visible to you. Both cases return the same body.
409The task's board or state was archived meanwhile (`state_in_use`). The response names the state so you can pick a target.
curl -sS -X POST "https://api.dailybot.com/v1/plan/tasks/ENG-142/restore/" \
  -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:write`.
  • Rate limit: 60 writes 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/tasks/{task_id}/participants/BetaCLI AuthPage-number pagination

Who is on this card

Participants and watchers, oldest first — the order the card's people strip renders. Visible to anyone who can see the task. Participation is not an access lever: this list never widens what its members can see.

Path parameters

NameTypeRequiredDescription
task_idstringRequiredA task uuid or its key, such as ENG-142, including a key retired by a board rename. Resolution is scoped to your organization first, so another organization's key is a 404 identical to a missing one. Numeric ids are never accepted.

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.

TaskParticipant object

NameTypeRequiredDescription
memberActorRefRequiredThe person. See ActorRef.
roleenumRequiredParticipant role. One of participant, watcher.
sourceenumRequiredHow the person came to be on the card. One of manual, creator, owner, commented, mentioned, sync.
is_mutedbooleanRequiredStay on the card without notifications.
added_byActorRef | nullOptionalWho added the person. See ActorRef.
created_atdate-timeRequiredWhen the row was created.

Response

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

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/tasks/ENG-142/participants/" \
  -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/tasks/{task_id}/participants/BetaCLI Auth

Put someone on this card

Adds a participant or watcher. Adding someone already on the card returns 200 with the existing row. Adding or removing a participant emits task.participant_added with actor_is_self, so "someone added me" and "I joined" can be told apart. A watcher change emits nothing: following a task is a private preference. Muting (is_muted) keeps the person on the card.

Path parameters

NameTypeRequiredDescription
task_idstringRequiredA task uuid or its key, such as ENG-142, including a key retired by a board rename. Resolution is scoped to your organization first, so another organization's key is a 404 identical to a missing one. Numeric ids are never accepted.

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_uuiduuidRequiredThe person's user uuid.
roleenumOptionalParticipant role. One of participant, watcher. Default participant.
is_mutedbooleanOptionalStay on the card without notifications. Default false.
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)TaskParticipantRequiredA TaskParticipant 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/tasks/ENG-142/participants/" \
  -H "Authorization: Bearer $DAILYBOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "user_uuid": "00000000-0000-4000-8000-00000000000c",
    "role": "participant"
  }'

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/tasks/{task_id}/participants/{user_uuid}/BetaCLI Auth

Take someone off this card

Removes the person from the card and emits task.participant_removed. Leaving is not muting: to stop notifications but stay on the card, set is_muted through the add endpoint.

Path parameters

NameTypeRequiredDescription
task_idstringRequiredA task uuid or its key, such as ENG-142, including a key retired by a board rename. Resolution is scoped to your organization first, so another organization's key is a 404 identical to a missing one. Numeric ids are never accepted.
user_uuidstringRequiredThe participant'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.
curl -sS -X DELETE "https://api.dailybot.com/v1/plan/tasks/ENG-142/participants/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: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`.
PATCH/v1/plan/tasks/{task_id}/attachments/{attachment_id}/BetaAPI keyCLI Auth

Rename a task attachment

Changes the display file name; the stored bytes do not change. Anyone who may write to the parent can rename its attachments.

Path parameters

NameTypeRequiredDescription
task_idstringRequiredA task uuid or its key, such as ENG-142, including a key retired by a board rename. Resolution is scoped to your organization first, so another organization's key is a 404 identical to a missing one. Numeric ids are never accepted.
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 may not write here (`insufficient_scope`), or you are a guest (`guest_not_allowed`).
404The parent 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/tasks/ENG-142/attachments/00000000-0000-4000-8000-000000000009/" \
  -H "X-API-KEY: $DAILYBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "filename": "spec-v2.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:write`.
  • Rate limit: 60 writes 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.

This page is the reference for Plan · Tasks. 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.