Уведомления
In-app уведомления («колокольчик») — персональная лента событий, адресованных конкретному пользователю кабинета (например, назначение на сделку или на задачу по сделке). Это REST-сторона того же потока, что в реальном времени приходит событием `notification.created` по персональному WebSocket-каналу пользователя: сокет нужен для живого пуша и бейджа, а эти эндпоинты — чтобы подгрузить историю при загрузке приложения, узнать число непрочитанных и сбросить бейдж. Лента скоупится по текущему пользователю и его активной компании (`current_company_id`): список, счётчик и «отметить всё» возвращают только уведомления активной компании; пометка одного уведомления прочитанным находит его по владельцу-пользователю независимо от компании. Объект уведомления: `id` (строка UUID), `type` (строковый идентификатор вида уведомления в snake_case — сейчас платформа эмитит `deal_assigned` и `deal_task_assigned`, набор будет расширяться), `title` (короткий заголовок), `body` (строка или `null`), `data` (объект с полями, зависящими от `type` — например, `deal_id`/`deal_title` для `deal_assigned`), `read_at` (ISO-время прочтения или `null`, если не прочитано), `created_at`. Важно про форму ответа списка: `GET /v1/notifications` отдаёт стандартный конверт пагинатора Laravel — массив под ключом `data`, а мета-поля пагинации (`current_page`, `per_page`, `total`, `last_page`, `next_page_url` и т.д.) лежат плоско на верхнем уровне. Это отличается от большинства REST-групп, где список приходит как `data:{ items, pagination }`. Параметры запроса: `filter=unread` (вернуть только непрочитанные; любое другое значение или отсутствие параметра — все), `per_page` (размер страницы, по умолчанию 20). Обратите внимание на snake_case `per_page` (не `perPage`).
Эндпоинты
| Метод | Путь | Описание |
|---|---|---|
| GET | /v1/notificationsЛента уведомлений пользователя в активной компании (конверт пагинатора Laravel). Параметры: `filter=unread`, `per_page` (по умолчанию 20). | Лента уведомлений пользователя в активной компании (конверт пагинатора Laravel). Параметры: `filter=unread`, `per_page` (по умолчанию 20). |
| GET | /v1/notifications/unread-countЧисло непрочитанных уведомлений пользователя в активной компании. Ответ: `{ "count": N }`. | Число непрочитанных уведомлений пользователя в активной компании. Ответ: `{ "count": N }`. |
| POST | /v1/notifications/{notification}/readОтметить одно уведомление прочитанным (по его UUID). Ответ: `{ "status": "ok" }`; 404, если уведомление не найдено или принадлежит другому пользователю. | Отметить одно уведомление прочитанным (по его UUID). Ответ: `{ "status": "ok" }`; 404, если уведомление не найдено или принадлежит другому пользователю. |
| POST | /v1/notifications/read-allОтметить прочитанными все непрочитанные уведомления пользователя в активной компании. Ответ: `{ "status": "ok" }`. | Отметить прочитанными все непрочитанные уведомления пользователя в активной компании. Ответ: `{ "status": "ok" }`. |
Примеры
Список непрочитанных уведомлений
Запрос
curl -X GET "https://api.aisar.app/v1/notifications?filter=unread&per_page=20" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Accept: application/json"Ответ
{
"current_page": 1,
"data": [
{
"id": "3f1e6a20-0c7b-4a9e-b2d1-8a5c1e000001",
"company_id": 1,
"user_id": 7,
"type": "deal_assigned",
"title": "You were assigned to deal \"Website redesign\"",
"body": "Assigned by Aigerim",
"data": {
"deal_id": 42,
"deal_title": "Website redesign",
"assigned_by": 3
},
"read_at": null,
"created_at": "2026-02-10T09:15:00.000000Z",
"updated_at": "2026-02-10T09:15:00.000000Z"
}
],
"first_page_url": "https://api.aisar.app/v1/notifications?page=1",
"from": 1,
"last_page": 1,
"last_page_url": "https://api.aisar.app/v1/notifications?page=1",
"next_page_url": null,
"path": "https://api.aisar.app/v1/notifications",
"per_page": 20,
"prev_page_url": null,
"to": 1,
"total": 1
}Счётчик непрочитанных
Запрос
curl -X GET "https://api.aisar.app/v1/notifications/unread-count" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Accept: application/json"Ответ
{
"count": 3
}Отметить одно уведомление прочитанным
Запрос
curl -X POST "https://api.aisar.app/v1/notifications/3f1e6a20-0c7b-4a9e-b2d1-8a5c1e000001/read" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Accept: application/json"Ответ
{
"status": "ok"
}Отметить все прочитанными
Запрос
curl -X POST "https://api.aisar.app/v1/notifications/read-all" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Accept: application/json"Ответ
{
"status": "ok"
}