How to accept USDT (BEP20, BNB Smart Chain) payments
USDT on BNB Smart Chain is popular because transfers are fast and network fees are low. This guide shows the minimal integration with ChainPay: no registration and no API key.
The model
- Your backend asks ChainPay for a deposit address for each order or user.
- The payer sends USDT (BEP20) to that address.
- After 15 confirmations (the default on BSC) ChainPay sweeps the funds to your own wallet and calls your webhook.
You keep custody: the destination is your forwardAddress.
Create the address
curl -X POST https://api.chainpay.site/deposit-address \
-H 'content-type: application/json' \
-d '{
"ticker": "bep20/usdt",
"callbackUrl": "https://shop.example.com/crypto-webhook?token=SECRET",
"forwardAddress": "0xYourOwnBscWallet...",
"externalReference": "order-123"
}'
ticker: "bep20/usdt"selects BNB Smart Chain and the USDT token.forwardAddressis a regular0x…address of your own BSC wallet.- Repeating the same request returns the same address, so retries are safe.
Handle the webhook
When the deposit is confirmed, ChainPay sends a POST to your callbackUrl:
{
"status": "confirmed",
"externalReference": "order-123",
"chain": "bsc",
"tokenSymbol": "USDT",
"tokenAddress": "0x55d398326f99059fF775485246999027B3197955",
"isNative": false,
"amount": "25.000000000000000000",
"txHash": "0x…"
}
- Verify the
tokenvalue from yourcallbackUrl: webhooks are not signed. - Match the order by
externalReferenceand credit it only onstatus: "confirmed". - Be idempotent: the same event may be delivered more than once. See webhook best practices.
Tell the payer the network
Show the network next to the address: BNB Smart Chain (BEP20). A token sent on a different network does not arrive as a BEP20 deposit, so a clear label prevents most support requests.
Fees
The fee is 1% plus a small flat part priced from the real gas cost of the network. BSC gas is low, so smaller payments are practical than on TRON. See Pricing for current numbers and Networks for minimum values.