Zapnoty — Scheduled and automations

API Documentation

REST API for notifications via Telegram and Max. Subscribers, OTP, broadcasts, forms, helpdesk.

Scheduled Messages

Delayed messages, drip chains, and recurring broadcasts

Three types of scheduled messages

  • type: "once" — one-time message at a specific time (reminder 24h before an event)
  • drip-chains — a sequence of messages with delays from a trigger (onboarding, lesson series)
  • recurring — repeats on an interval (daily digest, weekly report)

Scheduled Send

Send a message at a specified time. Supports formatting (html/markdown), media attachments, and inline buttons.

subscriber_id string (UUID) required

Subscriber UUID

text string required

Message text

scheduled_at string (ISO 8601) required

Date and time. Three formats: with offset (2026-06-01T09:00:00+03:00), UTC (...Z) or naive + timezone field.

timezone string

IANA timezone (e.g. Europe/Moscow). Required for naive scheduled_at and for cron.

name string

Name (for dashboard)

POST /v1/scheduled
 
{
"subscriber_id": "550e8400-...",
"text": "Meeting reminder",
"format": "html",
"scheduled_at": "2026-03-25T10:00:00Z",
"buttons": [[{"text": "Details", "url": "https://..."}]]
}

Drip Chains

Automatic sequence of messages on subscription or event. Each step supports formatting, media, and buttons.

name string required

Name (for dashboard)

trigger string required

Trigger: subscription, segment, permission

trigger_value string

Trigger value (tag or permission key)

catch_up_mode string

catch_up_mode for drip: from_start (default) or skip_past — skip steps whose time has already passed.

steps[].text string required

Message text

steps[].delay_minutes number required

Delay from trigger moment (minutes)

POST /v1/drip-chains
 
{
"name": "Onboarding",
"trigger": "subscription",
"steps": [
{"text": "Welcome!", "format": "html", "delay_minutes": 0},
{"text": "Tip of the day", "delay_minutes": 1440}
]
}

Recurring

Regular broadcast at a set interval. Supports formatting, media, buttons, and filters (channel, segment, permission).

Recurring cadence: interval_hours / interval_days / cron

Specify exactly one of the three. cron fits 'every Sunday at 9:00' — the expression is evaluated in the given timezone with DST handling.

name string required

Name (for dashboard)

text string required

Message text

interval_hours number

Repeat interval (hours)

interval_days number

Repeat interval in days (alternative to interval_hours).

cron string

Cron expression (5 fields: minute hour day month weekday). No more than once per hour, requires timezone.

timezone string

IANA timezone (e.g. Europe/Moscow). Required for naive scheduled_at and for cron.

POST /v1/recurring
 
{
"name": "Weekly digest",
"text": "<b>Weekly summary</b>",
"format": "html",
"interval_hours": 168
}

cron

POST /v1/recurring
 
{
"name": "Sunday digest",
"text": "Weekly summary",
"cron": "0 9 * * 0",
"timezone": "Europe/Moscow"
}

Skipping inactive subscribers (6.3.4)

If the subscriber is inactive or has blocked the bot at send time, the message gets the skipped status and the project receives a scheduled.skipped webhook (instead of failed).

Custom events and drip triggers (6.3.3)

Track subscriber actions (started a lesson, added to cart) and trigger drip chains on them — a Customer.io alternative for Telegram/Max.

POST /v1/events/track — record a subscriber event. After recording: event.tracked webhook, drip chains with trigger=event start, chains are cancelled per cancel_on_events.

subscriber_id string (UUID) required

Subscriber UUID

event string required

Event name: 1-64 chars, [a-zA-Z0-9._-]

properties object

Arbitrary JSON object of properties (up to 8 KB). Available in the template as {{event.key}}.

POST /v1/events/track
 
{
"subscriber_id": "550e8400-...",
"event": "lesson_started",
"properties": {"lesson": "Урок 1"}
}

Event-based drip trigger

A chain with trigger=event and trigger_value=event_name starts on tracking. properties_match filters: the chain starts only if event properties match. cancel_on_events lists events that cancel the subscriber's pending chain steps (e.g. a purchase cancels abandoned cart).

POST /v1/drip-chains
 
{
"name": "Abandoned cart",
"trigger": "event",
"trigger_value": "cart_updated",
"cancel_on_events": ["order_completed"],
"steps": [{"text": "{{event.item}} ждёт в корзине", "delay_minutes": 60}]
}

Related sections