Справочник кодов ошибок
Каждая ошибка API Pert возвращается в едином JSON-формате:
{
"error": "Описание ошибки для пользователя",
"code": "MACHINE_READABLE_CODE",
"details": {
"field": "name",
"reason": "required"
}
}
error— человекочитаемое сообщение.code— стабильный машиночитаемый код. Имеет смысл использовать его для условной логики обработки ошибки в клиенте.details(опционально) — структурированные данные о причине ошибки (например,fieldиreasonдля валидационных ошибок).
HTTP-статус выводится из поля Kind ошибки:
| Kind | HTTP |
|---|---|
validation |
400 Bad Request |
malformed |
400 Bad Request |
unauthorized |
401 Unauthorized |
forbidden |
403 Forbidden |
not_found |
404 Not Found |
conflict |
409 Conflict |
unavailable |
503 Service Unavailable |
internal |
500 Internal Server Error |
Общие
FORBIDDEN
Клиенту запрещён доступ к ресурсу.
- HTTP: 403 Forbidden
- Kind:
forbidden
Подробности
Клиент аутентифицирован, но у него нет нужных прав для операции. Не выдаётся при отсутствии ресурса — для этого используется *_NOT_FOUND.
INTERNAL_ERROR
Внутренняя ошибка сервиса.
- HTTP: 500 Internal Server Error
- Kind:
internal
Подробности
Непредвиденная ошибка на стороне сервера; клиент не должен пытаться автоматически восстановиться по этому коду — нужно повторить операцию позже или обратиться в поддержку.
MALFORMED_JSON
Некорректное тело запроса (не парсится как JSON).
- HTTP: 400 Bad Request
- Kind:
malformed
Подробности
Тело запроса невалидное (битый JSON, неверная структура).
UNAUTHORIZED
Клиент не аутентифицирован.
- HTTP: 401 Unauthorized
- Kind:
unauthorized
Подробности
Отсутствует или невалиден bearer-токен / сессионная кука. Клиенту нужно повторить аутентификацию.
VALIDATION_ERROR
Ошибка валидации входных данных.
- HTTP: 400 Bad Request
- Kind:
validation
Подробности
Значение хотя бы одного поля запроса не соответствует требованиям. Дополнительные данные (имя поля, причина) приходят в Details.
Workspace
WORKSPACE_ALREADY_ASSOCIATED
Workspace уже связан с MPC-конфигурацией.
- HTTP: 409 Conflict
- Kind:
conflict
Подробности
Попытка повторно ассоциировать workspace с конфигами после того, как ассоциация уже произведена.
WORKSPACE_ALREADY_EXISTS
Конфликт уникальности при создании workspace.
- HTTP: 409 Conflict
- Kind:
conflict
Подробности
Workspace с таким же уникальным набором атрибутов уже существует.
WORKSPACE_NOT_FOUND
Workspace не найден.
- HTTP: 404 Not Found
- Kind:
not_found
Подробности
Запрошенный workspace отсутствует в БД или недоступен текущему пользователю.
WORKSPACE_STATUS_INCOMPATIBLE
Статус workspace не позволяет операцию.
- HTTP: 409 Conflict
- Kind:
conflict
Подробности
Операция требует определённого статуса workspace (например, активации нужен статус new), но текущий статус другой.
Vault
VAULT_ALREADY_EXISTS
Vault с таким именем уже существует в workspace.
- HTTP: 409 Conflict
- Kind:
conflict
Подробности
Имя vault должно быть уникальным в рамках workspace.
VAULT_FROZEN
Операция недопустима над замороженным vault.
- HTTP: 409 Conflict
- Kind:
conflict
Подробности
Vault находится в статусе frozen — действие требует предварительной разморозки.
VAULT_NOT_FOUND
Vault не найден.
- HTTP: 404 Not Found
- Kind:
not_found
Подробности
Запрошенный vault отсутствует, удалён или принадлежит другому workspace.
VAULT_UNFREEZE_BLOCKED_BY_AML
Admin не может разморозить AML-замороженный vault.
- HTTP: 409 Conflict
- Kind:
conflict
Подробности
AML-провайдер запретил админам снимать заморозку. Для разморозки нужны более широкие полномочия или изменение настроек провайдера.
Wallet
WALLET_ALREADY_EXISTS
Wallet с такой комбинацией параметров уже существует.
- HTTP: 409 Conflict
- Kind:
conflict
Подробности
Попытка создать wallet/asset для существующей пары vault+currency.
WALLET_ASSET_NOT_FOUND
Asset кошелька не найден.
- HTTP: 404 Not Found
- Kind:
not_found
Подробности
Запрошенный asset отсутствует или принадлежит другому workspace.
WALLET_CURRENCY_UNKNOWN
Клиент указал неизвестный currency_id.
- HTTP: 400 Bad Request
- Kind:
validation
Подробности
Currency_id из запроса не зарегистрирован в системе. Поле currency_id приходит в WebError.Details.
WALLET_NOT_FOUND
Кошелёк не найден.
- HTTP: 404 Not Found
- Kind:
not_found
Подробности
Запрошенный wallet/asset отсутствует или принадлежит другому workspace.
Whitelisted Address
WHITELISTED_ADDRESS_ALREADY_EXISTS
Whitelisted address уже существует.
- HTTP: 409 Conflict
- Kind:
conflict
Подробности
Указанный адрес уже добавлен в этот whitelisted-кошелёк.
WHITELISTED_ADDRESS_NOT_FOUND
Whitelisted address не найден.
- HTTP: 404 Not Found
- Kind:
not_found
Подробности
Запрошенный whitelisted-адрес отсутствует или принадлежит другому кошельку.
WHITELISTED_CURRENCY_UNKNOWN
Клиент указал неизвестный currency_id.
- HTTP: 400 Bad Request
- Kind:
validation
Подробности
Currency_id из запроса не зарегистрирован в системе. Поле currency_id приходит в WebError.Details.
WHITELISTED_WALLET_ALREADY_EXISTS
Whitelisted wallet с таким именем уже существует.
- HTTP: 409 Conflict
- Kind:
conflict
Подробности
Имя whitelisted-кошелька должно быть уникальным в рамках workspace.
WHITELISTED_WALLET_NOT_FOUND
Whitelisted wallet не найден.
- HTTP: 404 Not Found
- Kind:
not_found
Подробности
Запрошенный whitelisted-кошелёк отсутствует или принадлежит неактивному workspace.
AML
AML_PROVIDER_INVALID_API_KEY
Некорректный API-ключ AML-провайдера.
- HTTP: 400 Bad Request
- Kind:
malformed
Подробности
Предоставленный API-ключ был отклонён провайдером при попытке подключения. Нужно перепроверить ключ и повторить запрос.
AML_PROVIDER_NOT_FOUND
AML-провайдер не найден.
- HTTP: 404 Not Found
- Kind:
not_found
Подробности
Workspace ссылается на AML-провайдера, которого нет среди зарегистрированных в системе. Клиенту следует выбрать другого провайдера из списка доступных.
Backup
BACKUP_NOT_FOUND
Backup не найден.
- HTTP: 404 Not Found
- Kind:
not_found
Подробности
Backup отсутствует, ещё не подготовлен или больше не доступен для запрошенной операции.
BACKUP_STATUS_INCOMPATIBLE
Статус backup не позволяет операцию.
- HTTP: 409 Conflict
- Kind:
conflict
Подробности
Ожидался один статус, найден другой (например, для подтверждения нужен received).
BACKUP_WORKSPACE_INACTIVE
Workspace неактивен для backup-операции.
- HTTP: 409 Conflict
- Kind:
conflict
Подробности
Для активного workspace разрешено создавать/проверять backup; в неактивном статусе операция отклонена.
Co-signer
COSIGNER_PART_NOT_FOUND
Co-signer part не найден.
- HTTP: 404 Not Found
- Kind:
not_found
Подробности
Запрошенный part отсутствует, уже закоммичен (его конфиг очищен) или связанный pending-intent недоступен.
COSIGNER_PART_STATUS_INVALID
Некорректный статус part для операции.
- HTTP: 409 Conflict
- Kind:
conflict
Подробности
Part находится в состоянии, при котором запрошенная операция недопустима (например, попытка commit без предварительного receive).
Gas station
GAS_STATION_CANNOT_ASSIGN_SELF
Попытка активировать auto-fuel на вольте, который сам является gas station.
- HTTP: 400 Bad Request
- Kind:
validation
Подробности
Gas station vault не может быть источником пополнения для самого себя — выберите другой vault.
GAS_STATION_NOT_FOUND
Gas station или связанная конфигурация не найдены.
- HTTP: 404 Not Found
- Kind:
not_found
Подробности
Для workspace/vault не назначена gas station, либо отсутствует asset-конфигурация в назначенной gas station.
Intent
INTENT_BATCH_ACQUIRE_WRONG_ENDPOINT
Batch-sign intent acquire через неверный эндпоинт.
- HTTP: 400 Bad Request
- Kind:
validation
Подробности
Batch-sign intent должен acquire-ться через /pending-intent/{id}/acquire-sign, а не через /acquire.
INTENT_NOT_ACQUIRABLE
Intent нельзя acquire текущим пользователем.
- HTTP: 409 Conflict
- Kind:
conflict
Подробности
Пользователь не подходит на роль acquire-er (нет прав либо intent адресован другому target).
INTENT_NOT_FOUND
Pending intent не найден.
- HTTP: 404 Not Found
- Kind:
not_found
Подробности
Запрошенный pending intent отсутствует, отозван или принадлежит другому workspace.
INTENT_NOT_SIGNABLE
Intent нельзя подписать.
- HTTP: 409 Conflict
- Kind:
conflict
Подробности
Для операции AcquireSign intent должен быть типа sign.
INTENT_PAYLOAD_MISSING
Payload intent отсутствует или null.
- HTTP: 400 Bad Request
- Kind:
validation
Подробности
Тело pending intent не содержит обязательной секции intent.
INTENT_STATUS_INVALID
Некорректный статус intent для операции.
- HTTP: 409 Conflict
- Kind:
conflict
Подробности
Операция требует определённого статуса (active/acquired); текущий статус другой и приходит в WebError.Details.
Transaction
TRANSACTION_APPROVAL_INVALID
Попытка апрува невалидным пользователем или для не-active intent.
- HTTP: 403 Forbidden
- Kind:
forbidden
Подробности
Пользователь не входит в список approvers или intent уже завершён / отозван.
TRANSACTION_ASSET_MISMATCH
Source и target asset не совпадают.
- HTTP: 400 Bad Request
- Kind:
validation
Подробности
Для перевода между внутренними кошельками источник и приёмник должны относиться к одной и той же валюте.
TRANSACTION_BLOCKED_BY_POLICY
Транзакция заблокирована политикой workspace.
- HTTP: 403 Forbidden
- Kind:
forbidden
Подробности
Правила politики не разрешают эту операцию. Причина и метаданные решения едут в WebError.Details.
TRANSACTION_INSUFFICIENT_BALANCE
На источнике недостаточно available-баланса.
- HTTP: 409 Conflict
- Kind:
conflict
Подробности
Available-баланс источника меньше суммы перевода (плюс комиссия, если она списывается из того же актива). В WebError.Details кладутся available и required в атомарных единицах.
TRANSACTION_NOT_FOUND
Транзакция не найдена.
- HTTP: 404 Not Found
- Kind:
not_found
Подробности
Запрошенная транзакция отсутствует или принадлежит другому workspace.
TRANSACTION_STATUS_INCOMPATIBLE
Статус транзакции не позволяет операцию.
- HTTP: 409 Conflict
- Kind:
conflict
Подробности
Операция требует определённого статуса (например, разморозка нужна только для frozen). Текущий статус кладётся в WebError.Details.
TRANSACTION_TARGET_MISSING
Не задан адрес/кошелёк назначения.
- HTTP: 400 Bad Request
- Kind:
validation
Подробности
В запросе нужно указать либо target_address, либо target_wallet_id.
TRANSACTION_UNFREEZE_BLOCKED_BY_AML
Admin не может разморозить AML-замороженную транзакцию.
- HTTP: 409 Conflict
- Kind:
conflict
Подробности
AML-провайдер запретил админам снимать заморозку транзакций.
TRANSACTION_UPSTREAM_ERROR
Ошибка от внешней системы обработки транзакций.
- HTTP: статус наследуется от Kind, который выводится из status_code в Details
- Kind:
validation | not_found | conflict | unauthorized | forbidden | unavailable | internal
Подробности
Внешняя система обработки транзакций вернула не-2xx ответ. Все полезные поля upstream-ответа (status_code, error_code, error_details, transaction_id, status, expired_at) доступны через WebError.Details. Если в upstream-ответе был error_code, именно он позволяет клиенту реагировать на конкретный сценарий.
Company
COMPANY_NOT_FOUND
Компания не найдена.
- HTTP: 404 Not Found
- Kind:
not_found
Подробности
Запрошенная компания отсутствует в системе.
Webhook
WEBHOOK_LIMIT_EXCEEDED
Превышен лимит webhooks для workspace.
- HTTP: 409 Conflict
- Kind:
conflict
Подробности
Для workspace настроено максимально допустимое количество webhooks. Удалите неактуальные перед созданием новых.
WEBHOOK_NOT_FOUND
Webhook не найден.
- HTTP: 404 Not Found
- Kind:
not_found
Подробности
Запрошенный webhook отсутствует или принадлежит другому workspace.
WEBHOOK_SIGNING_KEY_UNAVAILABLE
KMS-подписант не сконфигурирован.
- HTTP: 503 Service Unavailable
- Kind:
unavailable
Подробности
Попытка получить публичный ключ для проверки подписи, но trust-сервис не настроен. Скорее всего ошибка конфигурации сервиса.
WEBHOOK_URL_INVALID
URL вебхука не прошёл проверку.
- HTTP: 400 Bad Request
- Kind:
validation
Подробности
URL не парсится, использует недопустимую схему, указывает на loopback/приватную сеть или хост не резолвится. Конкретная причина едет в WebError.Details.