CRM API: ошибки и лимиты

← CRM API: начало работы

Ошибки и request ID

Ошибки имеют единый envelope:

JSON
{
  "error": {
    "code": "version_conflict",
    "message": "Ресурс был изменён другим участником",
    "details": { "currentVersion": 8 },
    "requestId": "06aa869a-74ea-4184-b1cf-c3d12de6ef7f"
  }
}
HTTPCodeЗначение
400validation_error, invalid_cursorНеверный DTO, query, неизвестное поле или cursor
401invalid_tokenТокен неверен, истёк, отозван или запрос пришёл вне CIDR allowlist
403insufficient_scopeНе хватает обязательного scope
404not_foundРесурс не найден в организации токена
409version_conflictCAS-конфликт; актуальная версия находится в details.currentVersion
409idempotency_conflict, idempotency_in_progressКонфликт ключа идемпотентности
409crm_provider_not_supportedОрганизация использует неподдерживаемый внешний CRM-провайдер
410cursor_expired, external_reference_deletedНужна полная синхронизация или новый externalId
413payload_too_largeТело запроса превышает лимит CRM API
422validation_errorНарушено доменное ограничение
428precondition_requiredВ upsert существующего mapping отсутствует expectedVersion
429rate_limit_exceededПревышен rate limit
503rate_limiter_unavailableПроверка rate limit недоступна; запрос не выполняется

Передавайте собственный безопасный X-Request-Id длиной до 128 символов или сохраняйте выданный сервером заголовок X-Request-Id для диагностики.

Rate limits

Лимиты считаются отдельно для каждого applicationId в минутных окнах:

  • GET и HEAD: 600 запросов в минуту;
  • POST, PATCH и DELETE: 120 запросов в минуту.

Отдельно ограничены неудачные попытки аутентификации: 30 в минуту с одного IP. При превышении ответ 429 приходит вместо 401 и не сообщает, был ли токен близок к верному.

После успешной авторизации и проверки CRM-провайдера rate-limit guard добавляет RateLimit-Limit, RateLimit-Remaining и RateLimit-Reset; последний — число секунд до сброса окна. При 429 дополнительно приходит Retry-After. Соблюдайте этот заголовок, используйте exponential backoff с jitter и ограничивайте параллелизм batch-запросов.

Актуальные значения всех лимитов отдаёт GET /capabilities в полях rateLimits и limits — они берутся из тех же констант, что применяет сервер, поэтому не расходятся с поведением.

Совместимость и вывод из эксплуатации

Ломающие изменения внутри v1 запрещены: удаление поля или маршрута требует новой major-версии API. Маршрут, который планируется вывести, заранее начинает отдавать заголовки Deprecation и Sunset с датами, а при наличии замены — Link с rel="successor-version". Между Deprecation и Sunset проходит не менее шести месяцев. Проверяйте эти заголовки в интеграции: их появление означает, что маршрут перестанет работать в указанную дату.

Зарезервировано, но не опубликовано в v1

Публичный API v1 не открывает управление сотрудниками, CRM-правами, API-приложениями и подписками на webhooks, а также чаты и сообщения. Всё это остаётся в защищённом кабинете: API-токены, Webhooks, Сотрудники. Не стройте интеграцию на предполагаемых путях: появление маршрута будет отражено в OpenAPI и этой документации.