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, 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

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
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/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).

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.

All eight 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

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

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

See Also