Supports BNB, BEP-20, BEP-721

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.

7-day free trial — no card, no KYC to start Non-custodial — private keys stay under your control Plans start at €49/month (€490/year) — view plans and rate limits

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:

MethodEndpointWhat it does
POST/api/v2/bsc/addresses/importRegister an existing private key so the API can send from that address
POST/api/v2/bsc/transactionsBuild, sign and broadcast a native BNB transfer
POST/api/v2/bsc/transactions/bep20Build, sign and broadcast a BEP-20 token transfer
GET/api/v2/bsc/webhooks/notificationsList every deposit notification the API has sent to your server
GET/api/accountCheck 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
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:

  1. Give each user a deposit address. If your system already manages keys, register them with POST /api/v2/bsc/addresses/import.
  2. Attach a webhook to the address. Setup takes a few minutes and is described in the webhooks guide.
  3. 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.
  4. 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

Step 1

Get your API key. Register and the key is in your dashboard right away. The 7-day trial starts without KYC.

Step 2

Make your first request. The quickstart walks you from sign-up to a first transaction.

Step 3

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.

ChainAddressesToken transfersDeposit webhooks
BitcoinPOST /api/v2/bitcoin/wallets/{wallet}/addresses— (no token standard)GET /api/v2/bitcoin/webhooks/notifications
EthereumPOST /api/v2/ethereum/addresses/importERC-20: POST /api/v2/ethereum/transactions/erc20GET /api/v2/ethereum/webhooks/notifications
TRONPOST /api/v2/tron/addresses/importTRC-20 and TRC-10: POST /api/v2/tron/transactions/trc20 and .../trc10GET /api/v2/tron/webhooks/notifications
SolanaPOST /api/v2/solana/addressesSPL: POST /api/v2/solana/transactions/SPL
BNB Smart ChainPOST /api/v2/bsc/addresses/importBEP-20: POST /api/v2/bsc/transactions/bep20GET /api/v2/bsc/webhooks/notifications
PolygonPOST /api/v2/polygon/addresses/importERC-20: POST /api/v2/polygon/transactions/erc20GET /api/v2/polygon/webhooks/notifications
ArbitrumPOST /api/v2/arbitrum/addresses/importERC-20: POST /api/v2/arbitrum/transactions/erc20GET /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

Yes. Assign a deposit address per customer, register a webhook, and credit BNB or any BEP-20 token, including USDT, USDC or your own, once the transfer settles. Payouts use POST /api/v2/bsc/transactions/bep20. This is a BEP-20 payment API: the accept-and-pay-out loop over REST, no node required.

A hosted service that reads from and writes to the BSC network for you. Instead of running a node and speaking JSON-RPC, you call HTTPS endpoints with an API key. Chaingateway's version is built for payments: it manages addresses and token transfers, and it notifies your server about deposits.

An RPC endpoint exposes the node protocol itself. You submit fully built, signed transactions and interpret raw results, usually through a web3 library. A REST API accepts a JSON description of what you want ("send 25 USDT to 0x...") and does the construction and broadcasting for you. RPC gives you more freedom; REST needs far less code for payment flows.

For payment operations, yes, and with less code: sending tokens, creating and importing addresses, and receiving deposit notifications all go through REST calls instead of RPC methods. What the API does not replace is raw protocol access. If your application makes arbitrary ethcall reads against contracts or needs archive data, keep an RPC endpoint for those paths and use Chaingateway for the payment traffic next to it.

BSC has targeted 0.75-second blocks since the Maxwell hardfork on June 30, 2025, with BscScan measuring about 0.8 seconds on average shortly after. A deposit is typically in a block within a second of broadcast, and the webhook follows once the transfer has settled. Waiting a few extra blocks for safety adds seconds, not minutes.

The platform is non-custodial: you control the keys to your funds. For automated flows, existing keys can be registered through POST /api/v2/bsc/addresses/import. The details are documented in the API reference.

All of them. Any contract that implements the BEP-20 standard works, from USDT, USDC and DAI to a token you deployed yesterday. You pass the contract address and the amount in token units in the request. There is no allowlist to apply for.

Failed deliveries land on a list you control: GET /api/v2/bsc/webhooks/notifications/failed shows what did not get through, and POST /api/v2/bsc/webhooks/notifications/{id}/retry re-sends each notification. For reconciliation, GET /api/v2/bsc/webhooks/notifications lists everything the API has sent, so you can diff missed events against your database once you are back up. Idempotent processing on the transaction hash keeps redeliveries from crediting anything twice.

Yes. The endpoint structure is identical across Bitcoin, Ethereum, TRON, Solana, Polygon and Arbitrum; in most cases only the chain segment in the URL changes. If TRON is on your roadmap, the TRON fee calculator shows what USDT transfers cost there before you commit.

Yes. Add the header X-Network: testnet to any request and it runs against the BSC testnet instead of mainnet. No separate account and no second API key needed.

Limits depend on your plan; the current numbers are on the pricing page. The 7-day trial includes everything you need for development and integration testing.

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.