Любой ответ REST Битрикс24 при ошибке возвращает JSON с полями error и error_description. Надёжная интеграция различает временные сбои (стоит повторить) и постоянные (нужно чинить код или права), опираясь на код ошибки и HTTP-статус.
Структура ответа при ошибке
Успешный ответ содержит поле result. При ошибке вместо него приходит объект с машинным кодом и человекочитаемым описанием:
{ "error": "expired_token", "error_description": "The access token provided has expired." }
error— короткий машинный код, по нему строят логику обработки.error_description— пояснение для человека и логов.
Опираться в коде нужно на error, а не на текст описания: формулировки могут меняться, коды стабильнее.
HTTP-коды ответов
REST Битрикс24 использует и HTTP-статусы, и коды в теле. Ориентируйтесь на оба: статус даёт класс проблемы, поле error — конкретику.
| HTTP | Смысл | Действие |
|---|---|---|
| 200 | Успех (но проверьте error в теле у batch) | Обработать result |
| 400 | Неверные параметры запроса | Исправить запрос |
| 401 | Проблема аутентификации, токен | Обновить токен |
| 403 | Нет прав/scope на метод | Проверить права |
| 404 | Метод или объект не найден | Проверить имя метода/ID |
| 500 | Внутренняя ошибка портала | Повторить с паузой |
| 503 | Сервис недоступен/перегрузка | Повторить с backoff |
Частые коды ошибок
Набор кодов, которые встречаются чаще всего, и что за ними стоит:
expired_token/invalid_token— токен доступа истёк или недействителен; нужно обновить через refresh-токен (для OAuth-приложений).QUERY_LIMIT_EXCEEDED— превышен лимит частоты запросов; повторить позже.OPERATION_TIME_LIMIT— исчерпан операционный лимит нагрузки метода.ERROR_METHOD_NOT_FOUND— метод не существует или недоступен в текущем scope.insufficient_scope— приложению не выдано право на этот раздел API.ACCESS_DENIED— у пользователя нет прав на объект или действие.INVALID_CREDENTIALS— неверные учётные данные вебхука/приложения.
Временные и постоянные ошибки
Ключевое решение при обработке — повторять запрос или нет. Разделяйте ошибки на два класса:
| Класс | Коды | Реакция |
|---|---|---|
| Временные | QUERY_LIMIT_EXCEEDED, OPERATION_TIME_LIMIT, 500, 503 | Повтор с нарастающей паузой |
| Аутентификация | expired_token | Обновить токен и повторить |
| Постоянные | 400, ERROR_METHOD_NOT_FOUND, insufficient_scope | Не повторять, чинить код/права |
Стратегия повторов
Грамотный retry строится на экспоненциальной задержке с ограничением числа попыток:
- При временной ошибке ждём базовую паузу (например, 1 секунду).
- Каждую следующую попытку удваиваем задержку: 1, 2, 4, 8 секунд.
- Ограничиваем число повторов (например, 5) и общий тайм-аут.
- Для
OPERATION_TIME_LIMITопираемся наoperating_reset_atиз блокаtimeи ждём до сброса окна. - При
expired_tokenсначала обновляем токен, потом повторяем без задержки.
Все неуспешные попытки логируйте с кодом ошибки, методом и параметрами — это резко ускоряет разбор инцидентов.
Ошибки внутри batch
Отдельный случай — ошибки в пакетных запросах. Метод batch может вернуть HTTP 200, но при этом часть вложенных команд провалится. Ошибки лежат не в корне ответа, а в result.result_error с ключами по именам команд.
Правильная обработка:
- Всегда проверять
result_error, даже при статусе 200. - Сопоставлять ошибки с именами команд, чтобы понять, какая операция не прошла.
- Учитывать
halt: приhalt=1часть команд могла не запуститься вовсе.
Не полагайтесь на один лишь HTTP-статус пакета — он не отражает судьбу отдельных команд.
Идемпотентность и логирование
Повторы неизбежно порождают риск дублей: запрос мог выполниться на портале, но ответ потеряться в сети — и retry создаст второй объект. Чтобы этого избежать, проектируйте операции идемпотентно.
- Внешний ключ. Храните на своей стороне идентификатор внешней системы и перед созданием проверяйте, нет ли уже такого объекта (например, поиском по
UF_*-полю). - Upsert вместо add. Где возможно, сначала ищите объект, затем решайте —
addилиupdate. - Журнал операций. Логируйте каждый запрос: метод, параметры, HTTP-статус, поле
errorи время. Это ускоряет разбор инцидентов в разы.
Наблюдаемость — не роскошь, а условие эксплуатации. Без журнала «данные иногда не доезжают» превращается в неразрешимую загадку, а с журналом видно конкретный код ошибки и запрос, на котором всё сломалось.
Итог
Обработка ошибок в REST Битрикс24 строится на чтении поля error, HTTP-статуса и блока time. Разделяйте временные ошибки (повтор с backoff) и постоянные (правка кода или прав), обновляйте токен по expired_token и обязательно проверяйте result_error внутри batch.
Мы в B2Bsite закладываем в интеграции с Битрикс24 устойчивую обработку ошибок: повторы, логирование, идемпотентность и разбор пакетных сбоев. Если ваш обмен молча теряет данные при сбоях портала — поможем сделать его предсказуемым и наблюдаемым.
Частые вопросы
Как выглядит ответ при ошибке?
Это JSON с полями error (машинный код) и error_description (пояснение). Поля result в таком ответе нет. В коде опирайтесь именно на error.
Что делать при ошибке expired_token?
Обновить токен доступа через refresh-токен для OAuth-приложения, затем повторить запрос. У вебхуков токен не истекает, но может быть отозван.
Нужно ли повторять запрос при ошибке 400?
Нет. Код 400 означает неверные параметры — это постоянная ошибка. Повтор не поможет, нужно исправить сам запрос.
Как правильно делать повторы?
Экспоненциальный backoff: 1, 2, 4, 8 секунд с ограничением числа попыток. Для OPERATION_TIME_LIMIT ждать до момента operating_reset_at.
Почему batch вернул 200, но данные не записались?
Часть команд провалилась. Ошибки лежат в result.result_error по именам команд, а не в корне ответа. Проверяйте это поле всегда.
Чем отличается insufficient_scope от ACCESS_DENIED?
insufficient_scope означает, что приложению не выдано право на раздел API. ACCESS_DENIED — что у самого пользователя нет прав на объект или действие.
Что означает ERROR_METHOD_NOT_FOUND?
Метод не существует, опечатан или недоступен в текущем scope приложения. Проверьте имя метода и выданные приложению права.
Поможем с настройкой и поддержкой Для разработчиков
Поможем с настройкой, доработкой и поддержкой Для разработчиков.