Документация API

REST API для уведомлений через Telegram и Max. Подписчики, OTP, рассылки, формы, helpdesk.

Формы

Публичный endpoint для приёма заявок с сайтов. Не требует API-ключа — безопасен для использования в клиентском JavaScript.

POST /f/{form_id}

body object обязательный

Произвольный JSON — любые поля формы

Пример запроса

POST /f/{form_id}
 
{
"name": "John",
"email": "john@example.com",
"message": "Хочу узнать подробнее"
}

Ответ

{
"ok": true
}

Поля формы

Принимаются произвольные поля. Стандартные поля выделяются в уведомлениях и будут использоваться в будущих интеграциях (CRM, Google Sheets).

name string

Имя отправителя

email string

Email отправителя

phone string

Телефон

subject string

Тема обращения

company string

Компания

city string

Город

url string

Ссылка на сайт

message string

Текст сообщения

* any

Любые другие поля — передаются как есть

Формат allowed_origins

Разрешённые источники указываются как домены. Схема (http/https), www и слеши нормализуются автоматически — достаточно написать example.com, все варианты (https://example.com, www.example.com, example.com/) будут приняты.

example.com — принимает заявки с https://example.com, http://example.com, https://www.example.com

*.example.com — любой поддомен и сам example.com (требуется минимум второй уровень, *.com запрещено)

Запрещены локальные хосты (localhost, 127.0.0.1), приватные IP и зарезервированные TLD (.local, .test, .example) — сервер вернёт ошибку при сохранении

Безопасность

Проверка Origin — только разрешённые домены

Rate limit — 30 заявок/мин на форму

Honeypot — скрытое поле _honey для защиты от ботов

Санитизация — автоматическое удаление HTML-тегов и опасного контента

Time-to-submit — проверка минимального времени заполнения формы. По умолчанию 3 секунды (JS-сниппет автоматически шлёт `_submit_time`). Для простых HTML-форм без JavaScript — выставьте 0 в настройках формы.

Блоклист одноразовых email-сервисов (mailinator, tempmail и т.д.) — помечаются как спам

Спам-папка и фильтры

Спам-заявки не удаляются — сохраняются отдельно для ревью. Вебхуки и email-уведомления для спама не отправляются.

Вкладка «Спам» в кабинете — отдельный список заявок, помеченных фильтрами

Honeypot — скрытое поле с уникальным именем per-form. Если бот его заполнит — заявка тихо отклоняется

Keyword blocklist — настраиваемый список слов. Заявки с ними помечаются как спам

Timestamp проверка — `_submit_time` при загрузке страницы, сервер сверяет интервал (по умолчанию 3 секунды). JS-сниппет шлёт поле автоматически. Для простых HTML-форм без JS отключите проверку (0) в настройках формы — иначе заявки попадут в спам с причиной «missing_timestamp».

Можно вручную помечать заявки как спам/не-спам в дашборде

Маршруты заявок (Form Routes)

Единая модель: маршрут = триггер + действие. Триггер — «всегда» (базовый получатель) или «по условию». Действия: доставить получателю / пометить как спам / заблокировать. До 40 маршрутов на форму.

Операторы условия: `contains` (подстрока), `equals` (точное равенство). Поле условия — имя поля или `*` для любого строкового поля

`mark_spam` — сохранить, но пометить как спам (не отправлять получателям, не слать webhook)

`block` — не сохранять вообще (тихий 200 OK)

`deliver` — доставить получателю (email/messenger/subscriber/team). Условный маршрут добавляется к основным «всегда» по умолчанию

Флаг `replace_defaults` на условном deliver-маршруте заменяет все «всегда»-маршруты при срабатывании — используется для перенаправления (например, «только для продаж — на sales@»)

Redirect после отправки

Если в настройках формы задан `redirect_url` и запрос пришёл как `application/x-www-form-urlencoded` (HTML-форма без JS), сервер отвечает `303 See Other` с `Location: <redirect_url>`. JSON-запросы (fetch/AJAX) продолжают получать `{ok:true}`.

Получатели: мессенджеры (Telegram/Max), email, подписчики проекта

HTML-форма (без JavaScript)

Самый простой путь интеграции. Форма работает как обычный HTML submit — браузер отправит POST на endpoint. Защита: honeypot + фильтры. Задайте «URL перенаправления» в настройках, чтобы после отправки пользователь увидел страницу «спасибо».

<form action="https://api.zapnoty.com/f/form_abc123" method="POST">
<input type="text" name="name" required>
<input type="email" name="email" required>
<textarea name="message" required></textarea>
<input type="text" name="_hp_xxx" value="" style="display:none">
<button type="submit">Send</button>
</form>

Fetch / SPA

Для одностраничных приложений и динамических форм. Возвращает `{ok:true}` в JSON. Обязательно обрабатывайте `{ok:false, error}` и сетевые ошибки. В кабинете на вкладке «Код интеграции → JavaScript» — конструктор с гибкой настройкой: 30-секундный таймаут первой попытки (как у Formspree), retry на 5xx/network, localStorage-очередь и идемпотентный `_request_id` — заявки не теряются при кратковременных падениях сервера и не дублируются при retry.

async function submitForm(data) {
const res = await fetch('https://api.zapnoty.com/f/form_abc123', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
});
const json = await res.json();
if (!res.ok || !json.ok) throw new Error(json.error);
return json;
}

Связанные разделы