Области и ошибки
Предоставляйте минимальные права и обрабатывайте каждый стабильный код ошибки публичного API.
Предоставляйте минимальные права и обрабатывайте каждый стабильный код ошибки публичного API.
Каждая операция публичного API требует одну явную область. Валидные учётные данные без этой области получают 403 insufficient_scope; они никогда не повышаются молча до более широкого доступа.
Справочник областей#
| Область | Разрешает |
|---|---|
account:read | Читать аутентифицированный аккаунт, тариф, права и сводку кошелька |
sites:read | Перечислять и получать сайты |
sites:write | Создавать, обновлять, публиковать и отменять публикацию сайтов |
agents:read | Читать настройки агентов |
agents:write | Обновлять характер, инструкции, языки, голос, состояние встраивания и разрешённые origin |
knowledge:read | Перечислять источники знаний и FAQ |
knowledge:write | Принимать или удалять текстовые источники и создавать, обновлять или удалять FAQ |
conversations:read | Перечислять диалоги и получать их сообщения |
leads:read | Перечислять собранные заявки |
leads:write | Создавать, обновлять, квалифицировать и принимать заявки в воронку возможностей |
pipeline:read | Читать стадии, аккаунты, возможности, активности и состояние синхронизации CRM |
pipeline:write | Настраивать стадии; создавать или обновлять возможности и аккаунты; импортировать или повторять результаты CRM |
analytics:read | Читать события аналитики сайта |
connectors:read | Перечислять состояние коннекторов без возврата секретов |
connectors:write | Создавать, обновлять, включать, отключать и удалять коннекторы |
domains:read | Читать состояние доменов и требуемые DNS-записи |
domains:write | Подключать, проверять, обновлять и удалять домены |
broadcasts:read | Перечислять рассылки и состояние доставки |
broadcasts:write | Создавать черновики и ставить в очередь отправку рассылки |
notifications:read | Перечислять уведомления владельца |
notifications:write | Отмечать уведомления прочитанными или непрочитанными |
monetization:read | Перечислять продукты монетизации |
monetization:write | Создавать, обновлять, активировать, деактивировать и удалять продукты |
usage:read | Читать учитываемые события использования |
webhooks:read | Перечислять конечные точки вебхуков и состояние доставки |
webhooks:write | Создавать и удалять конечные точки вебхуков |
Используйте области чтения для задач отчётности. Добавляйте область записи только когда интеграция выполняет эту мутацию. Например, экспорту заявок обычно нужны sites:read и leads:read, а не sites:write или agents:write.
Сбои областей#
{
"error": {
"code": "insufficient_scope",
"message": "The API key does not grant the required scope.",
"details": { "required": ["sites:write"] },
"request_id": "6c0b2f2e-..."
}
}Создайте замещающий ключ с недостающей областью и обновите серверный секрет. Области существующего ключа API нельзя расширить на месте; это делает изменения привилегий явными и аудируемыми.
Оболочка ошибок#
Все ошибки API используют одну форму верхнего уровня:
type ApiError = {
error: {
code: string;
message: string;
details?: unknown;
request_id: string;
};
};Ветвитесь на error.code, а не на английском message. Сообщения могут улучшаться без смены версии. Логируйте error.request_id и заголовок ответа x-request-id с именем операции, статусом и попыткой повтора — но никогда не логируйте заголовок авторизации или секреты запроса.
Справочник статусов и кодов#
| HTTP | Стабильный код | Значение | Нормальный ответ |
|---|---|---|---|
400 | invalid_request | Валидация не прошла или поле не поддерживается | Исправьте поля в details; не повторяйте неизменённый ввод |
400 | invalid_json | Тело не является объектом JSON или содержит невалидный JSON | Сериализуйте один валидный объект JSON |
401 | authentication_required | Заголовок Bearer отсутствует | Прикрепите серверные учётные данные |
401 | invalid_api_key | Ключ недействителен, истёк, отозван или его владелец больше не существует | Замените или ротируйте ключ |
403 | subscription_required | У владельца нет активного платного тарифа | Восстановите подписку перед повтором |
403 | insufficient_scope | Учётным данным не хватает области операции | Создайте замещающие учётные данные с минимальными правами |
403 | account_paused | Доступ API приостановлен для аккаунта | Возобновите доступ API или свяжитесь с владельцем аккаунта |
404 | not_found | Конечная точка или принадлежащий ресурс не найдены | Проверьте путь и ID, принадлежащий арендатору |
409 | conflict | Текущее состояние ресурса предотвращает действие | Прочитайте текущее состояние перед повтором |
415 | invalid_request | Тело мутации не application/json | Отправьте Content-Type: application/json |
429 | rate_limit_exceeded | Минутная корзина тарифа ключа исчерпана | Дождитесь Retry-After и примените джиттер |
500 | internal_error | Запрос не может быть завершён | Повторите безопасную или идемпотентную операцию и сообщите ID запроса |
Ресурсы вне аккаунта владельца учётных данных могут возвращать 404 вместо раскрытия, существует ли ID другого арендатора.
Детали валидации#
Валидация полей возвращает пути, которые можно показать рядом с вашими собственными элементами формы:
{
"error": {
"code": "invalid_request",
"message": "Request validation failed.",
"details": [
{ "path": "content.headline", "message": "String must contain at least 1 character(s)" }
],
"request_id": "6c0b2f2e-..."
}
}Тела мутаций должны быть объектами JSON. Массивы, пустые тела, данные формы и JSON, отправленный с текстовым типом контента, отклоняются.
Решения о повторе#
- Повторяйте
429после числа секунд вRetry-After. - Повторяйте
500только для безопасных чтений или записей, защищённых тем жеIdempotency-Key. - Повторяйте идемпотентный
409в процессе после его заголовкаRetry-After: 2. - Не повторяйте
400,401,403,404или конфликт состояния, пока причина не изменится.
См. Лимиты частоты для поведения отката и Справочник API для требуемой области каждой операции.