Public API — подключение и проверка
REST API для интеграции с ImpactBot из вашей системы: клиенты, метки, воронки, рассылки, таблицы и исходящие вебхуки.
Базовый адрес — `https://api.impactbot.ru/public/v1`. Полное описание маршрутов с примерами тел и ответов живёт на странице /api-docs в продукте; она собирается из одного описания с этой статьёй, и контрактный тест сверяет его с деревом маршрутов — маршрут, которого нет в коде, туда не попадёт.
Что нужно заранее
- Проект ImpactBot и тариф, в котором доступ к API включён. Иначе любой запрос отвечает `402` с кодом `FEATURE_NOT_AVAILABLE`.
- Роль администратор в проекте: только она может выпустить и отозвать ключ.
- Ваш сервер, который будет ходить в API. Ключ — серверный секрет; в браузер и в мобильное приложение его класть нельзя.
Права и доступы
Ключ выпускается в разделе Проект → Настройки, блок API-ключа. У ключа есть scopes — они и определяют, что ключом можно сделать:
- `clients:read`, `clients:write` — чтение карточек и работа с метками;
- `messages:send` — отправка сообщения клиенту;
- `flows:read`, `flows:write` — список воронок и их запуск;
- `broadcasts:write` — создание рассылок;
- `tables:read`, `tables:write` — таблицы и строки;
- `admin` — включает всё перечисленное.
Права наследуются: `flows:write` открывает и `flows:read`, `tables:write` — и `tables:read`. Если ключу не хватает права, ответ `403` с кодом `INSUFFICIENT_SCOPE`, и в теле указано поле `required` с нужным scope — угадывать не придётся.
Проект в запросах не передаётся ни параметром, ни в теле: он определяется по самому ключу. У ключа может быть срок жизни; после его истечения ответ `401` с кодом `API_KEY_EXPIRED` и датой в поле `expiredAt`.
Подключение и вебхук
Ключ передаётся заголовком:
X-API-Key: <ваш ключ>
Форма `Authorization: Bearer <тот же ключ>` тоже принимается. Отдельного эндпоинта обмена логина на токен нет — JWT для публичного API не выдаётся.
Небезопасные методы принимают заголовок Idempotency-Key (произвольная строка до 255 символов, UUID необязателен). Повтор в течение 24 часов с тем же ключом, путём и телом отдаёт сохранённый ответ и помечает его заголовком `Idempotency-Replayed`. Тот же ключ с другим телом — `409` `IDEMPOTENCY_KEY_REUSED`. Ответы с ошибкой не сохраняются, поэтому повторить неудавшийся запрос можно тем же ключом.
Исходящие вебхуки регистрируются вручную — сами они не появятся: `POST /webhooks` со scope `admin` и телом `{ "url": "...", "events": ["message.received"] }`. Адрес обязан быть `https`, без логина и пароля в URL и не должен указывать во внутреннюю сеть, иначе `400`. Список — `GET /webhooks`, удаление — `DELETE /webhooks/:id`.
Лимит — 100 запросов в минуту на ключ. В ответах есть `X-RateLimit-Limit`, `X-RateLimit-Remaining` и `X-RateLimit-Reset`, при превышении — `429` с `Retry-After`.
Проверка
Самый дешёвый пробный запрос — список клиентов; он ничего не меняет:
curl -H "X-API-Key: <ваш ключ>" \
https://api.impactbot.ru/public/v1/clients?limit=1
Ожидаемый ответ — `200` и тело вида `{ "success": true, "data": { "clients": [...], "pagination": {...} } }`. Ответы по таблицам приходят без обёртки `success/data` — это отдельная форма, и её стоит учесть в разборе.
Дальше проверьте право на запись тем эндпоинтом, который вам нужен, с заголовком `Idempotency-Key`: повторный вызов с тем же ключом обязан вернуть тот же ответ, а не создать вторую сущность.
Частые ошибки
- `401` `API_KEY_EXPIRED`. Срок ключа вышел — выпустите новый; дата истечения есть в теле ответа.
- `403` `INSUFFICIENT_SCOPE`. Ключ выпущен без нужного права. Scope добавляется только выпуском нового ключа.
- `402` `FEATURE_NOT_AVAILABLE`. Тариф проекта не включает доступ к API.
- `501` `PLATFORM_NOT_SUPPORTED`. Прямая отправка сообщения работает только для Telegram; для остальных площадок запускайте воронку.
- `409` `IDEMPOTENCY_IN_PROGRESS`. Первый запрос с этим ключом ещё выполняется — повторите через секунду.
- `400` `FILTER_TOO_WIDE` или `UNKNOWN_FILTER_FIELD`. В запросе строк больше пяти `filter[…]` либо поля нет в таблице.
- `400` `UNKNOWN_FIELD`. В теле строки поле, которого в таблице нет: неизвестные колонки не создаются молча.
- Запрос с `project_id`. Такого параметра нет ни на одном маршруте — проект берётся из ключа.