Кабинет

Разработчикам

Публичный API QNNECT: отправка WhatsApp-сообщений и шаблонов, каталог шаблонов канала и webhooks. Токены и идентификаторы каналов — в кабинете, раздел «Интеграции → API».

OpenAPI 3.1 (YAML) Вся дока одним .md llms.txt

MCP

Endpoint: https://qnnect.kz/mcp · Streamable HTTP
claude mcp add --transport http qnnect https://qnnect.kz/mcp

Без токена MCP отдаёт документацию API. С read-only токеном из кабинета («API интеграции и MCP» → «MCP») добавляются данные компании — каналы и шаблоны: подключайте сервер по URL https://qnnect.kz/mcp?token=<MCP_READ_TOKEN>. Кнопки установки в один клик для Cursor и VS Code — там же, в кабинете.

HTTP API для отправки WhatsApp-сообщений и шаблонов через ваш канал QNNECT и для чтения каталога шаблонов канала.

Аутентификация

Каждый запрос аутентифицируется двумя значениями, которые копируются из кабинета QNNECT (Интеграции → API):

  • channel_uuid — идентификатор канала, часть пути URL;
  • api_token — секретный токен канала, передаётся query-параметром token.

Оба значения — per-канал. Держите токен в секрете: любой, у кого он есть, может отправлять сообщения за ваш счёт. Токен можно перевыпустить в кабинете в любой момент (старый перестаёт работать сразу).

Модель доставки

Отправляющие эндпоинты асинхронны: успешный вызов возвращает 202 с message_uuid — сообщение поставлено в очередь и доставляется в фоне. Прогресс доставки приходит через webhook-интеграции (см. Webhooks).

Ошибки

Ошибки — JSON-объекты {"error": "<код>"} с опциональным человекочитаемым message. HTTP-коды: 400 неверный ввод, 401 нет или неверный токен, 403 отправка приостановлена (компания заблокирована или нет средств), 404 неизвестный канал или шаблон.

Эндпоинты

POST /api/v1/{channel_uuid}/message/Отправить текст или медиа

Отправляет свободное сообщение пользователю WhatsApp. Свободные сообщения доставляются только внутри 24-часового сервисного окна, открытого последним входящим сообщением пользователя; вне окна используйте шаблон.

type выбирает вид сообщения. Для text обязательно поле text. Для медиа-типов (image, video, audio, document, sticker) обязателен media.url; text становится подписью там, где WhatsApp её поддерживает (image, video, document).

Поддерживаемые форматы и лимиты размера:

typeMIMEмакс. размер
imageimage/jpeg, image/png5 MB
videovideo/mp4, video/3gpp16 MB
audioaudio/aac, audio/mp4, audio/mpeg, audio/amr, audio/ogg16 MB
documentpdf, doc(x), xls(x), ppt(x), txt100 MB
stickerimage/webp500 KB

media.url должен быть публичным HTTPS-URL.

Тело запроса

ПолеТипОбязательноеОписание
typestring (text, image, video, audio, document, sticker)даВид сообщения. text требует text; медиа-виды требуют media.url.
phonestringдаТелефон получателя в международном формате, только цифры (например 77778866697).
textstringнетТекст для type=text; подпись для image/video/document.
mediaobjectнетОписание медиа; обязательно для медиа-типов.

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

curl -X POST 'https://qnnect.kz/api/v1/{channel_uuid}/message/?token=YOUR_API_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
  "type": "text",
  "phone": "77778866697",
  "text": "Hello! Your order is ready."
}'

Ответы

  • 202 — Сообщение принято и поставлено в очередь доставки.
  • 400 — Неверный ввод. В error — машиночитаемый код.
  • 401 — Токен отсутствует (missing_token) или неверен (invalid_token).
  • 403 — Отправка приостановлена — компания заблокирована или нет средств (company_inactive).
  • 404 — Канала с таким channel_uuid нет (channel_not_found).
POST /api/v1/{channel_uuid}/template/Отправить шаблонное сообщение

Отправляет одобренный WhatsApp-шаблон. Шаблоны работают вне 24-часового окна — это способ начать диалог первым.

values заполняет нумерованные плейсхолдеры тела {{1}}, {{2}}, … по порядку; количество должно точно совпадать с шаблоном (см. GET /api/v1/{channel_uuid}/templates/variables.body). header_values и button_values заполняют плейсхолдеры заголовка/кнопок, если они есть в шаблоне.

Медиа-шаблоны (заголовок IMAGE/VIDEO/DOCUMENT): передайте публичный media_url (опционально с media_mime_type) или заранее зарегистрированный media_id. Карусели: cards подменяет картинки карточек по индексу; null оставляет образец из шаблона.

Тело запроса

ПолеТипОбязательноеОписание
phonestringдаТелефон получателя в международном формате, только цифры.
template_namestringдаИмя шаблона ровно как в каталоге (listTemplates).
valuesarrayнетЗначения плейсхолдеров тела {{1}}, {{2}}, … по порядку; количество должно совпадать с variables.body.
header_valuesarrayнетЗначения плейсхолдеров заголовка, если они есть в шаблоне.
button_valuesarrayнетЗначения плейсхолдеров кнопок (динамические суффиксы URL и т.п.).
media_urlstringнетПубличный URL медиа для шаблонов с медиа-заголовком.
media_idstringнетЗаранее зарегистрированный media id — альтернатива media_url.
media_mime_typestringнетMIME-тип media_url (например image/jpeg).
cardsarrayнетТолько карусель — подмена картинок карточек по индексу; null оставляет образец.

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

curl -X POST 'https://qnnect.kz/api/v1/{channel_uuid}/template/?token=YOUR_API_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
  "phone": "77778866697",
  "template_name": "order_confirm",
  "values": [
    "Ivan",
    "12345"
  ]
}'

Ответы

  • 202 — Шаблон принят и поставлен в очередь доставки.
  • 400 — Неверный ввод. В error — машиночитаемый код.
  • 401 — Токен отсутствует (missing_token) или неверен (invalid_token).
  • 403 — Отправка приостановлена — компания заблокирована или нет средств (company_inactive).
  • 404 — Канал или шаблон не найден.
GET /api/v1/{channel_uuid}/templates/Список шаблонов канала

Возвращает каталог шаблонов канала со статусами и количеством переменных. Используйте его, чтобы узнать, что можно отправить и сколько values ждёт каждый шаблон, до вызова отправки.

По умолчанию возвращаются все статусы, включая PENDING и REJECTED — реально отправить можно только APPROVED.

Query-параметры

  • status — Фильтр по точному статусу (например APPROVED, PENDING, REJECTED).
  • category — Фильтр по категории.
  • type — Фильтр по типу шаблона (TEXT, IMAGE, VIDEO, DOCUMENT, CAROUSEL, …).

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

curl 'https://qnnect.kz/api/v1/{channel_uuid}/templates/?token=YOUR_API_TOKEN'

Ответы

  • 200 — Каталог шаблонов канала.
  • 401 — Токен отсутствует (missing_token) или неверен (invalid_token).
  • 404 — Канала с таким channel_uuid нет (channel_not_found).

Webhooks

HOOK incoming_messageВходящее сообщение от пользователя WhatsApp

Отправляется на настроенный вами webhook-URL, когда пользователь WhatsApp пишет в канал. Webhook-URL настраиваются в кабинете (Интеграции → Webhooks) и включаются по типам событий.

Доставка: POST с JSON-телом, Content-Type: application/json; charset=utf-8. Ответьте любым 2xx за 12 секунд; неуспешные доставки ретраятся в фоне.

Payload

ПолеТипОписание
eventstring (incoming_message, outgoing_message, message_status_update)Тип события; совпадает с именем вебхука.
phonestringНомер телефона пользователя WhatsApp.
channel_idstringИдентификатор канала (Gupshup app id), к которому относится событие.
textstringТекст сообщения (пусто для нетекстового контента).
message_uuidstringИдентификатор сообщения; для API-отправок совпадает с QueuedResponse.message_uuid.
statusstringТекущий статус сообщения (queued, sent, delivered, read, failed, …).
senderstring (CLIENT, COMPANY, AI)Кто автор сообщения.
timestampstringВремя события (ISO 8601).
HOOK outgoing_messageИсходящее сообщение из канала

Отправляется, когда сообщение уходит из канала — из интерфейса QNNECT, по API или из интеграции. Контракт доставки как у incoming_message.

Payload

ПолеТипОписание
eventstring (incoming_message, outgoing_message, message_status_update)Тип события; совпадает с именем вебхука.
phonestringНомер телефона пользователя WhatsApp.
channel_idstringИдентификатор канала (Gupshup app id), к которому относится событие.
textstringТекст сообщения (пусто для нетекстового контента).
message_uuidstringИдентификатор сообщения; для API-отправок совпадает с QueuedResponse.message_uuid.
statusstringТекущий статус сообщения (queued, sent, delivered, read, failed, …).
senderstring (CLIENT, COMPANY, AI)Кто автор сообщения.
timestampstringВремя события (ISO 8601).
HOOK message_status_updateИзменился статус доставки сообщения

Отправляется, когда WhatsApp сообщает об изменении статуса ранее отправленного сообщения (sentdeliveredread или failed). Сопоставляйте по message_uuid. Контракт доставки как у incoming_message.

Payload

ПолеТипОписание
eventstring (incoming_message, outgoing_message, message_status_update)Тип события; совпадает с именем вебхука.
phonestringНомер телефона пользователя WhatsApp.
channel_idstringИдентификатор канала (Gupshup app id), к которому относится событие.
textstringТекст сообщения (пусто для нетекстового контента).
message_uuidstringИдентификатор сообщения; для API-отправок совпадает с QueuedResponse.message_uuid.
statusstringТекущий статус сообщения (queued, sent, delivered, read, failed, …).
senderstring (CLIENT, COMPANY, AI)Кто автор сообщения.
timestampstringВремя события (ISO 8601).