Журнал изменений API
Все изменения публичного API: новые маршруты, поля, события вебхуков и коды ошибок. Новые записи добавляются сверху, даты указаны по UTC. Изменение, ломающее совместимость, отмечается словом несовместимо и объясняет, что должен сделать интегратор.
2026-09-13, комиссия сети
- Несовместимо для кода, который проверяет
fees.network.statusинвойса по перечнюquoted,pending,settled. У инвойса нет отдельной комиссии сети: затраты сети на приём входят в комиссию сервиса, иfees.network.statusтеперь всегдаincluded. Прежние значения больше не приходят. Ключи сохранены:quote,quote_rateиactual— всегдаnull,payer— всегдаmerchant. Если интеграция проверяет перечень строго, добавьтеincluded. См. комиссии. То же — в событияхinvoice.*и в ответах API кабинета и страницы оплаты. - Коды
422 network_fee_payer_not_supportedи503 network_fee_quote_unavailableостаются: покупатель комиссию сети не несёт. Изменились только их сообщения. - У выплаты новое поле
fees.network:payer— всегдаmerchant,amount— фиксированная комиссия сети, записанная в выплату при создании,charged— сколько списано с баланса проекта. То же — в данных событийpayout.confirmedиpayout.failed. См. комиссию сети. - Комиссия сети списывается с баланса проекта при подтверждении выплаты, отдельной проводкой реестра; выплата, провалившаяся в цепи, её не несёт. Получатель по-прежнему получает ровно
amount. - Административный API: тариф комиссии сети за выплату —
GET /admin/v1/payout-feesиPOST /admin/v1/payout-fees, кодыpayout_fee_confirmation_requiredиpayout_fee_valid_from_in_past; новый вид счёта реестраnetwork_cost_recoveryвGET /admin/v1/balancesи в проводках — административный API.
2026-09-13, комиссия сервиса
- У инвойса новые поля:
amount_requested— цена мерчанта,amount_credited— полученное за вычетом удержанных комиссий,fees— комиссия сервиса и комиссия сети. Поля только добавлены, прежние не меняют смысла:amount_expected— по-прежнему сумма, которую должен заплатить покупатель. См. комиссии. - Проверьте интеграцию. Если в проекте комиссию сервиса платит покупатель,
amount_expectedбольше цены на эту комиссию. Код, который сравниваетamount_expectedсо своей ценой заказа, должен сравниватьamount_requested. В проектах, где комиссию платит мерчант (так по умолчанию),amount_expectedравен цене, как раньше. - Идемпотентность
POST /v1/invoicesпоorder_idсравниваетamountзапроса с ценойamount_requested: повтор присылает цену, а не сумму с комиссией. - Комиссия сервиса удерживается с каждого подтверждённого платежа отдельной проводкой реестра и уменьшает баланс мерчанта. Ставка записывается в инвойс при создании: смена тарифа не меняет уже выставленные инвойсы.
- Те же поля — в данных событий
invoice.*(вебхуки) и в ответе маршрута страницы оплаты; страница оплаты показывает разбивку «Цена · Комиссия сервиса · Итого», когда комиссию платит покупатель (страница оплаты). - Новый код
503 network_fee_quote_unavailable: проект настроен так, что комиссию сети платит покупатель, а посчитать её сейчас нельзя. Такую настройку API кабинета больше не принимает —422 network_fee_payer_not_supported. - Административный API: тарифы комиссии сервиса —
GET /admin/v1/service-fees,POST /admin/v1/service-fees/platform,GET /admin/v1/merchants/{id}/service-fees,POST /admin/v1/merchants/{id}/service-fees, кодыservice_fee_confirmation_requiredиservice_fee_valid_from_in_past— административный API.GET /admin/v1/feesостался отчётом о комиссиях сети.
2026-09-13, проверка проектов и настройки проекта
- Проект, который бизнес заводит сам, принимает платежи только после проверки. Пока он не одобрен или если отклонён,
POST /v1/invoicesиPOST /v1/addressesотвечают новым кодом403 merchant_not_approved. Ключи API при этом работают, чтение инвойсов тоже. Все мерчанты, созданные раньше, одобрены: для существующих интеграций ничего не меняется. - Владелец может выключить приём в активе для своего проекта. Тогда
POST /v1/invoicesв этом активе отвечает новым кодом422 asset_disabled_by_merchant, аPOST /v1/addressesне включает актив в списокassets. Уже открытые инвойсы оплачиваются и закрываются, повтор принятого запроса возвращает инвойс. 403 merchant_disabledтеперь означает выключение и оператором, и владельцем проекта.- Проект без адреса вебхуков событий не получает: они не ставятся в очередь и после появления адреса не досылаются (вебхуки).
- Административный API: у мерчанта новые поля —
review_status,review_reason,reviewed_at,reviewed_by,site_url,description,network_fee_payer,service_fee_payer,disabled_by. Появились фильтрGET /admin/v1/merchants?review_status=, маршрутыPOST /admin/v1/merchants/{id}/approveиPOST /admin/v1/merchants/{id}/reject— административный API. Несовместимо для клиентов административного API:webhook_urlмерчанта может бытьnull. Консоль обновлена в том же изменении. - Маршруты
/cabinet/v1для приложения кабинета: служебные, снаружи недоступны и вGET /v1/openapi.jsonне входят.
2026-09-13, переключатели приёма и выплат
- Оператор может временно выключить приём или выплаты в активе. Пока приём выключен,
POST /v1/invoicesв этом активе отвечает новым кодом422 asset_payments_disabled, аPOST /v1/addressesне включает актив в списокassets. Пока выключены выплаты,POST /v1/payoutsотвечает новым кодом422 asset_payouts_disabled. - Повторы запросов, принятых раньше, отвечают как прежде: инвойс по тому же
order_idи выплата по тому жеreferenceвозвращаются. - Уже открытые инвойсы оплачиваются и закрываются, уже созданные выплаты исполняются: переключатель касается только нового.
- Административный API:
PATCH /admin/v1/assets/{id}, поляpayments_enabledиpayouts_enabledв объекте актива, новые кодыasset_not_foundиasset_flag_locked— административный API.
2026-09-13, административный API консоли
- Маршруты
/admin/v1для консоли оператора: мерчанты и их ключи, инвойсы, остатки счетов реестра, движение средств, комиссии сети, каталог активов, доставки вебхуков и журнал аудита — административный API. Доступ по токену консолиADMIN_API_TOKENи заголовку оператораX-Operator; без токена маршрутов нет (ADR-0033). - Адреса возврата мерчанта
return_urlиcancel_urlвидны в объекте мерчанта и меняютсяPATCH /admin/v1/merchants/{id}по правилам страницы оплаты. - Новые коды ошибок, только у этих маршрутов:
merchant_not_found,api_key_not_found,delivery_not_found,delivery_not_failed. - Маршруты
/v1и описаниеGET /v1/openapi.jsonне изменились: административные маршруты в него не входят.
2026-09-13, страница оплаты и адреса возврата
- У инвойса новое поле
checkout_url— ссылка на страницу оплаты, если оператор её настроил, иначеnull. - Необязательные поля
return_urlиcancel_urlвPOST /v1/invoices: куда страница оплаты вернёт покупателя. Допускаются только в пределах origin адресов, заданных у мерчанта оператором; иначе новый код422 redirect_url_not_allowed. Те же поля появились в ответе инвойса. - Повтор
POST /v1/invoicesс другимиreturn_urlилиcancel_url—409 order_id_conflict, как повтор с другой суммой. Запросы без этих полей ведут себя как раньше. - Возврат покупателя подписан: параметры
invoice_id,order_id,status,ts,signature, подпись HMAC-SHA256 секретом вебхуков. Формат и код проверки — в странице оплаты. Решение — ADR-0032. GET /checkout/v1/invoices/{id}— служебный маршрут сервера страницы оплаты, без ключа API, в приватной сети. Мерчантам он не нужен.
2026-09-12, USDC в сети TRON
- Новый актив
USDC_TRON: инвойсы и выплаты в USDC принимаются наравне с USDT, 6 знаков после запятой, 20 подтверждений. КонтрактTEkxiTehnzSmSe2XqrBj4w32RUN966rdz8— прочитан в сети, а не взят из статьи:symbol() = USDC,name() = USD Coin,decimals() = 6. Обоснование и граница решения — в ADR-0026. - USDC на адресе приёма больше не считается неожиданным активом. Для TRON
unexpected_assetтеперь означает токен, которого нет в каталоге. - TRX платёжным активом пока не стал: в режиме сжигания энергии (
SWEEP_ENERGY_MODE=burn) комиссию за свип платит сам адрес приёма, поэтому TRX на него кладёт оператор — и с включённым флагом эти операционные деньги были бы зачислены как чей-то платёж. Сначала правило, отличающее переводы с наших адресов, и тест; потом флаг. Выплаты в TRX не появятся и после: суточные лимиты складывают суммы в одной единице, что верно только для привязанных к доллару активов. - Активы тестовых сетей не изменились: проверяемого контракта USDC в Nile и Shasta нет.
2026-09-12, домен в установщике
POST /setup/domain— панель находит у провайдера DNS зону, которой принадлежит указанное имя, создаёт или исправляет запись A на адрес этого сервера и возвращает то, что видно в публичном DNS прямо сейчас. Проверяется не своя запись, а ответ сети: записанное и видимое — разные утверждения, и работает только второе.- Если зоны у провайдера нет, панель создаёт её сама и показывает NS-серверы, которые нужно прописать у регистратора домена: без делегирования зону не видит никто, какими бы правильными ни были записи в ней. Зона создаётся под регистрируемым именем — последние две метки.
- Ответ маршрута говорит, видит ли провайдер делегирование (
delegated), создавалась ли зона (zone_created) и какие NS-серверы нужны (nameservers). - Шаг «Домен» стоит первым и необязателен: без домена сервис доступен по адресу сервера. Переменные
SETUP_DOMAINиBUNNY_API_KEYпишет сама панель; ключ провайдера используется только для записи и проверки и обратно не показывается. - Панель первого запуска теперь открывается в браузере по адресу сервера — порт API публикуется на время установки одной переменной и возвращается на loopback после неё (ADR-0025). Маршруты
/v1не изменились.
2026-09-12, установщик записывает конфигурацию сам
- Страница первого запуска больше не печатает блок переменных для вставки руками: она записывает файл окружения на сервере —
POST /setup/env. Значения проверяются теми же разборщиками, которыми сервис читает конфигурацию при старте, поэтому записанный файл — это файл, с которым сервис запускается. Маршруты/v1не изменились. POST /setup/signer-valuesиGET /setup/signer-env— выбор владельца для сервера подписи и готовый файл окружения для него вместе с командами по порядку. Пароль роли базы и два значения сида в него не попадают: первый уже есть на этом сервере, вторые создаются на том.- Шаги «Сеть и узлы» и «Файл окружения» — новые и обязательные. Второй закрывается только когда значения не просто записаны, но и применены: переменные читаются один раз, при старте.
- Секрет, принятый страницей, обратно не отдаётся: в ответе
GET /setup/stateу него только признак «задано». Пустое поле означает «не менять». - Поле, в которое вставили 12 или 24 коротких слова, отвергается: мнемоника не вводится на этой странице ни в одно поле. Обоснование и границы — в ADR-0024.
2026-09-12, страница первого запуска
- Пока настройка сервиса не завершена, API отдаёт страницу
GET /setup, которая ведёт по шагам и проверяет каждый. Когда все обязательные шаги закрыты, её маршруты отвечают404. Мерчантов это не касается: маршруты/v1не изменились. - Служебные маршруты страницы:
GET /setup/state,POST /setup/verify,POST /setup/steps/{key},POST /setup/merchant. Доступны только из приватной сети и только с одноразовым кодом из лога сервиса. См. первый запуск. - Страница не принимает и не создаёт мнемонику, парольную фразу и приватную половину операторского ключа — обоснование в ADR-0024.
2026-09-12, отправка выплат
- События
payout.confirmedиpayout.failed: выплата подтверждена сетью или её транзакция попала в блок неуспешной. Поля — в вебхуках. Как и раньше, тело вебхука — сигнал «сходи проверь»: состояние выплаты берите изGET /v1/payouts/{id}. - Выплата в
failedне повторяется автоматически: новая попытка требует новогоreference. - Остальное в этом обновлении внутреннее: подпись выплат с горячего кошелька, вторая независимая проверка вайтлиста вместе с подписью оператора, предохранитель, останавливающий выплаты сам. Публичные маршруты не изменились.
2026-09-12, выплаты
POST /v1/payouts— создание выплаты, идемпотентное поreference. Ответ202у созданной выплаты,200у повтора. См. выплаты.GET /v1/payouts/{id}— текущее состояние выплаты с её статусом и причинами ожидания.- Выплата возможна только на адрес из вайтлиста мерчанта и только после задержки перед первым использованием. Переход лимита выплату не отклоняет: она принимается со статусом
pending_reviewи ждёт подтверждения человека, аreview_reasonsназывает перейденные пределы. См. лимиты. - Новые коды ошибок:
payout_not_found,reference_conflict,asset_not_payable,address_not_whitelisted,payouts_halted. См. коды ошибок. - Отправка выплат в сеть и события вебхуков
payout.confirmedиpayout.failedпоявятся в следующем обновлении: пока выплата доходит до статусаqueuedи ждёт исполнения.
2026-09-12, свипы
- Инвойс доходит до статуса
settled: средства по нему перенесены в холодное хранилище. Для мерчанта это то же, чтоconfirmed, вебхука у перехода нет — товар отдаётся наconfirmed, как и раньше. См. статусы. - Остальное в этом обновлении внутреннее: подпись и отправка свипов, подтверждение их в цепи и проводки в реестре. Публичные маршруты и события вебхуков не изменились.
2026-09-11, операционные маршруты
GET /admin/health— состояние сервиса для оператора и мониторинга: отставание сканера в блоках и глубина очереди вебхуков. См. операционное состояние.GET /metrics— те же показатели в текстовом формате Prometheus.- Оба маршрута служебные: аутентификации не требуют, данных мерчантов не содержат и доступны только в приватной сети.
2026-09-11, доставка вебхуков
- События из очереди уходят на URL мерчанта с подписью
X-Signatureи заголовкомX-Timestamp, с повторами по расписанию из описания вебхуков. До этого события только записывались. - Заголовок
User-Agentисходящих вебхуков содержит название продукта. - Ответ
3xxне считается успешной доставкой и не выполняется.
2026-09-11, сканер платежей
- Инвойсы меняют статус по переводам в сети:
seen,confirmed,underpaid,expired,paid_late. См. статусы. - В ответе
GET /v1/invoices/{id}полеdepositsзаполняется платежами по инвойсу. - Сервис формирует события вебхуков
invoice.seen,invoice.confirmed,invoice.overpaid,invoice.underpaid,invoice.expired,invoice.paid_late,deposit.confirmedиdeposit.orphaned. См. события. Отправка событий на URL мерчанта включится в следующем обновлении.
2026-09-11, адреса и инвойсы
- Аутентификация по заголовку
X-Api-Keyи лимиты запросов по ключу и по IP-адресу — см. аутентификацию. POST /v1/addresses— постоянный адрес пользователя для мерчантов в режимеper_user. См. адреса.POST /v1/invoices— создание инвойса, идемпотентное поorder_id. См. инвойсы.GET /v1/invoices/{id}— текущее состояние инвойса с его платежами.GET /v1/openapi.json— машиночитаемое описание API в формате OpenAPI 3.1.- Новые коды ошибок:
validation_failed,unauthorized,merchant_disabled,invoice_not_found,address_mode_mismatch,order_id_conflict,asset_not_supported,amount_below_minimum,rate_limited,addresses_exhausted. См. коды ошибок.
2026-09-11, служебные маршруты
- Добавлены служебные маршруты
GET /healthzиGET /readyz— см. мониторинг. - Введён единый формат ошибок
{ "error": { "code", "message" } }и кодыbad_request,route_not_found,internal_error,service_unavailable— см. коды ошибок. - Каждый ответ содержит заголовок
X-Request-Idдля поиска запроса в логах.