Skip to content

Quotas, plans and pricing

Notifly operates on a model of daily quotas. The main unit of accounting is an event: any action that generates a notification or consumes platform resources charges exactly one event. When the daily limit is exhausted, new events on the same day are rejected — until the counter resets at 00:00 Moscow time. For example, POST /message then responds with 429 Too Many Requests.

Every feature is available on every plan — plans differ only in their limits. Current prices and values:

LimitFreeProBusiness
Price per month0 ₽299 ₽999 ₽
Events/day (dailyEvents)1 000100 000Unlimited
AI requests/day (aiRequestsPerDay)502 00050 000
Assistant requests/day (assistantRequestsPerDay)1005 000100 000
Port scans/day (portScansPerDay)1030010 000
Devices (devices)315Unlimited
Status pages (statusPages)15Unlimited
Screenshot storage (storageMB)50 MB1 GB10 GB
  • Devices — the number of simultaneously active clients (applications receiving notifications). When downgrading the plan, excess devices are automatically moved to suspended (the oldest active clients are disabled).
  • Unlimited is not “infinity” but an unreachable ceiling: a limit of 1,000,000,000 or more is treated as unlimited, and the admin UI shows “Unlimited” instead of a progress bar.
  • Status pages — the number of public status pages per account. Hiding the “powered by Notifly” badge starts with Pro.
  • Storage is not a daily quota but a persistent volume: see Screenshot storage below.

An event is not just a message: every monitor check and every heartbeat ping also costs one event, even when everything is fine and no notification is sent. That is why monitors are usually the main consumer of the quota, and it is best to count from their interval:

What is runningEvents per day
A monitor checking every 5 minutes288
A monitor checking every minute1 440
A monitor checking every 30 seconds (minimum for HTTP and protocol monitors)2 880
A heartbeat from an hourly cron job24
A script sending 50 messages a day50

An example for Free (1,000 events a day): three monitors every 5 minutes (3 × 288 = 864) plus one hourly heartbeat (24) come to 888 events, leaving about a hundred for messages. But a single monitor checking every minute (1,440) already does not fit into Free — for that interval you need Pro, or check less often.

Minimum check intervals: protocol and HTTP monitors — 30 seconds; content, port and API workflow monitors — 60 seconds; browser workflows — 5 minutes. The actual usage for the day per monitor and source is shown in the quota breakdown.

What happens when the quota runs out:

  • sending messages (POST /message) and heartbeat pings are rejected with 429 Too Many Requests;
  • monitors are not switched off — they postpone their checks until the counter reset (00:00 Moscow time, with a margin of a few minutes) and then carry on by themselves;
  • once a day a “Daily quota exhausted” notification arrives in the System service channel, with a breakdown of what the events were spent on.

A deduction happens at the moment of the action — a check, a ping, sending a point, receiving an email — not for the resulting notification. From this follows:

  • a monitor check that triggered an alert charges only the check event (monitor / http_monitor / content_monitor / port_monitor / workflow_monitor) — there is no separate event for alert or recovery;
  • a heartbeat recovery notification does not charge anything beyond the already counted heartbeat;
  • exception — heartbeat_alert: the “missed ping” alert has no ping of its own (the ping didn’t arrive), so it is counted as a separate event;
  • metric alerts are counted via the metric point; there is no separate event for an alert;
  • email and webhook router are counted on arrival: one incoming email = one email event, one incoming router payload = one router event, regardless of how many channels they are forwarded to (forwarding to channels is not charged separately);
  • a single action is never charged twice under different categories.

When the limit is exceeded the user receives a system notification once per day that the quota is exhausted.

Each deduction belongs to one of the event types. These same keys appear in quota breakdown and in the admin.

KeyWhen chargedLimit
messageEach incoming message to a channeldailyEvents
heartbeatEach ping of the heartbeatdailyEvents
heartbeat_alertTriggering of the “missed ping” alertdailyEvents
monitorEach check of a protocol monitor (TCP/DNS/TLS, etc.)dailyEvents
http_monitorEach check of an HTTP monitordailyEvents
content_monitorEach check of a content monitordailyEvents
port_monitorEach check of a port monitordailyEvents
workflow_monitorEach check of a multi-step API workflow monitordailyEvents
port_scanEach discovery port scan of a hostportScansPerDay
web_scriptEach trigger of the web scriptdailyEvents
metricEach sent metric pointdailyEvents
askEach question posed to the ask monitordailyEvents
emailArrival of an email in the inbox (once per email)dailyEvents
routerIncoming payload to the webhook router (once per request)dailyEvents
ai_requestCall to AI/LLM (choosing a router rule, selector, or workflow step)aiRequestsPerDay
assistant_requestDialog interaction with the chat assistantassistantRequestsPerDay

Screenshots taken by browser workflows and browser content monitors occupy object storage and are counted against a separate, non-daily storageMB quota.

  • Only frames referenced by an alert message count; frames from failed runs without an alert are deleted right away and take no space.
  • When the used volume exceeds the plan limit, the oldest screenshots are evicted FIFO — new frames are always kept.
  • On a plan downgrade the storage is not trimmed instantly: the nightly cleanup and the eviction on the next screenshot upload bring it down to the new limit.

The current value is in the GET /user/quota-breakdown response (the storage field: usedBytes and limitBytes).

All daily counters are reset on schedule at 00:00 MSK. The historical breakdown by day is not removed — the new day simply starts counting from zero, and past days’ statistics remain available.

Rate limit for the scripts ingest endpoint

Section titled “Rate limit for the scripts ingest endpoint”

In addition to the daily quota, the public ingest endpoint for the web script (POST /script/:token) is protected by a separate rate limit: no more than 120 requests per minute per token (fixed window). When exceeded the server responds with HTTP 429 Too Many Requests with a Retry-After header (seconds until the end of the current window) and a body:

{"ok": false, "error": "rate limited"}

The client SDK batches events itself and enforces a hard limit of 100 POSTs per session, so 120/min comfortably covers legitimate traffic. The limit is applied per-token and is counted separately from the daily events quota.

Free costs nothing, Pro is 299 ₽ per month and Business is 999 ₽ per month. There is no card payment yet — Pro and Business are paid by bank transfer against an invoice. Here is how it works:

  1. Email support@notifly.ru with the plan you need (Pro — 299 ₽ per month, or Business — 999 ₽ per month), the period, and the e-mail of the Notifly account it should be enabled for.
  2. Receive an invoice with the payment details — it is sent in reply to your email.
  3. Pay the invoice by bank transfer. In the payment reference, put the invoice number and your account e-mail — this makes it quicker to match the payment to your account.
  4. Wait for the operator’s reply. Once the payment arrives, an operator switches your account to the new plan and lets you know. The new limits apply immediately; monitors that were on hold because the quota ran out resume their checks right away, without waiting for the counter reset.

Your current plan and today’s usage are shown in the admin under Profile, and the prices of all plans — on the Pricing page (the Upgrade plan menu item). The Subscribe button on the plan cards does nothing yet — use email.

Downgrading is self-service and takes effect immediately. Excess devices are automatically moved to suspended — the oldest active clients are disabled until the new limit is met; screenshot storage is brought within the new limit by the nightly cleanup.

  • You cannot upgrade a plan yourself from the admin or via the API: for a regular user POST /current/user/plan accepts only a downgrade (or the current plan), and an upgrade request gets 402 Payment Required. Upgrades are performed by an operator after payment.
  • The balance is shown in your profile. For a regular user the Top up button does not credit money yet: the server replies 402 suggesting payment by bank transfer ("paymentMethod": "bank_transfer"). Direct top-up (POST /current/user/topup) is available to administrators only.

GET /user/quota-breakdown returns detailed usage statistics for the current user for a day (by default — today in MSK; another day — via ?day=YYYY-MM-DD):

Окно терминала
curl -H "X-Notifly-Key: C_xxx" \
"$NOTIFLY_URL/user/quota-breakdown?day=2026-06-23"

The response contains:

  • day — the date (YYYY-MM-DD in MSK);
  • rows — row-wise breakdown “event type × resource” with a human-readable resource name;
  • hourly — hourly events consumption for the day;
  • series — per-minute consumption split into three series: events (main quota), ai (AI requests) and portscan (port scans);
  • storage — a snapshot of the used storage at request time: usedBytes against limitBytes (not a daily quota, see Screenshot storage).

Base URL — https://api.notifly.ru (or $NOTIFLY_URL). Authorization header — X-Notifly-Key (client-token, prefix C).

MethodPathPurpose
GET/user/quota-breakdownDetailed daily usage breakdown (?day=YYYY-MM-DD optional)
POST/current/user/topupTop up balance. Body: {"amountRubles": N} (integer ≥ 1). Direct top-up — only for administrators; regular users receive 402 ("paymentMethod": "bank_transfer")
POST/current/user/planChange plan. Body: {"plan": "free"|"pro"|"business"}. Regular users can only downgrade; an upgrade returns 402. When downgrading it suspends excess devices (response includes suspendedDevices)