Bitcoin API: приём платежей BTC без запуска ноды
Принимайте платежи в BTC через REST API. Генерируйте депозитные адреса, отслеживайте подтверждения и отправляйте выплаты без запуска полной Bitcoin-ноды.
Найдите Bitcoin API, и первым результатом будет справочник RPC от Bitcoin Core. Это канонический интерфейс к сети, и он предполагает, что вы управляете полной нодой: устанавливаете bitcoind, синхронизируете примерно несколько сотен гигабайт данных сети, держите машину онлайн и повторяете цикл обновлений при каждом релизе. Для некоторых проектов это верный путь. Если вы хотите принимать платежи в BTC в своём приложении, это крюк.
Bitcoin API от Chaingateway — это REST-альтернатива. Вы создаёте кошельки и депозитные адреса по обычному HTTPS, отправляете BTC одним POST-запросом и получаете вебхук, когда приходят монеты. Это BTC API в самом прямом смысле: HTTPS на входе, JSON на выходе. Аутентификация — Bearer-токен из бесплатного 7-дневного пробного периода — без ноды, без KYC для старта.
Bitcoin через REST вместо JSON-RPC
JSON-RPC Bitcoin Core хочет синхронизированную ноду перед первым полезным ответом. REST API хочет API-ключ. Разница видна в вашем календаре: первоначальная загрузка блоков занимает дни на типичном оборудовании, а после этого нода потребляет диск и пропускную способность и всё равно нуждается в мониторинге на протяжении всей жизни вашего продукта. Наша статья о blockchain API против blockchain node подробно сравнивает оба подхода. Запускайте собственную ноду, когда вам нужен контроль на уровне политики над вашим представлением о сети; используйте API, когда цель — платежи.
Повседневные вызовы чисто ложатся на REST-модель. Там, где интеграция с нодой оборачивает getnewaddress и listtransactions и опрашивает изменения, API назначает адреса и позволяет вебхуку заниматься наблюдением. Циклы опроса исчезают, а вместе с ними — cron-задачи, тихо ломающиеся по выходным.
Есть и второе отличие. Сырые методы RPC возвращают сырые данные. Chaingateway возвращает структурированный JSON с читаемыми полями, так что ответ может пойти прямо в вашу базу данных, минуя слой парсинга.
Что понадобилось бы с bitcoin-core RPC, рядом
Сравнение становится конкретным, как только вы перечисляете реальную работу. Предположим, задача — «дать каждому клиенту депозитный адрес и зачислить его счёт, когда придёт BTC».
| Задача | С Bitcoin Core (JSON-RPC) | С REST API |
|---|---|---|
| Предпосылка | синхронизированная полная нода: bitcoind плюс несколько сотен ГБ данных сети | API-ключ |
| Новый депозитный адрес | getnewaddress на клиента, плюс режим резервного копирования кошелька, который вы пишете сами | POST /api/v2/bitcoin/wallets/{wallet}/addresses |
| Обнаружение входящего BTC | настройка walletnotify, либо опрос listsinceblock / gettransaction по таймеру | подписанный POST вебхука на ваш сервер |
| Отправка BTC | sendtoaddress, плюс горячий кошелёк в ноде, настройки комиссии и резервные копии файла кошелька, которые вы контролируете | POST /api/v2/bitcoin/transactions |
| Отслеживание подтверждений | повторный опрос gettransaction, пока число не удовлетворит вашу политику | опрос GET /api/v2/bitcoin/transactions/{txid}/decoded, который несёт число подтверждений |
| Аудиторский след | парсинг вывода listtransactions и дедупликация в собственном коде | GET /api/v2/bitcoin/webhooks/notifications |
| Текущие затраты | диск, пропускная способность, обновления, мониторинг | проблема провайдера |
Исходящие платежи заслуживают более пристального взгляда. sendtoaddress выглядит как один вызов, но он предполагает горячий кошелёк внутри вашей ноды, настройки комиссии, которые вы контролируете, и протестированную резервную копию файла кошелька. Даже getbalance у́же, чем кажется: он сообщает баланс кошелька ноды, а не произвольного адреса, так что бухгалтерия в стиле биржи всё равно попадает в ваш код. Ничто из этого не критика Bitcoin Core — это эталонное программное обеспечение для управления сетью, и оно хорошо справляется с этой работой. Оно никогда не задумывалось как платёжный бэкенд веб-приложения, поэтому вокруг него накапливается столько связующего кода.
Отправка BTC через REST
REST-сторона пути отправки — это три эндпоинта. POST /api/v2/bitcoin/wallets создаёт кошелёк, зашифрованный паролем, который Chaingateway не хранит — потеряете его, и никто не сможет восстановить кошелёк, в этом и суть. POST /api/v2/bitcoin/wallets/{wallet}/addresses выводит под ним столько адресов, сколько вам нужно; один кошелёк несёт их все. А POST /api/v2/bitcoin/transactions отправляет:
curl -X POST https://app.chaingateway.io/api/v2/bitcoin/transactions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq",
"amount": 0.0015,
"walletname": "treasury",
"password": "wallet-password",
"speed": "medium"
}'
Ответ несёт txid транслированной транзакции. speed принимает fast, medium или slow и задаёт уровень комиссии — компромисс между стоимостью и временем до первого подтверждения. Необязательный subtractfee: true вычитает сетевую комиссию из суммы вместо добавления её сверху, что нужно, когда клиент выводит весь свой баланс.
Это полный вызов отправки — создайте аккаунт и запустите его в testnet со своим собственным кошельком.
Всё необходимое для приёма BTC
Вебхуки (IPN)
Мгновенные уведомления о платежах для входящих транзакций, отправляемые сразу после расчёта соответствующей транзакции в сети. Задайте личный секрет в своём профиле, и каждое уведомление будет нести заголовок X-Signature, который может проверить ваш сервер. Доставки, завершившиеся неудачей, перечислены на GET /api/v2/bitcoin/webhooks/notifications/failed и могут быть повторно отправлены одним вызовом.
Предсказуемые REST-эндпоинты
Создавайте адреса и отслеживайте платежи через чистый, последовательный API. Запросы и ответы выглядят как остальная платформа Chaingateway, поэтому разработчик, интегрировавший одну сеть, читает ответы Bitcoin без руководства.
Безопасная обработка адресов
Некастодиальность по конструкции, со встроенной валидацией адреса. Некорректные или опечатанные адреса отклоняются прежде, чем что-либо коснётся сети.
Декодированные запросы
Данные транзакций приходят как структурированный JSON вместо сырого hex, включая суммы и состояние подтверждений, на которые действует ваш бэкенд.
Время блока и подтверждения: чего ожидать
Bitcoin добавляет блок примерно каждые десять минут, хотя отдельные интервалы сильно варьируются. Каждый новый блок, добытый поверх блока с вашей транзакцией, добавляет подтверждение, и каждое подтверждение усложняет разворот.
| Размер платежа | Подтверждений ожидать |
|---|---|
| Небольшой, до примерно $1000 | 1 (около 10 минут) |
| Средний, до примерно $10 000 | 3 (около 30 минут) |
| Крупный | 6 (около часа) |
| Очень крупный, свыше $1 млн | 10 и более |
Шесть подтверждений — около часа — де-факто стандарт «расчёта» со времён ранних бирж, и это остаётся верным по состоянию на середину 2026 года.
Десять минут — это в среднем, а не по расписанию
Корректировка сложности удерживает это со временем, но отдельные интервалы разбросаны широко вокруг этого значения — два блока в минуту случаются, как и сорокаминутные затишья. UX платежей должен это учитывать: «около десяти минут» — это среднее, а не обещание, поэтому ваша страница кассы должна говорить «обычно в течение часа», а не запускать таймер обратного отсчёта, который не может сдержать.
Почему не зачислять при нуле подтверждений?
Потому что до попадания в блок транзакция сидит в мемпуле, где её можно заменить или потратить дважды, и даже самый новый блок может выпасть из цепочки при реорганизации. API разбивает эту работу на две части. Вебхук срабатывает, как только транзакция расчитается в сети — payload несёт сумму, адрес, txid и номер блока, — так что ваш UI может отреагировать сразу. Дальше GET /api/v2/bitcoin/transactions/{txid}/decoded возвращает текущее число подтверждений, так что ваш реестр зачисляет только деньги, достигшие вашего порога. Показывайте прогресс рано, расчитывайте поздно.
UTXO: почему депозиты Bitcoin отличаются от EVM-сетей
У Bitcoin нет балансов аккаунтов. То, что хранит сеть, — это неизрасходованные выходы транзакций — UTXO, каждый — дискретный комок стоимости, привязанный к адресу. «Баланс» кошелька — это число, которое ваше ПО выводит, суммируя каждый UTXO, контролируемый его адресами; протокол никогда не хранит эту сумму нигде. Трата потребляет целые UTXO и создаёт новые, включая выход сдачи обратно к себе, — так же, как оплата счёта на 7 евро десятиевровой купюрой возвращает монеты.
Ethereum работает по противоположной модели. У аккаунта один баланс, сеть хранит его напрямую, и депозит — это приращение. В сетях EVM нормально дать клиенту один адрес и позволить сотне депозитов накапливаться на нём годами.
Для обработки депозитов модель UTXO даёт практическое преимущество: она подталкивает вас к одному адресу на клиента или на счёт, что и так является более чистым дизайном. Каждый входящий платёж — это новый выход на адрес, который вы отслеживаете, поэтому атрибуция однозначна — без разбора memo, без сопоставления по сумме. Это также означает, что «баланс адреса» — вопрос, на который отвечает индексатор, а не сеть, и именно эту бухгалтерию вы отдаёте на аутсорс, используя API с вебхуками вместо запуска этой машинерии самостоятельно. Уведомление сообщает вам: эта сумма, этот адрес, эта транзакция, этот блок. Остальное делает ваш реестр.
Поток депозита, шаг за шагом
Большинство интеграций Bitcoin в Chaingateway сосредоточены на депозитах: адрес на клиента, вебхук на платёж.
- Назначьте каждому клиенту депозитный адрес из вашего кошелька (
POST /api/v2/bitcoin/wallets/{wallet}/addresses). - Клиент отправляет BTC.
- Как только транзакция расчитается в сети, Chaingateway отправит POST с подписанным уведомлением на ваш сервер, несущим сумму, адрес, txid и номер блока.
- Ваш бэкенд проверяет подпись и зачисляет счёт, когда число подтверждений — прочитанное из
GET /api/v2/bitcoin/transactions/{txid}/decoded— достигает вашего порога.
Две заметки по реализации. Доставка не строго однократна — неудачное уведомление, которое вы повторно отправляете через API, придёт снова целиком, — поэтому сделайте ваш обработчик идемпотентным и привязывайте зачисления к ID транзакции, а не считайте callback-и. И подтверждения существуют не просто так: самый новый блок всё ещё может стать сиротой при реорганизации, поэтому решение о зачислении принадлежит числу подтверждений, а не только вебхуку.
Полезно моделировать каждый депозит как небольшой конечный автомат, а не булево значение. Заказ начинается с awaiting_payment, переходит в detected, когда срабатывает вебхук, продвигается через confirming, пока ваш поллер отслеживает число подтверждений, и попадает в settled, как только достигнут порог, — с underpaid и expired как явными боковыми выходами. Клиенты, отправляющие 0,00095 BTC против счёта в 0,001 BTC, существуют — обычно потому что их кошелёк вычел сетевую комиссию из введённой суммы; решите заранее, поглощает ли ваш допуск недостачу, или заказ ждёт доплаты. И дайте счетам срок истечения. Курсы обмена движутся, поэтому адрес, соответствовавший сумме счёта в понедельник, не должен расчитываться по устаревшей цене на следующей неделе.
Для аудита и сверки каждое уведомление, полученное вашим аккаунтом, можно перечислить через API:
curl https://app.chaingateway.io/api/v2/bitcoin/webhooks/notifications \
-H "Authorization: Bearer YOUR_API_KEY"Сначала testnet
Добавьте заголовок X-Network: testnet, и каждый вызов на этой странице выполнится против тестовой сети Bitcoin: те же маршруты, те же формы ответов, монеты без ценности. Краники бесплатно раздают тестовый BTC, так что весь поток депозита — адрес, платёж, вебхук, подтверждения — можно отрепетировать от начала до конца, не потратив ни одного сатоши.
Держите заголовок за конфигурацией, а не разбросанным по коду, и дайте вашему staging-окружению отдельный callback URL, чтобы тестовые депозиты не могли просочиться в продакшн-реестр. Когда репетиция сработает, уберите заголовок. Больше ничего в интеграции не меняется, в этом и суть: первый депозит в mainnet должен быть скучным.
Когда что-то ломается
Платёжный бэкенд зарабатывает свою репутацию в плохие дни, так что планируйте пути сбоев явно.
На уровне HTTP правила стандартны для REST. 401 означает, что Bearer-токен неверен или отсутствует; исправьте ключ, а не повторяйте. Другие ответы 4xx указывают на сам запрос — логируйте тело, называющее проблему, и относитесь к этому как к багу. Ответы в диапазоне 5xx и таймауты временны; повторяйте их с задержкой.
Специфичные для Bitcoin сценарии сбоя живут выше HTTP. Депозит, который никогда не подтверждается, обычно заплатил слишком маленькую комиссию и застрял в мемпуле; он может подтвердиться часы спустя или полностью выпасть, поэтому detected и settled должны оставаться отдельными состояниями в вашей системе. Уведомление о сумме ниже суммы счёта — это бизнес-решение, а не ошибка; обрабатывайте это в коде, а не в очереди поддержки. И если ваша конечная точка вебхука была недоступна, неудачные доставки ждут вас: GET /api/v2/bitcoin/webhooks/notifications/failed перечисляет их, POST /api/v2/bitcoin/webhooks/notifications/{id}/retry повторно отправляет каждую, а полный список на GET /api/v2/bitcoin/webhooks/notifications позволяет сравнить с реестром и зачислить пропущенное. Запускайте это сравнение каждую ночь, даже когда ничего не выглядит неправильным. Сверка, запускающаяся только после инцидентов, находит свои баги в продакшене.
Нужны стейблкоины рядом с BTC?
У самого Bitcoin нет USDT или USDC — стейблкоины живут в других сетях. Что даёт общая платформа — это форa: ваша интеграция Bitcoin уже говорит на том же API, что и наши эндпоинты Ethereum и TRON. Принимайте BTC сегодня, добавьте USDT на TRON в следующем спринте тем же ключом и тем же обработчиком вебхуков. Обзор blockchain API перечисляет все семь поддерживаемых сетей.
Практический порядок для большинства команд: сначала запустите депозиты BTC, потому что это то, что клиенты просят по имени, затем позвольте платёжным данным подсказать, какой стейблкоин-рельс добавить вторым. В Chaingateway этот второй рельс переиспользует вашу проверку подписи, вашу задачу сверки и ваш конечный автомат депозита без изменений.
Почему разработчики строят на Bitcoin
- У него самая долгая история среди всех блокчейнов, работающая с 2009 года, и самое широкое признание среди конечных пользователей.
- Сеть расчитывается круглосуточно. Нет банковских часов и региональных отсечек.
- Подтверждения следуют предсказуемому ритму, с новым блоком примерно каждые десять минут, что упрощает рассуждения о платёжных потоках.
- Принятие — крупнейшее среди всех криптосетей, поэтому «принимаете ли вы Bitcoin?» всё ещё первый вопрос, который задают клиенты.
Ни одно из этих свойств не появилось из обновления дорожной карты; это те же гарантии, с которыми сеть была выпущена. Эта стабильность — аргумент в пользу BTC для продуктов с долгим горизонтом: интеграция, построенная в этом году, не устареет из-за поворота протокола в следующем — а это больше, чем может заявить большинство платёжных стеков.
Построено для реальных платёжных сценариев
Очевидный случай — касса: клиент выбирает Bitcoin, и ваше приложение назначает адрес; вебхук подтверждает платёж. Те же строительные блоки несут и более тяжёлые нагрузки. Биржи и игровые платформы держат по одному депозитному адресу на пользователя и зачисляют балансы при подтверждении. Потоки выплат и денежных переводов проталкивают трансграничные переводы без корреспондентских банков посередине. Подписные сервисы генерируют свежий адрес счёта каждый цикл и позволяют вебхуку закрывать его.
Что объединяет эти случаи — это форма работы. Bitcoin занимается расчётами; ваше приложение — состоянием. API находится между ними и превращает события сети в HTTP-вызовы, которые ваш фреймворк уже умеет маршрутизировать, — поэтому случай кассы и случай биржи работают на одной и той же горстке эндпоинтов.
Интеграция за три шага
Получите API-ключ. Регистрация бесплатна, и пробный период начинается без KYC.
Выполните первый запрос. Подтвердите ключ через GET /api/account, затем создайте кошелёк и ваши депозитные адреса.
Настройте вебхуки и запустите продакшен. Направьте уведомления на вашу конечную точку, проверьте HMAC-подпись, затем уберите заголовок X-Network: testnet — идентичный код заработает в mainnet.
Что работает в какой сети
Bitcoin — единственная строка без столбца переводов токенов: у сети нет стандарта токенов, поэтому нативный BTC работает через собственную модель кошелька вместо вызова в стиле ERC-20. Вот как это выстраивается рядом с другими шестью сетями.
| Сеть | Адреса | Переводы токенов | Вебхуки депозитов |
|---|---|---|---|
| Bitcoin | POST /api/v2/bitcoin/wallets/{wallet}/addresses | — (нет стандарта токенов) | GET /api/v2/bitcoin/webhooks/notifications |
| Ethereum | POST /api/v2/ethereum/addresses/import | ERC-20: POST /api/v2/ethereum/transactions/erc20 | GET /api/v2/ethereum/webhooks/notifications |
| TRON | POST /api/v2/tron/addresses/import | TRC-20 и TRC-10: POST /api/v2/tron/transactions/trc20 и .../trc10 | GET /api/v2/tron/webhooks/notifications |
| Solana | POST /api/v2/solana/addresses | SPL: POST /api/v2/solana/transactions/SPL | — |
| BNB Smart Chain | POST /api/v2/bsc/addresses/import | BEP-20: POST /api/v2/bsc/transactions/bep20 | GET /api/v2/bsc/webhooks/notifications |
| Polygon | POST /api/v2/polygon/addresses/import | ERC-20: POST /api/v2/polygon/transactions/erc20 | GET /api/v2/polygon/webhooks/notifications |
| Arbitrum | POST /api/v2/arbitrum/addresses/import | ERC-20: POST /api/v2/arbitrum/transactions/erc20 | GET /api/v2/arbitrum/webhooks/notifications |
Две сноски для правильного прочтения таблицы. Во-первых: TRON — самая глубокая интеграция на платформе. Помимо перечисленных выше маршрутов, в справочнике описаны стейкинг (POST /api/v2/tron/freeze и /delegate), параметры сети и пара для самостоятельного подписания — /transactions/trc20/build для построения транзакции и /transactions/broadcast для отправки транзакции, подписанной локально. Если ваша служба комплаенса настаивает, что приватные ключи никогда не покидают ваши серверы, этот паттерн build-and-broadcast — ваш путь.
Во-вторых: прочерк означает, что текущий справочник не документирует маршрут v2 для этой ячейки, а не то, что сеть второсортна. У Bitcoin нет стандарта токенов, поэтому ячейка токенов пуста — нативный BTC работает через собственную модель кошелька: создайте зашифрованный паролем кошелёк через POST /api/v2/bitcoin/wallets, деривируйте депозитные адреса под ним и отправляйте через POST /api/v2/bitcoin/transactions. Справочник Solana охватывает создание адресов, переводы SOL и SPL, а также запросы баланса и блоков, но пока без вебхуков. Для всего, что не перечислено здесь, актуальное состояние — в справочнике API.
Часто задаваемые вопросы
Готовы принимать платежи в Bitcoin?
Создайте аккаунт на app.chaingateway.io/register, создайте кошелёк и отправьте тестовый перевод BTC в testnet. Полный справочник эндпоинтов — в документации, а тарифы и лимиты запросов — на отдельной странице.