MMeerPartners docs

Коды ошибок API

Единый формат ошибки API MeerPartners, HTTP-коды и таблица доменных кодов с пояснениями. Как клиенту реагировать на 401, 403, 409, 422, 429 и 5xx при интеграции.

API MeerPartners возвращает ошибки в едином формате со стабильным строковым кодом. Роутьте логику по полю code, а не по тексту сообщения: текст может меняться и локализоваться, код — нет.

Формат ошибки

{
  "error": {
    "code": "POSTBACK_BAD_SIGNATURE",
    "message": "Подпись неверна",
    "details": {}
  }
}
ПолеЗначение
codeСтабильная константа в SCREAMING_SNAKE_CASE — по ней клиент принимает решение
messageЧеловекочитаемое пояснение (может меняться)
detailsДоп. контекст: для валидации — карта полей; иногда limit, tenants и т.п.

Главное правило

Никогда не парсите message для логики. Ветвитесь по code и HTTP-статусу. message — только для логов и показа человеку.

HTTP-коды

HTTPСмыслЧто делать клиенту
400Некорректный запрос (синтаксис/семантика, устаревший timestamp)Исправить запрос, не ретраить вслепую
401Не аутентифицирован: нет/битый токен или подписьПроверить ключ/подпись/токен
403Нет прав: скоуп, роль, чужой tenantПроверить скоуп ключа / роль / tenant
404Ресурс не найден или невидимПроверить идентификатор
409Конфликт состояния/идемпотентности (в т.ч. replay)Пересобрать запрос (новый timestamp/ключ идемпотентности)
410Ресурс «протух» или отключён (ссылка/оффер неактивны)Не ретраить
422Ошибка валидации полейИсправить тело по details
429Превышен лимит частотыРетрай с backoff, смотреть Retry-After
500Внутренняя ошибкаРетрай с backoff; если повторяется — эскалация
503Зависимость недоступна (fail-closed)Ретрай позже с backoff

Доменные коды

Аутентификация и ключи

КодHTTPКогда
TENANT_API_KEY_INVALID401Ключ неизвестен, неактивен, отозван или истёк; нет X-Api-Key-Id
TENANT_API_KEY_SCOPE_DENIED403У ключа нет нужного скоупа (postback / sso)
TENANT_SUSPENDED403Бизнес (tenant) неактивен
TOKEN_EXPIRED401JWT истёк
TOKEN_INVALID401JWT не разобрался/невалиден
TOKEN_WRONG_TYPE401Ожидался refresh, пришёл другой тип (или наоборот)
TOKEN_REVOKED401Refresh-токен уже использован/отозван
ACCESS_REVOKED401Доступ отозван на стороне MeerID (бан/удаление)
EMBED_SCOPE_DENIED403Действие требует полного токена, а пришёл embed-scoped

Postback

КодHTTPКогда
POSTBACK_BAD_SIGNATURE401HMAC-подпись не сошлась
POSTBACK_STALE_TIMESTAMP400X-Timestamp вне окна ±300 с
POSTBACK_REPLAY409Повтор той же подписи в окне памяти
POSTBACK_TENANT_MISMATCH403X-Tenant-Id не совпал с tenant ключа
POSTBACK_MISSING_FIELD422Нет обязательного поля для event_type (или невалидное тело)
POSTBACK_UNKNOWN_REF200Нет атрибутируемого клика — accepted:false (не ошибка)
POSTBACK_REFUND_NO_CONVERSION200Refund на несуществующую конверсию — accepted:false
POSTBACK_RATE_LIMITED429Слишком много postback на ключ

Коды на 200 — не сбой

POSTBACK_UNKNOWN_REF и POSTBACK_REFUND_NO_CONVERSION приходят с HTTP 200 и accepted:false. Это штатные исходы (органика / неприменимый refund), а не ошибки связи — не ретрайте их.

Token-exchange (SSO)

КодHTTPКогда
EXCHANGE_DENIED401Невалидная подпись, нет/просрочен X-Timestamp, tenant неактивен
EXCHANGE_REPLAY401Повтор той же подписи
USER_BANNED403Пользователь заблокирован

Вебхуки

КодHTTPКогда
DEPOSIT_WEBHOOK_UNCONFIGURED503Секрет вебхука депозита не задан (fail-closed)
DEPOSIT_WEBHOOK_SIGNATURE_INVALID401Нет заголовков / неверная подпись / timestamp вне окна / replay
DEPOSIT_WEBHOOK_REPLAY_STORE_UNAVAILABLE503Хранилище replay-защиты недоступно
INVALID_PAYLOAD400Невалидный JSON в теле
LOGOUT_TOKEN_INVALID401Невалидный logout_token (back-channel logout MeerID)
WEBHOOK_TIMESTAMP_STALE401Identity-вебхук MeerID вне окна свежести

Трекинг

КодHTTPКогда
TRACKING_LINK_NOT_FOUND404Неизвестный {code} ссылки
LINK_INACTIVE410Ссылка отключена (без fallback)
OFFER_INACTIVE410Оффер неактивен (без fallback)
TRACKING_RATE_LIMITED429Явный флуд по трекинг-эндпоинту

Общие

КодHTTPКогда
VALIDATION_ERROR422Ошибка валидации тела (карта полей в details)
FORBIDDEN403Недостаточно прав/роли
TENANT_HEADER_REQUIRED400Несколько бизнесов и не указан X-Tenant-Id (details.tenants)
TOO_MANY_REQUESTS429Превышен лимит (заголовок Retry-After)
SERVICE_UNAVAILABLE503Зависимость недоступна (fail-closed)
INTERNAL_SERVER_ERROR500Необработанная ошибка

Пользовательские ошибки кабинета

Коды, которые видит человек в интерфейсе кабинета (например BELOW_MIN_PAYOUT, KYC_REQUIRED, INSUFFICIENT_BALANCE, OFFER_PAUSED, SELF_REFERRAL_FORBIDDEN), описаны в пользовательском справочнике. Полный перечень с человеческими формулировками — на странице Справочник ошибок.

Что дальше