Быстрый старт: ключ, запросы, ошибки

Ключ, первый запрос и ответ посетителю за четыре шага, а следом права ключа, формат ответа, коды отказов, постраничная выборка и пределы API.

Адреса #

ЧтоАдрес
Публичное APIhttps://api.widgetchat.ru/api/v1
Файл виджетаhttps://api.widgetchat.ru/widget/bozex-support-widget.js
Кабинетhttps://widgetchat.ru/cabinet
Приём событий Битрикс24https://widgetchat.ru/b24/event
Приём событий amoCRMhttps://widgetchat.ru/amocrm/hook/{scope_id}
Приём событий RetailCRMhttps://widgetchat.ru/retailcrm/hook/{clientId}

Только HTTPS. Тестового контура нет: заведите отдельный проект в кабинете и работайте с ним. Он изолирован от боевого рабочим пространством.

1. Получить ключ #

Кабинет → карточка сайта → "API и вебхуки" → "Выдать ключ". Ключ показывается один раз: в базе лежит только его отпечаток.

Права выбираются при выдаче: conversations:read, conversations:write, media:read. Метод без права отвечает 403 insufficient_scope, остальные продолжают работать тем же ключом.

2. Первый запрос #

GET /api/v1/conversations?status=open&limit=5 conversations:read
Пример вызова
curl -s https://api.widgetchat.ru/api/v1/conversations?status=open&limit=5 \
  -H "Authorization: Bearer wck_ваш_ключ"
Ответ
{
  "data": [
    {
      "id": "6c82f8e2-2ee2-4387-8c9b-34d164b18176",
      "status": "open",
      "channel": "app",
      "visitor": {"id": "u_8f1c…", "name": "Иван", "email": "ivan@example.ru"},
      "source": "widget",
      "createdAt": "2026-08-22T09:14:58.113Z",
      "lastMessageAt": "2026-08-22T09:15:04.281Z",
      "lastReadAt": null
    }
  ],
  "nextCursor": "2026-08-22T09:14:58.113Z",
  "hasMore": true
}

3. Ответить посетителю #

POST /api/v1/conversations/{id}/messages conversations:write
Пример вызова
curl -s -X POST https://api.widgetchat.ru/api/v1/conversations/6c82f8e2-…/messages \
  -H "Authorization: Bearer wck_ваш_ключ" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: reply-4417" \
  -d '{"content": "Заказ уже в пути, доставим завтра до 14:00"}'
Ответ
201 {"data": {"id": "7735af47-…", "status": "queued", "direction": "outgoing",
                "createdAt": "2026-08-22T09:15:04.281Z"}}

Idempotency-Key делает повтор безопасным: тот же ключ вернёт 200 и duplicate: true вместо второго сообщения в переписке.

4. Подписаться на события #

Кабинет → "API и вебхуки" → "Добавить адрес". Секрет подписи показывается один раз. Кнопка "Проверить" шлёт событие webhook.test: на нём видно свою же подпись и код ответа обработчика.

Обработчик обязан ответить 2xx в течение 20 секунд. Работу уводите в свою очередь: долгий ответ считается неудачей и приводит к повтору.

Ключ: где хранить и как отзывать #

Каждый запрос несёт заголовок Authorization: Bearer wck_… Ключ выдаётся на один подключённый сайт и открывает переписку только этого сайта: разговор соседнего подключения по нему не найдётся даже по точному номеру.

В базе хранится только отпечаток ключа. Потерянный ключ не восстанавливается: он отзывается и выдаётся заново. Отозванный перестаёт открывать что-либо сразу, а запись остаётся с отметкой revokedAt.

Пример вызова
Authorization: Bearer wck_cZLLSCqi7pQ2m4E1vN…

Ключ серверный. В код страницы его класть нельзя: оттуда его прочитает любой посетитель и получит доступ ко всей переписке сайта.

Права ключа #

ПравоМетоды
conversations:readGET /conversations, GET /conversations/{id}, GET /conversations/{id}/messages
conversations:writePOST /conversations/{id}/messages, POST /conversations/{id}/close
media:readGET /media/{id}

Запросы из браузера и CORS #

Заголовков CORS публичное API не выдаёт намеренно, и обращение из браузера посетителя не пройдёт. Виджет работает по другому входу: по подписанному токену окна, который выдаёт шлюз.

Отказы аутентификации #

HTTPcodeКогда
401unauthorizedзаголовка нет, ключ не тот или отозван
403insufficient_scopeу ключа нет права на этот метод
429rate_limit_exceededбольше 300 запросов в минуту на ключ

Конверт ответа #

Удачный ответ всегда кладёт содержимое в data, даже когда это один объект. У списков рядом появляются nextCursor и hasMore. Отказ приходит в том же конверте полем error с машинным кодом и пояснением на английском.

Все ответы идут с Cache-Control: no-store: в них чужая переписка.

Ответ
{"data": { … }}
{"data": [ … ], "nextCursor": "2026-08-22T09:15:04.281Z", "hasMore": true}
{"error": {"code": "validation_error", "message": "content must not exceed 4096 characters"}}

Все коды отказов #

HTTPcodeКогда
400validation_errorтело не разобралось или значение не подходит
401unauthorizedключа нет, отозван или чужой
403insufficient_scopeу ключа нет права на метод
404not_foundразговора нет либо он другого сайта
409conversation_closedразговор закрыт, ответа посетитель не увидит
409no_visitorв разговоре нет посетителя виджета
413file_too_largeфайл по ссылке больше предела
429rate_limit_exceededпревышен предел частоты, смотрите Retry-After
502file_fetch_failedфайл по вашей ссылке не скачался
503storage_unavailableбаза или Redis недоступны, повторите позже

Постраничная выборка #

Выборка курсорная, а не по номерам страниц: пока читается первая страница, посетители пишут, и нумерация сдвинула бы часть разговоров мимо читающего. Курсором служит время последнего показанного элемента в формате RFC 3339 с наносекундами.

Берите nextCursor из ответа и передавайте его параметром cursor, пока hasMore истинно.

ПолеТипОбяз.Описание
limitintнетразмер страницы: 25 по умолчанию, 100 потолок
cursorstringнетпродолжение выборки: значение nextCursor предыдущего ответа

Пределы #

ЧтоСколько
Запросов на ключ300 в минуту, дальше 429 с Retry-After
Размер страницы25 по умолчанию, 100 потолок
Длина ответа4096 символов
Тело запроса256 КБ
Файл по ссылке50 МБ
Срок подписанной ссылки на вложение1 час
Ожидание вашего обработчика вебхука20 секунд
Попыток доставки вебхука3, пауза 5 секунд и дальше вдвое
Окно проверки подписи вебхука5 минут

Что дальше #

Полные сигнатуры методов собраны на странице "Разговоры, сообщения и вложения". Формат событий и проверка подписи описаны в "Вебхуках". Если нужен не API, а готовый коннектор к CRM, смотрите страницы Битрикс24 и RetailCRM. Подключение amoCRM описано отдельно: оно заработает, когда техподдержка amoCRM выдаст сервису канал.