Что говорит код ошибки API
Конверт ошибки, откуда берётся её код, и каждый код, которым отвечает API, — что он значит и что с ним делать.
4 мин чтения
Когда API отклоняет запрос или не может его выполнить, в его ответе есть код — устойчивое имя того, что произошло. Эта страница перечисляет коды, которыми отвечает API, и говорит, что значит каждый и что с ним делать. Ветвитесь по коду, а не по сообщению.
Конверт ошибки
Ошибка, о которой API сообщает сам, приходит в одном конверте. Статья Обзор описывает его поля и те немногие ответы, которые приходят без него.
{
"error": {
"code": "budget_exceeded",
"message": "Budget 74438200973595137 (monthly) exceeded",
"request_id": "7c2e9a41-3b8d-4f6a-9e15-c04d2b7a8f63"
}
}Код, который несёт больше, кладёт это в details. Пул, у которого кончились подключения, называет там последний сбой вызова.
{
"error": {
"code": "pool_exhausted",
"message": "No provider connection could serve the request after 3 attempt(s)",
"details": { "last_error_code": "provider_rate_limit" },
"request_id": "0d3c1b9e-5a47-4f0e-9a36-2f6c8d1e7b42"
}
}Рядом с каждым кодом таблицы ниже печатают HTTP-статус, которым API на него отвечает, — два для кода с двумя значениями, — и прочерк для кода, которым никогда не отвечают на запрос.
SDK сохраняют код
Оба SDK выбрасывают ошибку на ответ-ошибку, и ошибка сохраняет код API: code в Node.js, errorCode в PHP. Первая таблица ниже называет тип, который каждый SDK выбрасывает для её кодов. У кодов двух других таблиц собственного типа нет, и правило под каждой из этих таблиц говорит, какой тип выбрасывает SDK. Статья Обработка ошибок показывает, как их ловить.
Коды, для которых у SDK есть тип
Для этих кодов каждый SDK выбрасывает собственный тип. Большинство из них приходит от операций, которые вызывает SDK: запроса к флоу и его вызовов модели, кредитов клиента.
| Код | HTTP-статус | Тип ошибки в SDK | Что это значит | Что делать |
|---|---|---|---|---|
invalid_api_key | 401 | AuthenticationException PHPAuthenticationError Node.js | В запросе нет API-ключа или есть ключ, которого Slen не знает, — скопированный с ошибкой, отозванный или заменённый ротацией. | Проверьте значение заголовка Authorization. Отозванный ключ больше не работает — выпустите новый в консоли. |
insufficient_scope | 403 | AuthenticationException PHPAuthenticationError Node.js | Ключ действителен, но у него нет разрешения, которого требует операция, — или его не включает роль человека, вошедшего в консоль. Сообщение ошибки называет это разрешение и в обоих случаях говорит об API-ключе. | Используйте ключ с этим разрешением или выпустите такой ключ. Давайте ключу только те разрешения, которые нужны его сервису. Человеку, вошедшему в консоль, нужна роль, которая включает это разрешение; её даёт владелец или администратор организации. |
not_authenticated | 401 | AuthenticationException PHPAuthenticationError Node.js | Никто не вошёл. В запросе нет ни API-ключа, ни сессии человека, вошедшего в консоль, или сессия закончилась. | Отправьте API-ключ в заголовке Authorization или снова войдите в консоль. |
not_a_member | 403 | AuthenticationException PHPAuthenticationError Node.js | Человек, вошедший в консоль, не участник организации, о которой запрос, или ещё не состоит ни в одной организации. | Примите приглашение в организацию или переключитесь на организацию, участником которой вы являетесь. |
account_suspended | 403 | AuthenticationException PHPAuthenticationError Node.js | Учётная запись человека, который входит, приостановлена, и вход отклонён. | Учётная запись не может войти, пока её не восстановят. Напишите в поддержку, чтобы узнать причину. |
policy_denied | 403 | PolicyDeniedException PHPPolicyDeniedError Node.js | Политика отклонила запрос до того, как были зарезервированы какие-либо деньги. Сообщение ошибки называет политику. | Прочитайте в сообщении, какая политика отклонила запрос. Измените запрос — модель, операцию, стоимость — или измените политику в консоли. |
model_not_allowed | 403 | PolicyDeniedException PHPPolicyDeniedError Node.js | Узел модели во флоу называет модель, которой нет в каталоге, или модель, которая выключена. Выполнение заканчивается как failed с этим кодом. | Выберите в узле модели модель из списка моделей — в нём активные модели, у которых есть действующая цена, — и опубликуйте новую версию. |
budget_exceeded | 402 | BudgetExceededException PHPBudgetExceededError Node.js | Вызов вывел бы бюджет за его лимит. То, что бюджет уже держит и потратил в текущем окне, вместе с холдом, который просит этот вызов, больше лимита. | Дождитесь следующего окна бюджета — его resets_at говорит когда; бюджет типа total заново не начинается. Или поднимите лимит бюджета. |
operation_limit_exceeded | 402 | OperationLimitExceededException PHPOperationLimitExceededError Node.js | Бюджет на операцию ограничивает, сколько может зарезервировать один вызов операции, а холд, который просит этот вызов, выше этого ограничения. | Просите меньше — меньше выходных токенов, модель дешевле — или поднимите ограничение. Тот же запрос будет отклонён снова, пока одно из них не изменится. |
concurrency_limit_exceeded | 402 | ConcurrencyLimitException PHPConcurrencyLimitError Node.js | Бюджет типа concurrency — в консоли «Одновременные резервы» — разрешает держать открытыми заданное число холдов одновременно, и все они заняты вызовами, которые выполняются. | Отправьте запрос снова, когда закончится один из выполняющихся вызовов, или поднимите лимит бюджета. Запрос к флоу отправляйте снова с новым ключом, потому что его отклонённое выполнение сохраняет ключ, который у него был. Это не лимит запросов ключа. |
insufficient_credits | 402 | InsufficientCreditsException PHPInsufficientCreditsError Node.js | Счёт клиента не может покрыть цену вызова в кредитах, или у клиента нет счёта этого типа кредитов. Списание или корректировка отклоняются так же, когда оставили бы баланс ниже того, что держит счёт. | Пополните кредиты клиента. Счёт, в настройках которого разрешён отрицательный баланс, не отклоняет. |
customer_blocked | 403 | CustomerBlockedException PHPCustomerBlockedError Node.js | Клиент, для которого сделан запуск, заблокирован. Новый запуск этого клиента отклоняется до того, как что-либо создано. Запуск, который уже идёт, отклоняется на следующем холде кредитов, и выполнение завершается с этим кодом. | Разблокируйте клиента, чтобы его запуски снова проходили. Пока клиент заблокирован, его кредиты можно пополнять, списывать и корректировать, а выписку — читать. |
customer_not_found | 404 | CustomerNotFoundException PHPCustomerNotFoundError Node.js | Проект не знает клиента, которого называет запрос, — клиента не добавляли, не пополняли и не настраивали, или его удалили. Так отклоняется вызов операции с ценой для такого клиента, а также чтение, блокировка, списание и удаление. Корректировка счёта, которого нет, отклоняется так же. | Сначала добавьте клиента или пополните его — пополнение создаёт клиента и счёт. |
overrun_stopped | 402 | OverrunStoppedException PHPOverrunStoppedError Node.js | Оценка вызова модели во флоу, сделанная заново после того, как взят холд, и до вызова провайдера, превысила холд больше, чем позволяет допуск превышения узла, а политика перерасхода узла модели — остановить. Холд возвращён, провайдер не вызывался. Тот же код завершает выполнение, когда человек отклонил согласование, которое запросил перерасход, или никто не ответил вовремя. У нового узла модели политики перерасхода нет, а политика, которая у узла есть, практически не срабатывает, потому что обе оценки считаются по одному и тому же запросу с разницей в мгновение. | Отправьте запрос снова с новым ключом — вызов будет оценён заново и возьмёт собственный холд. Чтобы таких отказов не было, выключите политику перерасхода узла модели и опубликуйте новую версию. |
overrun_approval_required | 402 | OverrunApprovalRequiredException PHPOverrunApprovalRequiredError Node.js | Оценка вызова модели во флоу, сделанная заново после того, как взят холд, и до вызова провайдера, превысила холд больше, чем позволяет допуск превышения узла, а политика перерасхода узла модели просит человека одобрить разницу. Выполнение ждёт этого решения, поэтому на запрос отвечает ждущее выполнение, а не этот код. У нового узла модели политики перерасхода нет, а политика, которая у узла есть, практически не срабатывает, потому что обе оценки считаются по одному и тому же запросу с разницей в мгновение. | Примите решение по согласованию в консоли. Согласование, которое отклонили или по которому никто не решил вовремя, завершает выполнение с кодом overrun_stopped. |
idempotency_conflict | 409 | IdempotencyConflictException PHPIdempotencyConflictError Node.js | Ключ Idempotency-Key уже использовал другой запрос — тот же ключ с другим телом или ключ другого пополнения, списания или корректировки проекта. | Отправьте новый запрос с новым ключом. На повтор первого запроса с его ключом отвечают как прежде. |
idempotency_in_progress | 409 | IdempotencyConflictException PHPIdempotencyConflictError Node.js | Вызов модели во флоу встретил холд, который всё ещё стоит под его собственным ключом, и был отклонён, чтобы провайдер не был вызван дважды. Выполнение заканчивается как failed с этим кодом. Обычный запуск с этим не встречается. | Прочитайте выполнение и его трассировку. Отправляйте запрос снова с новым ключом, только если ответ всё ещё нужен, — за первый вызов могли заплатить. |
cost_calculation_failed | 422 | InvalidRequestException PHPInvalidRequestError Node.js | Модель активна, но у неё нет действующей цены, поэтому Slen не может посчитать, сколько будет стоить вызов, и вызов отклоняется. | Назовите модель из списка моделей — в нём активные модели, у которых есть действующая цена. |
provider_not_configured | 422 | ProviderException PHPProviderError Node.js | Ни одно подключение проекта не может обслужить провайдера запрошенной модели, поэтому вызов некуда отправить. Во флоу тот же код приходит, когда пул, через который узел модели направляет вызов, удалён или выключен. | Добавьте подключение к этому провайдеру в консоли или включите то, которое есть. Включите пул снова или выберите в узле модели другой пул и опубликуйте новую версию. Затем отправьте запрос с новым ключом. |
provider_rate_limit | 429 | ProviderException PHPProviderError Node.js | Провайдер ответил, что его лимит запросов исчерпан. Пул, который переключает подключения при лимите запросов, сначала пробует другое; этот код приходит, когда ничего другого не пробовали. | Отправьте вызов снова позже с новым ключом. Добавьте подключение в пул или разрешите пулу переключать подключения при лимите запросов. |
provider_error | 502 | ProviderException PHPProviderError Node.js | Провайдер отклонил вызов или ответил тем, чем Slen не может воспользоваться, и вызов не завершился. | Проверьте, чего запрос просит у модели, — параметр, которого модель не принимает, провайдер отклоняет. Отправьте вызов снова с новым ключом, когда запрос будет верным. |
provider_timeout | 504 | ProviderException PHPProviderError Node.js | До провайдера не удалось достучаться — имя не разрешилось или соединение не установилось, — поэтому вызов не ушёл. Вопреки названию, это не значит, что модель отвечала медленно. | Отправьте вызов снова позже с новым ключом. Провайдер, до которого достучались и который не ответил вовремя, — это operation_uncertain, а не этот код. |
provider_unavailable | 502 | ProviderException PHPProviderError Node.js | Провайдер ответил сбоем на своей стороне. Slen ставит это подключение на паузу, а пул, который переключает подключения, пробует другое. | Отправьте вызов снова позже с новым ключом. Пул с несколькими подключениями переживает сбой одного из них. |
pool_exhausted | 503 | ProviderException PHPProviderError Node.js | Ни одно подключение пула не смогло обслужить вызов за то число попыток, которое разрешает пул. last_error_code в деталях ошибки называет последний сбой, а заголовок Retry-After говорит, сколько ждать, когда это известно. | Подождите столько, сколько говорит Retry-After, и отправьте вызов снова с новым ключом. Если пул исчерпывается часто, добавьте в него подключения. |
operation_uncertain | 504 | OperationUncertainException PHPOperationUncertainError Node.js | Провайдер был вызван, а его ответ не вернулся, поэтому неизвестно, был ли вызов сделан и оплачен. Так же заканчивается вызов модели во флоу, который шёл в фоне, если провайдер его принял, а спросить провайдера о нём больше не удалось. Холд не возвращается — он держится, пока не истечёт. Выполнение, которое так закончилось, получает статус uncertain. | Не отправляйте вызов снова с новым ключом — это может быть второй оплаченный вызов. Прочитайте операцию или выполнение, чтобы узнать, что произошло. Событие вебхука operation.uncertain тоже сообщает о таком вызове. |
ledger_unavailable | 503 | ServiceUnavailableException PHPServiceUnavailableError Node.js | Реестр трат был недоступен, когда вызов попросил свой холд. Вызов не авторизован — для него ничего не зарезервировано, и его провайдер не вызывался. | Отправьте запрос снова позже — запрос к флоу с новым ключом, потому что его неудавшееся выполнение сохраняет ключ, который у него был. GET /v1/degraded-status говорит, что API пропускает, пока реестр недоступен. |
flow_runtime_error | — | FlowRuntimeException PHPFlowRuntimeError Node.js | Код, который среда выполнения держит для флоу, сломавшегося во время выполнения по причине, для которой у неё нет более узкого кода. Сейчас этим кодом не отвечает ни один запрос и им не заканчивается ни одно выполнение — у сбоя выполнения есть более узкий код или нет никакого. | Сейчас обрабатывать нечего. Если ответ всё же принесёт этот код, прочитайте трассировку выполнения, чтобы увидеть, где оно остановилось. Вызовы моделей до этого места оплачены, и повтор с новым ключом оплатит их снова. |
step_limit_exceeded | 500 | FlowRuntimeException PHPFlowRuntimeError Node.js | Выполнение не дошло до конечного узла за то число шагов, которое разрешено одному выполнению. Флоу больше, чем среда выполнения проходит за один запрос. | Сократите флоу или разделите работу между двумя операциями. Затем отправьте запрос с новым ключом — на повтор с тем же ключом отвечает неудавшееся выполнение. |
unrouted_port | 500 | FlowRuntimeException PHPFlowRuntimeError Node.js | Узел вышел через порт, к которому ничего не подключено, и выполнению некуда было идти. Сообщение ошибки называет узел и порт. | Подключите этот порт в конструкторе флоу и опубликуйте новую версию. Затем отправьте запрос с новым ключом — на повтор с тем же ключом отвечает неудавшееся выполнение. |
execution_timeout | 504 | TimeoutException PHPTimeoutError Node.js | Выполнение флоу исчерпало время, которое ему отведено. Вызов модели, который ответил до этого, оплачен. | Прочитайте трассировку выполнения, чтобы увидеть, куда ушло время. Прежде чем повторять запрос, учтите, что повтор с новым ключом снова оплатит то, что уже оплачено. |
http_request_failed | 502 | FlowRuntimeException PHPFlowRuntimeError Node.js | Вызов, который флоу делает к другому HTTP API, не удался или получил в ответ ошибку, а к порту ошибки узла, который его сделал, ничего не подключено. Это не провайдер модели. Этот узел заморожен, если сервис не настроен иначе, — уже опубликованная с ним версия выполняется, а новая версия содержать его не может. | Проверьте API, которое вызывает флоу, затем отправьте запрос с новым ключом — на повтор с тем же ключом отвечает неудавшееся выполнение. Порт ошибки замороженного узла нельзя подключить в новой версии — чтобы изменить, что флоу делает при такой ошибке, опубликуйте версию без этого узла. |
rate_limit_exceeded | 429 | RateLimitException PHPRateLimitError Node.js | API-ключ или человек, вошедший в консоль, отправил за минуту больше запросов, чем позволяет лимит. У нескольких операций свой, меньший лимит — например, у проверки подключения провайдера. Заголовок Retry-After ответа говорит, сколько секунд ждать. Чтение статуса выполнения тоже считается. | Подождите столько, сколько говорит Retry-After, и отправьте запрос снова. Для отклонённого запроса ничего не зарезервировано и не потрачено. |
service_unavailable | 503 | ServiceUnavailableException PHPServiceUnavailableError Node.js | Slen не смог достучаться до своей базы данных и ответил, ничего не сделав. Тот же код отвечает на изменение бюджета, которое слишком долго ждало вызовов, выполняющихся на этом бюджете; ничего не изменено. | Отправьте запрос снова позже. Отклонённое изменение бюджета говорит в Retry-After, когда. |
background_hold_expired | — | TimeoutException PHPTimeoutError Node.js | Это не ответ API — им заканчивается выполнение, запущенное в асинхронном режиме. Вызов модели во флоу выполнялся у провайдера в фоне, и его холд был закрыт другим списанием, пока вызов ждал, поэтому вызов закончился, не спросив у провайдера ответ. Ничего не возвращено, и провайдер всё ещё может выставить счёт за принятый вызов. Вопреки названию, холд, который просто истёк, так вызов не заканчивает. | Отправляйте запрос снова с новым ключом, только если ответ всё ещё нужен. Провайдер может выставить счёт и за первый вызов, поэтому за ответ, возможно, придётся заплатить дважды. |
execution_conflict | 500 | FlowRuntimeException PHPFlowRuntimeError Node.js | Выполнение не удалось открыть — его запись столкнулась с другой, и не по ключу идемпотентности. Флоу не выполнялся. | Отправьте запрос снова. Если это повторится, напишите в поддержку и укажите id запроса. |
unknown_node | 500 | FlowRuntimeException PHPFlowRuntimeError Node.js | Опубликованная версия флоу ведёт к узлу, которого среда выполнения не может найти, поэтому выполнение остановилось. | Опубликуйте флоу заново из конструктора флоу, затем отправьте запрос с новым ключом — на повтор с тем же ключом отвечает неудавшееся выполнение. Если с новым ключом ошибка повторится, напишите в поддержку и укажите id запроса. |
node_type_not_supported | 500 | FlowRuntimeException PHPFlowRuntimeError Node.js | В опубликованной версии флоу есть узел типа, который среда выполнения не умеет выполнять. | Замените узел в конструкторе флоу и опубликуйте новую версию. Затем отправьте запрос с новым ключом — на повтор с тем же ключом отвечает неудавшееся выполнение. |
Коды без собственного типа
Для этих кодов у SDK нет собственного типа. Он выбрасывает тип по статусу ответа — по правилу под таблицей.
| Код | HTTP-статус | Что это значит | Что делать |
|---|---|---|---|
project_access_restricted | 403 | Вызывающий видит только часть проектов организации и попытался изменить то, что принадлежит всей организации, или прочитать журнал аудита. API-ключу доступен только проект, которому он принадлежит. | С API-ключом создавайте нужное в проекте ключа — подключение провайдера, у которого scope равен project. Человек просит внести изменение участника, которому доступны все проекты. |
customer_has_history | 409 | Клиента нельзя удалить, потому что с ним уже что-то происходило — на счёте есть кредиты или резерв, или в выписке есть запись. Журнал кредитов только дополняется, и его записи объясняют баланс. | Заблокируйте клиента вместо удаления. |
reservation_not_found | 404 | Это не ответ ни одной операции API. Slen держит этот код для холда, который не может найти, пока закрывает вызов модели. | Обрабатывать нечего. Если ответ всё же его принесёт, напишите в поддержку и приведите id запроса. |
reservation_expired | 409 | Это не ответ ни одной операции API. Slen держит этот код для продления истёкшего холда; истёкший холд всё ещё принимает списание своего вызова. | Обрабатывать нечего. Если ответ всё же его принесёт, напишите в поддержку и приведите id запроса. |
invalid_request | 409, 422 | Запрос нельзя выполнить в таком виде, и сообщение ошибки говорит почему — политика без параметра, который нужен её действию, или с условием, которое её действие никогда не встречает; выбранные проекты для участника, чья роль открывает все проекты; заголовок Idempotency-Key длиннее 190 символов. SDK сами выбрасывают ошибку с этим кодом для вызова, который отклоняют до отправки. | Прочитайте сообщение и измените запрос. |
idempotency_key_required | 400 | Операция требует заголовок Idempotency-Key, а в запросе его нет или он пустой. | Отправьте собственный ключ, который называет единицу работы, и отправляйте тот же ключ, когда повторяете эту работу. |
invalid_flow_input | 422 | Во входе нет того, что нужно узлу флоу, — флоу, который вызывает модель, требует непустой messages во входе. Выполнение закрывается как failed, и ключ остаётся за ним. | Исправьте вход и отправьте его с новым ключом. На повтор с тем же ключом отвечает неудавшееся выполнение. |
execution_parked | — | Это не ответ API. Внутри среды выполнения он отмечает выполнение, которое остановилось, чтобы ждать, а на запрос отвечает само выполнение — ждущее или в очереди. | Обрабатывать как ошибку нечего. Дождитесь выполнения так же, как любого другого, которое ждёт. |
flow_not_found | 404 | На код операции не отвечает ни один флоу — к нему не привязан флоу, у флоу нет опубликованной версии или флоу в архиве. Ничего не создаётся, поэтому ключ идемпотентности остаётся свободным. Тот же код отвечает на id флоу, который вызывающему недоступен. | Привяжите код операции к флоу и опубликуйте флоу. Повтор с тем же ключом выполнится, когда флоу сможет ответить. |
operation_not_found | 404 | Ни у одной операции — записи одного вызова модели с его попытками у провайдеров — нет такого id в проекте ключа. | Проверьте id. Операция другого проекта отвечает так же. |
invalid_credentials | 401, 502 | Два случая. Вход в консоль, при котором почта и пароль не совпадают ни с одной учётной записью. Вызов модели, при котором провайдер отклонил ключ подключения, обслуживавшего вызов, — тогда Slen отмечает учётные данные этого подключения как недействительные. | Войдите с правильным паролем. Для подключения укажите в нём действующий ключ провайдера в консоли. |
csrf_token_mismatch | 419 | Запрос сессии консоли пришёл без своего CSRF-токена или с устаревшим. Запрос с API-ключом этот код никогда не получает. | Перезагрузите страницу консоли и повторите действие. |
not_found | 404 | Регистрация и вход в консоль ответили так, будто такого адреса нет. Они открыты только для браузера, в котором открыли выданную ссылку доступа. | Откройте свою ссылку доступа в этом браузере, затем снова зарегистрируйтесь или войдите. |
flow_execution_not_found | 404 | Выполнения с таким id нет в проектах, доступных вызывающему, — его не было вовсе, или оно принадлежит другому проекту. | Проверьте id. Это execution_id ответа, который начал выполнение. |
Для кода без собственного типа SDK выбирает тип ошибки по HTTP-статусу ответа:
401,403AuthenticationExceptionPHP,AuthenticationErrorNode.js402SpendRefusedExceptionPHP,SpendRefusedErrorNode.js429RateLimitExceptionPHP,RateLimitErrorNode.js- 500 и выше
ProviderExceptionPHP,ProviderErrorNode.js - любой другой статус
InvalidRequestExceptionPHP,InvalidRequestErrorNode.js
Коды консоли и настроек
Эти коды приходят от операций консоли и настроек: входа и сессий, организаций и проектов, участников и приглашений, ключей, политик, бюджетов, флоу и их версий, согласований, оповещений, вебхуков, подключений и пулов, обновлений консоли в реальном времени, — а invalid_date_range от списков реестра, холдов и операций. Ни один метод SDK эти операции не вызывает. Правило под таблицей — правило SDK для любого кода без собственного типа.
| Код | HTTP-статус | Что это значит | Что делать |
|---|---|---|---|
session_required | 403 | Это может сделать только человек, вошедший в консоль, — создать организацию, изменить или удалить участника, отправить, повторно отправить или отозвать приглашение, подключить или изменить канал или маршрут уведомлений, прочитать и изменить свои уведомления. API-ключ этого не может. | Сделайте это в консоли, войдя как участник, чья роль это разрешает. |
member_forbidden | 403 | Роль вошедшего человека не разрешает такое изменение этого участника, или изменение касается его собственного участия. Роль владельца даёт и забирает только владелец, а изменяет или удаляет участника только владелец или администратор. | Попросите владельца внести изменение. Чтобы самому расстаться с организацией, выйдите из неё. |
channel_forbidden | 403 | Консоль попросила обновления в реальном времени по проекту, который вызывающему читать нельзя, — по другому проекту, чем тот, которому принадлежит ключ, или по проекту, недоступному человеку. | Переключитесь на доступный вам проект и откройте страницу снова. |
budget_not_found | 404 | Бюджета с таким id нет в проектах, доступных вызывающему, — его не было вовсе, или он принадлежит другому проекту. | Проверьте id. Получите список бюджетов, чтобы найти нужный; архивный бюджет попадает в список, если include_archived равен 1. |
invalid_date_range | 422 | Окно списка реестра, холдов или операций — не такое, какое список читает. Оба конца приходят вместе или не приходят вовсе, конец не может быть раньше начала, окно — не больше семи дней, и каждый конец — момент, который список может разобрать. | Отправьте from и to вместе, конец после начала, не дальше семи дней друг от друга, — или не отправляйте ни одного и читайте последние семь дней. Чтобы прочитать более долгий период, сдвигайте окно. |
flow_invalid | 422 | В графе флоу есть ошибки, поэтому он не может стать версией, которая выполняется. Их нашла публикация в черновике, или откат нашёл, что версия, к которой он вернулся бы, называет модель или пул, которых больше нет. Подробности ошибки перечисляют каждую проблему с её кодом и узлом, к которому она относится. | Исправьте каждую ошибку списка в конструкторе флоу и опубликуйте снова. Предупреждения публикацию не останавливают. Для отката выберите другую версию или опубликуйте черновик, который больше не называет исчезнувшее. |
flow_draft_not_found | 404 | У флоу нет черновика для публикации — его опубликовали и с тех пор не меняли. Так же отвечает проверка флоу, у которого нет ни черновика, ни опубликованной версии. | Измените флоу, чтобы начать новый черновик, затем опубликуйте его. Чтобы версия, которая выполняется сейчас, выполнялась и дальше, публиковать ничего не нужно. |
flow_slug_taken | 409 | В том же проекте в тот же момент создавался другой флоу и занял то же короткое имя. Флоу не создан. | Создайте флоу снова. Имя, которое в проекте уже есть, получает число в конце своего короткого имени. |
approval_not_found | 404 | Запроса на согласование с таким id нет в проектах, доступных вызывающему, — его не было вовсе, или он принадлежит другому проекту. | Проверьте id. Получите список запросов на согласование проекта, чтобы найти нужный. |
alert_not_found | 404 | Оповещения с таким id нет в проектах, доступных вызывающему, — его не было вовсе, или оно принадлежит другому проекту. | Проверьте id. Прочитайте ленту оповещений, чтобы найти нужное. |
alert_rule_not_found | 404 | Правила оповещения с таким id нет в проектах, доступных вызывающему, — его не было вовсе, его удалили, или оно принадлежит другому проекту. | Проверьте id. Правила перечислены на вкладке правил страницы оповещений. |
alert_rule_unknown_setting | 422 | Настройки правила оповещения называют настройку, которой у его типа нет. Сообщение называет настройки, которые тип принимает. | Отправляйте только настройки, которые сообщение называет для этого типа. |
api_key_not_found | 404 | API-ключа с таким id нет в проектах, доступных вызывающему, — его не было вовсе, или он принадлежит другому проекту. Для отозванного ключа ротация невозможна, и запрос отвечает так же. | Проверьте id на странице ключей консоли. Чтобы заменить отозванный ключ, выпустите новый. |
invite_not_found | 404 | По этой ссылке или этому id приглашения нет. Ссылка могла быть набрана с ошибкой, или приглашение принадлежит другой организации. | Откройте ссылку точно в том виде, в каком она пришла в письме, или попросите новое приглашение. |
invite_not_pending | 410 | Приглашение существует, но больше не открыто — его приняли, отклонили или отозвали, или его срок истёк. | Попросите владельца или администратора организации пригласить вас снова. |
invite_email_mismatch | 403 | Приглашение отправлено на другой адрес электронной почты, чем у вошедшей учётной записи. | Войдите в учётную запись того адреса, на который отправлено приглашение, или попросите приглашение на свой адрес. |
email_not_verified | 403 | Учётная запись ещё не подтвердила свой адрес электронной почты, поэтому не может принять приглашение или подключить Telegram для уведомлений. | Откройте ссылку подтверждения, отправленную на этот адрес, затем откройте приглашение или подключите Telegram снова. |
invite_forbidden | 403 | Вошедший человек не может управлять этим приглашением. Приглашает только владелец или администратор, а приглашение на роль владельца отправляет, повторно отправляет и отзывает только владелец. API-ключ приглашениями не управляет. | Попросите владельца — или администратора, если роль ниже владельца, — отправить или изменить приглашение. |
member_not_found | 404 | Участника с таким id в организации нет — он мог выйти или быть удалён. | Прочитайте список участников снова и используйте id, который он даёт. |
last_owner | 409 | Изменение оставило бы организацию без владельца. У организации остаётся хотя бы один. | Сначала сделайте владельцем другого участника, затем измените роль этого, удалите его или выйдите. |
organization_not_found | 404 | Организации нет, или вошедший человек не её участник. Так же отвечает запрос, который называет другую организацию, чем у ключа. | Проверьте id и переключитесь на организацию, участником которой вы являетесь. |
organization_limit_reached | 409 | Человек уже владеет столькими организациями, сколькими может владеть один человек, — двадцатью, если сервис не настроен иначе. | Сделайте другого участника владельцем организации, которая вам больше не нужна, и выйдите из неё, затем создайте новую. |
project_not_found | 404 | Проекта с таким id в организации нет, или он недоступен вызывающему. | Проверьте id. Получите список проектов организации, чтобы найти доступный вам. |
project_required | 422 | В организации ещё нет проекта, а запросу он нужен для работы. | Создайте проект в организации, затем повторите действие. |
policy_not_found | 404 | Политики с таким id нет в проектах, доступных вызывающему, — её не было вовсе, её удалили, или она принадлежит другому проекту. | Проверьте id. Прочитайте список политик, чтобы найти нужную. |
provider_connection_not_found | 404 | Подключения провайдера с таким id нет в проектах, доступных вызывающему, — его не было вовсе, или оно принадлежит другому проекту. Пул отказывается принять такое подключение с тем же кодом. | Проверьте id. Получите список подключений, а для пула выберите подключение своего проекта или всей организации. |
provider_pool_not_found | 404 | Пула провайдеров с таким id нет в проектах, доступных вызывающему, — его не было вовсе, или он принадлежит другому проекту. | Проверьте id. Получите список пулов, чтобы найти нужный. |
webhook_endpoint_not_found | 404 | Вебхука с таким id в организации нет, или он принадлежит проекту, недоступному вызывающему. | Проверьте id на странице вебхуков консоли. |
webhook_url_not_allowed | 422 | Slen не будет доставлять на этот адрес. Вебхуку нужен адрес https на порту 443, с именем хоста, а не IP-адресом, без логина и пароля, и его хост не может вести в частную сеть. | Укажите публичный адрес https своего сервиса. Хост, имя которого ещё не разрешается, принимается, потому что каждая доставка разрешает его заново. |
email_already_registered | 409 | Учётная запись с этим адресом электронной почты уже есть, поэтому новая не создана. | Войдите с этим адресом или сбросьте его пароль, если забыли его. |
invalid_token | 422 | Ссылка для подтверждения адреса электронной почты или для нового пароля неверна, уже использована или её срок истёк. | Попросите новую ссылку и откройте её в том виде, в каком она пришла в письме. |
too_many_attempts | 429 | За короткое время не удалось слишком много попыток войти или задать новый пароль — для этой учётной записи или с этого сетевого адреса, поэтому попытки на время отклоняются. | Подождите время, которое называет заголовок Retry-After, затем попробуйте снова с правильным паролем — или задайте новый. |
oauth_failed | 422 | Вход через Google не удалось завершить. Попытка заняла слишком много времени или не прошла проверку, или Google не подтвердил адрес, который связал бы с уже существующей учётной записью. | Начните вход через Google заново. Если Google не подтвердил адрес, войдите с паролем учётной записи. |
flow_version_not_found | 404 | У флоу нет версии с таким номером. | Получите список версий флоу и используйте номер, который он даёт. |
flow_version_not_published | 409 | Названная версия — черновик. Снова выполняться может только версия, которую опубликовали. | Назовите опубликованную версию или опубликуйте черновик. |
no_previous_version | 409 | Откат без номера версии ведёт к опубликованной версии сразу под той, которая выполняется, а такой нет — флоу на своей первой версии, или ни одна его версия не выполняется. | Назовите версию, к которой перейти, или опубликуйте новую. |
draft_conflict | 409 | Черновик уже не тот, для которого сделан запрос. Кто-то сохранил его в промежутке или опубликовал и начал новый — или во время публикации пришло сохранение либо другая публикация, пока она готовилась. Ничего не записано и ничего не опубликовано. | Прочитайте черновик снова, примените к нему своё изменение и отправьте запрос снова с номерами, которые у него теперь. |
operation_already_bound | 409 | На этот код операции уже отвечает другой флоу проекта. Флоу отвечает на один код, а код ведёт к одному флоу; этот флоу сохраняет код, который у него был. | Сначала уберите код у другого флоу или выберите другой код. |
approval_expired | 409 | Запрос на согласование больше нельзя решить. Его срок истёк, и теперь он закрыт так, будто никто не решил, — или его выполнение закончилось и больше не ждёт. | Решения больше ничто не ждёт. Откройте выполнение, чтобы увидеть, чем оно закончилось, и отправьте запрос к флоу снова с новым ключом, если работа всё ещё нужна. |
approval_already_decided | 409 | Запрос на согласование больше не ожидает — кто-то решил его первым, или его срок истёк. | Прочитайте запрос снова, чтобы увидеть решение и кто его принял. |
connection_in_use | 409 | Подключение провайдера — последнее включённое подключение пула, поэтому его удаление оставило бы пулу нечего вызывать. | Добавьте в пул другое подключение или включите одно из его подключений, затем удалите это. Или сначала удалите пул. |
pool_in_use | 409 | Флоу всё ещё вызывает модели через этот пул — его называет версия флоу, которая выполняется, или незаконченное выполнение идёт на версии, которая его называет. Пул не удалён. | Опубликуйте версии этих флоу, которые называют другой пул, дайте выполнениям закончиться, затем удалите пул. |
pool_connection_exists | 409 | Подключение уже входит в этот пул. | Вместо этого измените условия участия подключения — его приоритет, вес, множитель стоимости или то, включено ли оно. |
pool_connection_not_found | 404 | Подключение не входит в этот пул. | Прочитайте пул, чтобы увидеть его подключения, или сначала добавьте подключение. |
connection_incompatible | 422 | Подключение не может войти в этот пул. Оно другого провайдера, чем пул, а пул не принимает подключения других провайдеров, — или подключение удалено. | Выберите подключение провайдера пула или разрешите пулу принимать подключения других провайдеров. |
unsupported_pool_strategy | 422 | Вызов модели прошёл через пул, стратегию которого Slen не выполняет. API такую стратегию никогда не принимает; пул получил её иным путём. | Задайте пулу стратегию priority, least_utilized или weighted, затем отправьте запрос снова с новым ключом — вызов, который встретил этот код, закончился. |
already_a_member | 409 | Человек с этим адресом электронной почты уже участник организации, поэтому приглашение не отправлено. | Измените роль участника, если имелось в виду это. |
invite_already_pending | 409 | Приглашение на этот адрес электронной почты в организации уже открыто. | Отправьте открытое приглашение повторно или отзовите его и пригласите снова. |
invite_limit_reached | 429 | За короткое время ушло слишком много писем с приглашениями — организация отправляет не больше 50 в сутки, один человек не больше 20 в час, новые приглашения и повторные вместе, если сервис не настроен иначе, — поэтому это на время отклонено. | Подождите время, которое называет заголовок Retry-After, затем пригласите или отправьте повторно ещё раз. Уже отправленные приглашения тем временем остаются открытыми. |
user_session_not_found | 404 | Активной сессии с таким id у вошедшего человека нет. Она могла закончиться, или из неё уже вышли. | Прочитайте список своих сессий снова. С сессией, которой больше нет, ничего делать не нужно. |
notification_channel_not_found | 404 | Канала уведомлений с таким id в организации нет, или он принадлежит проекту, который вызывающему недоступен. Личный канал другого человека тоже не находится. | Проверьте id в списке каналов команды или в списке своих каналов. |
notification_route_not_found | 404 | Маршрута уведомлений с таким id в организации нет, или он принадлежит проекту, который вызывающему недоступен. Маршрут также удаляется, когда его последний получатель покидает организацию, и через некоторое время после удаления правила оповещения, к которому он привязан. | Прочитайте список маршрутов снова. |
notification_subscription_not_found | 404 | Подписки с таким id у вошедшего человека в этой организации нет. Подписка принадлежит только своему участнику, и подписка другого участника не находится. | Прочитайте список своих подписок снова. |
notification_channel_url_not_allowed | 422 | Slen не будет отправлять уведомления на этот адрес. Адрес канала должен быть вебхуком того сервиса, к которому относится канал, — адресом Slack на hooks.slack.com в /services/, адресом вебхука Discord или адресом рабочего процесса Teams в Azure Logic Apps или Power Automate, с /workflows/ в пути. Адрес выведенного из работы соединителя Office 365 отклоняется, как и адрес, который не https на порту 443, содержит логин или пароль, называет IP-адрес или ведёт в частную сеть. Группа в Telegram адреса не принимает вовсе. Подробности ошибки называют случай. | Скопируйте адрес из сервиса заново и вставьте его целиком. Для Microsoft Teams создайте рабочий процесс канала, а не соединитель. |
notification_channel_kind_unavailable | 422 | Эта установка Slen не предлагает Telegram, потому что для неё не настроен бот Telegram. | Используйте вместо него Slack, Microsoft Teams, Discord или почту либо попросите того, кто отвечает за установку, настроить бота. |
notification_channel_state_invalid | 409 | Канал не в том состоянии, которое нужно для этого действия. Чат подтверждается, только пока он ждёт подтверждения, и только тем, кто получил его ссылку. Тест уходит только в активный канал. Канал, который ждёт свою ссылку, включается подтверждением чата, а не изменением статуса. У аккаунта один чат Telegram, поэтому второй не подключается, пока первый включён или на паузе. | Прочитайте канал снова и действуйте по его состоянию. Подтвердите чат как тот, кто получил ссылку, возобновите канал на паузе перед тестом или отключите свой Telegram, прежде чем подключать другой. |
notification_link_expired | 410 | Ссылка, которая подключает чат Telegram, истекла раньше, чем её принял чат. Ссылка действует 15 минут, если сервис не настроен иначе. | Для группы команды удалите канал и подключите группу заново с новой ссылкой. Для своего чата подключите Telegram снова среди своих уведомлений, и для того же канала придёт новая ссылка. |
notification_limit_reached | 409 | У организации уже столько каналов или маршрутов уведомлений, сколько ей можно, или у участника столько подписок в ней — 20 каналов и 50 маршрутов у организации и 20 подписок у участника, если сервис не настроен иначе. | Удалите канал, маршрут или подписку, которые больше не нужны, и попробуйте снова. |
notification_event_not_allowed | 422 | Маршрут или подписка называет событие, о котором людям сообщать нельзя, или получателя, чья роль не читает это событие в консоли. Наблюдатель не видит согласований, поэтому ни маршрут, ни подписка не приносит наблюдателю согласование. | Называйте среди событий только оповещения и согласования и не включайте наблюдателя в маршрут, который несёт согласования. |
notification_unsubscribe_invalid | 404 | Ссылка для отписки от писем-уведомлений сделана не Slen. Её обрезали или изменили по дороге. | Откройте ссылку из письма снова, целиком, или отключите письма среди своих уведомлений в консоли. |
Для кода без собственного типа SDK выбирает тип ошибки по HTTP-статусу ответа:
401,403AuthenticationExceptionPHP,AuthenticationErrorNode.js402SpendRefusedExceptionPHP,SpendRefusedErrorNode.js429RateLimitExceptionPHP,RateLimitErrorNode.js- 500 и выше
ProviderExceptionPHP,ProviderErrorNode.js - любой другой статус
InvalidRequestExceptionPHP,InvalidRequestErrorNode.js
Код, с которым заканчивается выполнение
Выполнение, которое не завершилось, хранит код в error_code, а error_message говорит то же предложением. Чтение статуса, ожидание и повтор запроса с его ключом читают оба поля. Большинство этих кодов — коды этой страницы: код ошибки, которой ответили на запрос. Два вида — нет.
Узел Отклонить запрос завершает выполнение с кодом и сообщением, заданными в нём. Узел, в котором не задано ни того ни другого, завершает его так:
{
"status": "rejected",
"error_code": "rejected_by_flow",
"error_message": "The request was rejected by the flow"
}Среда выполнения закрывает выполнение, которое больше не может провести, с собственным кодом: его обработчик остановился, оно ждало дольше, чем выполнению можно ждать, его состояние не удалось сохранить или прочитать. Что произошло, говорит error_message. Выполнение, которое ждало слишком долго, заканчивается так:
{
"status": "failed",
"error_code": "parked_expired",
"error_message": "The execution waited longer than a parked execution may and was closed"
}У выполнения, которое закрыла ошибка без кода в API, нет ни того ни другого: error_code и error_message равны null.
Что читать дальше
Обзор — поля конверта и ответы, которые приходят без него.
Аутентификация — отказы ключу и его разрешениям.
Обработка ошибок — ловите ошибки в SDK и узнавайте, стоил ли вызов денег.
Асинхронные запуски и ожидание — как прочитать, чем закончилось выполнение.
Выполнения — статус и код, с которыми закончилось выполнение, по HTTP.
Когда исход неизвестен — что делать после
operation_uncertain.
Собрано из openapi b070e1f, sdk contract 5cc7055, php ae4a53b, node 84bc62d