API Reference
Plain REST over HTTPS — search, single-mint lookup, 500-mint batch resolve, and a cached image proxy. No API key, permissive CORS, anyone can call them straight from a browser, curl, or a server.
Protocol
REST over HTTPS · GET + POST
Auth
None. CORS * — call from any origin.
Content-Type
application/json for POST bodies.
Search the registry by symbol, name, or mint. Empty query returns top-by-volume.
| name | type | req | description |
|---|---|---|---|
| q | string | optional | Text query: mint, symbol, or partial name. Ranking: exact mint → exact symbol → symbol-prefix → name-prefix → fuzzy. |
| limit | int | optional | 1–200, default 50. |
| page | int | optional | 1-indexed, default 1. |
| include_token22 | bool | optional | Default true. false hides Token-22 mints. |
Request
Response
curl '{{BASE}}/tokens?q=USDC&limit=3'
const r = await fetch('{{BASE}}/tokens?q=USDC&limit=3');
const data = await r.json();
console.log(data.items);
import requests
r = requests.get('{{BASE}}/tokens', params={'q': 'USDC', 'limit': 3})
print(r.json()['items'])
Single-mint lookup. 404 when the mint isn't in the registry yet.
| name | type | req | description |
|---|---|---|---|
| mint | base58 pubkey | required | The SPL or Token-22 mint address. |
Request
Response
curl '{{BASE}}/tokens/So11111111111111111111111111111111111111112'
const r = await fetch('{{BASE}}/tokens/So11111111111111111111111111111111111111112');
const token = await r.json();
import requests
token = requests.get('{{BASE}}/tokens/So11111111111111111111111111111111111111112').json()
Up to 500 mints per request. Hits land in items, misses in unknown (and get auto-enqueued for on-chain enrichment).
| field | type | req | description |
|---|---|---|---|
| mints | array<string> | required | Up to 500 base58 mint addresses. |
Request body
Response
curl -X POST '{{BASE}}/tokens/batch' \
-H 'content-type: application/json' \
-d '{"mints":["So111...","EPjF...","Es9v..."]}'
const r = await fetch('{{BASE}}/tokens/batch', {
method: 'POST',
headers: { 'content-type': 'application/json' },
body: JSON.stringify({ mints: ['So111...', 'EPjF...', 'Es9v...'] }),
});
const { items, unknown } = await r.json();
import requests
r = requests.post('{{BASE}}/tokens/batch', json={'mints': ['So111...', 'EPjF...', 'Es9v...']})
items, unknown = r.json()['items'], r.json()['unknown']
Cached image proxy. Always returns 200 + an image — falls back to an Unknown SVG when the upstream is unreachable, so your <img> never breaks. Unknown mints are silently enqueued for on-chain resolution.
| name | type | req | description |
|---|---|---|---|
| mint | base58 pubkey | required | The mint address. Response is cached server-side after the first hit. |
Request
Response
curl '{{BASE}}/img/EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v' -o usdc.png
const img = new Image();
img.src = '{{BASE}}/img/EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v';
document.body.appendChild(img);
<img src="{{BASE}}/img/EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" />
All endpoints that return a single token row use this shape.
{
"mint": "<base58 pubkey>",
"symbol": "USDC",
"name": "USD Coin",
"decimals": 6,
"logo_url": "https://...",
"logo_status": "ok" | "unchecked" | "broken" | "missing",
"is_token22": false,
"daily_volume_usd": 1234567.89,
"first_seen_at": 1778506622843,
"last_seen_at": 1778507442287,
// Full-metadata capture (added 2026-05-12). Nullable on rows
// whose enrichment predates the migration.
"supply": "10000000000",
"mint_authority": null,
"freeze_authority": null,
"metaplex_uri": "https://arweave.net/...json",
"update_authority": "<pubkey>",
"seller_fee_basis_points": 0,
"token_standard": 2,
"description": "USD-pegged stablecoin issued by Circle.",
"external_url": "https://www.circle.com/usdc",
"extensions": { "website": "...", "twitter": "...", "telegram": "..." },
"tags": ["stablecoin"]
}
Per-IP sliding window. 429 responses carry a retry-after header. Need a higher tier? Reach out to allow-list partner IPs.
| endpoint | budget | ||
|---|---|---|---|
| GET /tokens | 60 req/min/IP | ||
| GET /tokens/:mint | 180 req/min/IP | ||
| POST /tokens/batch | 20 req/min/IP (up to 500 mints each) | ||
| GET /img/:mint | 600 req/min/IP | ||
| Global fallback | 300 req/min/IP across all routes |