Plan · Notifications & reports
The notification catalogue, each person's switches and daily briefing, the organization's channel routes and scheduled reports, and the channels they post to. 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].
The notification catalogue
Every notification kind, personal and organization: the one catalogue the web settings, the CLI and the agent skill render from. scope is personal (a switch a person sets for themselves, by DM and/or email) or org (a kind a channel route can post). key values are stable lowercase identifiers; default is what a person gets before touching the switch; immediate kinds are never held by the burst window.
NotificationKind object
| Name | Type | Required | Description |
|---|---|---|---|
| key | string | Required | Stable lowercase identifier: what items[].kind and a route's kinds take. |
| scope | enum | Required | personal (a switch a person sets for themselves, DM and/or email) or org (a kind a route can post to a channel). |
| group | string | Required | The groups[].key it belongs to, for rendering. |
| title | string | Required | — |
| description | string | Required | — |
| events | array<string> | Required | The task event types that produce it. |
| targeting | enum | Required | Who it reaches: me, watched, content_author, project_members, scheduled or org. |
| supports | array<string> | Required | The channels it can use: chat, email. |
| default | object | Required | {chat, email}: what a person gets before touching the switch. |
| immediate | boolean | Required | An immediate kind is never held by the burst window. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| groups | array<object> | Required | {key, title} rows, in display order. |
| kinds | array<NotificationKind> | Required | The NotificationKind objects. |
Errors
| Status | When |
|---|---|
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
curl -sS "https://api.dailybot.com/v1/plan/notifications/catalog/" \
-H "X-API-KEY: $DAILYBOT_API_KEY"dailybot plan tasks notifications catalog{
"groups": [
{
"key": "my_work",
"title": "My work"
}
],
"kinds": [
{
"key": "task_assigned",
"scope": "personal",
"group": "my_work",
"title": "Assigned to me",
"description": "Someone made me the owner of a task.",
"events": [
"task.owner_changed"
],
"targeting": "me",
"supports": [
"chat",
"email"
],
"default": {
"chat": true,
"email": false
},
"immediate": 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: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.
My notification switches
The caller's effective switches, one item per personal kind, with chat / email values: the stored switch when there is one (stored: true), otherwise the catalogue default (stored: false). destination says where chat notifications go: a direct message by default, or a public channel the person chose. A person is never notified about their own actions, whatever these say.
NotificationDestination object
| Name | Type | Required | Description |
|---|---|---|---|
| type | enum | Required | dm (the default) or channel. |
| channel | ChatChannel | null | Required | The public channel when type is channel. See ChatChannel. |
ChatChannel object
NotificationPreferenceItem object
| Name | Type | Required | Description |
|---|---|---|---|
| kind | string | Required | The catalogue key. |
| group | string | Required | — |
| title | string | Required | — |
| supports | array<string> | Required | chat, email. |
| default | object | Required | {chat, email} from the catalogue. |
| stored | boolean | Required | true when the person set this switch; false when the value is the catalogue default. |
| chat | boolean | Required | Effective value. |
| boolean | Required | Effective value. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| destination | NotificationDestination | Required | A NotificationDestination object. |
| items | array<NotificationPreferenceItem> | Required | One row per personal kind: NotificationPreferenceItem objects. |
| paused_until | datetime | null | Required | Reserved; always null in this version. |
Errors
| Status | When |
|---|---|
| 400 | The credential is an agent or organization key (`actor_required`); this endpoint needs a person. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | Guest accounts cannot use Plan (`guest_not_allowed`). |
curl -sS "https://api.dailybot.com/v1/plan/me/notifications/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN"dailybot plan tasks notifications get --me{
"destination": {
"type": "dm",
"channel": null
},
"items": [
{
"kind": "task_assigned",
"group": "my_work",
"title": "Assigned to me",
"supports": [
"chat",
"email"
],
"default": {
"chat": true,
"email": false
},
"stored": true,
"chat": true,
"email": true
}
],
"paused_until": null
}Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:read`.
- Rate limit: 120 reads per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key, which acts as its person. An agent or organization key gets `400 actor_required`.
Change my notification switches
Partial: only the kinds and channels you name are written; everything else keeps its effective value. Answers the full effective body, the same as GET. An unknown kind is 400 unknown_notification_kind and an unknown field is 400 unknown_field (extra.parameter names it). A destination channel must be public (type: channel on GET /v1/plan/channels/); a private one is 400 channel_not_found, and notifications about members-only work still come by DM. paused_until is reserved: sending a value is 501 not_implemented.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
| destination | object | Optional | {type: "dm"} or {type: "channel", channel: {external_id}}. |
| items | array<object> | Optional | {kind, chat?, email?} rows: the catalogue key and the channels to set. Omit a channel to leave it as is. |
| paused_until | datetime | null | Optional | Reserved. Only null is accepted; a datetime is 501 not_implemented. |
| agent_name | string | Optional | The name of the agent that executed this write on the person's behalf (max 128 characters, blank means no agent). Takes priority over the X-Dailybot-Agent-Name header. See Agent attribution. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| destination | NotificationDestination | Required | A NotificationDestination object. |
| items | array<NotificationPreferenceItem> | Required | One row per personal kind: NotificationPreferenceItem objects. |
| paused_until | datetime | null | Required | Reserved; always null in this version. |
Errors
| Status | When |
|---|---|
| 400 | An unknown kind (`unknown_notification_kind`), an unknown field (`unknown_field`), a channel that is not public or not known (`channel_not_found`), an agent or organization key (`actor_required`), or an invalid agent name (`invalid_agent_attribution`). |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | Guest accounts cannot use Plan (`guest_not_allowed`). |
curl -sS -X PUT "https://api.dailybot.com/v1/plan/me/notifications/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"kind": "task_assigned",
"email": true
},
{
"kind": "comment_added",
"chat": false
}
]
}'dailybot plan tasks notifications set --me task_assigned --email onTry 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, which acts as its person. An agent or organization key gets `400 actor_required`.
List the organization's channel routes
Every route: a chat channel, the organization notification kinds it receives, and its scope (the whole workspace, some boards or some projects). viewer.can_manage says whether the caller may create or change routes. Any member, and any key, may read.
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| page | integer | Optional | 1-based page number. |
| page_size | integer | Optional | Rows per page. Default 50, maximum 100. Out-of-range values are clamped, never rejected: asking for 500 returns 100. |
NotificationRoute object
| Name | Type | Required | Description |
|---|---|---|---|
| uuid | uuid | Required | Stable public identifier. |
| name | string | Required | Route name. |
| enabled | boolean | Required | A disabled route keeps its settings and posts nothing. |
| channel | ChatChannel | Required | Where it posts. See ChatChannel. |
| kinds | array<string> | Required | The organization notification kinds it receives (key values from the catalogue). |
| scope | RouteScope | Required | Which work it covers. See RouteScope. |
| created_by | UserRef | null | Required | Who created it. See UserRef. |
| created_at | datetime | null | Required | — |
| updated_at | datetime | null | Required | — |
RouteScope object
RoutesViewer object
UserRef object
Response
| Name | Type | Required | Description |
|---|---|---|---|
| count | integer | Required | Total number of rows. |
| next | uri | Required | URL of the next page, or null. |
| previous | uri | Required | URL of the previous page, or null. |
| results | array<NotificationRoute> | Required | The page of NotificationRoute objects. |
| viewer | RoutesViewer | Required | A RoutesViewer object. |
Errors
| Status | When |
|---|---|
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
curl -sS "https://api.dailybot.com/v1/plan/notification-routes/" \
-H "X-API-KEY: $DAILYBOT_API_KEY"dailybot plan tasks routes list{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"uuid": "00000000-0000-4000-8000-000000000021",
"name": "Engineering channel",
"enabled": true,
"channel": {
"external_id": "C0123ABC",
"name": "engineering",
"type": "channel"
},
"kinds": [
"task_completed",
"project_update_posted",
"project_lead_changed"
],
"scope": {
"type": "boards",
"uuids": [
"00000000-0000-4000-8000-000000000002"
]
},
"created_by": {
"uuid": "00000000-0000-4000-8000-000000000001",
"name": "Ana"
},
"created_at": "2026-09-30T14:00:00Z",
"updated_at": "2026-09-30T14:00:00Z"
}
],
"viewer": {
"can_manage": 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:read`.
- Rate limit: 120 reads per minute per actor.
- Works with a login session, a CLI user token, a personal API key, or an agent or organization key. A personal key sees what its person sees; an agent or organization key acts as a system actor and sees organization-visible boards only.
Create a channel route
Organization administrators only. A route posts the organization notification kinds you pick (a task completed, a project update, a lead change…) to one chat channel, for the whole workspace or for some boards or projects. At most 10 routes per organization. Accepts Idempotency-Key.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | Optional | A key you generate for this intent. A replay with the same key and body returns the first response without a second side effect and carries Idempotency-Replayed: true. Keys are kept for 24 hours. The same key with a different body is 409 idempotency_key_payload_mismatch; a repeat while the first call is still running gets 409 idempotency_in_progress for up to 120 seconds. |
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | Optional | Route name. |
| enabled | boolean | Optional | Default true. |
| channel | object | Optional | {external_id}: the platform channel id, as GET /v1/plan/channels/ lists it. Unknown ids are 400 channel_not_found. |
| kinds | array<string> | Optional | Organization kinds from the catalogue (scope: org). Anything else is 400 unknown_notification_kind. |
| scope | RouteScope | Optional | {type, uuids}. A members-only board or project is 400 route_scope_not_org_visible with extra.uuids: channels only ever receive what the whole workspace can see. |
| agent_name | string | Optional | The name of the agent that executed this write on the person's behalf (max 128 characters, blank means no agent). Takes priority over the X-Dailybot-Agent-Name header. See Agent attribution. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | NotificationRoute | Required | A NotificationRoute object. |
Errors
| Status | When |
|---|---|
| 400 | A field failed validation: `channel_not_found`, `unknown_notification_kind`, `route_scope_not_org_visible` (`extra.uuids`), `unknown_field`, or `notification_routes_limit_reached` (`extra.limit`, 10 routes). `invalid_agent_attribution` means the agent name is invalid. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | You are not an organization administrator (`insufficient_scope`), or you are a guest (`guest_not_allowed`). An agent or organization key is refused here too. |
curl -sS -X POST "https://api.dailybot.com/v1/plan/notification-routes/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Engineering channel",
"channel": {
"external_id": "C0123ABC"
},
"kinds": [
"task_completed",
"project_update_posted",
"project_lead_changed"
],
"scope": {
"type": "boards",
"uuids": [
"00000000-0000-4000-8000-000000000002"
]
}
}'dailybot plan tasks routes create --name "Engineering channel" --channel C0123ABC --kind task_completed --kind project_update_posted --board 00000000-0000-4000-8000-000000000002Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:admin` — container writes. A non-guest member can call it with a login session or a personal API key (a key with explicit Plan scopes needs `tasks:write`, which covers it); an agent or organization key gets `403 insufficient_scope`.
- Rate limit: 60 writes per minute per actor.
- Organization administrators only, with a login session, a CLI user token or a personal API key. Any member and any key may read.
Retrieve a channel route
One route. A route in another organization is 404.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| route_id | uuid | Required | The route's uuid. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | NotificationRoute | Required | A NotificationRoute object. |
Errors
| Status | When |
|---|---|
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 404 | The route does not exist in your organization (`not_found`), never a 403. |
curl -sS "https://api.dailybot.com/v1/plan/notification-routes/00000000-0000-4000-8000-000000000021/" \
-H "X-API-KEY: $DAILYBOT_API_KEY"dailybot plan tasks routes get 00000000-0000-4000-8000-000000000021{
"uuid": "00000000-0000-4000-8000-000000000021",
"name": "Engineering channel",
"enabled": true,
"channel": {
"external_id": "C0123ABC",
"name": "engineering",
"type": "channel"
},
"kinds": [
"task_completed",
"project_update_posted",
"project_lead_changed"
],
"scope": {
"type": "boards",
"uuids": [
"00000000-0000-4000-8000-000000000002"
]
},
"created_by": {
"uuid": "00000000-0000-4000-8000-000000000001",
"name": "Ana"
},
"created_at": "2026-09-30T14:00:00Z",
"updated_at": "2026-09-30T14:00:00Z"
}Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:read`.
- Rate limit: 120 reads per minute per actor.
- Works with a login session, a CLI user token, a personal API key, or an agent or organization key. A personal key sees what its person sees; an agent or organization key acts as a system actor and sees organization-visible boards only.
Change a channel route
Organization administrators only. Partial: only the fields you send are written, with the same validation as create.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| route_id | uuid | Required | The route's uuid. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | Optional | Route name. |
| enabled | boolean | Optional | Default true. |
| channel | object | Optional | {external_id}: the platform channel id, as GET /v1/plan/channels/ lists it. Unknown ids are 400 channel_not_found. |
| kinds | array<string> | Optional | Organization kinds from the catalogue (scope: org). Anything else is 400 unknown_notification_kind. |
| scope | RouteScope | Optional | {type, uuids}. A members-only board or project is 400 route_scope_not_org_visible with extra.uuids: channels only ever receive what the whole workspace can see. |
| agent_name | string | Optional | The name of the agent that executed this write on the person's behalf (max 128 characters, blank means no agent). Takes priority over the X-Dailybot-Agent-Name header. See Agent attribution. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | NotificationRoute | Required | A NotificationRoute object. |
Errors
| Status | When |
|---|---|
| 400 | A field failed validation: `channel_not_found`, `unknown_notification_kind`, `route_scope_not_org_visible` (`extra.uuids`), `unknown_field`, or `notification_routes_limit_reached` (`extra.limit`, 10 routes). `invalid_agent_attribution` means the agent name is invalid. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | You are not an organization administrator (`insufficient_scope`), or you are a guest (`guest_not_allowed`). An agent or organization key is refused here too. |
| 404 | The route does not exist in your organization (`not_found`), never a 403. |
curl -sS -X PATCH "https://api.dailybot.com/v1/plan/notification-routes/00000000-0000-4000-8000-000000000021/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"enabled": false
}'dailybot plan tasks routes update 00000000-0000-4000-8000-000000000021 --disableTry it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:admin` — container writes. A non-guest member can call it with a login session or a personal API key (a key with explicit Plan scopes needs `tasks:write`, which covers it); an agent or organization key gets `403 insufficient_scope`.
- Rate limit: 60 writes per minute per actor.
- Organization administrators only, with a login session, a CLI user token or a personal API key. Any member and any key may read.
Delete a channel route
Organization administrators only. The channel stops receiving at once. Answers 204.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| route_id | uuid | Required | The route's uuid. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Errors
| Status | When |
|---|---|
| 400 | Validation failed; the response `code` says which field. `invalid_agent_attribution` means the agent name is invalid. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | You are not an organization administrator (`insufficient_scope`), or you are a guest (`guest_not_allowed`). An agent or organization key is refused here too. |
| 404 | The route does not exist in your organization (`not_found`), never a 403. |
curl -sS -X DELETE "https://api.dailybot.com/v1/plan/notification-routes/00000000-0000-4000-8000-000000000021/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN"dailybot plan tasks routes delete 00000000-0000-4000-8000-000000000021Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:admin` — container writes. A non-guest member can call it with a login session or a personal API key (a key with explicit Plan scopes needs `tasks:write`, which covers it); an agent or organization key gets `403 insufficient_scope`.
- Rate limit: 60 writes per minute per actor.
- Organization administrators only, with a login session, a CLI user token or a personal API key. Any member and any key may read.
Post a test message to a route's channel, or preview it
Organization administrators only. With ?dry_run=true the sample is rendered and the channel resolved, and nothing is sent or logged. Without it, one message is posted and logged like any route post.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| route_id | uuid | Required | The route's uuid. |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| dry_run | boolean | Optional | true renders and resolves only; nothing is sent or logged. Fails closed: any value other than 0, false, no or off is a dry run. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| dry_run | boolean | Required | Echoes the request: true when nothing was sent. |
| channel | ChatChannel | Required | A ChatChannel object. |
| text | string | Required | The rendered sample message. |
| sent | boolean | Required | false on a dry run. |
| status | string | Optional | The delivery status when sent. |
| delivery_uuid | uuid | null | Optional | The delivery record when sent; see the deliveries endpoint. |
Errors
| Status | When |
|---|---|
| 400 | Validation failed; the response `code` says which field. `invalid_agent_attribution` means the agent name is invalid. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | You are not an organization administrator (`insufficient_scope`), or you are a guest (`guest_not_allowed`). An agent or organization key is refused here too. |
| 404 | The route does not exist in your organization (`not_found`), never a 403. |
curl -sS -X POST "https://api.dailybot.com/v1/plan/notification-routes/00000000-0000-4000-8000-000000000021/send-test/?dry_run=true" \
-H "Authorization: Bearer $DAILYBOT_TOKEN"dailybot plan tasks routes send-test 00000000-0000-4000-8000-000000000021 --dry-run{
"dry_run": true,
"channel": {
"external_id": "C0123ABC",
"name": "engineering",
"type": "channel"
},
"text": "Test message from Dailybot Plan for the route \"Engineering channel\".",
"sent": false
}Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:admin` — container writes. A non-guest member can call it with a login session or a personal API key (a key with explicit Plan scopes needs `tasks:write`, which covers it); an agent or organization key gets `403 insufficient_scope`.
- Rate limit: 60 writes per minute per actor.
- Organization administrators only, with a login session, a CLI user token or a personal API key. Any member and any key may read.
A route's last deliveries
The newest 20 delivery rows, newest first: sent, failed (with a reason code) or skipped (not_org_visible, rate_limited). Never message text.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| route_id | uuid | Required | The route's uuid. |
DeliveryRecord object
| Name | Type | Required | Description |
|---|---|---|---|
| uuid | uuid | Required | — |
| status | enum | Required | sent, failed (see error) or skipped (not_org_visible, rate_limited). |
| channel | enum | Required | chat or email. |
| error | string | null | Required | A reason code when the delivery failed or was skipped. Never message text. |
| message_id | string | null | Required | The platform's message id when it was posted. |
| created_at | datetime | Required | — |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| count | integer | Required | Total number of rows. |
| next | uri | Required | URL of the next page, or null. |
| previous | uri | Required | URL of the previous page, or null. |
| results | array<DeliveryRecord> | Required | The DeliveryRecord objects. |
Errors
| Status | When |
|---|---|
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 404 | The route does not exist in your organization (`not_found`), never a 403. |
curl -sS "https://api.dailybot.com/v1/plan/notification-routes/00000000-0000-4000-8000-000000000021/deliveries/" \
-H "X-API-KEY: $DAILYBOT_API_KEY"dailybot plan tasks routes deliveries 00000000-0000-4000-8000-000000000021Try 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.
Search the chat channels routes and reports can post to
The connected platform's channels, sorted by name, as a page. search is a case-insensitive substring of the name. platform names the platform (slack, msteams, discord, google_chat); with no chat platform connected the answer is 400 platform_not_connected. Organization administrators see private channels the bot is in; everyone else sees public channels only (a private channel is absent, not forbidden). type=channel answers public channels only, for everyone: what a personal notification destination must be.
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| search | string | Optional | Case-insensitive substring of the channel name. |
| type | string | Optional | channel answers public channels only, for everyone. Without it, organization administrators also see private channels the bot is in. |
| page | integer | Optional | 1-based page number. |
| page_size | integer | Optional | Rows per page. Default 50, maximum 100. Out-of-range values are clamped, never rejected: asking for 500 returns 100. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| count | integer | Required | Total number of rows. |
| next | uri | Required | URL of the next page, or null. |
| previous | uri | Required | URL of the previous page, or null. |
| results | array<ChatChannel> | Required | The page of ChatChannel objects. |
| platform | string | Required | slack, msteams, discord or google_chat. |
Errors
| Status | When |
|---|---|
| 400 | No chat platform is connected (`platform_not_connected`), or `type` or a paging value is not valid. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
curl -sS "https://api.dailybot.com/v1/plan/channels/?search=eng&type=channel" \
-H "X-API-KEY: $DAILYBOT_API_KEY"dailybot plan tasks channels search eng --type channel{
"count": 1,
"next": null,
"previous": null,
"platform": "slack",
"results": [
{
"external_id": "C0123ABC",
"name": "engineering",
"type": "channel"
}
]
}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.
List the organization's scheduled reports
Every schedule with its kind (daily, week_start, week_end), ISO weekdays (Monday = 1), local time in its IANA timezone, channel, email recipients, scope and last run. viewer.can_manage says whether the caller may change them (an organization administrator).
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| page | integer | Optional | 1-based page number. |
| page_size | integer | Optional | Rows per page. Default 50, maximum 100. Out-of-range values are clamped, never rejected: asking for 500 returns 100. |
ReportSchedule object
| Name | Type | Required | Description |
|---|---|---|---|
| uuid | uuid | Required | — |
| name | string | Required | — |
| kind | enum | Required | daily, week_start or week_end. |
| enabled | boolean | Required | — |
| weekdays | array<integer> | Required | ISO weekdays, Monday = 1. A week_start or week_end report has exactly one. |
| time | string | Required | HH:MM, 24-hour, in timezone. |
| timezone | string | Required | IANA name. |
| channel | ChatChannel | null | Required | Where it posts, or null for email only. See ChatChannel. |
| email_recipients | array<UserRef> | Required | See UserRef. |
| scope | RouteScope | Required | See RouteScope. |
| created_by | UserRef | null | Required | — |
| last_run | ReportRun | null | Required | See ReportRun. |
| created_at | datetime | null | Required | — |
| updated_at | datetime | null | Required | — |
ReportRun object
| Name | Type | Required | Description |
|---|---|---|---|
| uuid | uuid | Required | — |
| period_key | string | Required | The period the run covered, for example a date or an ISO week. |
| scheduled_for | datetime | Required | — |
| sent_at | datetime | null | Required | — |
| status | enum | Required | sent, failed (see error) or skipped_empty. |
| error | string | null | Required | A reason code when it failed. |
| channel_message_id | string | null | Required | — |
| email_count | integer | Required | How many emails went out. |
| is_test | boolean | Required | true for a send-test; it does not count as the period's run. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| count | integer | Required | Total number of rows. |
| next | uri | Required | URL of the next page, or null. |
| previous | uri | Required | URL of the previous page, or null. |
| results | array<ReportSchedule> | Required | The page of ReportSchedule objects. |
| viewer | RoutesViewer | Required | A RoutesViewer object. |
Errors
| Status | When |
|---|---|
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
curl -sS "https://api.dailybot.com/v1/plan/reports/" \
-H "X-API-KEY: $DAILYBOT_API_KEY"dailybot plan tasks reports list{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"uuid": "00000000-0000-4000-8000-000000000022",
"name": "Friday wrap-up",
"kind": "week_end",
"enabled": true,
"weekdays": [
5
],
"time": "16:00",
"timezone": "America/Bogota",
"channel": {
"external_id": "C0123ABC",
"name": "engineering",
"type": "channel"
},
"email_recipients": [
{
"uuid": "00000000-0000-4000-8000-000000000001",
"name": "Ana"
}
],
"scope": {
"type": "all",
"uuids": []
},
"created_by": {
"uuid": "00000000-0000-4000-8000-000000000001",
"name": "Ana"
},
"last_run": null,
"created_at": "2026-09-30T14:00:00Z",
"updated_at": "2026-09-30T14:00:00Z"
}
],
"viewer": {
"can_manage": 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: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.
Schedule a report
Organization administrators only. A daily report says what is expected today and who owns it; a week-start report looks at the week ahead; a week-end report says what closed, what is at risk and what did not close. It posts to a channel, goes by email to the people you name, or both, on the weekdays and local time you choose. At most 10 schedules per organization. Accepts Idempotency-Key.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | Optional | A key you generate for this intent. A replay with the same key and body returns the first response without a second side effect and carries Idempotency-Replayed: true. Keys are kept for 24 hours. The same key with a different body is 409 idempotency_key_payload_mismatch; a repeat while the first call is still running gets 409 idempotency_in_progress for up to 120 seconds. |
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | Optional | Schedule name. |
| kind | enum | Optional | daily (what is expected today, with owners), week_start (the week ahead) or week_end (what closed, what is at risk, what did not close). |
| enabled | boolean | Optional | Default true. |
| weekdays | array<integer> | Optional | ISO weekdays, Monday = 1 … Sunday = 7. A daily report takes any set (for example [1,2,3,4,5]); week_start and week_end take exactly one. |
| time | string | Optional | HH:MM, 24-hour, in timezone. |
| timezone | string | Optional | IANA name. Defaults to the organization's. |
| channel | object | null | Optional | {external_id} of the channel to post to, or null for email only. A schedule needs a channel, email recipients, or both. |
| email_recipients | array<uuid> | Optional | User uuids that receive it by email. [] clears them. |
| scope | RouteScope | Optional | {type, uuids}: the whole workspace, some boards or some projects. Members-only work is refused with 400 route_scope_not_org_visible. |
| agent_name | string | Optional | The name of the agent that executed this write on the person's behalf (max 128 characters, blank means no agent). Takes priority over the X-Dailybot-Agent-Name header. See Agent attribution. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | ReportSchedule | Required | A ReportSchedule object. |
Errors
| Status | When |
|---|---|
| 400 | A schedule field is invalid (`invalid_schedule`, `extra.parameter` is `weekdays`, `time`, `timezone`, `channel` or `kind`), the channel is unknown (`channel_not_found`), the scope names members-only work (`route_scope_not_org_visible`), a field is unknown (`unknown_field`), or the organization already has 10 schedules (`report_schedules_limit_reached`, `extra.limit`). `invalid_agent_attribution` means the agent name is invalid. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | You are not an organization administrator (`insufficient_scope`), or you are a guest (`guest_not_allowed`). An agent or organization key is refused here too. |
curl -sS -X POST "https://api.dailybot.com/v1/plan/reports/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Friday wrap-up",
"kind": "week_end",
"weekdays": [
5
],
"time": "16:00",
"timezone": "America/Bogota",
"channel": {
"external_id": "C0123ABC"
},
"scope": {
"type": "all",
"uuids": []
}
}'dailybot plan tasks reports create --name "Friday wrap-up" --kind week_end --weekday 5 --time 16:00 --channel C0123ABCTry it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:admin` — container writes. A non-guest member can call it with a login session or a personal API key (a key with explicit Plan scopes needs `tasks:write`, which covers it); an agent or organization key gets `403 insufficient_scope`.
- Rate limit: 60 writes per minute per actor.
- Organization administrators only, with a login session, a CLI user token or a personal API key. Any member and any key may read.
Retrieve a scheduled report
One schedule. A schedule in another organization is 404.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| report_id | uuid | Required | The scheduled report's uuid. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | ReportSchedule | Required | A ReportSchedule object. |
Errors
| Status | When |
|---|---|
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 404 | The schedule does not exist in your organization (`not_found`), never a 403. |
curl -sS "https://api.dailybot.com/v1/plan/reports/00000000-0000-4000-8000-000000000022/" \
-H "X-API-KEY: $DAILYBOT_API_KEY"dailybot plan tasks reports get 00000000-0000-4000-8000-000000000022{
"uuid": "00000000-0000-4000-8000-000000000022",
"name": "Friday wrap-up",
"kind": "week_end",
"enabled": true,
"weekdays": [
5
],
"time": "16:00",
"timezone": "America/Bogota",
"channel": {
"external_id": "C0123ABC",
"name": "engineering",
"type": "channel"
},
"email_recipients": [
{
"uuid": "00000000-0000-4000-8000-000000000001",
"name": "Ana"
}
],
"scope": {
"type": "all",
"uuids": []
},
"created_by": {
"uuid": "00000000-0000-4000-8000-000000000001",
"name": "Ana"
},
"last_run": null,
"created_at": "2026-09-30T14:00:00Z",
"updated_at": "2026-09-30T14:00:00Z"
}Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:read`.
- Rate limit: 120 reads per minute per actor.
- Works with a login session, a CLI user token, a personal API key, or an agent or organization key. A personal key sees what its person sees; an agent or organization key acts as a system actor and sees organization-visible boards only.
Change a scheduled report
Organization administrators only. Partial, with the same validation as create. channel: null clears the channel and email_recipients: [] clears the recipients; clearing both is 400 invalid_schedule (extra.parameter: "channel").
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| report_id | uuid | Required | The scheduled report's uuid. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | Optional | Schedule name. |
| kind | enum | Optional | daily (what is expected today, with owners), week_start (the week ahead) or week_end (what closed, what is at risk, what did not close). |
| enabled | boolean | Optional | Default true. |
| weekdays | array<integer> | Optional | ISO weekdays, Monday = 1 … Sunday = 7. A daily report takes any set (for example [1,2,3,4,5]); week_start and week_end take exactly one. |
| time | string | Optional | HH:MM, 24-hour, in timezone. |
| timezone | string | Optional | IANA name. Defaults to the organization's. |
| channel | object | null | Optional | {external_id} of the channel to post to, or null for email only. A schedule needs a channel, email recipients, or both. |
| email_recipients | array<uuid> | Optional | User uuids that receive it by email. [] clears them. |
| scope | RouteScope | Optional | {type, uuids}: the whole workspace, some boards or some projects. Members-only work is refused with 400 route_scope_not_org_visible. |
| agent_name | string | Optional | The name of the agent that executed this write on the person's behalf (max 128 characters, blank means no agent). Takes priority over the X-Dailybot-Agent-Name header. See Agent attribution. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | ReportSchedule | Required | A ReportSchedule object. |
Errors
| Status | When |
|---|---|
| 400 | A schedule field is invalid (`invalid_schedule`, `extra.parameter` is `weekdays`, `time`, `timezone`, `channel` or `kind`), the channel is unknown (`channel_not_found`), the scope names members-only work (`route_scope_not_org_visible`), a field is unknown (`unknown_field`), or the organization already has 10 schedules (`report_schedules_limit_reached`, `extra.limit`). `invalid_agent_attribution` means the agent name is invalid. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | You are not an organization administrator (`insufficient_scope`), or you are a guest (`guest_not_allowed`). An agent or organization key is refused here too. |
| 404 | The schedule does not exist in your organization (`not_found`), never a 403. |
curl -sS -X PATCH "https://api.dailybot.com/v1/plan/reports/00000000-0000-4000-8000-000000000022/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"weekdays": [
1
],
"kind": "week_start",
"time": "09:00"
}'dailybot plan tasks reports update 00000000-0000-4000-8000-000000000022 --kind week_start --weekday 1 --time 09:00Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:admin` — container writes. A non-guest member can call it with a login session or a personal API key (a key with explicit Plan scopes needs `tasks:write`, which covers it); an agent or organization key gets `403 insufficient_scope`.
- Rate limit: 60 writes per minute per actor.
- Organization administrators only, with a login session, a CLI user token or a personal API key. Any member and any key may read.
Delete a scheduled report
Organization administrators only. Its runs go with it. Answers 204.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| report_id | uuid | Required | The scheduled report's uuid. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Errors
| Status | When |
|---|---|
| 400 | Validation failed; the response `code` says which field. `invalid_agent_attribution` means the agent name is invalid. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | You are not an organization administrator (`insufficient_scope`), or you are a guest (`guest_not_allowed`). An agent or organization key is refused here too. |
| 404 | The schedule does not exist in your organization (`not_found`), never a 403. |
curl -sS -X DELETE "https://api.dailybot.com/v1/plan/reports/00000000-0000-4000-8000-000000000022/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN"dailybot plan tasks reports delete 00000000-0000-4000-8000-000000000022Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:admin` — container writes. A non-guest member can call it with a login session or a personal API key (a key with explicit Plan scopes needs `tasks:write`, which covers it); an agent or organization key gets `403 insufficient_scope`.
- Rate limit: 60 writes per minute per actor.
- Organization administrators only, with a login session, a CLI user token or a personal API key. Any member and any key may read.
Preview a scheduled report with real data
The report as it would be sent now: the same ReportDocument the chat message and the email are rendered from. Organization reports only ever include boards and projects the whole workspace can see.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| report_id | uuid | Required | The scheduled report's uuid. |
ReportDocument object
| Name | Type | Required | Description |
|---|---|---|---|
| kind | enum | Required | daily, week_start, week_end or personal_daily. |
| locale | string | Required | — |
| header | object | Required | {title, period_key, period_label, scope}. |
| sections | array<ReportSection> | Required | See ReportSection. |
| empty | boolean | Required | true when no section has items. |
| narrative | string | Optional | An optional short summary paragraph. |
ReportSection object
| Name | Type | Required | Description |
|---|---|---|---|
| key | string | Required | Stable section key, for example closed, at_risk, due_today. |
| title | string | Required | — |
| count | integer | Required | — |
| empty | boolean | Required | — |
| items | array<ReportItem> | Required | See ReportItem. |
ReportItem object
| Name | Type | Required | Description |
|---|---|---|---|
| type | enum | Required | task, project, milestone, goal or text. |
| uuid | string | Required | — |
| key | string | Optional | The task key, such as ENG-142, when the item is a task. |
| title | string | Required | — |
| url | string | Required | Deep link into the web app. |
| owner | UserRef | Optional | — |
| due_date | date | Optional | — |
| state | string | Optional | — |
| category | string | Optional | — |
| health | string | Optional | — |
| badges | array<string> | Required | Short flags such as overdue or blocked. |
UserRef object
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | ReportDocument | Required | A ReportDocument object. |
Errors
| Status | When |
|---|---|
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 404 | The schedule does not exist in your organization (`not_found`), never a 403. |
curl -sS "https://api.dailybot.com/v1/plan/reports/00000000-0000-4000-8000-000000000022/preview/" \
-H "X-API-KEY: $DAILYBOT_API_KEY"dailybot plan tasks reports preview 00000000-0000-4000-8000-000000000022{
"kind": "week_end",
"locale": "en",
"header": {
"title": "Week 40 wrap-up",
"period_key": "2026-W40",
"period_label": "Sep 28 \u2013 Oct 2",
"scope": {
"type": "all"
}
},
"sections": [
{
"key": "closed",
"title": "Closed this week",
"count": 1,
"empty": false,
"items": [
{
"type": "task",
"uuid": "00000000-0000-4000-8000-000000000011",
"key": "ENG-142",
"title": "Ship the onboarding checklist",
"url": "https://app.dailybot.com/tasks/ENG-142",
"owner": {
"uuid": "00000000-0000-4000-8000-000000000001",
"name": "Ana"
},
"due_date": "2026-10-01",
"state": "Done",
"category": "done",
"badges": []
}
]
},
{
"key": "at_risk",
"title": "At risk",
"count": 0,
"empty": true,
"items": []
}
],
"empty": false
}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.
Send a scheduled report now as a test, or preview what would be sent
Organization administrators only. With ?dry_run=true the document, the channel and the recipients are answered and nothing is sent. Without it the report is sent now and recorded as a test run (is_test: true); it does not count as the period's run.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| report_id | uuid | Required | The scheduled report's uuid. |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| dry_run | boolean | Optional | true renders and resolves only; nothing is sent or logged. Fails closed: any value other than 0, false, no or off is a dry run. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| dry_run | boolean | Required | Echoes the request: true when nothing was sent. |
| document | ReportDocument | Required | A ReportDocument object. |
| channel | ChatChannel | null | Required | A ChatChannel object. |
| email_recipients | array<UserRef> | Required | The UserRef objects. |
| sent | boolean | Required | false on a dry run. |
| run | ReportRun | Optional | The test run when sent. See ReportRun. |
Errors
| Status | When |
|---|---|
| 400 | Validation failed; the response `code` says which field. `invalid_agent_attribution` means the agent name is invalid. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | You are not an organization administrator (`insufficient_scope`), or you are a guest (`guest_not_allowed`). An agent or organization key is refused here too. |
| 404 | The schedule does not exist in your organization (`not_found`), never a 403. |
curl -sS -X POST "https://api.dailybot.com/v1/plan/reports/00000000-0000-4000-8000-000000000022/send-test/?dry_run=true" \
-H "Authorization: Bearer $DAILYBOT_TOKEN"dailybot plan tasks reports send-test 00000000-0000-4000-8000-000000000022 --dry-runTry it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:admin` — container writes. A non-guest member can call it with a login session or a personal API key (a key with explicit Plan scopes needs `tasks:write`, which covers it); an agent or organization key gets `403 insufficient_scope`.
- Rate limit: 60 writes per minute per actor.
- Organization administrators only, with a login session, a CLI user token or a personal API key. Any member and any key may read.
A scheduled report's last runs
The newest 20 runs, newest first: sent, failed (with a reason code) or skipped_empty. Test sends carry is_test: true.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| report_id | uuid | Required | The scheduled report's uuid. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| count | integer | Required | Total number of rows. |
| next | uri | Required | URL of the next page, or null. |
| previous | uri | Required | URL of the previous page, or null. |
| results | array<ReportRun> | Required | The ReportRun objects. |
Errors
| Status | When |
|---|---|
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 404 | The schedule does not exist in your organization (`not_found`), never a 403. |
curl -sS "https://api.dailybot.com/v1/plan/reports/00000000-0000-4000-8000-000000000022/runs/" \
-H "X-API-KEY: $DAILYBOT_API_KEY"dailybot plan tasks reports runs 00000000-0000-4000-8000-000000000022Try 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.
My daily briefing settings
The caller's daily briefing settings, effective values. With nothing stored the answer is the default: the person's work days (Monday–Friday when they never changed them), 09:00 in their own timezone (timezone_is_default: true), chat on, email off, enabled: false. The chat leg is always a direct message, never the person's notification channel: the briefing holds their members-only work too.
Response
| Name | Type | Required | Description |
|---|---|---|---|
| enabled | boolean | Required | Whether the briefing is sent at all. |
| weekdays | array<integer> | Required | ISO weekdays, Monday = 1. |
| time | string | Required | HH:MM, 24-hour, in timezone. |
| timezone | string | Required | IANA name. |
| timezone_is_default | boolean | Required | true when the timezone is the person's own rather than one they set here. |
| chat | boolean | Required | Deliver by direct message. |
| boolean | Required | Deliver by email. | |
| skip_when_empty | boolean | Required | Skip the briefing on a day with nothing to say. |
| effective | boolean | Required | true when the weekdays are the person's default work days rather than a set stored here. |
| last_sent_at | datetime | null | Required | When the briefing last went out, or null. |
Errors
| Status | When |
|---|---|
| 400 | The credential is an agent or organization key (`actor_required`); this endpoint needs a person. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | Guest accounts cannot use Plan (`guest_not_allowed`). |
curl -sS "https://api.dailybot.com/v1/plan/me/briefing/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN"dailybot plan tasks briefing get{
"enabled": true,
"weekdays": [
1,
2,
3,
4,
5
],
"time": "09:00",
"timezone": "America/Bogota",
"timezone_is_default": true,
"chat": true,
"email": false,
"skip_when_empty": true,
"effective": true,
"last_sent_at": "2026-09-30T14:00:00Z"
}Try it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks:read`.
- Rate limit: 120 reads per minute per actor.
- Needs a person: call it with a login session, a CLI user token or a personal API key, which acts as its person. An agent or organization key gets `400 actor_required`.
Change my daily briefing
Partial: only the fields you send are written. weekdays are ISO 1..7, time is HH:MM, timezone is an IANA name (optional: the first write stores the person's own). At least one of chat and email must stay on. Refusals are 400 invalid_schedule (extra.parameter) and 400 unknown_field. Answers the full effective body.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
| enabled | boolean | Optional | Whether the briefing is sent at all. |
| weekdays | array<integer> | Optional | ISO weekdays, Monday = 1 … Sunday = 7. |
| time | string | Optional | HH:MM, 24-hour. |
| timezone | string | Optional | IANA name. |
| chat | boolean | Optional | Deliver by direct message. |
| boolean | Optional | Deliver by email. | |
| skip_when_empty | boolean | Optional | Skip the briefing on a day with nothing to say. |
| agent_name | string | Optional | The name of the agent that executed this write on the person's behalf (max 128 characters, blank means no agent). Takes priority over the X-Dailybot-Agent-Name header. See Agent attribution. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| enabled | boolean | Required | Whether the briefing is sent at all. |
| weekdays | array<integer> | Required | ISO weekdays, Monday = 1. |
| time | string | Required | HH:MM, 24-hour, in timezone. |
| timezone | string | Required | IANA name. |
| timezone_is_default | boolean | Required | true when the timezone is the person's own rather than one they set here. |
| chat | boolean | Required | Deliver by direct message. |
| boolean | Required | Deliver by email. | |
| skip_when_empty | boolean | Required | Skip the briefing on a day with nothing to say. |
| effective | boolean | Required | true when the weekdays are the person's default work days rather than a set stored here. |
| last_sent_at | datetime | null | Required | When the briefing last went out, or null. |
Errors
| Status | When |
|---|---|
| 400 | A field is invalid (`invalid_schedule`, `extra.parameter` names it), unknown (`unknown_field`), both channels are off, the credential is an agent or organization key (`actor_required`), or the agent name is invalid (`invalid_agent_attribution`). |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | Guest accounts cannot use Plan (`guest_not_allowed`). |
curl -sS -X PUT "https://api.dailybot.com/v1/plan/me/briefing/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"enabled": true,
"weekdays": [
1,
2,
3,
4,
5
],
"time": "08:30",
"email": true
}'dailybot plan tasks briefing set --enable --weekday 1,2,3,4,5 --time 08:30 --email onTry 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, which acts as its person. An agent or organization key gets `400 actor_required`.
Preview today's briefing
Today's briefing for the caller, rendered now: the personal_daily ReportDocument with what is overdue, due today, in progress, blocked and next up, unread mentions and the projects the caller leads.
Response
| Name | Type | Required | Description |
|---|---|---|---|
| (body) | ReportDocument | Required | A ReportDocument object. |
Errors
| Status | When |
|---|---|
| 400 | The credential is an agent or organization key (`actor_required`); this endpoint needs a person. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | Guest accounts cannot use Plan (`guest_not_allowed`). |
curl -sS "https://api.dailybot.com/v1/plan/me/briefing/preview/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN"dailybot plan tasks briefing previewTry 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, which acts as its person. An agent or organization key gets `400 actor_required`.
Send today's briefing to me now, or preview it
With ?dry_run=true nothing is sent. Without it, today's briefing goes to the caller by direct message and/or email, per their settings.
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| dry_run | boolean | Optional | true renders and resolves only; nothing is sent or logged. Fails closed: any value other than 0, false, no or off is a dry run. |
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| X-Dailybot-Agent-Name | string | Optional | The name of the agent that executed this write on the person's behalf. Use it on multipart and body-less writes (DELETE, archive, restore); on JSON writes send the body field agent_name instead, which wins if both are present. Percent-encode the value as UTF-8. Control characters are stripped; a blank value means no agent. More than 128 characters, or a value that cannot be decoded, is 400 invalid_agent_attribution (never truncated). An agent-type key, which is not bound to a person, gets 400 invalid_agent_attribution if it sends it. The stamp never changes a permission answer. See Agent attribution. |
Response
| Name | Type | Required | Description |
|---|---|---|---|
| dry_run | boolean | Required | Echoes the request: true when nothing was sent. |
| document | ReportDocument | Required | A ReportDocument object. |
| sent | boolean | Required | false on a dry run. |
Errors
| Status | When |
|---|---|
| 400 | The credential is an agent or organization key (`actor_required`); this endpoint needs a person. |
| 401 | Missing, expired or malformed credential (`credential_absent`, `credential_expired`, `credential_malformed`). |
| 402 | Plan is not enabled for your organization yet (`plan_upgrade_required`). Expected during the Beta: write to [email protected]. |
| 403 | Guest accounts cannot use Plan (`guest_not_allowed`). |
curl -sS -X POST "https://api.dailybot.com/v1/plan/me/briefing/send-test/?dry_run=true" \
-H "Authorization: Bearer $DAILYBOT_TOKEN"dailybot plan tasks briefing send-test --dry-runTry it
This is a copy-only helper — the request is not sent from your browser. Paste the command into your terminal to execute it.
- Scope: `tasks: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, which acts as its person. An agent or organization key gets `400 actor_required`.
This page is the reference for Plan · Notifications & reports. 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.
Personal doors (me/notifications, me/briefing) need a person: a login session, a CLI user token or a personal API key; an agent or organization key gets 400 actor_required. Routes, scheduled reports and their send-test are for organization administrators. Every send-test takes ?dry_run=true, which renders and resolves without sending. A person’s briefing always arrives by direct message and/or email, never in a channel.