Inbox
Inbox is your personal, Workspace-scoped notification feed. It uses a browser session and the API conventions. You never see another user's items. Native-token access is published for planning only, so mobile clients shouldn't use it yet.
List items
GET /api/v1/workspaces/{workspace_id}/inbox?limit=50&unread_only=true&category=mentionlimit is 1–100 (default 50). cursor is opaque and bound to the Workspace, unread mode and
category that created it. unread_only=true returns unread items. unread_count always counts all
unread items, not just the page.
{
"items": [
{
"id": "018f0d5a-ef50-7fa3-8c11-2ddc6b30dc11",
"workspace_id": "018f0d5a-ef50-7fa3-8c11-2ddc6b30dc12",
"category": "assignment",
"urgency": "high",
"resource_type": "task",
"resource_id": "018f0d5a-ef50-7fa3-8c11-2ddc6b30dc13",
"summary": {},
"deep_link": "/app/example-workspace/inbox",
"aggregation_count": 1,
"last_event_at": "2026-08-20T10:00:00Z",
"read_at": null,
"seen_at": null,
"archived_at": null,
"revision": 1,
"created_at": "2026-08-20T10:00:00Z"
}
],
"next_cursor": null,
"has_more": false,
"unread_count": 1
}Categories: assignment, mention, comment, due, dependency, agent, integration,
invitation, security, import_export, billing and administrative.
- Items are created in the background and only when your preferences allow them, so a just-completed action may not appear on the very next read.
- Rapid activity can update one grouped item.
aggregation_countandlast_event_atreport it. - Archived items, and items whose Task is inactive, inaccessible or no longer followed, are hidden.
Discuss notices Awaiting deployment
Read generated Discuss message notices in Discuss. They are excluded from Inbox items and unread totals, including older notices. Other Agent notifications remain in Inbox. Your configured email and push preferences still apply.
Mark read or unread
PATCH /api/v1/inbox-items/{inbox_item_id} HTTP/1.1
X-CSRF-Token: <csrf-token>
If-Match: "1"
Content-Type: application/json
{"read": true}If-Match is the item's revision. The response is the updated item with its ETag. Repeating the
same state is safe, a stale revision returns 409 revision_conflict and an item that's absent or
isn't yours returns 404.
To sync across devices, POST /api/v1/workspaces/{workspace_id}/inbox/read-state with
{"cutoff": "2026-08-20T10:00:00Z", "read": true} marks visible deliveries up to the cutoff read and
seen (read: false marks them seen only). The cutoff is monotonic and idempotent, so late updates
from another device can't regress state. The response gives changed and the current unread_count.
Reading an item also cancels its pending email and push, but messages already sent can't be recalled.
Notification preferences
GET /api/v1/workspaces/{workspace_id}/notification-preferences returns each category with its
description, Inbox, email and push state, email_available and push_available, delivery policy, a
mandatory flag and a revision. Revision 0 is the default, not a saved choice.
PATCH /api/v1/workspaces/{workspace_id}/notification-preferences/{category}
Content-Type: application/json
{"web_enabled": true, "email_enabled": false, "push_enabled": true, "delivery_policy": "daily_digest", "expected_revision": 0}Use the returned revision next time. A stale one returns 409 revision_conflict.
- Delivery policy is
immediate,daily_digest(08:00 in your timezone) orweekly_digest(Monday 08:00). - Security, billing and administrative notifications can't disable Inbox delivery, and email is
mandatory for them when
email_availableistrue. Enabling email when it's unavailable returns422 email_not_entitled. - Email needs the paid
notifications.emailentitlement, a verified address, active membership and current access to the resource, and for Tasks a current follow. These are rechecked when the email is sent, so losing access or muting a Task stops queued email. Failed sends are retried, then dropped. - Push needs a confirmed browser endpoint.
Browser push
Push is opt-in through the browser's permission prompt.
GET /api/v1/me/push-endpoints/browser/configreturns the public VAPID key.- Subscribe through the active service worker.
PUT /api/v1/me/push-endpoints/browserregisters that subscription (browser session and CSRF). It replaces the session's earlier endpoint.DELETE /api/v1/me/push-endpoints/browserremoves it, idempotently.
Subscriptions are encrypted, confirmed for 45 days and removed on logout, account disablement, expiry or permanent rejection by the provider. A push contains the Assign title, an approved category phrase, an opaque notification ID and a relative link, with no Workspace, resource, person or customer content.