Skip to main content
Use the token catalog endpoint to keep token names, symbols, decimals, contract addresses, and logos current in your backend. The endpoint returns the catalog as a sequence of pages across supported chains and networks.

What you need

  • A Dynamic API token with the environment.settings.read scope. See API token permissions.
  • Server-side storage for the catalog and its ETag value.
Keep the API token server-side. Read it from an environment variable or a secrets manager, never from client-side code or a committed file.

Fetch the catalog

Call GET /api/v0/tokenCatalog with your API token. The endpoint paginates results: limit sets the page size (1 to 100, default 50) and cursor continues from a previous page:
curl
A successful response contains one page of tokens, the cursor for the next page, and a version for the current catalog content:
When nextCursor is a string, pass it as cursor on the next request to fetch the following page. When nextCursor is null, the page is the last one and the catalog is fully read. The logoURI field is optional. Identify a token by its chain, network, and contract address instead of its symbol, because the same symbol can exist on multiple networks.

Poll without downloading unchanged data

Each page response includes an ETag header and a version field. The ETag identifies one specific page request, so it only matches a later request with the same limit and cursor. The version hashes the entire catalog, so the first page’s version changes whenever any token changes. To poll efficiently, save the first page’s ETag together with your stored catalog. On the next scheduled request, send that value in If-None-Match on the first page only:
  • 304 Not Modified means the catalog is unchanged. Keep using the saved copy.
  • 200 OK with a new version means the catalog changed. Read every page until nextCursor is null and replace the saved snapshot and ETag.
This TypeScript example accepts the previously saved snapshot so the same path works on the first run and later runs:
TypeScript
Persist the returned object after each successful sync. If the process restarts, load both values before the next request; an ETag without its matching catalog is not useful.

Handle errors

Treat each successful sync as a complete replacement snapshot. Do not discard the last valid snapshot when a refresh fails.
Last modified on September 26, 2026