Binance Smart Chain API for BNB and BEP-20 Payments
Send and receive BNB and BEP-20 tokens over one REST API. Create deposit addresses, get HMAC-signed webhooks, and go live on BSC without running a node.
Chaingateway's Binance Smart Chain API moves BNB and BEP-20 tokens through plain REST calls. Your backend creates deposit addresses over HTTPS and sends tokens with a single POST request. When a customer pays, a webhook hits your server, timed to BSC's sub-second blocks. There is no node to run and no web3 library to install: authentication is a Bearer token in the Authorization header, and every response is JSON.
Sign-up takes a minute. The trial runs 7 days, costs nothing and asks for no KYC. Create an API key and send your first testnet transaction today.
Everything you need to build on Binance Smart Chain
Webhooks (IPN)
BSC has produced a block roughly every 0.75 seconds since the Maxwell hardfork went live on June 30, 2025, and deposit notifications follow the same rhythm. When a BEP-20 transfer reaches one of your addresses, Chaingateway calls your endpoint with the decoded payload. Set a personal secret in your profile and every call carries an X-Signature header so you can verify the sender. If your endpoint was down, failed deliveries are listed by the API and re-sent with one call per notification.
Easy transactions
One POST request sends BNB (POST /api/v2/bsc/transactions) or any BEP-20 token (POST /api/v2/bsc/transactions/bep20). Gas and nonce are optional request fields the API fills in, so you never hand-tune gwei values or track nonces across concurrent payouts.
Secure address handling
BSC uses the same 0x address format and EIP-55 checksum as Ethereum. The API validates every address before a transaction is built, and the architecture is non-custodial: your keys stay yours. If you already manage keypairs, register them with POST /api/v2/bsc/addresses/import.
Decoded queries
Raw BSC logs are hex blobs. Chaingateway's decoded-transaction endpoint returns human-readable JSON instead — sender, recipient and amount as plain fields — and webhook payloads arrive decoded the same way.
A REST API, not another RPC endpoint
If you searched for "Binance Smart Chain RPC", you probably expected a node URL. The official docs at docs.bnbchain.org list public JSON-RPC endpoints, and they work. But they leave the hard part to you. A raw RPC connection understands eth_call and eth_sendRawTransaction; ABI encoding and nonce management happen in your code, and so does key handling. Public endpoints also throttle aggressively under load, which is exactly when your payment system needs them most.
Chaingateway sits one layer higher. You tell the API which token to send, how much and to whom. It builds the transaction and broadcasts it to the network; every transaction created through the API is listed, hash included, under GET /api/v2/bsc/transactions, so you can link your users straight to BscScan.
The trade-off is honest: if you need arbitrary contract calls or archive-depth queries, run a node or use an RPC provider. If you need payments, meaning deposits in and payouts out, the REST layer removes most of the code you would otherwise write and maintain yourself.
BSC endpoint reference
The official BNB Chain documentation answers the RPC question with a list of fifteen JSON-RPC methods and a public node URL. That list describes the protocol. A payment integration needs something shorter. Five endpoints cover the whole loop on Chaingateway:
| Method | Endpoint | What it does |
|---|---|---|
POST | /api/v2/bsc/addresses/import | Register an existing private key so the API can send from that address |
POST | /api/v2/bsc/transactions | Build, sign and broadcast a native BNB transfer |
POST | /api/v2/bsc/transactions/bep20 | Build, sign and broadcast a BEP-20 token transfer |
GET | /api/v2/bsc/webhooks/notifications | List every deposit notification the API has sent to your server |
GET | /api/account | Check your account and plan status |
Each of them accepts the X-Network: testnet header for dry runs, and every request authenticates with the same Bearer token. The exact request and response schemas live in the API reference.
JSON-RPC method vs. one REST call
Here is the same table from the integrator's side: what a task costs you against a raw node, and what it costs against the REST layer.
| Job to do | Raw JSON-RPC | Chaingateway |
|---|---|---|
| Send 25 USDT | eth_gasPrice, eth_getTransactionCount, eth_estimateGas, eth_sendRawTransaction, plus ABI encoding and transaction signing in your own code |
One POST /api/v2/bsc/transactions/bep20 |
| Detect a deposit | Poll eth_blockNumber, scan eth_getLogs for Transfer events, decode topics and adjust for token decimals |
A webhook POST arrives at your server |
| Audit deposit history | Build and operate your own indexer | GET /api/v2/bsc/webhooks/notifications |
For a feel of the difference, this is what talking to a public BSC node looks like:
curl -X POST https://bsc-dataseed.bnbchain.org \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
The answer is a hex string. Everything after that, from converting 0x30bf8d3 into a number to fetching logs and mapping raw amounts against token decimals, is code you write and debug. Multiply that by each method you need and you end up with a small in-house middleware project. The REST call skips the middleware because it is the middleware.
BSC in numbers
BSC has targeted 0.75-second blocks since the Maxwell hardfork on June 30, 2025, and gas has stayed cheap, typically 0.1 to 1 gwei on BscScan's tracker. A standard BEP-20 transfer runs 50,000 to 65,000 gas, which at those prices works out to a fraction of a cent.
Chain facts age quickly, so here are the fuller figures with dates attached. As of early July 2026:
The block interval target is 0.75 seconds. The Maxwell hardfork set it on June 30, 2025, and BscScan measured an average of about 0.8 seconds shortly after activation. Earlier in 2025 the Lorentz hardfork had already halved the old 3-second interval to 1.5 seconds, so BSC quartered its block time within a single year.
Gas is cheap and has stayed cheap. BscScan's gas tracker has hovered in the 0.1 to 1 gwei range through 2026, with a daily average around 0.63 gwei in March 2026. A standard BEP-20 transfer consumes on the order of 50,000 to 65,000 gas, which at those prices works out to roughly 0.00004 BNB. Check the current BNB price yourself before you quote fees to customers, but the result has sat in the low cents for years.
For a checkout page the practical consequence is this: a customer's USDT transfer is in a block within about a second, and after a handful of additional blocks, a few seconds in total, you can credit the order. Compare that with Ethereum mainnet, where a slot alone takes 12 seconds.
Send and receive any token on BSC, even your own
Every standard BEP-20 contract works. USDT, USDC and DAI run out of the box, with amounts in token units rather than raw base units. If you have launched your own token, pass its contract address to the same endpoint and it behaves like any other. Because the API is identical across chains, the code you write for BSC also runs against Ethereum, Polygon or Arbitrum once you swap the chain segment in the URL.
Why developers choose Binance Smart Chain
Fees on BSC sit far below Ethereum mainnet, which matters when you process many small payments rather than a few large ones. Sub-second block times keep checkout flows snappy. The DeFi ecosystem around PancakeSwap gives BEP-20 tokens deep liquidity, and the network has carried high daily active usage for years, so its failure modes are well understood and its tooling is mature.
Quickstart: send USDT (BEP-20) in four languages
All examples call POST /api/v2/bsc/transactions/bep20 with a Bearer token. The contract address below is USDT on BSC (0x55d398326f99059fF775485246999027B3197955); password is the password of the sending address's password-protected wallet. The exact request schema is in the API reference. To test without real funds, add the header X-Network: testnet.
cURL
curl -X POST https://app.chaingateway.io/api/v2/bsc/transactions/bep20 \
-H "Authorization: Bearer $CHAINGATEWAY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contractaddress": "0x55d398326f99059fF775485246999027B3197955",
"from": "0xYourSenderAddress",
"to": "0xRecipientAddress",
"amount": 25.0,
"password": "wallet-password"
}'That's the complete transfer request — create an account and run it on BSC testnet first.
How BEP-20 deposits reach your backend
A payments integration on BSC follows one loop:
- Give each user a deposit address. If your system already manages keys, register them with
POST /api/v2/bsc/addresses/import. - Attach a webhook to the address. Setup takes a few minutes and is described in the webhooks guide.
- The customer sends USDT to the address. The transfer lands in a block within about a second, and Chaingateway POSTs the decoded event to your endpoint.
- Your server verifies the HMAC signature and credits the account. That is the whole flow.
In production, three details separate a demo from a system you can leave alone.
The first is the address mapping. Store one row per customer or per order: your internal ID, the deposit address, the creation date. When a webhook arrives, the recipient address in the payload is your lookup key. A unique index on the address column means a deposit can never be credited to two customers, no matter how your code around it changes.
The second is idempotency. Delivery is not exactly-once: a failed notification you re-send through the API arrives again in full. Record the transaction hash of every processed deposit with a unique constraint, and let the database reject duplicates. Crediting logic that survives the same event arriving three times is the difference between a redelivery mechanism that protects you and one that double-pays.
The third is a confirmation policy. A webhook tells you the transfer is in a block. With 0.75-second blocks, ten further blocks arrive in well under ten seconds, so waiting for a small safety margin costs almost nothing in user experience. For a 5 USDT digital purchase, crediting on the notification is a reasonable business decision. For a 50,000 USDT deposit, wait a few seconds longer and re-check the transaction (GET /api/v2/bsc/transactions/{txid}) before you release anything.
Deposits also pile up across many addresses over time. The usual answer is a periodic sweep: a scheduled job that sends accumulated balances from deposit addresses to your treasury wallet, using the same POST /api/v2/bsc/transactions/bep20 call with the deposit address in the from field. Each sweeping address needs a sliver of BNB for gas, which at sub-gwei prices is a rounding error.
If your endpoint was unreachable, the missed deliveries are not gone: GET /api/v2/bsc/webhooks/notifications/failed lists them, and POST /api/v2/bsc/webhooks/notifications/{id}/retry re-sends each one. For reconciliation, you can also list everything the API has sent you:
curl https://app.chaingateway.io/api/v2/bsc/webhooks/notifications \
-H "Authorization: Bearer $CHAINGATEWAY_API_KEY"
That one endpoint turns "did we miss a deposit?" from a support ticket into a diff against your own database.
Payouts: the other half of the loop
Withdrawals deserve the same care as deposits, because a bug here sends money instead of missing it.
Validate before you send
The flow starts before the API call. Validate the destination address the moment the user submits it: correct length, 0x prefix, and the EIP-55 checksum if mixed-case letters are present. A checksum failure means a typo, and catching it in the form costs nothing, while catching it after broadcast is impossible. The API rejects malformed addresses before building the transaction, but the checksum test is yours to run — and by the time the API answers, the user has left the page.
Track every payout in your database
Write the payout to your database before you send it. One row per payout, with a state column: queued, sent, confirmed. A worker picks up queued rows, makes exactly one POST /api/v2/bsc/transactions/bep20 call per row, and stores the API response next to it. The transaction hash — your receipt — shows up in GET /api/v2/bsc/transactions, the list of everything created through the API. Show it to the user as a BscScan link and they can watch their own withdrawal confirm, which quietly eliminates the most common support ticket in the category.
Handling timeouts
The failure case that matters is the timeout. If your API call times out, you do not know whether the transfer went out. Do not retry blindly. Check GET /api/v2/bsc/transactions and your own records first, and only re-send when you are sure nothing was broadcast. Because payouts run from a hot wallet, keep a BNB float on the sending address for gas; at current BSC prices a small top-up covers thousands of transfers, so this is a monthly chore rather than an operational risk.
Test on the BSC testnet first
Every endpoint on this page runs against the BSC testnet when you add one header:
X-Network: testnet
No second account, no separate API key, no code changes beyond the header. Testnet BNB comes free from the official BNB Chain faucet, so you can rehearse the entire loop, from address creation through deposit webhook to payout, without real funds. Address formats and transaction mechanics are identical to mainnet.
The rehearsal worth doing is the ugly one: send a deposit while your webhook endpoint is switched off, bring it back up, then re-send the delivery from the failed list (POST /api/v2/bsc/webhooks/notifications/{id}/retry) and watch it arrive. Confirm your idempotency handling by replaying a notification against your own endpoint. Ten minutes of deliberate failure testing on testnet saves an incident review on mainnet. When everything holds, delete the header and the same code is live.
Webhook security in practice
A webhook endpoint is a door into your accounting system, so treat it like one.
Verify the signature before you parse anything else. Set a personal secret in your profile settings; from then on Chaingateway sends an X-Signature header with every notification — base64 of an HMAC-SHA256 over the payload's txid, keyed with that secret. Your server recomputes it from the received txid and compares in constant time. A request that fails the check gets a 4xx and no further processing, no matter how plausible its payload looks. The mechanics, verification code included, are in the webhooks guide.
A second, separate lock guards the other direction: in the account panel you can restrict your API key to the IP addresses of your own servers. That whitelist protects API access — a leaked key moves nothing from anywhere else — not the webhook endpoint, so it complements the signature rather than replacing it.
Replay is the attack the HMAC alone does not stop, since a recorded valid notification stays valid. Your idempotency constraint closes that hole: a transaction hash that has already been credited gets acknowledged and ignored. Serve the endpoint over HTTPS only, and keep the webhook URL free of secrets, because URLs end up in logs on systems you do not control.
When requests fail
Every integration eventually sees errors, and the API reports them as ordinary HTTP status codes, so your existing error handling patterns apply.
A 401 means the Bearer token is missing, expired or wrong; check the Authorization header and the key in your dashboard. Validation failures in the 4xx range, such as a malformed address or a missing field, come with a JSON body explaining what to fix. Do not retry these: the same request will fail the same way until the payload changes.
Request and address limits depend on your plan; if you bump into them routinely, the pricing page lists plans with higher limits. Server-side 5xx errors and timeouts are safe to retry for read requests. For sends, apply the timeout rule from the payout section: verify nothing was broadcast before you submit again.
Log the full response body next to your own request record. When something needs support attention, that pairing answers most questions before they are asked. The status codes and error schemas for each endpoint are documented in the API reference.
Moving off your own BSC node
Plenty of teams run a BSC full node for exactly one purpose: watching deposits and broadcasting payouts. That node costs real money and attention. Storage requirements are measured in terabytes of NVMe, initial sync takes days without a snapshot, and 2025 alone brought two hardforks, Lorentz and Maxwell, each a mandatory client upgrade on a deadline. Miss one and your node stops following the chain, which for a payment system means deposits silently stop arriving.
If the node exists only for payments, the migration path is short. Import your existing keys with POST /api/v2/bsc/addresses/import, replace your eth_getLogs polling loop with webhook notifications, and point payout code at POST /api/v2/bsc/transactions/bep20. Run both systems in parallel for a week and diff the results; the notification list makes that comparison a query rather than a project. Then decommission the node and reclaim the hardware budget.
If you want to keep a node, or you are deciding whether to build one in the first place, our guide to setting up a Binance Smart Chain node walks through the hardware, the sync and the maintenance honestly. The two approaches also combine: some teams keep a node for archive queries and contract calls while routing payment traffic through the API, because the API's webhook layer is the part that is genuinely tedious to rebuild.
Built for every use case
Most teams on Chaingateway's BSC endpoints run one of two patterns. The first is accepting payments: a shop or SaaS generates a deposit address per order, waits for the webhook and ships the product, with settlement in seconds instead of banking days. The second is wallet operations at scale: exchanges and platforms that watch deposits and process withdrawals across thousands of user addresses, all through the same few endpoints.
The same building blocks cover token launches (airdrops and vesting payouts scripted as BEP-20 transfers), cross-border transfers where a wire would take days, recurring payouts for subscription billing, and DeFi products that need to see transactions the moment they confirm.
Integration in three steps
Get your API key. Register and the key is in your dashboard right away. The 7-day trial starts without KYC.
Make your first request. The quickstart walks you from sign-up to a first transaction.
Set up webhooks and go live. Deposits push to your server instead of you polling for them — the webhooks guide covers setup and signature verification — then drop the X-Network: testnet header and the same code runs against mainnet.
Pricing
Plans and their limits are listed on the pricing page. Every new account starts with the free 7-day trial, so you can finish the whole BSC integration before paying anything.
What works on which chain
BSC follows the same request pattern as Ethereum, with BEP-20 in place of ERC-20. The table below places it next to the other six chains the API covers.
| Chain | Addresses | Token transfers | Deposit webhooks |
|---|---|---|---|
| Bitcoin | POST /api/v2/bitcoin/wallets/{wallet}/addresses | — (no token standard) | 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 and TRC-10: POST /api/v2/tron/transactions/trc20 and .../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 |
Two footnotes to read the table correctly. First: TRON is the deepest integration on the platform. Beyond the routes above, the reference documents staking (POST /api/v2/tron/freeze and /delegate), chain parameters, and a self-signing pair — /transactions/trc20/build to construct a transaction and /transactions/broadcast to submit one you signed locally. If your compliance team insists that private keys never leave your servers, that build-and-broadcast pattern is your way in.
Second: a dash means the current reference documents no v2 route for that cell, not that the network is second-class. Bitcoin has no token standard, hence the empty token cell — native BTC runs through its own wallet model instead: create a password-encrypted wallet with POST /api/v2/bitcoin/wallets, derive deposit addresses under it, and send with POST /api/v2/bitcoin/transactions. Solana's reference covers address creation, SOL and SPL transfers, and balance and block lookups, but no webhooks yet. For anything not listed here, the API reference has the current state.
Frequently asked questions
Ready to integrate Binance Smart Chain?
Create your account, copy the API key and send a testnet transaction in the next ten minutes. The full endpoint reference is at /docs/, and the developer portal collects tutorials for the most common payment flows.