Нажмите Энтер.
Получите данные.
REST API /api/v1, 53 скоупа, 239 эндпоинтов, 11 событий вебхуков и JS API виджета. Чаты, контакты, ИИ, база знаний, тикеты и биллинг — всё, что умеет кабинет, умеет и ваш код.
# нажмите Энтер или знак справа $ curl -H "Authorization: Bearer sb_••••" \ https://smartbtn.me/api/v1/chats?limit=1
Быстрый старт
Три шага от нуля до первого ответа. Каждый запрос привязан к одному виджету и авторизован bearer‑токеном.
- Выпустите токенКабинет → API‑токены: название, срок действия (необязательно) и нужные скоупы. Токен принадлежит ровно одному виджету. Открытый текст показывается один раз; Smartbtn хранит только хеш, поэтому потерянный токен не восстановить — только отозвать и выпустить заново.
- Включите API виджетаВ настройках виджета включите «Разрешить API виджета (JS и REST)». Выпуск токена сам по себе этот переключатель не включает.
- Отправьте первый запросТокен передаётся только в заголовке
Authorization— никогда в URL.
# список чатов виджета curl -H "Authorization: Bearer $SMARTBTN_TOKEN" \ https://smartbtn.me/api/v1/chats
// 200 OK · курсорная пагинация { "data": [ { "id": 48211, "status": "open", "last_message_at": "2026-10-17T09:41:12+03:00" }, … ], "next_cursor": "eyJpZCI6NDgyMTB9" // null — на последней странице }
https://smartbtn.me/api/v1 — основной адрес API для всех данных проекта. Всегда отправляйте запросы по HTTPS и не пересылайте токен при редиректах.401 или 403 с телом RFC‑7807 application/problem+json — см. Ошибки.Аутентификация
Три пути — в зависимости от того, кто кому звонит. Доступ запрещён по умолчанию: нет скоупа — нет вызова.
Каждый запрос несёт Authorization: Bearer <token>. На сервере токен превращается в виджет и его скоупы.
Исходящие запросы подписаны секретом: X‑Smartbtn‑Signature. Если вашей стороне нужен свой bearer — его можно добавить.
Для POST /v1/ai/replies — своя подписанная рамка, привязанная к вашему ИИ‑оператору и виджету, с долговечным causation_id.
Переключатель, о котором забывают
«Разрешить API виджета (JS и REST)» в настройках виджета открывает и REST, и JS API виджета. Выпуск токена его не включает. Скоупы существующего ключа меняются в кабинете (API‑токены → ключ → «Изменить скоупы») без перевыпуска — интеграции продолжают работать.
Пресеты
| Пресет | Скоупы | Когда |
|---|---|---|
| Настройка через AI 9 | widget:read · widget:write · ai:read · ai:write · ai:apply · kb:read · kb:write · files:write · stats:read | Ваше ИИ‑приложение настраивает виджет: ассистента, базу знаний, тексты. Заменяет весь выбор скоупов. |
| Только чтение (пример набора) | chats:read · messages:read · contacts:read · stats:read | Дашборды, BI, выгрузки. |
| Мост в helpdesk (пример набора) | chats:read · messages:read · messages:write · webhooks:write · support:read | Зеркалить диалоги и тикеты в вашу CRM. |
ai:credentials:write выдавайте, только если владелец разрешил подключить ключ провайдера. Права аккаунта, биллинга и партнёрки для настройки ИИ не нужны. Ключ показывается один раз — отзовите его после настройки.Скоупы
53 скоупа маршрутов, плюс один условный и один зарезервированный. Запрос проходит, только если у токена есть скоуп маршрута (или указанная альтернатива).
| Скоуп | Что даёт |
|---|---|
| chats · 2 | |
| chats:read | Чтение чатов и их метаданных |
| chats:write | Закрыть чат, запросить оценку, передать, взять, назначить или снять оператора |
| messages · 2 | |
| messages:read | История сообщений чата |
| messages:write | Отправка сообщений, индикатора набора и отметок о прочтении от имени оператора |
| contacts · 2 | |
| contacts:read | Чтение контактов |
| contacts:write | Изменение полей и атрибутов контакта |
| agents · 3 | |
| agents:read | Операторы и их статус присутствия |
| agents:writeчувствительный | Пригласить, изменить, приостановить, восстановить или удалить оператора; приглашённый видит все чаты виджета |
| agents:events:read | Журнал действий и метрики оператора |
| tags · 2 | |
| tags:read | Чтение тегов |
| tags:write | Привязать теги к контакту |
| files · 2 | |
| files:read | Скачать загруженный файл |
| files:write | Загрузить новый файл |
| stats · 1 | |
| stats:read | Сводная статистика чатов, сообщений и оценок |
| channels · 3 | |
| channels:read | Онлайн‑статус своего канала |
| channels:write | Доставить входящее сообщение в свой канал |
| channels:register | Зарегистрировать новый свой канал (только для установленных приложений) |
| webhooks · 2 | |
| webhooks:read | Список подписок на вебхуки |
| webhooks:write | Создать, удалить или переотправить подписку |
| quick_phrases · 2 | |
| quick_phrases:read | Быстрые фразы оператора |
| quick_phrases:write | Создать, изменить или удалить быстрые фразы |
| ratings · 1 | |
| ratings:read | Оценки посетителей и кого из операторов они касаются |
| responder · 2 | |
| responder:injectчувствительный | Вставить ответ в живой чат как внешний ИИ‑оператор или бот |
| responder:escalateусловный | Для POST /v1/ai/replies: передать чат человеку по escalate=true |
| widget · 2 | |
| widget:read | Внешний вид, поведение и код установки виджета |
| widget:write | Изменить настройки виджета и сбросить его кеш |
| departments · 2 | |
| departments:read | Отделы, их операторы и расписание |
| departments:write | Создать, изменить или удалить отдел и расписание |
| messengers · 2 | |
| messengers:read | Какие мессенджеры и соцсети подключены (без учётных данных) |
| messengers:writeчувствительный | Подключить или отключить мессенджер; записывает учётные данные провайдера |
| ai · 4 | |
| ai:read | ИИ‑ассистенты, их настройки и алерты |
| ai:write | Создать и изменить ассистентов, ИИ‑настройки и ИИ‑операторов, включая персону и промпт |
| ai:credentials:writeчувствительный | Сохранить ключи сторонних LLM‑провайдеров (BYOK) |
| ai:apply | Одобрить улучшение, которое переписывает персону живого ассистента |
| kb · 2 | |
| kb:read | Правила базы знаний и загруженные источники |
| kb:write | Создать, изменить или удалить правила и источники базы знаний |
| transcripts · 1 | |
| transcripts:read | Экспорт стенограммы чата |
| account · 2 | |
| account:read | Профиль аккаунта и все его юрлица |
| account:write | Изменить только имя, фамилию и телефон аккаунта |
| billing · 2 | |
| billing:read | Биллинг виджета и юрлица аккаунта |
| billing:write | Создать, изменить, удалить юрлица; счета не выставляет и деньги не двигает |
| partners · 2 | |
| partners:read | Данные партнёрского аккаунта и рефералов |
| partners:withdrawзарезервирован | Зарезервирован: выплаты через API сейчас не выполняются |
| support · 4 | |
| support:read | Тикеты, чаты с активностью клиента, их сообщения и свой журнал действий |
| support:replyчувствительный | Ответить клиенту от имени оператора поддержки |
| support:write | Взять или отпустить чат, закрыть тикет без ответа, переоткрыть |
| support:tickets:close | Только закрыть тикет — и больше ничего |
| marketing · 2 | |
| marketing:read | Маркетинговые кампании: баннеры, попапы, email‑рассылки |
| marketing:write | Создать и изменить кампании, сменить статус, запустить email‑рассылку |
| broadcasts · 2 | |
| broadcasts:read | Рассылки в мессенджерах (WhatsApp, Telegram, MAX, VK) |
| broadcasts:write | Создать, изменить и запустить рассылку |
| problems · 2 | |
| problems:read | Кластеры проблем клиентов и настройки анализа |
| problems:write | Изменить настройки и статус кластера: new, in progress, resolved, recurring |
| invitations · 2 | |
| invitations:read | Правила умных приглашений, A/B‑варианты, шаблоны и воронка |
| invitations:write | Создать, изменить, включить или удалить правила и шаблоны |
Эндпоинты
Вся публичная поверхность в одном списке. Фильтр по ресурсу, поиск по пути, клик по строке — готовый curl в буфере.
ai Ассистенты, операторы, ключи, самообучение, маркетплейс54
chats Диалоги, сообщения, передача, оценки18
kb База знаний: правила, краулер, файлы, поиск16
agents Операторы, приглашения, метрики14
messengers Мессенджеры, сообщества VK, кабинеты Avito13
billing Баланс, подписки, счета, юрлица12
support Агент поддержки: тикеты и чаты12
widget Настройки, язык, переводы, скины, кеш12
channels Свои каналы8
external‑operators Свой бот как оператор8
webhook‑subscriptions Подписки на вебхуки8
broadcasts Рассылки в мессенджерах7
departments Отделы и расписание7
invitations Умные приглашения7
marketing Маркетинговые кампании7
partner Партнёрская программа7
wishes Пожелания к ИИ7
contacts Контакты и теги5
problems Анализ проблем клиентов4
quick‑phrases Быстрые фразы4
compat Совместимость при переезде3
stats Статистика3
account Аккаунт2
files Файлы2
ratings Оценки1
tags Теги1
v1 1
webhook‑events Каталог событий1
Пути — относительно https://smartbtn.me/api. Записи требуют Content‑Type: application/json и X‑Smartbtn‑Idempotency‑Key. Группа compat — слой совместимости для переезда с другой чат‑платформы.
Вебхуки
Подписанный JSON POST на ваш адрес, когда происходит событие из подписки. Подписки — через /v1/webhook‑subscriptions или в кабинете.
{
"id": "evt_01JAB3K9Q7",
"type": "ticket.created",
"data": {
"button_guid": "b_3f9c2e",
"ticket_number": 10482,
"chat_id": 48211,
"client_id": 9134,
"reason": "human_request",
"priority": "high",
"sla_hours": 4,
"source": "chat",
"created_at": "2026-10-17T10:15:00+03:00"
}
}reason: human_request | billing | ai_unresolved | action_request | …; priority: high | normal; source: chat | app | site. Тикет и переписка — GET /v1/support/tickets/{number}.
Заголовки доставки
| X‑Smartbtn‑Event | Тип события, например message.created. |
| X‑Smartbtn‑Signature | HMAC сырого тела: sha256=v1:<hex>. |
| X‑Smartbtn‑Idempotency‑Key | Одно значение на событие, не меняется при повторах. По нему — дедупликация. |
| X‑Smartbtn‑Delivery | Одно значение на попытку доставки — для ваших логов. |
| X‑Smartbtn‑Timestamp | Unix‑время отправки. Для справки, в подпись не входит. |
Проверка подписи
HMAC‑SHA256 от сырого тела (байты как пришли, до разбора JSON) секретом подписки; сравнение — за постоянное время. Секрет показывается один раз при создании подписки; ротация — POST /v1/webhook‑subscriptions/{id}/rotate‑secret.
// Node.js · пример, секрет — заглушка import crypto from 'node:crypto'; function verify(rawBody, header, secret) { const expected = 'sha256=v1:' + crypto.createHmac('sha256', secret).update(rawBody).digest('hex'); const a = Buffer.from(expected), b = Buffer.from(header || ''); return a.length === b.length && crypto.timingSafeEqual(a, b); }
// PHP $expected = 'sha256=v1:' . hash_hmac('sha256', file_get_contents('php://input'), $secret); if (!hash_equals($expected, $_SERVER['HTTP_X_SMARTBTN_SIGNATURE'] ?? '')) { http_response_code(401); exit; }
Повторы и порядок
- До 4 попыток (первая отправка + 3 повтора), пауза
min(60, 2^attempt × 5)с — примерно 10, 20, 40 с. - Не‑2xx или таймаут — неудачная попытка. Неудачные доставки можно переотправить:
POST /v1/webhook‑subscriptions/{id}/redeliver— тот же ключ идемпотентности, новый id доставки. - Доставка «хотя бы раз» и без гарантии порядка. Полезная нагрузка минимальна — идентификаторы, а не копии записей; детали забирайте через REST.
JS API
Передайте оператору то, что вы уже знаете о посетителе. Вызовы принимаются только с домена из настроек виджета.
smartbtn_widget_api.setContactInfo(info)
Задаёт контактные данные посетителя. Оператор видит их так, будто посетитель сам заполнил форму. Имя, телефон и email в Smartbtn играют особую роль — поэтому отдельный метод.
| Название | Тип | Описание |
|---|---|---|
| name | string | Имя посетителя |
| string | Email посетителя | |
| phone | string | Телефон посетителя |
| description | string | Дополнительная информация о клиенте |
Smartbtn_api.setClientInfo({ name: "Василий Васильев", email: "email@example.com", phone: "+17584987855", description: "Description text" });
smartbtn_widget_api.setCustomData(fields)
Произвольные данные для информационной панели справа в приложении оператора. Вызывайте сколько угодно раз — в открытом диалоге панель обновится в реальном времени. Поля выводятся в порядке массива.
| Название | Тип | Описание |
|---|---|---|
| fields | array | Список полей |
| field.title | string | Заголовок над полем |
| field.content | string | Содержимое поля; теги экранируются |
| field.link | string | URL, открываемый по клику |
Smartbtn_api.setClientCustomData([ { title: "Order", content: "#10482 · 3 items", link: "https://shop.example/orders/10482" }, { title: "Actions", content: "Open customer profile", link: "https://crm.example/c/9134" } ]);
smartbtn_widget_api.setSkin(skin, opts) · open() · close()
Переключайте тему оформления виджета на лету без перезагрузки страницы (classic, minimal, capsule, liquid) или управляйте окном чата программно. Для постоянной настройки под проект передайте те же поля в PATCH /v1/widget/settings.
// JS API · переключение стиля кнопки на странице в реальном времени smartbtn_widget_api.setSkin("minimal"); smartbtn_widget_api.setSkin("capsule", { capsuleTitle: "Smartbtn AI", capsuleSubtitle: "Ответим за ~1 с" }); // REST API · PATCH /v1/widget/settings (скоуп widget:write) { "skin": "minimal", "widget_header_align": "center", "widget_show_operator_avatars": false, "widget_show_tabs_bar": false, "chat_bg": "#FAF8F5", "capsule_title": "Smartbtn AI", "capsule_subtitle": "Онлайн 24/7" }
widget_api_contact_sync, эти вызовы также порождают вебхук contact.updated.Support‑agent API
Автоматический агент поддержки работает с очередью тикетов и чатами клиентов: берёт чат, отвечает от имени вашего оператора поддержки, закрывает тикет. Выключен, пока владелец виджета его не включит.
- Владелец включаетУказывает токены, которым можно работать агентом, и IP‑адреса, с которых можно звонить.
- Очередь
GET /v1/support/tickets·GET /v1/support/chats - Взять чат
POST …/chats/{id}/claim·…/release - ОтветитьТолько текст, ссылки — только на разрешённые хосты виджета.
201— только когда сообщение сохранено. - Закрыть или переоткрыть
POST …/tickets/{number}/close·…/reopen
| Скоуп | Разрешает |
|---|---|
| support:read | Тикеты, чаты с активностью клиента, сообщения с метками client / ai / support / system, свой журнал действий |
| support:write | Взять / отпустить чат, закрыть без ответа, переоткрыть |
| support:reply | Ответ клиенту от имени оператора поддержки (чувствительный) |
| support:tickets:close | Только закрыть тикет — для кнопки «Вопрос решён» на вашем бэкенде |
curl -X POST https://smartbtn.me/api/v1/support/chats/48211/reply \ -H "Authorization: Bearer $AGENT_TOKEN" \ -H "Content-Type: application/json" \ -H "X-Smartbtn-Idempotency-Key: $(uuidgen)" \ -d '{"text":"Готово, доступ восстановлен."}'
ИИ API
Всё, что делает раздел ИИ в кабинете: ассистенты, свои ключи провайдеров, база знаний, самообучение с откатом, пожелания, проблемы, сигналы спроса и ассистент внутри вашего приложения.
Несколько ассистентов со своей ролью и языком, тест перед запуском, операторы с именами на каждом языке.
- GET/v1/ai/assistants
- POST/v1/ai/assistants/{id}/test
- PATCH/v1/ai/operators/{id}
- POST/v1/ai/handoff
Claude, ChatGPT, DeepSeek, YandexGPT, Gemini, Mistral или любой OpenAI‑совместимый. Список моделей — по ключу.
- GET/v1/ai/credentials
- POST/v1/ai/credentials
- GET/v1/ai/credentials/{id}/models
Краулер по вашему сайту, загрузка PDF и DOCX, правила, поиск и статус индексации.
- PUT/v1/kb/crawler
- POST/v1/kb/uploads
- POST/v1/kb/rules
- GET/v1/kb/search
Запуск настройки, циклы, журнал, версии персоны с откатом и стоп‑кран.
- POST/v1/ai/learning/tune
- GET/v1/ai/learning/cycles
- POST/v1/ai/learning/persona‑versions/{version}/revert
- GET/v1/ai/learning/kill‑switch
Пожелание свободным текстом → предпросмотр без последствий → одобрить, отклонить или откатить.
- POST/v1/wishes
- GET/v1/wishes/{id}/preview
- POST/v1/wishes/{id}/approve
- POST/v1/wishes/{id}/revert
Кластеры проблем со статусами и месячным лимитом расходов; что клиенты просили, а у вас этого нет.
- GET/v1/problems
- PATCH/v1/problems/settings
- POST/v1/problems/{id}/status
- GET/v1/ai/demand‑signals
Ваш бэкенд сообщает статус клиента (зарегистрирован, оплатил, клиент с какого времени, состояние сервиса) запросом с подписью HMAC — ИИ учитывает его в ответе и эскалации.
- POST/v1/ai/customer‑status
- POST/v1/ai/tickets
- GET/v1/ai/alerts
Ход диалога, привязка чата к аккаунту, распознавание и синтез речи, тикеты из приложения — через подписанную интеграцию.
- POST/v1/ai/assistant/turn
- POST/v1/ai/assistant/account‑link
- POST/v1/ai/assistant/speech‑to‑text
- POST/v1/ai/assistant/text‑to‑speech
Готовые ассистенты под нишу: кофейня, клиника, магазин, автосервис. Применить — один запрос.
- GET/v1/ai/marketplace/templates
- POST/v1/ai/marketplace/templates/{slug}/apply
Свой бот отвечает в чатах: асинхронные ответы, передача человеку, тесты и жизненный цикл.
- POST/v1/ai/replies
- POST/v1/external‑operators/{public_id}/tests
- POST/v1/external‑operators/{public_id}/lifecycle
Лимиты
На каждый токен — два счётчика: чтение и запись считаются отдельно, поэтому опрос не съедает бюджет записи.
| X‑RateLimit‑Limit | Размер счётчика, в который попал запрос (600 или 120) |
| X‑RateLimit‑Remaining | Сколько запросов осталось в окне |
| X‑RateLimit‑Reset | Когда окно обнулится |
| Retry‑After | При 429: сколько секунд ждать |
HTTP/1.1 429 Too Many Requests Content-Type: application/problem+json Retry-After: 12 X-RateLimit-Limit: 120 X-RateLimit-Remaining: 0 { "status": 429, "title": "Too Many Requests", "reason": "rate_limited" }
У /v1/ai/assistant/tickets/status и /v1/ai/assistant/account‑link — свои счётчики; для Support‑agent API владелец может задать свой лимит.
Ошибки
Любая ошибка — RFC‑7807 application/problem+json: статус и причина для машины, пояснение для человека.
HTTP/1.1 403 · Content-Type: application/problem+json { "type": "https://smartbtn.me/problems/forbidden", "title": "Forbidden", "status": 403, "detail": "Token lacks scope chats:write.", "required_scopes": [ "chats:write" ], "hint": "Dashboard → API tokens → key → Edit scopes" }
В теле — required_scopes и подсказка, где выдать скоуп. Перевыпускать ключ не нужно.
| Статус | Значение |
|---|---|
| 400 | Некорректный запрос или не передан обязательный ключ идемпотентности |
| 401 | Нет токена, токен неверный или отозван |
| 403 | У токена нет скоупа; в теле — required_scopes и где его выдать |
| 404 | Не найдено в этом виджете |
| 405 | Метод не разрешён — остановитесь и сообщите, не ищите обходных записей |
| 409 | Ключ идемпотентности повторён в течение 24 ч или конфликт состояния |
| 422 | Ошибка валидации (например, прислали поле только для чтения) |
| 429 | Лимит запросов; соблюдайте Retry‑After |
Идемпотентность
Сеть подводит. Ключ делает повтор записи безопасным: одна операция не выполнится дважды.
- Передавайте
X‑Smartbtn‑Idempotency‑Keyв каждом POST / PATCH / PUT / DELETE: новый UUID — для новой операции, тот же ключ — для повтора той же. - Операции с
x‑idempotency: requiredв OpenAPI: нет ключа → 400, ключ повторён в течение 24 часов → 409 (а не закешированный успех). - Не уверены, прошла ли запись? Сначала прочитайте состояние. Не меняйте ключ автоматически; соблюдайте Retry‑After.
- Ответ
502от внешнего провайдера освобождает ключ — повторяйте с тем же ключом.
KEY=$(uuidgen) curl -X PATCH https://smartbtn.me/api/v1/widget/settings \ -H "Authorization: Bearer $SMARTBTN_TOKEN" \ -H "Content-Type: application/json" \ -H "X-Smartbtn-Idempotency-Key: $KEY" \ -d '{"language":"ru"}' # ошибка сети? повторите с тем же $KEY
Changelog
Изменения публичного API и вебхуков в 2026 году. Всё ниже — добавления, версия остаётся v1.
Новое событие ticket.created (включено). GET /v1/support/tickets отвечает любому ключу с support:read, пока агент поддержки не настроен. Скоупы ключа меняются в кабинете без перевыпуска. 403 получает required_scopes.
POST/PATCH /v1/ai/operators принимают name_i18n; системные имена переводятся на язык виджета; предсказуемый выбор приветствия.
Чтение — 600 в минуту, запись — 120. Опрос больше не съедает бюджет записи. X‑RateLimit-* описывают счётчик, в который попал запрос.
Чаты с активностью начиная с указанного момента — как бы давно они ни были созданы. В каждом чате появилось last_message_at.
chat.account.email_requested — чат ждёт адрес клиента, агенту не нужно запускать второй поток кода.
Только закрытие тикета — для кнопки «Вопрос решён» на вашем бэкенде.
Фильтры has_client_messages=1 и q (2–100 символов).
POST /v1/ai/assistant/account‑link и /revoke. Выключено, пока владелец не включит.
Правила индексируются ключом виджета или ключом включённого ассистента; 502 освобождает ключ идемпотентности.
Аккаунт виден, пока тикет открыт и ещё 7 дней после закрытия.
Новая группа /v1/support: очередь, чаты, аренда чатов, ответы, закрытие и переоткрытие тикетов. Выключено, пока владелец не включит.
Поля code_pending, code_expires_at, last_code_result и last_code_at.
Плагин WordPress
Виджет на сайте WordPress без правки кода темы.
- Скачайтеархив плагина на компьютер.
- УстановитеПоложите распакованную папку в
wp‑content/plugins/— или загрузите через админку WordPress. - АктивируйтеВ меню появится пункт Smartbtn.
- Вставьте токенСкопируйте токен безопасности из настроек виджета в кабинете.
При смене пароля токен безопасности меняется, старый перестаёт работать — вставьте новый в плагин.
Примеры кода
Все чаты с активностью с прошлого опроса — по курсору до конца.
# первая страница curl -G https://smartbtn.me/api/v1/chats \ -H "Authorization: Bearer $SMARTBTN_TOKEN" \ --data-urlencode "updated_since=2026-10-17T09:00:00+03:00" # следующая — с next_cursor из ответа curl -G https://smartbtn.me/api/v1/chats \ -H "Authorization: Bearer $SMARTBTN_TOKEN" \ --data-urlencode "cursor=eyJpZCI6NDgyMDd9"