# API для разработчиков: уведомления Уведомления являются серверной проекцией событий блокчейна. Сервер возвращает все непросмотренные записи независимо от возраста и просмотренные записи не старше 60 дней. Пагинации нет: выдача содержит все непросмотренные и всю доступную 60-дневную просмотренную историю. ## GetNotifications Авторизация обязательна. Обычно payload пустой. Legacy-поле `limit` принимается для совместимости, но в v2 игнорируется. Для обновления badge без загрузки карточек можно передать `{"countsOnly":true}`; тогда массивы лент остаются пустыми, но watermark и `*UnseenCount` возвращаются. Ответ содержит три ленты: `replies`, `connections`, `events`, а также `*SeenAtMs` и `*UnseenCount` для каждой категории. - `replies`: TEXT_REPLY. - `connections`: friend/unfriend, close_friend/unclose_friend, shine confirmed/unconfirmed, official confirmed/unconfirmed. Контакты не создают уведомлений. - `events`: FOLLOW/UNFOLLOW каналов. Фильтр каждой категории: `created_at_ms > seenAtMs OR created_at_ms >= now - 60 days`. ## SetNotificationState Сохраняет подписанный watermark просмотра. Сервер принимает только монотонное движение `seenAtMs` вперёд. Запрос: ```json {"op":"SetNotificationState","requestId":"ntf-seen-1","payload":{"blobB64":"..."}} ``` Бинарный контейнер `SHiNE_NTF` v1.0 (big-endian): ```text 'SHiNE_NTF' 9 bytes ASCII formatVersionMajor u8 = 1 formatVersionMinor u8 = 0 loginLen u8 login ASCII[loginLen] timeMs u64 nonce u32 stateType u8 = 1 (SEEN_WATERMARK) category u8 (1 replies, 2 connections, 3 events) seenAtMs u64 signature Ed25519[64] ``` Подпись `clientKey` вычисляется над всеми байтами контейнера до `signature`, по тому же принципу, что подписанный контейнер `SHiNE_DM`. Сервер проверяет, что `login` совпадает с авторизованным пользователем, проверяет Ed25519-подпись и сохраняет также исходный signed blob для будущей переносимой синхронизации состояния.