Supported networks
Which chains and stablecoins the gateway accepts, and how coverage differs by top-up method.
The gateway accepts USDC and USDT on four mainnets. Coverage is not the same for both on-chain top-up methods — x402 is limited to Base and Arbitrum, while a plain token transfer works on all four.
| Network | Chain ID | Decimals | x402 | Direct transfer |
|---|---|---|---|---|
| Base | 8453 | 6 | USDC, USDT | USDC, USDT |
| Arbitrum One | 42161 | 6 | USDC, USDT | USDC, USDT |
| Ethereum | 1 | 6 | — | USDC, USDT |
| BNB Smart Chain | 56 | 18 | — | USDC, USDT |
There is no Solana, Polygon, or Optimism support, and no native-ETH payment — only the ERC-20 stablecoins listed above.
x402 — Base and Arbitrum only
The x402 flow signs a gasless transfer authorization rather than
sending a transaction, so it needs USDC's ERC-3009 transferWithAuthorization (or Permit2
for USDT) plus facilitator settlement on that chain. Only Base and Arbitrum satisfy both,
which is why the 402 response's accepts array never offers Ethereum or BNB Chain.
Treat the live accepts array as the source of truth — it is generated from the
deployment's own chain config, so a staging deployment offers testnets instead.
Direct transfer
Send USDC or USDT to the gateway's collection wallet from any of the four networks. An indexer polls all of them and credits the sending wallet, typically within about a minute. No signature or API call is required.
Read the destination address from the gateway rather than hardcoding it:
curl https://api.tk24.ai/v1/config
# { "gatewayWalletAddress": "0x...", "minTopupUsd": 1, "networkMode": "mainnet" }Send only from a wallet you control — the credit goes to the sending address, and transfers out of an exchange account cannot be credited to you.
Claiming a missed transfer
If a transfer is not credited, submit its hash. The gateway re-verifies the receipt on-chain before crediting, and the same hash can never be credited twice.
curl -X POST https://api.tk24.ai/v1/topup/direct \
-H "Content-Type: application/json" \
-d '{ "txHash": "0x...", "network": "1" }'| Field | Type | Description |
|---|---|---|
txHash | string | The transfer's transaction hash |
network | string | Optional. Chain ID or alias (ethereum, base, arbitrum, bsc). Omit to scan every supported chain |
walletAddress | string | Optional. Expected sender, rejected on mismatch |
/v1/topup/inflow and /v1/topup/appeal are aliases for the same handler.
Conversion rates
| Token | Credit |
|---|---|
| USDC | 1 USDC = $1.00 |
| USDT | 1 USDT = $0.999 |
The USDT haircut applies to both x402 and direct transfers. BNB Chain's USDC and USDT carry 18 decimals rather than 6; the gateway normalises this, so send whole-token amounts as you normally would.
Testnets
Staging (https://agent-router.gaib.cloud) runs the testnet equivalents — Base Sepolia
(84532), Arbitrum Sepolia (421614), Ethereum Sepolia (11155111) and BSC Testnet
(97). Production rejects testnet chains outright. Check which mode a deployment is in
with networkMode from GET /v1/config.
SIWE and chain IDs
The chainId in a SIWE message is not checked — the gateway
verifies the signature, the address, and that issuedAt is under an hour old, nothing
else. Any chain ID your wallet is on will authenticate. The examples use 8453 purely as
a convention.