Notifications, OTP without SMS, forms without a backend, helpdesk, auth and scheduled broadcasts — one REST API and one dashboard. Telegram and Max, one platform.
Features
Telegram and Max through a single interface. Subscribers choose the channel, you send the same way.
Verification codes via messenger. Cheaper than SMS, instant delivery, attempt control. Custom template with {{code}}.
Mass delivery through a queue. Track status, sent/failed in real time.
OAuth user authentication via Telegram and Max. Static links, API sessions with state, QR-polling for cross-device.
Built-in ticket system. Customers message the bot — you reply via API or dashboard. SLA timers, statuses, webhooks.
Receive submissions from websites without a backend — secure and simple
Bot responds in subscriber's language. Built-in ru/en locales, switch via /lang.
Delayed messages, automatic drip chains on subscription, and recurring broadcasts on schedule
Notification types at the project level. Subscribers control what they receive.
Link like t.me/bot?start=proj_SLUG. One-click subscription with subscriber_id binding.
Photos, videos, documents. Inline buttons with URL or callback_data. Up to 3 rows of 3 buttons.
Create a template with variables: {{order_id}}. Reuse without duplicating text.
12 event types: subscriptions, delivery, broadcasts, buttons, auth, helpdesk. HMAC-SHA256 signature. Configure via dashboard or API.
Text formatting: bold, italic, code, links. Support for plain, markdown, and html formats.
Signature with name, description, and logo. Auto-messages on subscribe and unsubscribe in two languages.
Sending statistics: total, failed, by channel, by day for 30 days.
Predefined tags for segmentation. CRUD via dashboard and API, up to 20 per project.
API
Bearer token, JSON in/out. A handful of endpoints cover all scenarios.
Solutions & use cases
Common scenarios where Zapnoty replaces a stack of 3-4 separate services.
10× cheaper than SMS, higher reach than email
OTP, order status, abandoned cart, promos
Forms with instant Telegram notification — no forgotten inboxes
Drip lessons, reminders, Q&A and bot login
Support in Telegram/Max, no heavy chat widget
How it works
Sign up with Yandex or VK, create a project and get an API key.
Send users a deep link. They subscribe in one click via Telegram or Max bot.
One HTTP request with a Bearer token — and the notification is delivered instantly.
No credit card required. 100 credits per month free — enough to try every feature. Integrate in 5 minutes.
curl -X POST /v1/send
-H "Authorization: Bearer zn_..."
-d {"text": "Hello!"}FAQ
Yes, subscribers need Telegram or Max. They follow a deep link, tap Start in the bot — and they're subscribed. No sign-up or extra apps required.
Free tier — 100 credits/month (1 credit = 1 Telegram/Max message, 2 credits = email). Paid plans from 290 ₽/mo (300 credits), with quarterly (−13%) and yearly (−33%) discounts. 11 tiers up to enterprise — see the Pricing page for details.
Notifications go through messengers, not SMS. 5-50× cheaper (0.14-0.84 ₽ per message vs 4-7 ₽ per SMS), instant, with 90-95% open rate. Supports buttons, media, and formatting — SMS can't.
The /stop command in the bot unsubscribes from all projects. Subscribers can also manage subscriptions via /settings.
Yes, the API works globally. Server is in Russia, but you can send notifications to subscribers in any country where Telegram or Max is available.
Yes. You can send inline buttons with URL or callback_data, as well as images, videos, and documents via the media field.
POST /v1/otp/send generates a 6-digit code and sends it to the subscriber. POST /v1/otp/verify checks the entered code. Built-in brute-force protection: 3 attempts by default (range 1–10), 5-minute TTL. If the user isn't subscribed yet, use POST /v1/otp/request — the service generates a deeplink, the bot asks to subscribe and delivers the code in one tap.
Yes. The limit is 300 requests per minute per project. Exceeding it returns 429 with a Retry-After header and retryable: true in JSON. All API errors include a retryable field to help decide whether to retry.
Yes. The Management API provides CRUD operations for templates, permissions, tags, webhook, forms (and delivery routes), and helpdesk configuration (settings, SLA, ticket types, canned responses, routing rules). Similar to setWebhook in Telegram Bot API. See the "Management (API)" section in the docs.
The user clicks a bot link → confirms login in the messenger → automatically subscribes to notifications → your server receives user data (name, username, subscriber_id). Three options: static link, API session with state, QR-polling for cross-device. See the "User Auth" section in the docs.
Helpdesk is a built-in ticket support system. Customers message the bot — a ticket is created and the user is automatically subscribed to notifications. You reply via API (POST /v1/helpdesk/tickets/{id}/reply) or dashboard. Includes statuses (new, in_progress, waiting, closed), ticket types (Bug, Suggestion, Question, Finance — customizable), SLA timers, and webhook events. Supports virtual channel for tickets from website/app users without a messenger — replies are delivered via webhook. Enable in project settings.
Yes! Zapnoty supports three types: scheduled send (specific date/time), drip chains on subscription, and recurring broadcasts (every N hours).
Yes! Create a form in the dashboard or via the API (POST /v1/forms) and get a public endpoint. Send data via fetch() directly from HTML — no API key needed, secure. Submissions are forwarded to Telegram, Max, or email.
Yes — the Custom Bots (white-label) mode on paid plans. Connect your own Telegram/Max bot by token: your name, avatar, welcome, commands and Mini App branding. Subscribers talk to your bot, not the system one. The mode is chosen when creating a project and is immutable. See the «Custom Bots» section of the docs.
Each project has two API keys: a live zn_live_ and a test zn_test_. A request with the test key goes through the full API logic (validation, responses, error codes, webhooks), but no real message is sent to Telegram/Max — this is the sandbox mode. The _test_directives field lets you force the delivery outcome (success/failed), the /v1/otp/send response returns the real code in a sandbox_code field, and the /v1/test/simulate-event endpoint triggers any webhook event. Note: the test key can read (GET) and run runtime operations (send, OTP, broadcast), but cannot change project settings — such a request returns 403, settings are configured with the live key. See the «Testing the integration» section of the docs.