Token support is runtime state. ListTokens returns every token that can appear on a quote, on every chain, in one call.
Cache the response for the lifetime of a page load rather than calling it per quote, and refresh it when your app reloads. It changes when the operator lists or delists a token, not on a schedule.

Amount handling

decimals from the catalog is the only correct source for converting user input into amount_in.
Never round-trip an amount through a float. Parse once at the input boundary, keep it as a string or bigint everywhere else.

Building a token picker

Pair the catalog with GetChains so the picker only offers what is currently quotable:
The two calls are independent, so issue them together on load.

Single token lookup

GetTokenInfo resolves one token by chain and address, for cases where you have an address from elsewhere — a deep link, a user paste, a stored preference.
It returns the symbol, decimals, chain id, and logo, read live from the token contract or mint on chain — so it also resolves addresses outside the catalog, though those still cannot be quoted. If the chain read fails, the call returns UNAVAILABLE rather than inventing metadata.

Tiers and slippage

tier classifies a token’s liquidity and feeds the default slippage applied when you omit slippage_bps. Stable assets get tighter defaults than long-tail ones. You can always override per quote; see Slippage.