Appearance
Notifications API
Notifications alert you when someone assigns you to an issue, comments on your issue, mentions you, moves an issue you're involved with, or adds you to a project or team. All inbox endpoints are scoped to the authenticated user's own notifications.
Per-issue subscriptions let a user opt in to or out of notifications for a specific issue without touching their global preferences. Global preferences control which notification types reach the user at all, and on which channel (in-app inbox, email, or both).
Permissions
| Action | Required Permission | Scope |
|---|---|---|
| List notifications | Authentication only | Your notifications |
| Mark as read/unread | Notifications: Update | Your notifications |
| Delete | Notifications: Delete | Your notifications |
| Watch / unwatch issue | Issues: Read (on the issue's project) | Your subscription |
| Update preferences | Authentication only | Your preferences |
Admins bypass all permission checks.
Endpoints
| Method | Endpoint | Description |
|---|---|---|
GET | /api/notifications | List your notifications |
POST | /api/notifications/bulk-read | Mark notifications as read |
POST | /api/notifications/bulk-unread | Mark notifications as unread |
POST | /api/notifications/bulk-delete | Delete notifications |
GET | /api/projects/{project}/issues/{issue}/watch | Get watch status for an issue |
POST | /api/projects/{project}/issues/{issue}/watch | Toggle watch status for an issue |
POST | /api/profile/notification-preferences | Update your notification preferences |
List Notifications
GET /api/notifications
bash
curl https://{tenant}.kendo.dev/api/notifications \
-H "Authorization: Bearer your-token"json
[
{
"id": 15,
"type": 1,
"message": "Alice Johnson assigned \"Add pagination to issue list\" to you",
"read_at": null,
"created_at": "2026-03-13T14:00:00.000000Z",
"actor": {
"id": 4,
"first_name": "Alice",
"last_name": "Johnson",
"profile_picture": "alice-johnson-abc123.jpg"
},
"notifiable": {
"type": "issue",
"id": 42,
"key": "KD-0042",
"title": "Add pagination to issue list",
"project_id": 1
}
},
{
"id": 21,
"type": 5,
"message": "Carol Davis added you to project \"Mobile App\"",
"read_at": null,
"created_at": "2026-03-14T09:10:00.000000Z",
"actor": {
"id": 9,
"first_name": "Carol",
"last_name": "Davis",
"profile_picture": null
},
"notifiable": {
"type": "project",
"id": 3,
"name": "Mobile App"
}
},
{
"id": 23,
"type": 6,
"message": "Carol Davis added you to team \"Data\"",
"read_at": "2026-03-14T12:00:00.000000Z",
"created_at": "2026-03-14T11:30:00.000000Z",
"actor": {
"id": 9,
"first_name": "Carol",
"last_name": "Davis",
"profile_picture": null
},
"notifiable": {
"type": "team",
"id": 2,
"name": "Data"
}
}
]A read_at value of null means the notification is unread.
The actor field is null if the user who triggered the notification has been deleted.
The notifiable object is polymorphic — its type determines which additional fields are present:
type | Additional fields |
|---|---|
issue | id, key, title, project_id |
project | id, name |
team | id, name |
Mark as Read
POST /api/notifications/bulk-read
Request Fields
| Field | Type | Required | Description |
|---|---|---|---|
notification_ids | integer[] | Yes | Notification IDs to mark as read (min 1). Must belong to the authenticated user. |
Returns 204 No Content on success.
bash
curl -X POST https://{tenant}.kendo.dev/api/notifications/bulk-read \
-H "Authorization: Bearer your-token" \
-H "Content-Type: application/json" \
-d '{
"notification_ids": [12, 15]
}'Mark as Unread
POST /api/notifications/bulk-unread
Same request body as Mark as Read. Returns 204 No Content on success.
bash
curl -X POST https://{tenant}.kendo.dev/api/notifications/bulk-unread \
-H "Authorization: Bearer your-token" \
-H "Content-Type: application/json" \
-d '{
"notification_ids": [12]
}'Bulk Delete
POST /api/notifications/bulk-delete
Same request body as Mark as Read. Returns 204 No Content on success.
bash
curl -X POST https://{tenant}.kendo.dev/api/notifications/bulk-delete \
-H "Authorization: Bearer your-token" \
-H "Content-Type: application/json" \
-d '{
"notification_ids": [15]
}'Watch Issue
Per-issue subscriptions let you receive (or suppress) notifications for a specific issue. Watching is stored as a many-to-many pivot: a row exists for the (issue, user) pair while you are watching, and is removed when you stop. You are auto-attached as a watcher when you create an issue, get assigned to one, or comment on one — each gated by a per-user toggle (see Update Notification Preferences). Mentions notify you but do not auto-attach: a mention is a one-shot summons, not a subscription.
Get Watch Status
GET /api/projects/{project}/issues/{issue}/watch
bash
curl https://{tenant}.kendo.dev/api/projects/1/issues/KD-0042/watch \
-H "Authorization: Bearer your-token"json
{
"watching": true
}Toggle Watch
POST /api/projects/{project}/issues/{issue}/watch
Flips your subscription on the issue. The request body is empty — if you have a pivot row, it is deleted; if you don't, one is created.
bash
curl -X POST https://{tenant}.kendo.dev/api/projects/1/issues/KD-0042/watch \
-H "Authorization: Bearer your-token"json
{
"watching": false
}Reassignment leaves the old assignee's pivot row in place — they may have other reasons to follow the issue (creator, commenter). The "unassigned" notification still fires as a one-shot, gated only by the notify_assignment email toggle (in-app delivery is unconditional).
Update Notification Preferences
POST /api/profile/notification-preferences
Controls which notification events reach you. Preferences fall into three buckets:
- Auto-watch rules decide whether you get attached to the
issue_watcherspivot when you create / get assigned to / comment on an issue. Pivot membership is the in-app gate for activity on watched issues — there is no per-event in-app toggle. - Always-fire summons (mentions, assignment, project / team membership) always show in your inbox. The fields below control whether email is also sent.
- Watched-issue activity (comments + lane changes on issues you watch) always shows in your inbox; the master toggle controls whether email is also sent.
All eight fields are required.
Request Fields
| Field | Type | Required | Description |
|---|---|---|---|
auto_watch_on_create | boolean | Yes | Auto-attach you to the watcher pivot when you create an issue |
auto_watch_on_assigned | boolean | Yes | Auto-attach you when you're assigned to an issue |
auto_watch_on_commented | boolean | Yes | Auto-attach you when you comment on an issue |
notify_mentions | boolean | Yes | Send email when you're @mentioned |
notify_assignment | boolean | Yes | Send email when you're assigned (or unassigned from) an issue |
notify_project_membership | boolean | Yes | Send email when you're added to a project |
notify_team_membership | boolean | Yes | Send email when you're added to a team |
notify_watched_activity_email | boolean | Yes | Send email about comments / lane changes on issues you're watching |
Returns the updated profile resource.
bash
curl -X POST https://{tenant}.kendo.dev/api/profile/notification-preferences \
-H "Authorization: Bearer your-token" \
-H "Content-Type: application/json" \
-d '{
"auto_watch_on_create": true,
"auto_watch_on_assigned": true,
"auto_watch_on_commented": true,
"notify_mentions": true,
"notify_assignment": true,
"notify_project_membership": true,
"notify_team_membership": false,
"notify_watched_activity_email": true
}'Notification Types
| Value | Type | Description |
|---|---|---|
1 | Assignment | You were assigned to an issue |
2 | Comment | Someone commented on an issue you're involved with |
3 | Lane Change | An issue you're involved with changed lane |
4 | Mention | You were @mentioned in a comment |
5 | Project Membership | You were added to a project |
6 | Team Membership | You were added to a team |
See Also
- Issues API — Issues that notifications reference
- Comments API — Comments that trigger notifications