Квоты и тарифы
Notifly работает по модели дневных квот. Главная единица учёта — событие: любое действие, которое генерирует уведомление или потребляет ресурсы платформы, списывает ровно одно событие. Когда дневной лимит исчерпан, новые события того же дня отклоняются — до сброса счётчика в 00:00 по московскому времени.
Лимиты зависят от тарифа. Текущие значения:
| Лимит | Free | Pro | Business |
|---|---|---|---|
События/день (dailyEvents) | 1 000 | 100 000 | 1 000 000 |
AI-запросы/день (aiRequestsPerDay) | 20 | 500 | 5 000 |
Запросы к ассистенту/день (assistantRequestsPerDay) | 100 | 2 000 | 20 000 |
Сканы портов/день (portScansPerDay) | 10 | 100 | 1 000 |
Устройства (devices) | 3 | 5 | 20 |
- Устройства — это количество одновременно активных клиентов (приложений, получающих уведомления). При понижении тарифа лишние устройства автоматически переводятся в suspended (отключаются самые старые активные клиенты).
Один счёт — одно списание
Заголовок раздела «Один счёт — одно списание»Списание происходит в момент самого действия — проверки, пинга, отправки точки, прихода письма, — а не за результирующее уведомление. Из этого следует:
- проверка монитора, приведшая к тревоге, списывает только само событие
проверки (
monitor/http_monitor/content_monitor/port_monitor/workflow_monitor) — отдельного события за alert или recovery нет; - recovery-уведомление heartbeat не списывает ничего сверх уже учтённого
heartbeat; - исключение —
heartbeat_alert: у тревоги «пропущен ping» нет своего пинга (ping не пришёл), поэтому она учитывается отдельным событием; - метрик-алерты считаются через точку
metric, отдельного события за алерт нет; - email и webhook-роутер считаются по приходу: одно входящее письмо =
одно событие
email, один входящий payload роутера = одно событиеrouter, независимо от того, в сколько каналов они разойдутся (пересылка в каналы отдельно не списывается); - одно действие никогда не списывается дважды под разными категориями.
При превышении лимита пользователю один раз в сутки приходит системное уведомление о том, что квота исчерпана.
Типы событий
Заголовок раздела «Типы событий»Каждое списание относится к одному из типов события. Эти же ключи показываются в разбивке расхода и в админке.
| Ключ | Когда списывается | Лимит |
|---|---|---|
message | Каждое входящее сообщение в канал | dailyEvents |
heartbeat | Каждый ping heartbeat | dailyEvents |
heartbeat_alert | Срабатывание тревоги «пропущен ping» | dailyEvents |
monitor | Каждая проверка протокольного монитора (TCP/DNS/TLS и т.п.) | dailyEvents |
http_monitor | Каждая проверка HTTP-монитора | dailyEvents |
content_monitor | Каждая проверка монитора контента | dailyEvents |
port_monitor | Каждая проверка монитора портов | dailyEvents |
workflow_monitor | Каждая проверка multi-step API workflow-монитора | dailyEvents |
port_scan | Каждый discovery-скан портов хоста | portScansPerDay |
web_script | Каждое срабатывание скрипта для сайта | dailyEvents |
metric | Каждая отправленная точка метрики | dailyEvents |
ask | Каждый заданный вопрос ask-монитора | dailyEvents |
email | Приход письма в inbox (один раз на письмо) | dailyEvents |
router | Приход payload в webhook-роутер (один раз на запрос) | dailyEvents |
ai_request | Обращение к AI/LLM (подбор правила, селектора, шага workflow) | aiRequestsPerDay |
assistant_request | Ход диалога с чат-ассистентом | assistantRequestsPerDay |
Сброс счётчиков
Заголовок раздела «Сброс счётчиков»Все дневные счётчики обнуляются по расписанию в 00:00 МСК. Историческая разбивка по дням при этом не удаляется — новый день просто начинает считать с нуля, а статистика прошлых дней остаётся доступной.
Rate limit ingest-эндпоинта скриптов
Заголовок раздела «Rate limit ingest-эндпоинта скриптов»Помимо дневной квоты, публичный ingest-эндпоинт скрипта для сайта
(POST /script/:token) защищён отдельным rate limit: не более
120 запросов в минуту на один токен (фиксированное окно). При превышении
сервер отвечает HTTP 429 Too Many Requests с заголовком Retry-After
(секунды до конца текущего окна) и телом:
{ "ok": false, "error": "rate limited" }Клиентский SDK сам батчит события и держит жёсткий предел в 100 POST на сессию, поэтому 120/мин с запасом покрывает легитимный трафик. Лимит применяется per-токен и считается отдельно от дневной квоты событий.
Пополнение баланса и смена тарифа
Заголовок раздела «Пополнение баланса и смена тарифа»Баланс и тариф управляются в админке — app.notifly.ru, раздел профиля пользователя. Там же видно текущий расход по каждой квоте.
- Смена тарифа (
free/pro/business) применяется сразу. При понижении тарифа лишние устройства автоматически переводятся в suspended — отключаются самые старые активные клиенты до нового лимита. - Пополнение баланса доступно администраторам напрямую; обычным пользователям возвращаются реквизиты для оплаты переводом.
Разбивка расхода
Заголовок раздела «Разбивка расхода»GET /user/quota-breakdown отдаёт детальную статистику расхода текущего
пользователя за день (по умолчанию — сегодняшний по МСК; другой день — через
?day=YYYY-MM-DD):
curl -H "X-Notifly-Key: C_xxx" \ "$NOTIFLY_URL/user/quota-breakdown?day=2026-06-23"Ответ содержит:
day— дата (YYYY-MM-DDпо МСК);rows— построчная разбивка «тип события × ресурс» с человекочитаемым именем ресурса;hourly— почасовой расход событий за день;series— поминутный расход, разделённый на три ряда:events(общая квота),ai(AI-запросы) иportscan(сканы портов).
REST API
Заголовок раздела «REST API»Базовый URL — https://notifly.ru (или $NOTIFLY_URL). Заголовок авторизации —
X-Notifly-Key (client-token, prefix C) либо Basic Auth.
| Метод | Путь | Назначение |
|---|---|---|
GET | /user/quota-breakdown | Детальная разбивка расхода за день (?day=YYYY-MM-DD опционально) |
POST | /current/user/topup | Пополнить баланс. Body: {"amountRubles": N} (целое ≥ 1). Прямое пополнение — только для администраторов; обычным пользователям возвращается 402 с реквизитами |
POST | /current/user/plan | Сменить тариф. Body: {"plan": "free"|"pro"|"business"}. При понижении суспендит лишние устройства (в ответе — suspendedDevices) |