Custom Tokens
Accept any token you want on 22 networks - ERC-20s, TRC-20s, Solana SPL, TON jettons, and the newest L2s - with your own icon, rate, and confirmation rule.
Adding a token#
Under Settings → Custom tokens, add a row per token:
- Network - the chain the token lives on (22 supported, see below)
- Contract address - the token contract on that chain
- Code - your token's checkout code: 2-12 lowercase letters and digits only
- Name - display name
- Decimals - 0 to 36, as per the contract
- Optional: icon (HTTPS URL), custom confirmation count (0-200), fixed rate or a rate URL (live price feed), and your receiving address for the token
The code charset is strict: underscores, hyphens, and uppercase letters are rejected - MY_TOKEN is not a valid code, mytoken is. Codes also cannot collide with a built-in coin.
Supported networks#
Ethereum and all major L2s (ERC-20 on Ethereum, Base, Arbitrum, Optimism, Polygon, Avalanche, Linea, Mantle, Berachain, Sonic, Unichain, World Chain, Monad, Plasma, Abstract, HyperEVM, Scroll, Ink, Robinhood Chain), BSC (BEP-20), TRON (TRC-20), Solana (SPL), and TON (jettons).
Contract formats are validated per chain - EVM 0x... addresses, TRON base58 T..., Solana base58, TON jetton ids - so typos are caught at save time, not at a customer's payment.
How custom tokens behave#
- Detection: incoming transfers are detected like any built-in token on that chain, honoring your custom confirmation count
- Pricing: use a fixed rate, a live rate URL (HTTPS only), or let the buyer pay the token amount directly on a crypto-denominated checkout
- Addresses: each token has its own receive address setting (web3 names resolve too)
- Webhooks and exports treat the token like any coin, with its code and contract recorded on the transaction
Managing tokens via API#
The API exposes get-custom-tokens, and the agent API offers full CRUD with the same validation rules - useful for syncing a catalog of community tokens.