Token List API
Every token listed on LitVMSwap, with a logo URL that loads on any site. It follows the standard Token List format, so most wallets and token pickers can read it as is.
The full list
GEThttps://www.litvmswap.com/api/token/v2
Terminal
curl https://www.litvmswap.com/api/token/v2JSON
{
"name": "LitVMSwap",
"timestamp": "2026-11-04T08:00:00.000Z",
"version": { "major": 2, "minor": 0, "patch": 0 },
"logoURI": "https://www.litvmswap.com/tlogo.png",
"keywords": ["litvmswap", "litvm"],
"tokens": [
{
"chainId": 4441,
"address": "0xdf69970B2fE416339187aA41D39882e864984CE9",
"symbol": "ZKUSDC",
"name": "ZKUSDC",
"decimals": 18,
"logoURI": "https://assets.coingecko.com/coins/images/53776/standard/usdc.jpg?1737340150",
"extensions": {
"isNative": false,
"isWrappedNative": false,
"verified": true,
"popular": true,
"readOnChain": true,
"oracleSymbol": "USDC/USD"
}
}
]
}One token
GEThttps://www.litvmswap.com/api/token/v2?address=0x...
Terminal
curl "https://www.litvmswap.com/api/token/v2?address=0xdf69970B2fE416339187aA41D39882e864984CE9"You get { "token": { ... } } with the same shape as one entry above. A token that isn't listed returns 404
with "This token is not listed on LitVMSwap". A malformed address returns 400.
What the fields mean
| Field | Meaning |
|---|---|
symbol, name, decimals | Read from the token contract itself (cached for a few minutes). If the chain read fails, you get the list's values |
logoURI | Always a full URL, so it works outside litvmswap.com |
extensions.isNative | true only for native zkLTC (the 0xEeee... placeholder) |
extensions.isWrappedNative | true for wzkLTC |
extensions.verified | Listed and checked by the LitVMSwap team |
extensions.popular | Marked as a popular pick in the app |
extensions.readOnChain | true when symbol, name and decimals all came from the chain |
extensions.displaySymbol / displayName | Only present when the app shows a different label than the contract (say, a friendlier name) |
extensions.oracleSymbol | The price feed pair the app uses for USD values, when there is one |
Caching
Responses are cacheable for 5 minutes (s-maxage=300) and can be served stale for up to an hour while a fresh
copy loads. The list doesn't change often, so caching it on your side for a few minutes is perfect.
Example: a token lookup map
TypeScript
type ListedToken = {
chainId: number
address: string
symbol: string
name: string
decimals: number
logoURI: string | null
extensions: { isNative: boolean; verified: boolean; popular: boolean; [k: string]: unknown }
}
const res = await fetch('https://www.litvmswap.com/api/token/v2')
const list: { tokens: ListedToken[] } = await res.json()
const byAddress = new Map(list.tokens.map((t) => [t.address.toLowerCase(), t]))
const usdc = byAddress.get('0xdf69970b2fe416339187aa41d39882e864984ce9')
console.log(usdc?.symbol, usdc?.decimals, usdc?.logoURI)Showing a token that's not in the list? Read symbol(), name() and decimals() from the contract and show
a "not verified" hint next to it. Anyone can deploy a token called "USDC".