Skip to content

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, adds you to a project or team, or creates a report in a project you watch. 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. Per-project report subscriptions let a user opt in to notifications when new reports arrive. Global preferences control which notification types reach the user at all, and on which channel (in-app inbox, email, or both).

Permissions

ActionRequired PermissionScope
List notificationsAuthentication onlyYour notifications
Mark as read/unreadNotifications: UpdateYour notifications
DeleteNotifications: DeleteYour notifications
Watch / unwatch issueIssues: Read (on the issue's project)Your subscription
Watch / unwatch project reportsReports: Read (on the project)Your subscription
Update preferencesAuthentication onlyYour preferences

Admins bypass all permission checks.

Endpoints

MethodEndpointDescription
GET/api/notificationsList your notifications
POST/api/notifications/bulk-readMark notifications as read
POST/api/notifications/bulk-unreadMark notifications as unread
POST/api/notifications/bulk-deleteDelete notifications
GET/api/projects/{project}/issues/{issue}/watchGet watch status for an issue
POST/api/projects/{project}/issues/{issue}/watchToggle watch status for an issue
POST/api/projects/{project}/reports/watchToggle report watch for a project
POST/api/profile/notification-preferencesUpdate 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:

typeAdditional fields
issueid, key, title, project_id
projectid, name
teamid, name

Mark as Read

POST /api/notifications/bulk-read

Request Fields

FieldTypeRequiredDescription
notification_idsinteger[]YesNotification 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).

Watch Project Reports

Per-project report subscriptions let you receive notifications when new reports are created in a project. Watching is stored as a many-to-many pivot: a row exists for the (project, user) pair while you are watching, and is removed when you stop. Project owners are auto-attached as report watchers when the project is created.

Toggle Report Watch

POST /api/projects/{project}/reports/watch

Flips your report subscription on the project. The request body is empty — if you have a pivot row, it is deleted; if you don't, one is created. The report creator is excluded from notifications (self-notify guard).

bash
curl -X POST https://{tenant}.kendo.dev/api/projects/1/reports/watch \
  -H "Authorization: Bearer your-token"
json
{
  "report_watcher_ids": [4, 8]
}

The response contains the full list of user IDs currently watching reports for this project.

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_watchers pivot 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.
  • Report activity (new reports on projects you watch) always shows in your inbox; the toggle controls whether email is also sent.

All nine fields are required.

Request Fields

FieldTypeRequiredDescription
auto_watch_on_createbooleanYesAuto-attach you to the watcher pivot when you create an issue
auto_watch_on_assignedbooleanYesAuto-attach you when you're assigned to an issue
auto_watch_on_commentedbooleanYesAuto-attach you when you comment on an issue
notify_mentionsbooleanYesSend email when you're @mentioned
notify_assignmentbooleanYesSend email when you're assigned (or unassigned from) an issue
notify_project_membershipbooleanYesSend email when you're added to a project
notify_team_membershipbooleanYesSend email when you're added to a team
notify_watched_activity_emailbooleanYesSend email about comments / lane changes on issues you're watching
notify_report_activity_emailbooleanYesSend email when new reports are created in projects 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,
    "notify_report_activity_email": true
  }'

Notification Types

ValueTypeDescription
1AssignmentYou were assigned to an issue
2CommentSomeone commented on an issue you're involved with
3Lane ChangeAn issue you're involved with changed lane
4MentionYou were @mentioned in a comment
5Project MembershipYou were added to a project
6Team MembershipYou were added to a team
7Report CreatedA new report was created in a project you watch

See Also