Ваше первое сообщение
Отправьте текстовое сообщение в WhatsApp, прочитайте переписку и покажите клиенту синие галочки.
Отправка текста
curl -X POST https://developers.wasync.app/api/v1/messages \
-H "Authorization: Bearer $WASYNC_API_KEY" \
-H "Content-Type: application/json" \
-d '{"connectionId":"conn_8f3a21","to":"40700000000","text":"Hi from my app 👋"}'{
"messageId": "cmqj3k2ab0001xyz",
"waMessageId": "[email protected]_3EB0A1B2C3",
"status": "sent"
}В поле to указываются только цифры в международном формате, без +, например 40700000000. Длина text — не более 4096 символов. Для медиафайлов передайте media вместо text:
{ filename, mimetype, data (base64, ≤ 16 MB), caption? } — строго одно из двух. Для голосовых сообщений используйте mimetype: audio/ogg и имя файла вида voice-*.ogg. Требуется whatsapp.send.
Установите HTTP-таймаут не менее 180 секунд
Отправка через qr обычно занимает 1–7 с, для длинных текстов — до 20 с, а путь самовосстановления может занять около 2,5 минуты. Отправка через cloud_api занимает около 1 с. Медленная отправка — это не ошибка: клиент, который сдаётся через 30 с и повторяет запрос, отправит покупателю сообщение дважды. Всегда передавайте idempotencyKey (UUID на каждую логическую отправку) и повторяйте запрос с тем же ключом.
Два идентификатора — используйте для связи нужный
В ответе приходят два идентификатора, и они не взаимозаменяемы.
| Id | Где встречается | Для чего использовать |
|---|---|---|
messageId (cuid) | messageId в POST, id в GET, message.id в обоих webhooks | Единственный идентификатор для связывания. Сохраните его при отправке, дедуплицируйте по нему, сопоставляйте с ним события message.status. |
waMessageId | waMessageId (REST), wa_id (webhooks), wa_message_id (отправка медиа) | Обращения в поддержку и отладка. Может быть null — не связывайте и не дедуплицируйте по нему. |
Стоит предусмотреть один вырожденный случай: ответ { "messageId": null, "waMessageId": "…", "status": …, "persisted": false } с HTTP 200 означает, что сообщение доставлено, но не сохранено. Не повторяйте запрос.
Чтение переписки
curl "https://developers.wasync.app/api/v1/messages?connectionId=conn_8f3a21&limit=20" \
-H "Authorization: Bearer $WASYNC_API_KEY"{
"messages": [
{
"id": "cmqj3k2ab0001xyz",
"waMessageId": "[email protected]_3EB0A1B2C3",
"connectionId": "conn_8f3a21",
"direction": "outgoing",
"text": "Hi from my app 👋",
"mediaUrl": null,
"mediaType": null,
"status": "delivered",
"errorMessage": null,
"createdAt": "2026-07-22T10:00:00.000Z"
}
],
"nextCursor": "cmqj3k2ab0001xyz",
"hasMore": true
}Сначала новые сообщения, постраничная выдача по курсору: limit — от 1 до 100 (по умолчанию 20), а в cursor передаётся nextCursor из предыдущего ответа. Требуется whatsapp.read.
Синие галочки для клиента
curl -X POST https://developers.wasync.app/api/v1/messages/read \
-H "Authorization: Bearer $WASYNC_API_KEY" \
-H "Content-Type: application/json" \
-d '{"connectionId":"conn_8f3a21","phone":"40700000000"}'Вызывайте этот метод, когда оператор открывает диалог в вашем интерфейсе. Иначе никто не откроет чат в WhatsApp, сообщения клиента останутся с двумя серыми галочками, и переписка будет выглядеть проигнорированной. Тело запроса — { connectionId, phone?, messageId? }, при этом нужен хотя бы один из параметров phone / messageId (cuid входящего сообщения; если переданы оба, приоритет у messageId). Метод требует whatsapp.send, а не whatsapp.read, потому что клиенту отправляется уведомление о прочтении. Идемпотентен, ключ не нужен, лимита запросов нет. Возвращает { "ok": true, "marked": 3 }.
Дальше
- Получайте уведомления о входящих сообщениях вместо опроса: Webhooks.
- Соберите интеграцию без кода: n8n или MCP.
- Сгенерируйте клиент по контракту:
npx @openapitools/openapi-generator-cli generate -i https://developers.wasync.app/openapi.json -g typescript-fetch -o ./wasync-client
Ваш первый вызов
Получите список подключений, доступных вашему ключу, и проверьте, хватает ли у вас ёмкости, прежде чем создавать ещё одно.
Продукт
Приложение WASync внутри Bitrix24, описанное по функциям. На эти страницы ведут ссылки из списка «Новое» в приложении, и мы поддерживаем их в актуальном состоянии по мере изменения функций.