Skip to content
LitVMSwapDocs
Open app
Developers / Token List API
Developers ยท API

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/v2
JSON
{
  "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

FieldMeaning
symbol, name, decimalsRead from the token contract itself (cached for a few minutes). If the chain read fails, you get the list's values
logoURIAlways a full URL, so it works outside litvmswap.com
extensions.isNativetrue only for native zkLTC (the 0xEeee... placeholder)
extensions.isWrappedNativetrue for wzkLTC
extensions.verifiedListed and checked by the LitVMSwap team
extensions.popularMarked as a popular pick in the app
extensions.readOnChaintrue when symbol, name and decimals all came from the chain
extensions.displaySymbol / displayNameOnly present when the app shows a different label than the contract (say, a friendlier name)
extensions.oracleSymbolThe 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".