Skip to content
view raw .md

Plan · Home & search

Entitlements, the home screen in one request, my tasks, favorites, inbox, activity, timeline, search, organization labels and milestones. 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/me/tasks/BetaCLI AuthPage-number pagination

The calling user's tasks

Your tasks, the same as GET /v1/plan/tasks/?owner=me plus the scope choice. Needs a person: an agent or organization key gets 403 insufficient_scope, never an empty list; a personal API key works.

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.

Filters

NameTypeRequiredDescription
scopestringOptionalWhich sense of "mine": owned is owner = me; participating means you are on the card; involved is the union of owned, participating and created by you, which is what a person means by "my tasks".
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.
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/.

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.

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.

Archived rows

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.

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
400An invalid filter value.
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/me/tasks/?scope=involved&state=open" \
  -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/me/tasks/counts/BetaCLI Auth

Personal task tab counts

Caller-scoped counts for owned, participating, involved, and overdue work. The four top-level integers are population totals across every lifecycle: owned counts every task assigned to the caller whether it is open, done or canceled. overdue is the exception and is owned-only, already excluding archived and terminal work. by_scope carries the status-qualified numbers, so a badge can say "N open" without a second request. open is decided by the state CATEGORY, exactly as ?state=open decides it; overdue means open AND past due; blocked uses the one live-blocker predicate. Every number is computed in the same single aggregate over the same visibility root. by_scope.<scope>.total equals the top-level integer of the same name by construction.

MyTaskCounts object

NameTypeRequiredDescription
ownedintegerRequiredTasks you own (all lifecycles).
participatingintegerRequiredTasks you participate in.
involvedintegerRequiredOwned, participating or created by you.
overdueintegerRequiredOpen tasks past their due date.
by_scopeobjectRequiredStatus-qualified counts per scope: {total, open, overdue, blocked}. Shape: {owned, participating, involved} — each {total, open, overdue, blocked: integer} (all required).

Response

NameTypeRequiredDescription
(body)MyTaskCountsRequiredA MyTaskCounts object.

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/me/tasks/counts/" \
  -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/me/recents/BetaCLI Auth

Recently visited boards for the caller

Boards you opened recently, newest first, as recorded by POST /v1/plan/boards/{board_id}/visit/. Hidden, archived and other organizations' boards are omitted rather than raised. Needs a person (an agent or organization key gets 403; a personal API key works).

RecentBoardList object

NameTypeRequiredDescription
countintegerRequiredTotal number of rows.
limitintegerRequiredPage size applied.
resultsarrayRequiredThe rows on this page. Items: {board: uuid, name: string, key: string, visited_at: date-time}.

Response

NameTypeRequiredDescription
(body)RecentBoardListRequiredA RecentBoardList object.

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/me/recents/" \
  -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/inbox/BetaCLI AuthPage-number pagination

Notification-worthy task events for the caller

Your inbox: task events worth your attention, newest first, as a page. mentioned=true keeps only the events where someone mentioned you; type keeps one event type. Both combine, and count and paging are exact, so there are no empty pages.

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.
typestringOptionalOnly events of this type, such as task.owner_changed (the Assigned tab). Combines with mentioned (AND).
mentionedbooleanOptionaltrue keeps only the events where someone mentioned you. Must be true or false.

ActivityEvent object

NameTypeRequiredDescription
uuidstringRequiredStable public identifier.
typestringRequiredThe event type. New types are added over time: ignore ones you do not recognise.
actorobjectRequiredWho acted.
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_atstringRequiredWhen the row was created.
taskobjectOptionalShape: {uuid, key, title, board {uuid, key, name} | null} | null.
payloadobjectRequiredIds, enum values, numbers, booleans and dates only, never user-written text.
changesarrayRequiredResolved field changes, [{field, from, to}].

Response

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

Errors

StatusWhen
400An undeclared parameter or a bad value (`invalid_filter_value`).
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/inbox/" \
  -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/inbox/read-all/BetaCLI Auth

Mark all inbox items read

Marks every inbox item read by moving your read cursor to now. The response is the new last_seen_at.

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
last_seen_atdate-timeRequiredEverything at or before this time counts as read.

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`).
curl -sS -X POST "https://api.dailybot.com/v1/plan/inbox/read-all/" \
  -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/inbox/{item_uuid}/read/BetaCLI Auth

Catch up to one inbox row

Marks this row and everything older read, and answers with the new unread_count. The inbox has no per-item read state, by design: read/unread is derived from a single cursor rather than a flag per row. Marking row five read while one to four stay unread has no representation in that model, and giving it one means a second source of truth that must agree with the cursor forever. What a watermark CAN express is "I have caught up to here", and in a newest-first feed that is what clicking a row usually means. A row this actor cannot see is 404, so an event uuid from another organization cannot move somebody else's cursor.

Path parameters

NameTypeRequiredDescription
item_uuidstringRequiredThe inbox row'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
last_seen_atdate-timeRequiredEverything at or before this time counts as read.
unread_countintegerRequiredUnread items.

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/inbox/00000000-0000-4000-8000-00000000000f/read/" \
  -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/inbox/unread-count/BetaCLI Auth

Unread inbox count for the caller

How many inbox items you have not read yet, for a badge. It takes the same filters as the inbox list, so each tab's badge counts exactly that tab's rows: mentioned=true for Mentions, type=task.owner_changed for Assigned. With no parameters it counts the whole inbox. Cheaper than listing the inbox.

Query parameters

NameTypeRequiredDescription
typestringOptionalOnly events of this type, such as task.owner_changed (the Assigned tab). Combines with mentioned (AND).
mentionedbooleanOptionaltrue keeps only the events where someone mentioned you. Must be true or false.

Response

NameTypeRequiredDescription
unread_countintegerRequiredUnread items.

Errors

StatusWhen
400An undeclared parameter or a bad value (`invalid_filter_value`).
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/inbox/unread-count/" \
  -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/activity/BetaAPI keyCLI AuthPage-number pagination

Org activity feed for Plan Home

Paginated events you may open, enriched with task cards and resolved changes[{field, from, to}] for display. Tasks you cannot see are omitted even when their board is visible.

Only the parameters listed here are accepted: any other query 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
typestringOptionalFilter to one event type. event_type is an alias.
actoruuidOptionalOnly events by this person (user uuid).
projectuuidOptionalOnly events in this project (uuid).
boarduuidOptionalOnly events on this board (uuid).
taskuuidOptionalOnly events about this task (uuid).
sincestringOptionalISO datetime: events recorded at or after this time (observed_at).
untilstringOptionalISO datetime: events recorded at or before this time (observed_at).

Response

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

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/activity/" \
  -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/me/activity-cursor/BetaCLI Auth

Read the caller's activity read cursor

Your activity read cursor: the moment up to which you have read the activity feed. It is null until you set it.

ActivityCursor object

NameTypeRequiredDescription
last_seen_atdate-time | nullRequiredEverything at or before this time counts as read.

Response

NameTypeRequiredDescription
(body)ActivityCursorRequiredA ActivityCursor object.

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/me/activity-cursor/" \
  -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/me/activity-cursor/BetaCLI Auth

Mark activity as read up to a timestamp

Stores your activity read cursor at last_seen_at, so another client can pick up where you left off.

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
last_seen_atdate-timeRequiredEverything at or before this time counts as read.
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)ActivityCursorRequiredA ActivityCursor 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].
curl -sS -X PUT "https://api.dailybot.com/v1/plan/me/activity-cursor/" \
  -H "Authorization: Bearer $DAILYBOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "last_seen_at": "2026-09-25T10:14:02Z"
  }'

Try it

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

  • Scope: `tasks:write`.
  • Rate limit: 60 writes per minute per actor.
  • Needs a person: call it with a login session, a CLI user token or a personal API key. An agent or organization key gets `403 insufficient_scope`.
GET/v1/plan/labels/BetaCLI Auth

List organization labels

The organization's label taxonomy, shared with forms and check-ins. Prefer this endpoint for settings screens; the board-scoped list is the same taxonomy behind a board access check.

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
nextstring|nullRequiredURL of the next page, or null.
previousstring|nullRequiredURL of the previous page, or null.
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].
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/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/labels/BetaCLI Auth

Create an organization label

Creates a label in the organization taxonomy. Same shape as POST /boards/{board_id}/labels/.

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].
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 -X POST "https://api.dailybot.com/v1/plan/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`.
PATCH/v1/plan/labels/{label_id}/BetaCLI Auth

Update an organization label

Partial update of name, color, description, or is_archived. Archiving hides the label from the default list without hard-deleting it. Restore is the same field the other way: {"is_archived": false}. Read a retired label back with GET /v1/plan/labels/?include_archived=true.

Path parameters

NameTypeRequiredDescription
label_idstringRequiredThe label'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.
colorstringOptionalDisplay color (hex).
descriptionstringOptionalFree-form description.
is_archivedbooleanOptionalWhether the row is archived. Archive is the delete: archived rows stay readable and restorable.
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].
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/labels/00000000-0000-4000-8000-00000000000b/" \
  -H "Authorization: Bearer $DAILYBOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "is_archived": true
  }'

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/labels/{label_id}/BetaCLI Auth

Delete an organization label

Hard-deletes when the label has no task assignments. Otherwise 409 label_in_use. Prefer PATCH with is_archived: true to retire a label that is still on cards.

Path parameters

NameTypeRequiredDescription
label_idstringRequiredThe label'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.
409The label is still on tasks (`label_in_use`). Archive it with `PATCH` instead.
curl -sS -X DELETE "https://api.dailybot.com/v1/plan/labels/00000000-0000-4000-8000-00000000000b/" \
  -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/entitlements/BetaAPI keyCLI Auth

Whether Plan is available here, and the plan ceilings

Whether Plan is available to your organization, and its plan ceilings. It is the one Plan endpoint that never answers 402, so call it before deciding whether to show the product.

enabled is the same check every other endpoint applies. reason is null when enabled; otherwise rollout (your organization is not enabled for the Beta yet) or usage (an admin turned Plan off). boards and projects report {used, limit}, even when disabled; limit is null when the plan has no cap. The free plan includes up to 3 boards and 1 project. used counts live rows only, so archiving frees a slot, and used > limit can happen on grandfathered plans.

A guest gets 403 guest_not_allowed here, not 200 with enabled: false, and never sees plan ceilings.

Entitlements object

NameTypeRequiredDescription
enabledbooleanRequiredWhether Plan is enabled for your organization.
reasonenum | nullRequiredWhy Plan is not enabled: rollout or usage; null when enabled. One of rollout, usage.
boardsobjectRequiredShape: {used: integer, limit: integer|null} (both required).
projectsobjectRequiredLinked projects. Shape: {used: integer, limit: integer|null} (both required).
labelsobjectRequiredOrganization labels on the task. Shape: {enabled: boolean}.

Response

NameTypeRequiredDescription
(body)EntitlementsRequiredA Entitlements object.

Errors

StatusWhen
401Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`).
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/entitlements/" \
  -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/timeline/BetaAPI keyCLI Auth

The scheduled work over a window, with its dependency edges and goal bands

The same filtered set as the task list, asked a scheduling question. rows are the cards that OVERLAP the window; unscheduled counts the matching cards with no dates at all; dependencies carries only edges whose both ends are in rows, because an arrow to a row the reader cannot see is a line to nowhere on the screen and a disclosure off it. Window selection (first match wins): - from + to (ISO dates) — explicit range; from may be in the past (e.g. today−7 … today+21). Aliases: window_from / window_to. - window_days — forward helper: today through today+N (inclusive span). - omitted — default forward window of 14 days from today (with a board filter).

Query parameters

Filters

NameTypeRequiredDescription
fromstringOptionalFirst day of an explicit window (ISO date). May be in the past. Pair with to. Alias: window_from.
tostringOptionalLast day of an explicit window (ISO date). Must be ≥ from. Alias: window_to.
window_fromstringOptionalAlias for from.
window_tostringOptionalAlias for to.
window_daysintegerOptionalForward-from-today helper. Ignored when both from and to (or their aliases) are present. Default when no explicit window is 14.
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.
projectarrayOptionalProject uuids. Repeatable; values are OR-ed.
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.
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.
categoryarrayOptionalThe five fixed state categories. There is no blocked category — blocked-ness is a relation; use blocked=true.
labelarrayOptionalLabel uuids — v4 only, at most 50, matching the shared label filter's existing cap. A non-v4 value is 400 invalid_label_filter.
include_unscheduledstringOptionalWhen 1 or true, unscheduled is {count, results[]} (capped) instead of a bare integer count.

Timeline object

NameTypeRequiredDescription
windowobjectRequiredThe window covered. Shape: {from: string, to: string}.
bandsarrayOptionalGoals live across the window. Items: {uuid, name, status, period_start, period_end}.
rowsarrayRequiredTasks that overlap the window. Items: {uuid, key, title, state (state name), category, owner (UserRef|null), goal (uuid|null), start_date, due_date, completed_at, is_blocked, is_overdue}.
dependenciesarrayOptionalDependency edges whose both ends are in rows. Items: {source (task uuid), target (task uuid), relation_type}.
unscheduledinteger | {count: integer, results: array}RequiredMatching tasks with no dates at all.
truncatedbooleanOptionaltrue when more changes are waiting: poll again immediately.

Response

NameTypeRequiredDescription
(body)TimelineRequiredA Timeline object.

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`).
429Rate limit reached. Wait the number of seconds in `Retry-After`.
curl -sS "https://api.dailybot.com/v1/plan/timeline/?board=ENG&from=2026-09-18&to=2026-10-16" \
  -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/pulse/BetaAPI keyCLI Auth

The home screen in one request (HomePulse), or a board-health aggregate (TaskPulse)

Two modes, chosen by the presence of group_by.

HomePulse (no group_by): the Plan home in one request — generated_at, integer counts, your my_preview, board, goal and timeline teasers, agent_summary, and the optional include bands. The population is stated as scope: "viewer_visible": every live, non-terminal task you can see — not the whole organization. Each tile names the query that reproduces it: open → ?state=open, overdue → ?due_before=<today>&state=open, blocked → ?blocked=true&state=open.

TaskPulse (with group_by, e.g. group_by=state): a board-health aggregate with totals, throughput and cycle time. Counts are integers only and there is no per-person breakdown. Answers If-None-Match with 304.

Query parameters

NameTypeRequiredDescription
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.
projectarrayOptionalProject uuids. Repeatable; values are OR-ed.
window_daysintegerOptionalThe trailing window for throughput and cycle time.
group_bystringOptionalPresence selects TaskPulse mode (a board-health aggregate). Omit it entirely for HomePulse; there is no default. The enum is closed and contains no person dimension: per-person output is refused by design.
includestringOptionalHomePulse only (no group_by). Comma-separated opt-in bands so a home screen renders from one request: projects → projects_preview (visible live projects, progress, newest update), attention → attention (your open work that is overdue or blocked), activity → recent_activity, goal_progress → progress and projects on each goals_preview row. A band you do not ask for is absent and costs nothing. An unknown token is 400 invalid_filter_value.

Headers

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

HomePulse object

NameTypeRequiredDescription
generated_atdate-timeRequiredWhen the response was computed.
scopeenumRequiredThe population counted: viewer_visible (everything you can see). One of viewer_visible.
openintegerOptionalTasks in a backlog, todo or in_progress state.
overdueintegerOptionalOpen tasks past their due date.
blockedintegerOptionalTasks with a live blocker.
unread_countintegerRequiredUnread items.
countsHomePulseCounts {open_tasks, open_tasks_on_goal_linked_projects, overdue_tasks, blocked_tasks, active_boards, active_projects, active_goals: integer}RequiredInteger counts across what you can see. All fields are always present.
my_previewobjectRequiredYour overdue and due-today work. Shape: {overdue: integer, due_today: integer, top_tasks: array of {uuid, title, due_date, priority, board (uuid)}} (all required).
recent_boardsarrayRequiredItems: {uuid, name, key, project (uuid|null), updated_at, viewer{is_member, can_see_content, can_manage}}.
featured_boardsarrayRequiredItems: {uuid, name, key, project (uuid|null), updated_at, viewer{is_member, can_see_content, can_manage}}.
goals_previewarrayRequiredItems: {uuid, name, status, period_start, period_end}; with include=goal_progress also progress (GoalProgress|null) and projects [{uuid, name, …}].
timeline_teaserobjectRequiredWork due soon. Shape: {window_from: string, window_to: string, due_soon_count: integer, rows: array} (all required).
agent_summaryobjectRequiredBoards where agents act, and approvals waiting. Shape: {boards_advisory, boards_autonomous, pending_approvals: integer} (all required).
projects_previewarrayOptionalPresent only with include=projects. Items: {uuid, name, health, progress (ProjectProgress|null), latest_update (ProjectUpdate|null)}.
attentionarrayOptionalPresent only with include=attention. Items: {uuid, key, title, due_date, priority, board, state{uuid, name, category}, overdue, blocked}.
recent_activityarray<ActivityEvent>OptionalPresent only with include=activity. See ActivityEvent.

TaskPulse object

NameTypeRequiredDescription
boardBoard | nullOptionalThe board. See Board.
window_daysintegerRequired—
generated_atdate-timeRequiredWhen the response was computed.
group_byenumRequiredThe grouping dimension. One of state, category, label, priority, board, age.
groupsarrayRequiredOne entry per column (or group), in order. Always present: key, count. Items: {key: string, name: string|null, count: integer, oldest_age_days: integer|null}.
totalsobjectRequiredShape: {total, blocked, unassigned, overdue , created_in_window, completed_in_window: integer}.
throughputarrayOptionalAll fields are always present. Items: {week_start: string, created: integer, completed: integer}.
cycle_time_days_p50number | nullOptional—
cycle_time_days_p90number | nullOptional—

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.

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.

Errors

StatusWhen
304Not modified: the `If-None-Match` ETag you sent still matches.
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/pulse/?include=projects,attention,activity,goal_progress" \
  -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/me/favorites/BetaCLI AuthPage-number pagination

Your pinned boards and saved views

Every pin you own, in rank order (1 is the top). A pin whose target you can no longer see (an archived or hidden board, or a saved view that is gone or no longer shared) is omitted rather than raised. The list uses the standard list envelope but is never paged: next and previous are always null, and it holds up to 50 pins. Needs a person: agent and organization keys are refused; a personal API key works.

Favorite object

NameTypeRequiredDescription
uuiduuidRequiredStable public identifier.
target_typeenumRequiredWhat is pinned: board or view. One of board, view.
target_uuiduuidRequiredThe board's or the saved view's uuid, per target_type.
rankintegerRequired1-based position in your list. Minimum 1.
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<Favorite>RequiredThe rows on this page. See Favorite.

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/me/favorites/" \
  -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/me/favorites/BetaCLI Auth

Pin a board or a saved view

New pins land at the bottom of your list. Pinning something already pinned returns the existing pin rather than a duplicate. A target you cannot see is 404, never 403. You can pin up to 50 boards and views; one more is 400 favorite_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
target_typeenumRequiredWhat is pinned: board or view. One of board, view.
target_uuiduuidRequiredThe board's or the saved view's uuid, per target_type.
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)FavoriteRequiredA Favorite 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/me/favorites/" \
  -H "Authorization: Bearer $DAILYBOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "target_type": "board",
    "target_uuid": "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.
  • 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/me/favorites/{favorite_id}/BetaCLI Auth

Move one pin within your list

Send one of after (place it just below that pin), before (just above it) or rank (1-based position, clamped to the list). When more than one is sent, after wins, then before. Ranks are renumbered to 1..n. A neighbour that is not one of your pins is 404.

Path parameters

NameTypeRequiredDescription
favorite_iduuidRequiredThe pin'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
rankintegerOptional1-based target position, clamped to the list. Minimum 1.
beforeuuidOptionalPlace the pin just above this pin.
afteruuidOptionalPlace the pin just below 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)FavoriteRequiredA Favorite 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/me/favorites/{favorite_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/me/favorites/{favorite_id}/BetaCLI Auth

Unpin

Removes the pin, never its target. The remaining pins are renumbered to 1..n.

Path parameters

NameTypeRequiredDescription
favorite_iduuidRequiredThe pin'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/me/favorites/{favorite_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`.

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