What's new, 21 October 2026: A customer who sends several messages before the bot's first reply no longer gets the opening sequence of a Chat Flow twice
WASync · Developers

Ошибки и идемпотентность

Ориентируйтесь на код ошибки, а не на статус. И делайте безопасным каждый повторный запрос, который стоит денег.

Ориентируйтесь на код, а не на статус

Ошибки возвращаются в виде { "error": "<code>" }. Одного статуса недостаточно, чтобы решить, что делать: два ответа 403 могут требовать противоположных действий.

СтатусКодЧто это значит и что делать
401invalid_keyКлюч неизвестен или отозван. Создайте новый; повторные запросы не помогут.
403ip_not_allowedУ ключа есть список разрешённых IP-адресов, и этого адреса в нём нет. С ключом всё в порядке — добавьте адрес на developers.wasync.app/keys. Ключ менять не нужно.
403insufficient_scopeУ учётных данных нет области доступа (scope), которая нужна этому эндпоинту.
403forbidden_portal_kindPOST /connections на портале Bitrix24. Подключения на таких порталах создаёт администратор портала.
400invalid_phone_numberphoneNumber должен содержать только цифры, без ведущего +.
400invalid_webhookURL должен быть HTTPS на общедоступном хосте.
402—Лицензия подключения истекла. См. Лицензии и trial.
409already_connectedСессия активна, связывать нечего.
409not_supported_for_providerОперация только для qr вызвана на номере cloud_api. Это окончательно — не повторяйте запрос.
422recipient_not_on_whatsappWhatsApp не нашёл аккаунт получателя. Проверьте, что номер указан в международном формате (сначала код страны, без ведущего нуля) и что человек пользуется WhatsApp. Для этого номера ошибка окончательная — не повторяйте запрос без изменений.
502send_failedWhatsApp не смог доставить сообщение по причине, не связанной с получателем (сессия или провайдер). Повторите через короткую паузу; если ошибка не уходит, проверьте статус подключения.
429warmup_limitedПочасовой лимит прогрева для нового номера qr. Делайте паузу в несколько минут.
429rate_limitedЗащита от злоупотреблений. Учитывайте Retry-After, если он есть; в любом случае держите паузу по умолчанию.
502pairing_code_unavailableОбычная ситуация, не сбой — переключитесь на QR-код.

Retry-After приходит не в каждом ответе 409/429, поэтому не стройте паузу между повторами только на нём.

Идемпотентность для POST /connections

Создание подключения запускает сессию WhatsApp и занимает платный слот. Если клиент получит тайм-аут и повторит запрос, он создаст второе подключение, и вы незаметно заплатите за два слота для одного клиента. Необязательный заголовок Idempotency-Key закрывает эту лазейку. Он поддерживается только в POST /connections; если его не передавать, поведение остаётся прежним.

Ключ — любая непрозрачная строка длиной до 255 символов. Он привязан к вашему рабочему пространству (два партнёра с одинаковой строкой никогда не пересекутся) и действует 24 часа с первого запроса, в котором был использован.

Новый ключ — подключение создаётся как обычно → 201 Created.
Тот же ключ, то же тело, в пределах TTL — возвращается то же подключение, ничего не создаётся повторно: 200 OK и заголовок ответа Idempotency-Replayed: true. Значение qr в этом ответе запрашивается заново, а не берётся из сохранённого при первом создании: коды сопряжения меняются примерно каждые 20 секунд, поэтому устаревший QR просто не отсканируется. Считайте 200 успехом, а не ошибкой.
Тот же ключ, другое тело, в пределах TTL — 400 { "error": "idempotency_key_reuse" }. Сравнивается хеш канонического тела, поэтому порядок ключей JSON не имеет значения.
Тот же ключ, первый запрос ещё выполняется — 409 { "error": "idempotency_in_progress" } с Retry-After: 1. Учтите его и повторите запрос с тем же ключом.

Ключ длиннее 255 символов отклоняется с ошибкой 400 { "error": "idempotency_key_invalid" } — он никогда не обрезается. Пустой заголовок или заголовок из одних пробелов считается отсутствующим. Структура тела ответа во всех случаях не меняется.

Создавайте один ключ на каждую попытку подключения клиента

Новый UUID (crypto.randomUUID()), созданный непосредственно перед вызовом и используемый только в повторах этого вызова. Не используйте один ключ на процесс, на API key, на день или константу. При таком грубом ключе второму подключаемому клиенту вернётся подключение первого вместо его собственного.

Идемпотентность при отправке

POST /messages принимает idempotencyKey в теле запроса (не в заголовке). Передавайте его всегда — по одному UUID на каждую логическую отправку.

  • При любой ошибке или тайм-ауте повторяйте запрос с тем же ключом. Новый ключ означает второе настоящее сообщение WhatsApp на чужом телефоне.
  • При 409 in_progress опрашивайте с тем же ключом: учитывайте Retry-After, если он есть, иначе делайте паузу около 5 с.
  • Медленная отправка — не неудачная отправка. Установите HTTP-тайм-аут не менее 180 с.
Была ли эта страница полезной?

On this page