API changelog
The running log of additions and confirmed behavioral changes to the Dailybot public API.
Additive changes to the Dailybot public API land continuously. Breaking changes ship behind a new URL prefix (/v2/) with a minimum six-month sunset on the previous version. This page is the running log — add it to your reader and you’ll never have to guess when a new endpoint appeared.
What qualifies as a change
We log four categories: Added (new endpoint, new field on a response, new query parameter), Changed (behavior of an existing endpoint changed in a compatible way), Deprecated (feature we plan to remove, always with the earliest removal date), and Removed (breaking removal, always announced ≥ 6 months earlier under Deprecated). We do not log purely internal changes.
Entries
2026-09-30 · Added — Notifications, personal briefing and scheduled reports (Plan Beta)
- Notification catalogue and personal switches —
GET /v1/plan/notifications/catalog/lists every kind;GET/PUT /v1/plan/me/notifications/read and change your own switches per kind and channel (DM and/or email), and where DMs go. You are never notified about your own actions. - Channel routes — organization administrators create routes (
/v1/plan/notification-routes/) that post chosen organization kinds (a task completed, a project update, a lead change…) to a chat channel, for the whole workspace or for some boards or projects. Each route has a delivery log and a send-test with?dry_run=true. - Scheduled reports —
/v1/plan/reports/schedules a daily, week-start or week-end report on the weekdays and local time you choose, to a channel and/or by email, with a preview on real data, a run log and a send-test. - Personal daily briefing —
GET/PUT /v1/plan/me/briefing/, pluspreview/andsend-test/: what you should work on today, by direct message and/or email. - Also —
GET /v1/plan/channels/to search the channels routes and reports can post to; board attachments (/v1/plan/boards/{board_id}/attachments/); rename on task, comment, project and goal attachments; who reacted on a comment or a project update, and reactions on project updates.
2026-09-30 · Changed — Dailybot Plan: base path /v1/plan/ (Plan Beta)
- Base path. Every Dailybot Plan endpoint lives under
/v1/plan/…, with thetasks:read/tasks:write/tasks:adminscopes and thetasks.*webhook events. There is no other prefix. - CLI 4.0.0 — every Plan command lives under
dailybot plan <tasks|task|board|project|goal> …. Newtasks notifications|routes|reports|briefing|channelsgroups andtasks timelineproject and milestone filters. Command index: Dailybot CLI for Plan.
2026-09-25 · Added — Inbox mentions filter (Plan Beta)
- Mentions —
GET /v1/plan/inbox/?mentioned=truekeeps only the events where someone mentioned you, with an exactcountand paging. It combines withtype(AND). - Badges per tab —
GET /v1/plan/inbox/unread-count/takes the samementionedandtypefilters, so each tab’s badge counts exactly that tab’s rows. With no parameters the answer is unchanged. Both endpoints refuse undeclared parameters with400 invalid_filter_value.
2026-09-29 · Changed — a personal API key acts as its person on all of Plan (Plan Beta)
- A personal API key is its person. It sees what the person sees (including private boards they belong to),
meis the person, and writes are recorded as the person. It can do everything the person can do on every Plan endpoint, including projects, boards, columns, goals, milestones, members, participants, mute, saved views and attachments. No organization-admin role and no scope grant is needed; explicittasks:*scopes on the key are a ceiling the person chose (tasks:writecovers admin operations,tasks:readis read-only). - Agent and organization keys are unchanged. They never act as a person:
403 insufficient_scopeon the endpoints that need a person,400 actor_requiredonowner=me. Guests stay refused with403 guest_not_allowed, with a key or a session. - Boards gain
effective_visibility(orgormembers): a board inside amembersproject readsmembers. Private objects are404 not foundto anyone without a grant. - CLI 3.19.0:
--agent-name/DAILYBOT_AGENT_NAME,task brief, and a login token bound to the API host that issued it. 3.19.1: clearerinvalid_agent_attributionguidance. 3.20.0: a personal API key can do everything its person can do on Plan, andtask labelsis fixed. 3.21.0: milestone and update commands:project milestone-attach,milestone-attachments,milestone-attachment get|rename|delete,milestone-restore,update-get,update-edit,update-delete,update-attach,update-attachmentsandupdate-attachment get|rename|delete. 3.22.0: the CLI covers every live Plan operation:task comment-react|comment-unreact,board label update|delete,board visit,tasks recents,tasks attachments-resolve, andtask comment --reply-to <comment-uuid>. It also hardens sign-out (logout revokes every session) and downloaded file names. See Authentication for Plan and Agent attribution.
2026-09-29 · Added — Milestones and project updates (Plan Beta)
- Milestones and project updates — new
POST …/milestones/{milestone_id}/restore/; attachments on milestones and on project updates (GET|POST(multipart, up to 5 MiB) …/attachments/,GET|PATCH(rename)|DELETE …/attachments/{attachment_id}/andGET …/attachments/{attachment_id}/content/); andGET|PATCH|DELETE …/updates/{update_id}/. Reference files withattachment:{uuid}markers. Milestones gainattachment_count; updates carryexecuted_by_agent,provenance,edited_atandattachments. Only an update’s author edits it or attaches to it (403 update_not_author, a new code); the author or an organization admin deletes it. Sendagent_nameto co-author an update with an agent.
2026-09-29 · Added — Agent attribution on Plan (Plan Beta)
- Name the agent on a write — every mutating
/v1/plan/endpoint acceptsagent_namein a JSON body, or theX-Dailybot-Agent-Nameheader (percent-encoded UTF-8) on multipart and body-less writes. The body wins; the maximum is 128 characters, and a longer or undecodable name is400 invalid_agent_attribution. An agent-type key that sends it gets the same error. The stamp never changes a permission answer. - Responses — comments, attachments and activity items carry
executed_by_agent({uuid, name, username, avatar}ornull); a task gainsexecutors(newest first, withfirst_atandlast_at), separate from the singularexecutor. - Keys — a personal API key acts as its person (see the entry above). Private objects stay
404for anyone not invited. See Agent attribution.
2026-09-26 · Changed — Open-org Plan permissions (Plan Beta)
- Every non-guest member holds
tasks:read,tasks:writeandtasks:admin. Members can create goals, projects and boards (and manage states and memberships).tasks:adminmeans container writes — it is no longer org-admin only. Guests stay refused with403 guest_not_allowedbefore entitlement. - Invite is the access lever. Privacy is membership, not org role. Org-wide containers are a shared workspace. A
membersproject or board is 404 (not visible) without a grant. Invite a person or a team; the last grant on a private container is409 last_grant_cannot_be_removed. No per-project roles (lead/viewer). - Oversight: organization admins and managers of all teams can see every project; a
membersboard still needs a grant. - Organization API keys still never hold
tasks:admin— they cannot change who can see (membership) or who is notified (participants) (403 insufficient_scope). PATCH /v1/plan/projects/{project_id}/persistsvisibilityand auto-grants the actor who privatizes (org→members). See Authentication for Plan.
2026-09-25 · Added — Attachments on comments, goals and projects (Plan Beta)
- Comment attachments —
GET/POST /v1/plan/tasks/{task_id}/comments/{comment_id}/attachments/,GET …/{attachment_id}/content/andDELETE …/{attachment_id}/. Only the comment’s author attaches; the uploader, the comment’s author or an organization admin can remove. Comment rows now carryattachments, their ready attachments by position. - Project and goal attachments — the same four operations under
/v1/plan/projects/{project_id}/attachments/and/v1/plan/goals/{goal_id}/attachments/. Anyone who can see the project or goal can list and download; uploading and removing need a signed-in non-guest member withtasks:admin(every non-guest member holds it; an API key gets403 insufficient_scope). - Upload rules —
multipart/form-dataonly (file, optionalcaption), up to 5 MiB (400 attachment_too_largewithextra.max_size_bytes), the same file types as task attachments, and at most 50 per comment, project or goal. Downloads stream the bytes withnosniffandno-store. Reference an image in a description asattachment:{uuid}and resolve it to the list’s signedurl, which expires after 15 minutes. - Activity —
task.comment_attached,task.comment_detached,goal.attached,goal.detached,project.attachedandproject.detachedappear in activity; they are not webhook events.
2026-09-25 · Security + Added + Changed — Dailybot Plan API (Beta)
- Security: keys are refused on every
tasks:adminoperation — creating, editing, archiving and restoring projects, boards, workflow states and goals, reordering states, managing board and project members, and linking goals to projects need a signed-in non-guest member (tasks:admin; every non-guest member holds it after login). An organization API key gets403 insufficient_scope. See person-only endpoints. Superseded in part by the 2026-09-26 open-org change above (members, not only org admins). - Security: the mention picker no longer returns email addresses — rows from
GET /v1/plan/boards/{board_id}/mentionables/are{uuid, name, handle, avatar_url, has_photo, kind}with no email, andqmatches a name, handle or external id, never a whole email address. - Added: bulk create can land at the top —
POST /v1/plan/tasks/bulk/withoperation: createaccepts an optionalposition:startputs the new tasks at the top of each column, in item order;end(the default) keeps them at the bottom. - Added: the mention picker carries avatars — each row now has
avatar_url(string ornull) andhas_photo, with the same meaning as on a task owner: whenhas_photoisfalse, show initials. On anagentrow they arenullandfalse. - Changed: dry-run doors document their preview — archiving a project, board, workflow state, task or goal, and completing a milestone, answer a
DryRunPreviewwith?dry_run=true:{operation, dry_run, reversible, restore_path, consequence, affects}, pluswould_refuseandrefusal_codeon a workflow state archive. Bulk keeps its own preview. - Changed: bulk dry-run previews report every change —
POST /v1/plan/tasks/bulk/?dry_run=truenow lists changes tolabels,rank,estimateandstart_dateinchanges.
2026-09-25 · Added — Dailybot Plan API (Beta)
- Plan API, in Beta — 117 operations under
/v1/plan/for projects, goals, boards, workflow states, tasks, comments, attachments, favorites, saved views, activity, inbox, timeline and search. Everything under/v1/plan/is labelled Beta and may change before general availability. Until your organization is enabled, Plan endpoints answer402 plan_upgrade_required; write to [email protected] to join. - Home in one request —
GET /v1/plan/pulse/acceptsinclude=projects,attention,activity,goal_progress, and the response states its population asscope: "viewer_visible". - Batched project updates —
GET /v1/plan/projects/updates/returns the newest updates across every project you can see. - My tasks —
GET /v1/plan/me/tasks/counts/addsby_scopewith{total, open, overdue, blocked}, and thestatefilter onGET /v1/plan/me/tasks/accepts state uuids oropen/done. - Bulk previews —
POST /v1/plan/tasks/bulk/?dry_run=trueruns the call and rolls it back. - Faster reads — Plan reads are faster, with unchanged responses.
- Delta feed —
sinceonGET /v1/plan/boards/{board_id}/delta/is a deprecated alias ofupdated_since; sendupdated_since. No removal date has been announced.
Documented at /developers/plan and the six Plan groups of the API reference.
2026-08-25 · Added — CLI Labels/Featured, team approver DMs, and programmatic approvals
- CLI & Agent Skill —
dailybot label …anddailybot featured …wrap organization Labels and per-user Featured (dailybot-cli >= 3.9.0). Agent sub-skillsdailybot-labelsanddailybot-featuredmirror the same surface. - Forms approval — team fan-out — When a form lists a team as approver, each active member receives the Approve/Deny chat notification (Slack DM). Individual named approvers still receive DMs as before.
- Forms approval — API / CLI decisions —
POST /v1/forms/{uuid}/responses/{uuid}/approval/withaction_status(approved|denied) and optionalcommentwhen comments are enabled. CLI:dailybot form response approve|deny. - Web app — Team approvers can Approve/Deny from the response modal when the API exposes
user_can_approve(including team membership).
Documented at /developers/cli, /developers/agent-skill, and /developers/api/forms.
2026-08-03 · Added — Organization Labels, personalization, and forms approval comments
- Organization Labels — Public CRUD under
/v1/labels/(entitlement, archive, associated items) plus POST assign/batch on forms, automations, and check-ins. Entitled when the Labels feature is enabled for the organization and the caller is not a guest; guests denied. List filters:labels=(match-any / OR within the comma-separated set),featured=,prioritize_featured=true. Compactlabels: LabelSummary[]and caller-privateis_featuredon list rows (and on Forms detail). - Personalization (
/v1/me/...) — Dashboard preferences per surface, saved views, and Featured toggles. Not gated by Labels entitlement. Empty dashboard preference →200with empty filters;DELETEis idempotent (204). - Forms approval comments — Public form payloads add read-only
approval_flow_comments_enabled. When enabled in form Setup, approvers may leave an optional short comment on web (over-limit rejected); Slack opens a modal. Microsoft Teams, Discord, and Google Chat do not collect approval comments from chat today — use the web app. Configure in the product UI only — not viaPATCH /v1/forms/{uuid}/config/. - Dashboard list enrichment — When enrichment is temporarily unavailable, enrichment query params return
503withdashboard_enrichment_temporarily_unavailable. See /developers/errors for Labels/personalization codes and retry guidance.
Documented at /developers/api/labels, /developers/api/users, /developers/api/forms, /developers/api/check-ins, and /developers/api/workflows.
2026-07-23 · Added — Interactive buttons contract v3.1: Modal → Workflow + {{trigger.*}}
modal_body now composes with callback_workflow (in addition to callback_url). On submit, modal field values are delivered to the triggered api_trigger workflow as {{trigger.fields.<name>}}. Workflow steps gain the canonical {{trigger.*}} namespace (source, body.*, button_id, button_value, fields.*, clicked_at, user.*, triggered_by_user_uuid) for value-branching buttons and modal-to-workflow form pre-fill. Button callback_auth / workflow request_auth credentials are write-only (reads return a *** mask).
Documented at /developers/api/messaging and /developers/api/workflows.
2026-07-23 · Added — api_trigger workflows + POST /v1/workflows/{uuid}/trigger/
New workflow trigger type fired only from outside the engine: the public trigger endpoint (202 Accepted, async run, optional ≤8 KiB JSON payload) or an interactive button’s callback_workflow (resolves exclusively to active api_trigger workflows). Selectable in the automations builder as When triggered via API or button. Errors include workflow_not_triggerable, workflow_trigger_payload_invalid, workflow_execute_not_allowed, and workflow_frozen.
Documented at /developers/api/workflows.
2026-07-23 · Added — request_auth on the Send-a-Request workflow action
The SEND_REQUEST automation step accepts optional static authentication with the same shape as interactive-button callback_auth — bearer, basic, or custom_header (RFC 7230 token; reserved header names denied). Values support {{variables}}; credentials never appear in step outputs.
Documented at /developers/api/workflows (trigger + auth patterns) and /developers/api/messaging (callback_auth).
2026-07-23 · Added — Interactive buttons contract v3: callback_prompt, callback_workflow, response, callback_auth
Four additions to the /v1/send-message/ button envelope: (1) callback_command is a known-command slot (≤200 chars); free-text AI prompts move to callback_prompt (≤2000, runs as the clicker) — the "prompt: …" prefix is rejected with 400 button_callback_command_invalid; (2) callback_workflow (workflow UUID) triggers an internal workflow; (3) response attaches an auto-reply to any button (instant ack in parallel with callback_url, recursive nested buttons with depth/size caps); (4) callback_auth adds optional static transport auth to callback POSTs — additive to the always-on HMAC signature. Mutual exclusivity spans all five callbacks.
Documented at /developers/api/messaging.
2026-07-23 · Added — Interactive buttons: callback_url, modal_body, callback_form, callback_command (778e5d6cd)
An interactive button can trigger signed outbound POSTs to callback_url (HMAC-SHA256, Stripe-style X-Dailybot-Signature: t=…, v1=…, 5-minute replay window, X-Dailybot-Delivery idempotency key), open a platform modal from modal_body, open an internal Dailybot form via callback_form, or run a known command via callback_command. Each interactive button carries a server-minted $btn/<uuid> id. Google Chat is delivered as platform hangouts. Additive — legacy payload.callback_config / action paths continue to work.
Documented at /developers/api/messaging.
2026-07-13 · Added + Changed + Deprecated — Forms list: owner filter, org-wide visibility, and deprecations
- Filter the forms list by owner: pass
owner_user_ids=<uuid>,<uuid>toGET /v1/forms/to see just their forms, and use the newGET /v1/forms/form-owners/endpoint to discover which members own forms (searchable, paginated). Member emails are hidden in picker payloads unless the caller is an admin or manager. - No more “missing” forms: every form in your organization now appears in list and search (
GET /v1/forms/), so a form can no longer be retrievable by UUID yet absent from the list. Form permissions (edit, see responses, change states) are unaffected. - Deprecated:
filter=meon the forms list — useowner_user_idswith your own UUID instead.available_on_list_viewis also deprecated and ignored server-side. Both fields remain accepted indefinitely; removal will be announced as a separate changelog entry with its own migration window.
Documented at /developers/api/forms.
2026-07-12 · Added — Forms API v2: enhanced filtering and automation
Forms list (GET /v1/forms/): Added filter (all/me/public/approval/workflow/archived), order (alphabetical/recent/total), is_ascend, search, include=questions, include_archived, and date range parameters. New response fields: workflow_enabled, approval_flow_enabled, created_at.
Responses list (GET /v1/forms/{uuid}/responses/): Added submission_sources (multi-select: member/anonymous/automation/public), submitter_user_ids (multi-select UUIDs), flow_status (pending/approved/denied), order (recent/oldest), and is_ascend. New response fields: is_anonymous, flow_status, content, submission_source, guest_user. Search now includes submitter name/email.
Submit response (POST /v1/forms/{uuid}/responses/): Added automation mode (no submitter attribution), anonymous mode (random name), guest_user (guest identity for automation), and submission_source (provenance label). New response fields: is_guest_user, guest_user, submission_source.
All new parameters are optional — omitting them produces the same behavior as before. No breaking changes. Documented at /developers/api/forms.
2026-07-10 · Changed — Case-insensitive kudos filter
?filter= on GET /v1/kudos/ and GET /v1/kudos/organization/ now accepts any casing (kudos_received, KUDOS_RECEIVED, Kudos_Received). Invalid values return 400 with code: "invalid_kudos_filter" (replaces not_valid_kudos_filter). Documented at /developers/api/kudos.
2026-07-10 · Added — Form response workflow state filter
GET /v1/forms/{uuid}/responses/?state=<state> filters responses by workflow state on forms with workflow enabled. Invalid states return 400 with code: "invalid_workflow_state". Documented at /developers/api/forms.
2026-07-10 · Added — Search on /v1/kudos/organization/
GET /v1/kudos/organization/ now supports ?search= (case-insensitive substring on kudos content, max 256 chars). Documented at /developers/api/kudos.
2026-07-10 · Changed — Agent endpoints return id and uuid
POST /v1/agent-reports/, GET /v1/agent-messages/, POST /v1/agent-messages/, and pending_messages on GET /v1/agent-health/ now return both id and uuid with the same UUID value for backward compatibility. Prefer uuid in new integrations. Documented at /developers/api/agents.
2026-07-10 · Breaking — Pagination is always-on on all list endpoints
The opt-in mechanism for pagination on GET /v1/forms/ and GET /v1/forms/{uuid}/responses/ has been removed. Every list endpoint now returns the standard { count, next, previous, results } envelope by default. Action required: if you relied on the bare-array response, wrap your consumer in the envelope (response.results). The ?paginated=true query parameter and the X-Dailybot-Paginate header no longer have any effect. Documented at /developers/conventions#pagination.
2026-07-10 · Breaking — Forms endpoints return uuid instead of id
All /v1/forms/** endpoints now return the resource identifier under the uuid key instead of id. This aligns forms with the Dailybot identifier convention — resources with a dedicated UUID column expose uuid; only resources whose primary key IS a UUID expose id. Action required: replace response.id / data["id"] with response.uuid / data["uuid"] in every forms integration. URL paths (/v1/forms/{uuid}/) are unchanged. Documented at /developers/api/forms.
2026-07-10 · Changed — Agent endpoints return uuid
POST /v1/agent-reports/, GET /v1/agent-messages/, POST /v1/agent-messages/, and the pending_messages array on GET /v1/agent-health/ now return the resource identifier under the uuid key. Documented at /developers/api/agents.
2026-07-10 · Added — Filters on /v1/kudos/ and /v1/workflows/
Both endpoints now support ?start_date, ?end_date (YYYY-MM-DD, caller timezone), and ?search (case-insensitive substring on message content for kudos, on workflow name for workflows; max 256 chars). These filters were previously accepted but silently ignored — they are now fully functional. Documented at /developers/api/kudos and /developers/api/workflows.
2026-07-10 · Changed — /v1/kudos/organization/ accepts CLI Bearer tokens
GET /v1/kudos/organization/ used to require an organization API key (X-API-KEY only). It now also accepts CLI Bearer tokens (Authorization: Bearer <token>). The organization admin permission requirement is unchanged. Documented at /developers/api/kudos.
2026-07-10 · Added — New validation error codes
Six new machine-readable error codes are documented and enforced uniformly:
invalid_user_identifier(HTTP 400) —?user=is not a valid UUID (applies to/v1/checkins/{uuid}/responses/and/v1/forms/{uuid}/responses/).invalid_date_range(HTTP 400) — date is notYYYY-MM-DD, orstart_date > end_date.search_query_too_long(HTTP 400) —?search=exceeds 256 characters.invalid_kudos_filter(HTTP 400) —?filter=on/v1/kudos/or/v1/kudos/organization/is not one ofkudos_received/kudos_given.invalid_workflow_state(HTTP 400) —?state=on/v1/forms/{uuid}/responses/is not valid for the form’s workflow.form_response_view_all_forbidden(HTTP 403) — member used?all=trueon a restricted form.invalid_sender_uuid/invalid_receiver_uuid(HTTP 400) —?sender_uuid=or?receiver_uuid=on/v1/kudos/organization/is not a valid UUID.
All /v1/** error responses are guaranteed to be application/json — no HTML error pages for client-input validation. Documented at /developers/errors#machine-codes.
2026-07-10 · Added — /v1/kudos/organization/ filters, response schema, and error contract
Fully documented the GET /v1/kudos/organization/ endpoint: admin-only, always paginated, ordered by created_at DESC (with id tiebreaker), top-level kudos only. Filters: filter (kudos_received / kudos_given), timezone-aware start_date / end_date, legacy naive-day date_start / date_end (both pairs can stack), plus sender_uuid / receiver_uuid. Response fields (user, receivers, company_value, content, is_anonymous, created_at) and the four 400 validation codes (invalid_date_range, invalid_kudos_filter, invalid_sender_uuid, invalid_receiver_uuid) are now on the endpoint page. Documented at /developers/api/kudos#get-v1kudosorganization.
2026-07-09 · Added — Unified pagination on all list endpoints
All /v1/ list endpoints now return the standard { count, next, previous, results } envelope uniformly. Added canonical page / page_size parameters. Legacy limit / offset remain accepted as aliases. Documented at /developers/conventions#pagination.
2026-07-09 · Added — Search parameter on list endpoints
Added ?search=<term> (case-insensitive substring, max 256 chars) on forms, check-ins, form responses, check-in responses, and users. Returns 400 with code: "search_query_too_long" if over the limit. Documented at /developers/conventions#search.
2026-07-09 · Added — Canonical date range parameters
Unified date-range parameters ?start_date / ?end_date (YYYY-MM-DD, caller timezone) on all paginated endpoints. Legacy aliases date_start/date_end and date_from/date_to continue to work. Returns 400 with code: "invalid_date_range" on malformed dates. Documented at /developers/conventions#date-range.
2026-07-09 · Added — Machine-readable error codes on all error responses
Every non-2xx response now carries a stable code field alongside detail. Dispatch on code, never parse the prose. Full reference at /developers/errors#machine-codes.
2026-07-09 · Added — Free-plan daily throttles on agent-reports and send-email
POST /v1/agent-reports/ is now limited to 50 per org per day on free plans. POST /v1/send-email/ is limited to 20 per org per day on free plans. Excess returns 429 with code: "free_plan_daily_limit_exceeded" and a Retry-After header. Paid plans unaffected. Documented at /developers/rate-limits#free-plan-throttles.
2026-07-09 · Added — send_as_user identity override on POST /v1/send-message/
New send_as_user field (UUID) on POST /v1/send-message/ lets authorized admin callers post a message that appears to come from another user’s Slack identity (display name + avatar). Slack-only. Mutually exclusive with bot_username, bot_icon_url, and bot_icon_emoji. Documented at /developers/api/messaging#send-as-user.
2026-07-09 · Added — API key show-once lifecycle and member access
API key secrets now follow show-once semantics: the full plaintext key is returned only at creation or regeneration; subsequent reads expose only the 4-char key_suffix. Non-admin organization members can now create and manage their own API keys (excluding agent keys). New created_by field on key responses. Documented at /developers/authentication#api-key-secret-lifecycle-show-once.
2026-07-09 · Added — CLI Bearer token free-plan allowlist
CLI Bearer tokens now explicitly document a free-plan endpoint allowlist. POST /v1/agent-reports/ (50/day), POST /v1/send-email/ (20/day), agent-health, agent-messages, and a handful of read endpoints are available on free plans. All other endpoints return 403 with code: "plan_upgrade_required" and an upgrade_url field. Documented at /developers/authentication#cli-bearer-tokens-free-plan-allowlist.
2026-07-09 · Changed — API key works on ALL /v1/ endpoints
Confirmed and documented: API keys are not restricted to agent operations — they work on all /v1/ public endpoints. The prior impression was caused by a CLI client-side limitation, not a server-side restriction. New auth method matrix at /developers/authentication#parity-matrix.
2026-07-09 · Removed — Bare-array pagination opt-in on forms endpoints
The deprecated bare-array default on GET /v1/forms/ and GET /v1/forms/{uuid}/responses/ has been removed. Pagination is now always-on — see the 2026-07-10 breaking change entry above.
2026-07-09 · Deprecated — /v1/followups/ endpoints
GET /v1/followups/ and GET /v1/followups/{uuid}/responses/ are deprecated. Use GET /v1/checkins/ and GET /v1/checkins/{uuid}/responses/ instead. The legacy paths continue to work but will be removed in a future release.
2026-07-07 · Changed — Check-in Responses: default listing restored + user filter
- The
GET /v1/checkins/{uuid}/responses/endpoint now correctly returns all participants’ responses by default (regression from a prior release has been fixed). - Added optional
?user=<uuid>parameter for admin/manager API key owners to filter responses to a specific participant. - The
?all=trueparameter is not applicable to check-in responses and should not be documented for this endpoint.
2026-07-06 · Added — Forms & check-ins authoring API
Full programmatic authoring for forms and check-ins: create, configure, archive, and question management (add, edit, delete, reorder with conditional logic). New utility endpoint GET /v1/report-channels/. Requires admin/manager role and CLI:write for write operations. Documented at /developers/api/forms and /developers/api/check-ins.
2026-07-06 · Changed — Stricter config validation and form response listing filters
Form and check-in config endpoints reject unknown fields with 400 unknown_field. List endpoints support include_archived. Form response listing (not check-in responses) supports all, user, date_from, date_to (admin-scoped). Admins can edit others’ form responses (audit via metadata.last_edited_by).
2026-07-02 · Added — Trilingual API reference at /developers/api/
Every one of the 101 public API endpoints across 18 groups now has a dedicated reference page rendered from a content collection. Each endpoint documents auth methods, parameters, request/response schemas, error codes, and rate-limit scope. Trilingual mirrors under /es/ and /pt/.
2026-07-02 · Commitment — Parity commitment: API key vs. CLI Bearer
Formalized the design commitment that every non-CLI-only endpoint accepts both credential types with identical response shape. See /developers/authentication#parity-guarantee. Rollout of the api-services enforcement is tracked and will be logged here when complete.