Bitcoin API : accepter les paiements BTC sans faire tourner de node
Acceptez les paiements BTC via une API REST. Générez des adresses de dépôt, suivez les confirmations, et envoyez des paiements sans faire tourner de full node Bitcoin.
Recherchez une Bitcoin API et le premier résultat est la référence RPC de Bitcoin Core. C'est l'interface canonique vers le réseau, et elle suppose que vous exploitiez une full node : installer bitcoind, synchroniser environ plusieurs centaines de gigaoctets de données de chaîne, garder la machine en ligne, et répéter le cycle de mise à jour à chaque version. Pour certains projets, c'est la bonne voie. Si vous voulez accepter des paiements BTC dans votre application, c'est un détour.
La Bitcoin API de Chaingateway est l'alternative REST. Vous créez des wallets et des adresses de dépôt via de simples appels HTTPS, envoyez du BTC avec un seul POST, et recevez un webhook quand des pièces arrivent. C'est une BTC API au sens le plus simple : HTTPS en entrée, JSON en sortie. L'authentification est un jeton Bearer issu d'un essai gratuit de 7 jours — pas de node, pas de KYC pour démarrer.
Bitcoin en REST plutôt qu'en JSON-RPC
Le JSON-RPC de Bitcoin Core veut une node synchronisée avant la première réponse utile. Une API REST veut une clé API. La différence se voit dans votre calendrier : le téléchargement initial des blocs prend des jours sur du matériel typique, et ensuite la node consomme disque et bande passante, et nécessite toujours une surveillance, aussi longtemps que votre produit existe. Notre article sur blockchain API vs. blockchain node compare les deux approches en détail. Faites tourner votre propre node quand vous avez besoin d'un contrôle au niveau des règles sur votre vue du réseau ; utilisez l'API quand les paiements sont l'objectif.
Les appels du quotidien se traduisent proprement dans le modèle REST. Là où une intégration à base de node enveloppe getnewaddress et listtransactions et sonde les changements, l'API assigne des adresses et laisse le webhook faire la surveillance. Les boucles de polling disparaissent, et avec elles les tâches cron qui échouent silencieusement un week-end.
Il existe une seconde différence. Les méthodes RPC brutes retournent des données brutes. Chaingateway retourne du JSON structuré avec des champs lisibles, si bien qu'une réponse peut aller directement dans votre base de données plutôt que passer par une couche de parsing.
Ce dont vous auriez besoin avec le RPC bitcoin-core, côte à côte
La comparaison devient concrète dès qu'on liste le travail réel. Supposons que la tâche soit « donner à chaque client une adresse de dépôt et créditer son compte quand du BTC arrive ».
| Tâche | Avec Bitcoin Core (JSON-RPC) | Avec l'API REST |
|---|---|---|
| Prérequis | une full node synchronisée : bitcoind plus plusieurs centaines de Go de données de chaîne | une clé API |
| Nouvelle adresse de dépôt | getnewaddress par client, plus un régime de sauvegarde de wallet que vous scriptez vous-même | POST /api/v2/bitcoin/wallets/{wallet}/addresses |
| Détecter du BTC entrant | configurer walletnotify, ou sonder listsinceblock / gettransaction sur une minuterie | POST de webhook signé vers votre serveur |
| Envoyer du BTC | sendtoaddress, plus un hot wallet dans la node, des réglages de frais et des sauvegardes de fichier wallet que vous possédez | POST /api/v2/bitcoin/transactions |
| Suivre les confirmations | re-sonder gettransaction jusqu'à ce que le nombre satisfasse votre politique | sonder GET /api/v2/bitcoin/transactions/{txid}/decoded, qui porte le nombre de confirmations |
| Piste d'audit | parser la sortie de listtransactions et dédupliquer dans votre propre code | GET /api/v2/bitcoin/webhooks/notifications |
| Coût continu | disque, bande passante, mises à jour, surveillance | le problème du fournisseur |
Les paiements sortants méritent un regard plus attentif. sendtoaddress ressemble à un seul appel, mais il présuppose un hot wallet à l'intérieur de votre node, des réglages de frais que vous possédez et une sauvegarde testée du fichier wallet. Même getbalance est plus restreint qu'il n'y paraît : il rapporte le solde du wallet de la node, pas celui d'une adresse arbitraire, si bien que la comptabilité de type exchange atterrit encore dans votre code. Rien de tout cela n'est une critique de Bitcoin Core — c'est le logiciel de référence pour exploiter le réseau et il excelle dans cette tâche. Il n'a jamais été conçu comme backend de paiement d'une application web, ce qui explique pourquoi tant de code colle s'accumule autour.
Envoyer du BTC en REST
Le côté REST du chemin d'envoi tient en trois endpoints. POST /api/v2/bitcoin/wallets crée un wallet, chiffré avec un mot de passe que Chaingateway ne stocke pas — perdez-le et personne ne peut restaurer le wallet, ce qui est précisément l'objectif. POST /api/v2/bitcoin/wallets/{wallet}/addresses dérive autant d'adresses sous lui que nécessaire ; un wallet les porte toutes. Et POST /api/v2/bitcoin/transactions envoie :
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"
}'
La réponse porte le txid de la transaction diffusée. speed accepte fast, medium ou slow et fixe le niveau de frais — le compromis entre coût et délai jusqu'à la première confirmation. Un subtractfee: true optionnel déduit les frais réseau du montant plutôt que de les ajouter, ce que vous voulez quand un client retire la totalité de son solde.
C'est l'appel d'envoi complet — créez un compte et exécutez-le sur testnet avec votre propre wallet.
Tout ce dont vous avez besoin pour accepter le BTC
Webhooks (IPN)
Notifications de paiement instantanées pour les transactions entrantes, envoyées dès qu'une transaction correspondante se règle on-chain. Définissez un secret personnel dans votre profil et chaque notification porte un en-tête X-Signature que votre serveur peut vérifier. Les livraisons échouées sont listées sous GET /api/v2/bitcoin/webhooks/notifications/failed et peuvent être renvoyées d'un seul appel.
Endpoints REST prévisibles
Créez des adresses et suivez les paiements avec une API propre et cohérente. Les requêtes et réponses ressemblent au reste de la plateforme Chaingateway, si bien qu'un développeur ayant intégré une chaîne lit les réponses Bitcoin sans manuel.
Gestion sécurisée des adresses
Non-custodial par conception, avec validation d'adresse intégrée. Les adresses malformées ou mal saisies échouent avant que quoi que ce soit ne touche la chaîne.
Requêtes décodées
Les données de transaction arrivent en JSON structuré plutôt qu'en hex brut, y compris les montants et l'état de confirmation sur lesquels votre backend agit.
Temps de bloc et confirmations : à quoi s'attendre
Bitcoin ajoute un bloc environ toutes les dix minutes, bien que les écarts individuels varient largement. Chaque nouveau bloc miné par-dessus celui contenant votre transaction ajoute une confirmation, et chaque confirmation rend un renversement plus difficile.
| Taille du paiement | Confirmations à attendre |
|---|---|
| Petit, jusqu'à environ 1 000 $ | 1 (environ 10 minutes) |
| Moyen, jusqu'à environ 10 000 $ | 3 (environ 30 minutes) |
| Grand | 6 (environ une heure) |
| Très grand, au-delà de 1 million $ | 10 ou plus |
Six confirmations — environ une heure — sont le standard de facto pour « réglé » depuis les débuts des plateformes d'échange, et cela tient toujours mi-2026.
Dix minutes sont une moyenne, pas un horaire
L'ajustement de difficulté la maintient dans le temps, mais les écarts individuels se dispersent largement autour — deux blocs en une minute arrivent, tout comme des sécheresses de quarante minutes. L'UX de paiement doit en tenir compte : « environ dix minutes » est une moyenne, pas une promesse, donc votre page de checkout devrait dire « généralement dans l'heure » plutôt que faire tourner un compte à rebours qu'elle ne peut pas tenir.
Pourquoi ne pas créditer à zéro confirmation ?
Parce que tant qu'une transaction n'est pas dans un bloc, elle reste dans le mempool, où elle peut être remplacée ou faire l'objet d'une double dépense, et même le bloc le plus récent peut sortir de la chaîne lors d'une réorganisation. L'API scinde ce travail en deux. Le webhook se déclenche une fois la transaction réglée on-chain — le payload porte montant, adresse, txid et numéro de bloc — pour que votre UI puisse réagir immédiatement. À partir de là, GET /api/v2/bitcoin/transactions/{txid}/decoded retourne le nombre de confirmations actuel, si bien que votre registre ne crédite que l'argent ayant atteint votre seuil. Montrez la progression tôt, réglez tard.
UTXO : pourquoi les dépôts Bitcoin diffèrent des chaînes EVM
Bitcoin n'a pas de soldes de compte. Ce que la chaîne stocke, ce sont des unspent transaction outputs — UTXO —, chacun un morceau discret de valeur verrouillé sur une adresse. Le « solde » d'un wallet est un nombre que votre logiciel dérive en additionnant chaque UTXO que ses adresses contrôlent ; le protocole ne stocke jamais cette somme nulle part. Dépenser consomme des UTXO entiers et en crée de nouveaux, y compris une sortie de monnaie rendue vers vous-même, de la même façon que payer une facture de 7 euros avec un billet de 10 euros rend de la monnaie.
Ethereum fonctionne selon le modèle opposé. Un compte a un solde, la chaîne le stocke directement, et un dépôt est un incrément. Sur les chaînes EVM, il est normal de donner une adresse à un client et de laisser une centaine de dépôts s'y accumuler au fil des années.
Pour la gestion des dépôts, le modèle UTXO a un avantage pratique : il vous pousse vers une adresse par client ou par facture, ce qui est de toute façon le design le plus propre. Chaque paiement entrant est une nouvelle sortie vers une adresse que vous surveillez, donc l'attribution est sans ambiguïté — pas de parsing de mémo, pas de correspondance par montant. Cela signifie aussi que « le solde d'une adresse » est une question à laquelle répond un indexeur plutôt que la chaîne elle-même — précisément la comptabilité que vous externalisez en utilisant une API avec des webhooks plutôt qu'en faisant tourner la machinerie vous-même. La notification vous dit : ce montant, cette adresse, cette transaction, ce bloc. Votre registre fait le reste.
Le flux de dépôt, étape par étape
La plupart des intégrations Bitcoin chez Chaingateway se concentrent sur les dépôts : une adresse par client, un webhook par paiement.
- Assignez à chaque client une adresse de dépôt depuis votre wallet (
POST /api/v2/bitcoin/wallets/{wallet}/addresses). - Le client envoie du BTC.
- Une fois la transaction réglée on-chain, Chaingateway POST une notification signée vers votre serveur, portant montant, adresse, txid et numéro de bloc.
- Votre backend vérifie la signature et crédite le compte une fois que le nombre de confirmations — lu depuis
GET /api/v2/bitcoin/transactions/{txid}/decoded— atteint votre seuil.
Deux notes d'implémentation. La livraison n'est pas exactement-une-fois — une notification échouée que vous renvoyez via l'API arrive à nouveau en entier — rendez donc votre handler idempotent et liez les crédits à l'ID de transaction plutôt que de compter les callbacks. Et les confirmations existent pour une raison : le bloc le plus récent peut toujours être orphelin lors d'une réorg, c'est pourquoi la décision de crédit doit dépendre du nombre de confirmations, pas du webhook seul.
Il est utile de modéliser chaque dépôt comme une petite machine à états plutôt qu'un booléen. Une commande démarre à awaiting_payment, passe à detected quand le webhook se déclenche, avance via confirming pendant que votre poller surveille le nombre de confirmations, et atterrit sur settled une fois le seuil atteint — avec underpaid et expired comme sorties latérales explicites. Des clients qui envoient 0,00095 BTC contre une facture de 0,001 BTC existent, généralement parce que leur wallet a déduit les frais réseau du montant saisi ; décidez à l'avance si votre tolérance absorbe le manque ou si la commande attend un complément. Et donnez une expiration aux factures. Les taux de change bougent, donc une adresse qui correspondait au montant de la facture lundi ne devrait pas se régler à un prix obsolète la semaine suivante.
Pour l'audit et la réconciliation, chaque notification reçue par votre compte peut être listée via l'API :
curl https://app.chaingateway.io/api/v2/bitcoin/webhooks/notifications \
-H "Authorization: Bearer YOUR_API_KEY"Testnet d'abord
Ajoutez l'en-tête X-Network: testnet et chaque appel de cette page tourne contre le réseau de test de Bitcoin : mêmes routes, mêmes formes de réponse, pièces sans valeur. Les faucets distribuent gratuitement du BTC de test, si bien que tout le flux de dépôt — adresse, paiement, webhook, confirmations — peut être répété de bout en bout sans dépenser un satoshi.
Gardez l'en-tête derrière la configuration plutôt que dispersé dans le code, et donnez à votre environnement de staging une URL de callback séparée pour que les dépôts de test ne puissent pas fuiter dans le registre de production. Quand la répétition fonctionne, retirez l'en-tête. Rien d'autre ne change dans l'intégration, ce qui est le but : le premier dépôt mainnet devrait être ennuyeux.
Quand quelque chose échoue
Un backend de paiement gagne sa place dans les mauvais jours, planifiez donc explicitement les chemins d'échec.
Au niveau HTTP, les règles sont du REST standard. Un 401 signifie que le jeton Bearer est faux ou manquant ; corrigez la clé plutôt que de réessayer. Les autres réponses 4xx pointent vers la requête elle-même — loguez le corps, qui nomme le problème, et traitez-le comme un bug. Les réponses dans la plage 5xx et les timeouts sont transitoires ; réessayez-les avec un backoff.
Les modes d'échec spécifiques à Bitcoin vivent au-dessus de HTTP. Un dépôt qui ne confirme jamais a généralement payé trop peu de frais et reste coincé dans le mempool ; il peut confirmer des heures plus tard ou disparaître entièrement, c'est pourquoi detected et settled doivent rester des états séparés dans votre système. Une notification pour un montant inférieur à la facture est une décision métier, pas une erreur — gérez-la dans le code, pas dans une file de support. Et si votre endpoint webhook était en panne, les livraisons échouées vous attendent : GET /api/v2/bitcoin/webhooks/notifications/failed les liste, POST /api/v2/bitcoin/webhooks/notifications/{id}/retry renvoie chacune, et la liste complète sous GET /api/v2/bitcoin/webhooks/notifications vous permet de comparer avec le registre et de combler les écarts. Faites tourner cette comparaison chaque nuit même quand rien ne semble anormal. Une réconciliation qui ne tourne qu'après des incidents trouve ses bugs en production.
Besoin de stablecoins à côté du BTC ?
Bitcoin lui-même n'a pas d'USDT ni d'USDC — les stablecoins vivent sur d'autres chaînes. Ce que la plateforme partagée vous donne, c'est une longueur d'avance : votre intégration Bitcoin parle déjà la même API que nos endpoints Ethereum et TRON. Acceptez le BTC aujourd'hui, ajoutez l'USDT sur TRON au prochain sprint avec la même clé et le même handler de webhook. L'aperçu de la blockchain API liste les sept chaînes supportées.
L'ordre pratique pour la plupart des équipes : lancer d'abord les dépôts BTC, car c'est ce que les clients demandent nommément, puis laisser les données de paiement indiquer quel rail stablecoin ajouter en second. Chez Chaingateway, ce second rail réutilise votre vérification de signature, votre tâche de réconciliation et votre machine à états de dépôt sans changement.
Pourquoi les développeurs construisent sur Bitcoin
- Il a le plus long historique de toutes les blockchains, en fonctionnement depuis 2009, et la reconnaissance la plus large parmi les utilisateurs finaux.
- Le réseau règle en continu. Il n'y a ni horaires bancaires ni coupures régionales.
- Les confirmations suivent un rythme prévisible, avec un nouveau bloc environ toutes les dix minutes, ce qui garde les flux de paiement faciles à raisonner.
- L'adoption est la plus large de tous les réseaux crypto, donc « acceptez-vous Bitcoin ? » reste la première question que posent les clients.
Aucune de ces propriétés ne vient d'une mise à jour de roadmap ; ce sont les mêmes garanties avec lesquelles le réseau a été livré. Cette stabilité est l'argument en faveur du BTC dans les produits à long horizon : une intégration construite cette année ne sera pas rendue obsolète par un virage de protocole l'année prochaine, ce qui est plus que ce que peuvent prétendre la plupart des piles de paiement.
Conçu pour des cas d'usage de paiement réels
Le cas évident est le checkout : un client choisit Bitcoin et votre app assigne une adresse ; le webhook confirme le paiement. Les mêmes briques portent aussi des charges plus lourdes. Les plateformes d'échange et de gaming font tourner une adresse de dépôt par utilisateur et créditent les soldes à la confirmation. Les flux de paiement et d'envoi de fonds poussent des transferts transfrontaliers sans banques correspondantes au milieu. Les entreprises par abonnement génèrent une nouvelle adresse de facture à chaque cycle et laissent le webhook la clôturer.
Ce que ces cas partagent, c'est la forme du travail. Bitcoin gère le règlement ; votre application gère l'état. L'API se situe entre les deux et transforme les événements on-chain en appels HTTP que votre framework sait déjà router — c'est pourquoi le cas du checkout et le cas de la plateforme d'échange tournent sur la même poignée d'endpoints.
Intégration en trois étapes
Obtenez votre clé API. L'inscription est gratuite et l'essai démarre sans KYC.
Effectuez votre première requête. Confirmez la clé avec GET /api/account, puis créez un wallet et vos adresses de dépôt.
Configurez les webhooks et passez en production. Pointez les notifications vers votre endpoint, vérifiez la signature HMAC, puis retirez l'en-tête X-Network: testnet — le code identique tourne sur mainnet.
Ce qui fonctionne sur quelle chaîne
Bitcoin est la seule ligne sans colonne de transfert de token : la chaîne n'a pas de standard de token, donc le BTC natif passe par son propre modèle de wallet plutôt que par un appel de type ERC-20. Voici comment elle se positionne face aux six autres chaînes.
| Chaîne | Adresses | Transferts de tokens | Webhooks de dépôt |
|---|---|---|---|
| Bitcoin | POST /api/v2/bitcoin/wallets/{wallet}/addresses | — (pas de standard de token) | 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 et TRC-10 : POST /api/v2/tron/transactions/trc20 et .../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 |
Deux notes de bas de page pour bien lire le tableau. D'abord : TRON est l'intégration la plus complète de la plateforme. Au-delà des routes ci-dessus, la référence documente le staking (POST /api/v2/tron/freeze et /delegate), les paramètres de chaîne, et une paire d'auto-signature — /transactions/trc20/build pour construire une transaction et /transactions/broadcast pour en soumettre une que vous avez signée localement. Si votre équipe conformité insiste pour que les clés privées ne quittent jamais vos serveurs, ce schéma build-and-broadcast est votre porte d'entrée.
Ensuite : un tiret signifie que la référence actuelle ne documente pas de route v2 pour cette cellule, pas que le réseau est de seconde classe. Bitcoin n'a pas de standard de token, d'où la cellule token vide — le BTC natif passe plutôt par son propre modèle de wallet : créer un wallet chiffré par mot de passe avec POST /api/v2/bitcoin/wallets, dériver des adresses de dépôt en dessous, et envoyer avec POST /api/v2/bitcoin/transactions. La référence de Solana couvre la création d'adresse, les transferts SOL et SPL, et les recherches de solde et de bloc, mais pas encore les webhooks. Pour tout ce qui n'est pas listé ici, la référence API a l'état actuel.
Questions fréquentes
Prêt à accepter des paiements Bitcoin ?
Créez un compte sur app.chaingateway.io/register, créez un wallet et envoyez un transfert BTC testnet. La référence complète des endpoints est dans la documentation, et les forfaits et limites de débit ont leur propre page.