/v1.
Получение доступа
Доступ выдаётся на каждый проект отдельно. Нужны все четыре условия:Активная подписка, Silver или выше
Одобренная заявка разработчика
Принятые условия для разработчиков API
Scopes, необходимые вашему проекту
Scopes
Аутентификация
Передавайте секретный ключ как Bearer-токен:- Список разрешённых IP — ограничивает вызовы конкретными IP-адресами серверов
- Лимиты частоты — потолки на проект, растущие вместе с уровнем подписки владельца
Ключи, ротация и хранение
- Держите ключ только на сервере — кто им владеет, может списывать средства ваших пользователей
- Выполняйте ротацию на вкладке API-ключей. Прежний ключ продолжает работать 24 часа — льготный период, чтобы выкатить обновление без простоя
- Секрет подписи вебхуков ротируется отдельно, со своим 24-часовым перекрытием
- При утечке немедленно выполните ротацию
Официальный SDK для Node.js
Официальный пакет@vetox-bot/vito оборачивает все девять эндпоинтов и проверку вебхуков. Он берёт на себя заголовок Idempotency-Key, повторные попытки с нарастающей задержкой, тайм-ауты и классификацию ошибок.
Установка
fetch и node:crypto — и поставляется сразу в ESM и CommonJS с полными определениями TypeScript.
Инициализация
apiKey, SDK прочитает VITO_API_KEY из окружения. Формат ключа проверяется при создании клиента, поэтому некорректный ключ упадёт сразу, а не после сетевого обхода и ответа 401.
Параметры клиента
Доступные методы
data — вам никогда не приходится самостоятельно разбирать success или data. Все методы принимают и параметры на конкретный вызов: { timeoutMs, maxRetries, signal, headers }, а методы записи дополнительно — { idempotencyKey }.Примеры использования
Проверка ключа при запуске
Чтение баланса
Списание с пользователя (продажа товара)
Начисление пользователю
Перебор транзакций
Идемпотентность и повторные попытки
SDK отправляет заголовокIdempotency-Key при каждой записи (deduct, credit, transfer). Если вы его не передали, SDK формирует ключ один раз на вызов и повторяет ровно тот же ключ при каждой повторной попытке, поэтому повтор не может провести операцию дважды.
Передавайте свой ключ, когда одна и та же логическая операция может быть повторена из нового процесса — обработчика задач, повторной доставки из очереди или планового прогона:
auth.rotateKey() исключён намеренно — повтор там выпустит второй ключ и обесценит тот, что вернула первая попытка.Проверка вебхуков через SDK
constructEvent проверяет пятиминутное окно повторов, сравнивает за постоянное время с каждой подписью h1 в заголовке — поэтому автоматически работает во время 24-часового перекрытия при ротации — затем разбирает полезную нагрузку и возвращает типизированное событие.
В обработчике маршрута Next.js (App Router) используйте вариант, который сам читает сырое тело:
event.eventId, прежде чем выполнять любой побочный эффект.Обработка ошибок
Всё, что бросает SDK, наследуется отVitoError и несёт code, status, type, requestId и retryable.
Отмена вызова
VitoConnectionError с кодом VITO_SDK_ABORTED.
Списание с пользователя
Ваше приложение вызывает POST /v1/deduct
guildId и данными товара.Vito возвращает confirmUrl
Пользователь подтверждает PIN-кодом
vetox.io.Vito проводит расчёт и уведомляет
Ваше приложение проверяет и завершает
Параметры запроса — /v1/deduct
Начисление пользователю
POST /v1/add начисляет Vito пользователю из вашего собственного баланса — для наград или возвратов. Те же поля, что и у /deduct, кроме guildId и product.
credit:create и достаточный баланс, иначе вызов вернёт 402 VITO_INSUFFICIENT_OWNER_FUNDS.Комиссии
Каждое списание поступает вам за вычетом комиссии платформы — по той же шкале, что и переводы Vito внутри приложения, в зависимости от вашего уровня подписки:/v1/add не облагаются ею никогда.Вебхуки
Добавьте один или несколькоhttps-адресов обратного вызова на вкладке настроек. Vito отправляет подписанный POST, как только подтверждение достигает конечного состояния.
Проверка подписи
Каждая доставка содержит заголовокX-Vito-Signature:
X-Vito-Event-Id как ключ дедупликации, поскольку повторная попытка отправляет тот же идентификатор:
<ts>:<rawBody> вашим секретом подписи и сравните за постоянное время.
События
Пять типов событий с одинаковой структурой полезной нагрузки. Полеdata.status содержит исход.
Коды ошибок
Каждый ответ обёрнут в конверт. Успех несётdata, ошибка — error, и никогда оба сразу:
Лимиты частоты
Idempotency-Key, чтобы безопасно исключать дубли при повторных попытках.Эндпоинты
Ограничения
- Подтверждения истекают через 10 минут — считайте неподтверждённые запросы брошенными
amountдолжен быть положительным целым числомmetadataограничена 10 ключами- Лимиты на транзакцию и на день задаёт команда Vetox; они отображаются только для чтения на вкладке настроек
Чек-лист безопасности
Держите секреты на сервере
Держите секреты на сервере
Проверяйте каждый вебхук
Проверяйте каждый вебхук
Проводите расчёт только по completed
Проводите расчёт только по completed
/deduct — списание окончательно только при confirmation.completed.Минимум привилегий
Минимум привилегий
Устранение неполадок
Каждый вызов возвращает «не авторизовано»
Каждый вызов возвращает «не авторизовано»
Я потерял ключ
Я потерял ключ
Подписи вебхуков не проходят после ротации
Подписи вебхуков не проходят после ротации
Списание никогда не завершается
Списание никогда не завершается
Вебхуки не приходят
Вебхуки не приходят
Пришло меньше Vito, чем я списал
Пришло меньше Vito, чем я списал
402 VITO_INSUFFICIENT_OWNER_FUNDS
402 VITO_INSUFFICIENT_OWNER_FUNDS
/v1/add финансируется из вашего собственного баланса, а не создаётся из ничего. Пополните его.