для разработчиков На сайт Rentu

Ошибки

У каждой ошибки есть машинный код. Ветвиться нужно по нему, а не по HTTP-статусу: статусы переиспользуются.

Структура#

json
{
  "success": false,
  "error": {
    "code": "plan_required",
    "message": "Endpoint requires PRO plan",
    "details": { "required_plan": "pro", "current_plan": "basic" }
  }
}

Все коды#

Учётные данные#

КодHTTPКогдаЧто делать
unauthorized401Нет токена, токен испорчен или подписан не тем секретом; ключ неизвестен, отключён или секрет неверенПроверить учётные данные. Повтор без изменений не поможет
token_expired401Истёк час жизни токенаПолучить новый токен и повторить запрос

Права и тариф#

КодHTTPКогдаЧто делать
forbidden_sc403У сотрудника, которому принадлежит ключ, нет прав на этот метод или этот торговый центрПроверить его роли в ТЦ. Повтор не поможет
plan_required403Метод или значение параметра доступны только на PRO. В details придут required_plan и current_planПерейти на PRO либо использовать доступное значение
payment_required402У торгового центра ограничение из-за оплатыВопрос к торговому центру, не технический
subscription_suspended402Доступ торгового центра приостановленТо же

Данные#

КодHTTPКогдаЧто делать
not_found404Не найден торговый центр, точка или зона; либо запрошенный идентификатор принадлежит другому ТЦПроверить идентификаторы
traffic_not_configured404В торговом центре не настроена система подсчёта посещаемостиПовторять бесполезно: attendance и traffic_areas не заработают, пока ТЦ не подключит подсчёт
already_exists_in_sc409POST /events: событие с такими же названием, типом и датами уже естьСчитать событие созданным. Молча подменять существующее API не будет

Параметры#

КодHTTPКогдаЧто делать
period_too_long422Запрошенный период больше, чем разрешает тариф ТЦРазбить период или перейти на PRO
fresh_data_requires_pro422На Basic запрошен сегодняшний деньСтавить end_date не позже вчера либо перейти на PRO
too_long_date422Превышено фиксированное окно метода: 31 день для почасовой посещаемости, 31 день для чековСузить период. Это не тарифное ограничение, PRO не поможет
validation_error422Любая другая ошибка входа: неизвестное значение перечисления, end_date раньше start_date, per_page вне диапазона, неразобранная датаИсправить по details

Временные сбои#

КодHTTPКогдаЧто делать
rate_limited429Превышен лимит частотыПодождать Retry-After секунд
rights_unavailable503Сервис прав не ответилПовторить с задержкой
traffic_unavailable503Не ответила подсистема подсчёта посещаемостиПовторить с задержкой
query_timeout504Выборка не уложилась в отведённое время. Обычно причина в слишком широком периоде на точке с большим объёмом чековСузить период и повторить
internal_error500Непредвиденная ошибка на нашей сторонеПовторить с задержкой; если повторяется — написать нам

Что повторять, а что нет#

Повторять имеет смысл ровно шесть кодов:

token_expired        → сначала обновить токен
rate_limited         → выждать Retry-After
rights_unavailable   → экспоненциальная задержка
traffic_unavailable  → экспоненциальная задержка
query_timeout        → сузить период, затем повторить
internal_error       → экспоненциальная задержка

Остальные коды описывают состояние, которое само не изменится: неверные параметры, отсутствие прав, недостаточный тариф, блокировка ТЦ. Повтор только съест лимит.

Отдельно стоит rights_unavailable. Когда сервис прав недоступен, мы не отдаём данные, а возвращаем 503. Открыть доступ «потому что не смогли проверить» нельзя: у сотрудника права могли уже отобрать. Интеграцию стоит строить так, чтобы 503 означал «попробуем позже», а не «данных нет».

Пример разбора#

python
resp = session.get(url, headers=headers)
body = resp.json()

if body.get("success"):
    handle(body["data"])
else:
    code = body["error"]["code"]
    if code == "token_expired":
        refresh_token(); retry()
    elif code == "rate_limited":
        sleep(int(resp.headers.get("Retry-After", 60))); retry()
    elif code in ("rights_unavailable", "traffic_unavailable", "internal_error"):
        backoff_retry()
    else:
        log_and_stop(code, body["error"]["message"])

Тексты в message написаны по-русски и предназначены человеку. Привязываться к ним в коде не стоит: они могут меняться, а code не меняется.