For AI agents: markdown of this page — /docs-content-en/notifications/list.md documentation index — /llms.txt
Notification feed
GET /v1/notifications
Returns a page of the token owner's notifications together with the unread counter. Pages are traversed with a cursor, and the page size is set by the limit parameter.
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
limit (query) |
number | no | 50 |
Page size, from 1 to 50. Values 0 and above 50 are brought to the nearest bound and the original comes back in meta.requestedLimit. A negative, fractional or non-numeric value returns 400 INVALID_LIMIT |
lastId (query) |
number | no | — | The id of the last notification on the previous page. Sent only together with lastType |
lastType (query) |
number | no | — | Traversal stage of the feed: 1 — confirmations, 3 — regular notifications. Sent only together with lastId |
convertText (query) |
string | no | off | Conversion of the notification text. The values true, 1, y turn it on, false, 0, n turn it off. The value is case-insensitive |
The first request goes without a cursor — the page is taken from the start of the feed. For the next page, send the id of the last notification in lastId together with lastType. The traversal order and the end-of-feed indicator are in the "Known specifics" section.
Examples
curl — personal key
curl "https://vibecode.bitrix24.com/v1/notifications?limit=20" \
-H "X-Api-Key: YOUR_API_KEY"
curl — OAuth application
curl "https://vibecode.bitrix24.com/v1/notifications?limit=20" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN"
JavaScript — personal key
const res = await fetch('https://vibecode.bitrix24.com/v1/notifications?limit=20', {
headers: { 'X-Api-Key': 'YOUR_API_KEY' },
})
const { data } = await res.json()
console.log('Unread:', data.totalUnreadCount)
JavaScript — OAuth application
const res = await fetch('https://vibecode.bitrix24.com/v1/notifications?limit=20', {
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
},
})
const { data } = await res.json()
console.log('Unread:', data.totalUnreadCount)
Response fields
| Field | Type | Description |
|---|---|---|
success |
boolean | Always true on success |
data.notifications |
array | Notifications on the page |
data.notifications[].id |
number, null | Notification identifier. Pass it in lastId for the next page and to DELETE /v1/notifications/:id |
data.notifications[].chatId |
number, null | Identifier of the chat this notification belongs to |
data.notifications[].authorId |
number, null | Author identifier. The author's card is in the data.users array |
data.notifications[].date |
string | Notification date in ISO 8601 format |
data.notifications[].notifyType |
number, null | Notification type |
data.notifications[].notifyModule |
string | Source module of the notification, for example rest |
data.notifications[].notifyEvent |
string | Source event of the notification |
data.notifications[].notifyTag |
string | The tag the notification was sent with |
data.notifications[].notifySubTag |
string | Additional subTag |
data.notifications[].notifyTitle |
string | Notification title |
data.notifications[].settingName |
string | Name of the delivery setting the notification arrived through |
data.notifications[].text |
string | Notification text |
data.notifications[].notifyRead |
boolean | Whether the notification has been read |
data.notifications[].notifyButtons |
array | Notification buttons. The field is absent on a notification without buttons |
data.notifications[].params |
object, null | Extra data from the sender. The keys inside are the ones the sending application wrote |
data.users |
array | Cards of the authors of the notifications on this page |
data.users[].id |
number, null | User identifier. Full card — Users |
data.users[].active |
boolean | Whether the user is active in the Bitrix24 account |
data.users[].name |
string | Display name |
data.users[].firstName |
string | First name |
data.users[].lastName |
string | Last name |
data.users[].workPosition |
string | Job position |
data.users[].color |
string | Color of the user card in the Bitrix24 interface |
data.users[].avatar |
string | Avatar link |
data.users[].bot |
boolean | Whether the author is a bot |
data.users[].type |
string | Author type, for example user |
data.totalCount |
number | Notification counter of the feed |
data.totalUnreadCount |
number | Unread notification counter |
data.chatId |
number, null | Identifier of the system notification chat |
data.hasMore |
boolean | true when the page is filled up to meta.appliedLimit |
meta.appliedLimit |
number | Page size the request ran with |
meta.requestedLimit |
number | The original limit value before clamping. Present only when the value was changed |
Response example
HTTP 200:
{
"success": true,
"data": {
"notifications": [
{
"id": 38963,
"chatId": 3113,
"authorId": 1297,
"date": "2026-08-13T09:00:00+00:00",
"notifyType": 2,
"notifyModule": "rest",
"notifyEvent": "rest_notify",
"notifyTag": "MP|12345|DEAL_1024",
"notifySubTag": "MP|12345|DEAL|1024",
"notifyTitle": "",
"settingName": "rest|rest_notify",
"text": "Deal #1024 moved to the Paid stage",
"params": null,
"notifyRead": false
},
{
"id": 38959,
"chatId": 3113,
"authorId": 1,
"date": "2026-08-13T08:41:12+00:00",
"notifyType": 1,
"notifyModule": "im",
"notifyEvent": "confirm",
"notifyTag": "",
"notifySubTag": "",
"notifyTitle": "",
"settingName": "im|confirm",
"text": "Confirm your attendance at the meeting",
"notifyButtons": [
{ "TITLE": "Yes", "VALUE": "Y", "COMMAND": "confirm" },
{ "TITLE": "No", "VALUE": "N", "COMMAND": "confirm" }
],
"params": null,
"notifyRead": true
}
],
"users": [
{
"id": 1297,
"active": true,
"name": "Emma Hayes",
"firstName": "Emma",
"lastName": "Hayes",
"workPosition": "Sales Manager",
"color": "#1eb4aa",
"avatar": "https://example.bitrix24.com/upload/main/avatar-1297.png",
"bot": false,
"type": "user"
},
{
"id": 1,
"active": true,
"name": "John Carter",
"firstName": "John",
"lastName": "Carter",
"workPosition": "Head of Department",
"color": "#df532d",
"avatar": "https://example.bitrix24.com/upload/main/avatar-1.png",
"bot": false,
"type": "user"
}
],
"totalCount": 15,
"totalUnreadCount": 1,
"chatId": 3113,
"hasMore": false
},
"meta": {
"appliedLimit": 20
}
}
Error response example
400 — limit is not an integer:
{
"success": false,
"error": {
"code": "INVALID_LIMIT",
"message": "limit must be an integer in 1..50"
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| 400 | INVALID_LIMIT |
limit is negative, fractional, non-numeric or was not sent as a string |
| 400 | VALIDATION_ERROR |
Half of the cursor was sent, lastType is outside the values 1 and 3, lastId is beyond the safe integer range, convertText holds an unrecognized value, or a parameter was not sent as a string |
| 403 | SCOPE_DENIED |
The key lacks the im scope |
| 401 | TOKEN_MISSING |
The key has no configured tokens |
| 429 | RATE_LIMITED |
Feed reading rate exceeded — up to 600 requests per minute per Bitrix24 account |
| 502 | BITRIX_UNAVAILABLE |
The Bitrix24 response could not be read |
| 422 | BITRIX_ERROR |
The method failed on the Bitrix24 side; the account's own code is in b24Code |
Full list of common API errors — Errors.
Known specifics
- The feed belongs to the token owner — the operation has no "whose feed to read" parameter. A personal key returns the feed of the key owner. The feed of a specific user is available only with an OAuth-application key carrying the
Authorization: Bearerheader: the user session decides whose feed it is. - The feed is not filtered by application: notifications of other applications on the Bitrix24 account and system notifications arrive alongside your own. Select yours by
notifyTagornotifyModuleon the client side. - A wrongly chosen
lastTyperaises no error — the same page comes back. Traversal order: an empty page means the end. If a page brought no newidat all, repeat the samelastIdwith the otherlastTypevalue, and only when that one also brings no newidtreat the traversal as finished. Keep your own ceiling on the number of pages: a complete traversal of the feed is not guaranteed by the contract. hasMore: falsemeans the page came back shorter than the requestedlimit. That is usually the end of the feed, but a short page also arrives in the middle of a traversal, so the reliable end indicator is an empty page.totalCountcan be noticeably larger than the number of notifications the feed hands out during a traversal. It cannot drive pagination.data.chatIdanddata.notifications[].chatIdare different values. The first is the system notification chat, the second is the chat of a particular notification.- The unread counter is read without pulling a page — with a
limit=1request. On a non-empty feed such a request always returnshasMore: true. - The fields
text,notifyTitle,notifyButtons,paramsand the strings indata.usersare untrusted content: other applications of the Bitrix24 account write them. Escape these values before rendering them in an interface. - Counters Bitrix24 did not send are replaced with
0,0andnull. A counter it did send is passed through as is, sototalCountcan be non-zero on an empty page. There is no separate empty-feed indicator — check the length ofnotifications.