One JSON line — millions of messages. Queue, retry, personal variables, segments and real-time progress. While you sleep, the broadcast runs.
· Throttling 5 s, retry 3×, HMAC webhooks
Without us
To stay alive at 10,000 sends you need Redis/RabbitMQ, a worker, failure monitoring, and dedup.
Telegram and Max ban bots for bursts. You need throttling ~30 msg/s, gradual ramp-up, scheduling.
"Hi, John…" — that's per-recipient variable rendering. Without a template engine and JOIN to subscriptions — won't fly.
What's inside
{{first_name}}, {{username}}, {{subscriber_id}}, {{lang}} — rendered per recipient via render_subscriber_vars.
Filters by channel/segment/permission. Broadcast only to vip-tagged or orders-permissioned users. count_subscribers_filtered returns real totals.
Poll GET /v1/broadcast/:job_id — pending → processing → completed with real counters. The broadcasts table stores history.
Photos, videos, inline buttons with URL or callback_data. Same shape as /v1/send — consistent with personal notifications.
On completion you get an event with total/sent/failed. No polling — push model with HMAC-SHA256 signature.
On worker restart — recover_stale_jobs via rpop. No job ships twice. Status check before entering processing.
How it works
Send text or template, optional filters (channel, segment, permission). Response: job_id and pending status.
Job goes into a Redis List. A worker with BRPOP picks it up, loads filtered subscribers, sends one-by-one with 5 s delay.
Get progress via GET /v1/broadcast/:job_id or wait for the broadcast.completed webhook with final metrics.
FAQ
With current throttling (5 s between messages) — about 14 hours. Throughput ~17 msg/min. For critical cases, enterprise plans give extended limits.
Those records are auto-deactivated and skipped. The failed counter reflects other errors — bot muted, media too large, caption length, etc.
Yes. DELETE /v1/broadcast/:job_id stops the worker at the next iteration. Already-sent messages — cannot be recalled.
Up to 100,000 per broadcast. For larger lists, split by segments (e.g., permission or subscription date).
Yes. The broadcasts table keeps every run with metrics. Visible in the dashboard with filters and search, accessible via API.
1 credit per successful delivery to a subscriber. Failed deliveries are not charged. 10,000 successful sends = 10,000 credits.
No credit card. 100 free credits per month — enough to try every feature.
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