Skip to main content

Resolve token metadata (curated list, then on-chain)

GET 

/v1/data/token/metadata

Resolves arbitrary token addresses to symbol / name / decimals.

Unlike /v1/data/token/list, which serves only the curated list, this endpoint falls back to reading the ERC-20 contract directly — so a token nobody has curated can still be resolved, displayed and traded.

Resolution order

  1. The chain's curated token list (source: "list", verified: true)
  2. An on-chain name/symbol/decimals read (source: "onchain", verified: false)

assetGroup is null for every on-chain result — deliberately. assetGroup is the key the price layer joins on, and name/symbol read off an arbitrary contract are attacker-controlled strings. A token that names itself USDC / USD Coin would otherwise join to the real USDC price and render a worthless balance at $1. An uncurated token therefore carries no price, and verified: false says why. Render it without a USD value.

An address with no decimals() is NOT returned. It appears in unresolved instead. Decimals are never defaulted to 18 — every amount is scaled by that number, so a guessed scale is a wrong transaction. unresolved lets a caller distinguish "not a token on this chain" from "the lookup failed" (which is a 5xx).

Pre-standard tokens that return bytes32 from name()/symbol() (MKR and friends) are decoded correctly.

Limits: at most 50 addresses per request; duplicates and casing are normalized.

Plain-text reference — GET /v1/data/token/metadata

Parameters

ParameterInTypeRequiredDescription
chainIdquerystringyesChain ID to resolve on See the ChainId schema for the full set of supported chains.
assetsquerystringyesComma-separated token addresses (max 50)

Response 200

FieldTypeDescription
successTrue
dataobjectInformational payload. null when the endpoint only builds calldata.
actionsnull

Example response

{
"success": true,
"data": {}
}

Request

Responses

Resolved token metadata, plus the addresses that are not ERC-20s