Money representation
Every amount is a decimal string, and USDT/USDC on BSC have 18 decimals. Read this twice.
Every amount is a decimal STRING. Never a JSON number.
1 ETH is 1000000000000000000 wei, which is larger than JavaScript's
Number.MAX_SAFE_INTEGER (2^53 ≈ 9.007e15). Parsing it as a number silently
corrupts it. Use BigInt, decimal.Decimal, BigDecimal — whatever your
language offers — end to end.
Every balance is returned in both forms so you never have to convert yourself:
{
"asset": { "chain": "bsc", "symbol": "USDT", "decimals": 18, "contract": "0x55d3…" },
"available": "1500000000000000000",
"available_decimal": "1.5",
"locked": "0",
"total": "1500000000000000000"
}⚠ USDT and USDC on BSC have 18 decimals. Everywhere else, 6.
This is a real property of those token contracts, not our choice.
| Chain | USDT decimals | "1000000" means |
|---|---|---|
| Ethereum, Tron, Solana, Polygon, Arbitrum, Base, Avalanche, TON | 6 | 1 USDT |
| BSC | 18 | 0.000000000001 USDT |
Because getting this wrong is a 12-orders-of-magnitude error, POST /v1/payouts
requires you to echo the asset's decimals and returns
400 decimals_mismatch (with both values) if it disagrees. Read decimals from
GET /v1/chains. Never hardcode 6.