Chains and tokens
The API accepts more chains and tokens than it can confirm. A payment on a combination that is not watched is created normally, shows an address, and never confirms, with no error anywhere. Offer your customers only the combinations marked live below.
There is no endpoint that lists payable combinations; this page is the list. It was last checked on 2026-09-19.
Mainnet
chain | token | Contract address or coin type | Decimals | Confirmations | Live on api.thru.la |
|---|---|---|---|---|---|
bnb | USDC | 0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d | 18 | 15 | live |
bnb | BNB | native | 18 | 15 | live |
bnb | USDT | 0x55d398326f99059fF775485246999027B3197955 | 18 | 15 | not yet |
sui | USDC | 0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC | 6 | 1 | live |
sui | SUI | native | 9 | 1 | live |
sui | USDT | 0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068::usdt::USDT | 6 | 1 | not yet |
arc | USDC | native (see Arc below) | 18 | 1 | live |
robinhood | USDG | 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 | 6 | 20 | live |
robinhood | ETH | native | 18 | 20 | live |
base | USDC | 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 | 6 | 20 | not yet |
base | USDT | 0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2 | 6 | 20 | not yet |
base | ETH | native | 18 | 20 | not yet |
solana | USDC | EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v | 6 | 32 | not yet |
solana | USDT | Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB | 6 | 32 | not yet |
solana | SOL | native | 9 | 32 | not yet |
tron | USDT | TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t | 6 | 19 | not yet |
tron | USDC | TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8 | 6 | 19 | not yet |
tron | TRX | native | 6 | 19 | not yet |
So the stablecoins you can accept on mainnet today are USDC on BNB Chain, USDC on Sui, USDC on Arc and USDG on Robinhood Chain. "Not yet" rows are registered, so the API accepts them, but api.thru.la is not watching them, and a payment made with one would not be detected. Do not offer them until this page marks them live.
Native coins (BNB, SUI, ETH) are live but are charged in coins: thru does no currency conversion, so "amount": "25" with "token": "BNB" asks for 25 BNB. For dollar prices, use stablecoins.
Testnet
chain | token | Contract address or coin type | Decimals | Live on api.thru.la |
|---|---|---|---|---|
arc | USDC | native | 18 | live |
bnb | BNB, USDC (0x64544969ed7EBf5f083679233325356EbE738930) | 18, 18 | not yet | |
base | ETH, USDC (0x036CbD53842c5426634e7929541eC2318f3dCF7e) | 18, 6 | not yet | |
sui | SUI, USDC (0xa1ec7fc00a6f40db9693ad1415d0c193ad3906494428cf252621037bd7117e29::usdc::USDC) | 9, 6 | not yet | |
solana | SOL, USDC (4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU) | 9, 6 | not yet | |
robinhood | ETH only | native | 18 | not yet |
tron | TRX only | native | 6 | not yet |
Test on Arc testnet ("chain": "arc", "network": "testnet", "token": "USDC"), with test USDC from Circle's faucet. It is the only testnet api.thru.la watches today.
Rails a custom-amount product may use
A custom_amount product (products) charges the session amount in units of the rail's token, 1:1: "amount": "37" on a USDC rail asks for 37 USDC, and on a BNB rail it asks for 37 BNB. thru does no currency conversion, so for dollar-denominated credit list stablecoin rails only. POST /v1/products and PATCH /v1/products/:id refuse a rail (the product's own chain/token, every networks row and every enabledChains entry) whose token is not registered for that chain and network, or whose chain thru does not watch — with <token> on <chain>/<network> is not a token thru detects or <chain> cannot be a rail on a custom_amount product. As of the date above, the stablecoin rails that are live are:
- mainnet:
USDConbnb,USDConsui,USDConarc,USDGonrobinhood; - testnet:
USDConarc.
Native coins (BNB, SUI, ETH) pass the check and are charged in coins. Fixed-price products are not restricted.
Chains the API accepts but never confirms
ethereum,polygon,arbitrum,optimism,avalanche,fantom,gnosis,linea,scroll,zksync,mantle,celo,blastandbscare accepted byPOST /v1/payments(201), but no token is registered for them, so a payment on them never confirms.ethereumis the one people reach for first; it is not live. For BNB Smart Chain, usebnb, notbsc.- A token that is not in the tables above is also accepted and never confirms. For example,
"token": "DAI"onbnbcreates a payment that will never be detected.
Chains the API rejects
aptos, bitcoin, litecoin, dogecoin, xrp, ton, near, cosmos, polkadot and cardano return 400 on create, because thru has no wallet on them that could receive funds.
Notes per chain
- Arc. USDC is Arc's native asset (it also pays gas), registered with 18 decimals and no contract address. Arc also exposes the same balance through an ERC-20 interface at
0x3600000000000000000000000000000000000000with 6 decimals. That is the same money, not a second token, and thru does not watch it. Payers must send USDC as a normal wallet transfer of the native asset. - Native coins on EVM chains (BNB, ETH on Robinhood Chain, USDC on Arc) are detected from the value of a top-level transaction. A native transfer made from inside a smart contract, which many smart-contract wallets and some exchange withdrawals do, is not detected. Tokens such as USDC on BNB Chain are detected from their transfer events and do not have this limitation.
- BNB Chain USDC and USDT use 18 decimals, not the 6 they use on most chains. Amounts in the API are in token units, so this matters only if you work with atomic amounts.
- Robinhood Chain has no USDC; its dollar stablecoin is USDG.
tokenaccepts the symbol or the contract address or coin type from these tables, and thru stores the symbol.