Appearance
Search API
Search for tokens by symbol across all supported chains.
Endpoints
| Method | Path | Description |
|---|---|---|
GET | /api/v2/search | Search tokens across all chains |
GET | /api/v2/token/:symbol/:chain | Get token info for a specific symbol and chain |
Search Tokens
GET /api/v2/searchReturns token data and registration status for a symbol across all supported chains, sorted by relevance score.
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
symbol | string | Yes | — | Token symbol to search (1-20 alphanumeric characters) |
chain | string | No | all | Filter by chain key: eth, arbitrum, base, polygon, bnb, avax, gnosis, solana |
status | string | No | all | Filter by registration status: available, unclaimed, claimed, inactive |
page | integer | No | 1 | Page number for pagination |
pageSize | integer | No | 25 | Results per page (max 100) |
refresh | boolean | No | false | Force cache refresh for real-time data |
expand | boolean | No | true | Enable query expansion for related symbols |
includeDeployer | boolean | No | false | Include deployer wallet address in results |
includeOwnership | boolean | No | false | Include ownership verification details |
Response Format
json
{
"success": true,
"symbol": "PEPE",
"filters": {
"chain": "all",
"status": "all"
},
"sort": {
"field": "score",
"order": "desc"
},
"results": [
{
"chainId": 42161,
"chainName": "Arbitrum",
"chainKey": "arbitrum",
"chainIcon": "https://assets.chaindaddy.io/chains/arbitrum.svg",
"source": "dexscreener",
"sources": ["dexscreener", "coingecko"],
"token": {
"address": "0x6982508145454ce325ddbe47a25d4ec3d2311933",
"symbol": "PEPE",
"name": "Pepe",
"decimals": 18,
"logoUrl": "https://assets.chaindaddy.io/tokens/pepe.png",
"website": "https://pepecoin.org",
"twitter": "@pepecoineth",
"marketCap": 1000000,
"fdv": 1500000,
"volume24h": 50000,
"priceUsd": 0.00000123,
"priceChange24h": -2.5,
"liquidity": 200000,
"holders": 5000
},
"crown": {
"status": "claimed",
"tokenId": 123,
"owner": "0x1234567890abcdef1234567890abcdef12345678",
"verificationMethod": "deployer"
}
}
],
"pagination": {
"total": 12,
"returned": 5,
"page": 1,
"pageSize": 25,
"totalPages": 1,
"hasMore": false,
"nextCursor": null
},
"meta": {
"totalResults": 12,
"chainCounts": {
"arbitrum": 3,
"eth": 2,
"solana": 4,
"base": 2,
"bnb": 1
},
"statusCounts": {
"claimed": 3,
"unclaimed": 7,
"available": 2
},
"queryExpanded": false,
"expansionQueries": []
}
}Response Fields
Top-level
| Field | Type | Description |
|---|---|---|
success | boolean | Whether the request completed |
symbol | string | Searched symbol (uppercased) |
filters | object | Applied filter parameters |
sort | object | Applied sort parameters |
results | array | Array of search results |
pagination | object | Pagination information |
meta | object | Result metadata and counts |
Result Object
| Field | Type | Description |
|---|---|---|
chainId | integer | Numeric chain ID (e.g., 42161 for Arbitrum) |
chainName | string | Human-readable chain name |
chainKey | string | Short chain identifier (e.g., arbitrum, solana) |
chainIcon | string | URL to chain icon asset |
source | string | Primary data source used |
sources | string[] | All data sources that contributed |
Token Object
| Field | Type | Description |
|---|---|---|
address | string | Token contract address |
symbol | string | Token symbol |
name | string | Token display name |
nameSource | string | Source of the token name |
decimals | integer | Token decimal places |
logoUrl | string | Token logo image URL |
website | string | Project website |
twitter | string | Twitter/X handle |
telegram | string | Telegram group URL |
discord | string | Discord invite URL |
marketCap | number | Market capitalization (USD) |
fdv | number | Fully diluted valuation (USD) |
volume24h | number | 24-hour trading volume (USD) |
priceUsd | number | Current price in USD |
priceChange24h | number | 24-hour price change (%) |
liquidity | number | Available liquidity (USD) |
holders | integer | Number of token holders |
Registration Object (JSON field: crown)
The JSON response field is named crown for API stability. Its contents describe the token's on-chain registration.
| Field | Type | Description |
|---|---|---|
status | string | Registration status (see below) |
tokenId | integer | null | Registration's on-chain ID |
owner | string | null | Registration owner wallet address |
verificationMethod | string | null | Method used to verify ownership |
Registration Status Values:
| Status | Meaning |
|---|---|
available | No token exists on this chain |
unclaimed | Token exists but no registration minted |
grace_period | New registration in 30-day grace period |
claimed | Registration exists, owned by someone else |
owned | Factory-created token, you own it |
inactive | Registration exists but heartbeat below 60% |
Pagination Object
| Field | Type | Description |
|---|---|---|
total | integer | Total results matching query |
returned | integer | Results in this response |
page | integer | Current page number |
pageSize | integer | Results per page |
totalPages | integer | Total available pages |
hasMore | boolean | Whether more pages exist |
nextCursor | string | null | Cursor for next page (if applicable) |
Meta Object
| Field | Type | Description |
|---|---|---|
totalResults | integer | Total results across all pages |
chainCounts | object | Result count per chain key |
statusCounts | object | Result count per registration status |
queryExpanded | boolean | Whether query expansion was used |
expansionQueries | string[] | Related symbols searched |
Sorting
Results are sorted by a composite relevance score:
- Status priority: available → unclaimed → grace_period → claimed → owned → inactive
- Market score: 40% market cap + 30% volume + 30% liquidity
- Chain priority: arbitrum → solana → polygon → base → bnb → eth
Code Examples
bash
# Basic search
curl -H "X-API-Key: cd_live_YOUR_KEY_HERE" \
"https://api.chaindaddy.io/api/v2/search?symbol=PEPE"
# With filters and pagination
curl -H "X-API-Key: cd_live_YOUR_KEY_HERE" \
"https://api.chaindaddy.io/api/v2/search?symbol=DOGE&chain=arbitrum&status=unclaimed&page=1&pageSize=10"
# Force refresh with deployer info
curl -H "X-API-Key: cd_live_YOUR_KEY_HERE" \
"https://api.chaindaddy.io/api/v2/search?symbol=PEPE&refresh=true&includeDeployer=true"javascript
const API_KEY = 'cd_live_YOUR_KEY_HERE';
const BASE_URL = 'https://api.chaindaddy.io';
async function searchTokens(symbol, options = {}) {
const params = new URLSearchParams({ symbol, ...options });
const response = await fetch(`${BASE_URL}/api/v2/search?${params}`, {
headers: { 'X-API-Key': API_KEY }
});
return response.json();
}
// Basic search
const results = await searchTokens('PEPE');
console.log(`Found ${results.pagination.total} results`);
// Filtered search
const arbResults = await searchTokens('DOGE', {
chain: 'arbitrum',
status: 'unclaimed',
pageSize: '10'
});python
import requests
API_KEY = 'cd_live_YOUR_KEY_HERE'
BASE_URL = 'https://api.chaindaddy.io'
def search_tokens(symbol, **kwargs):
params = {'symbol': symbol, **kwargs}
response = requests.get(
f'{BASE_URL}/api/v2/search',
params=params,
headers={'X-API-Key': API_KEY}
)
response.raise_for_status()
return response.json()
# Basic search
results = search_tokens('PEPE')
print(f"Found {results['pagination']['total']} results")
# Filtered search
arb_results = search_tokens('DOGE', chain='arbitrum', status='unclaimed', pageSize=10)Get Token by Symbol and Chain
GET /api/v2/token/:symbol/:chainReturns detailed token and registration information for a specific symbol on a specific chain.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
symbol | string | Yes | Token symbol |
chain | string | Yes | Chain key: eth, arbitrum, base, polygon, bnb, avax, gnosis, solana |
Response Format
json
{
"success": true,
"chainId": 42161,
"chainName": "Arbitrum",
"token": {
"address": "0x6982508145454ce325ddbe47a25d4ec3d2311933",
"symbol": "PEPE",
"name": "Pepe",
"decimals": 18,
"marketCap": 1000000,
"volume24h": 50000,
"priceUsd": 0.00000123,
"liquidity": 200000,
"holders": 5000
},
"crown": {
"status": "claimed",
"tokenId": 123,
"owner": "0x1234567890abcdef1234567890abcdef12345678",
"verificationMethod": "deployer"
}
}Code Examples
bash
curl -H "X-API-Key: cd_live_YOUR_KEY_HERE" \
"https://api.chaindaddy.io/api/v2/token/PEPE/arbitrum"javascript
async function getToken(symbol, chain) {
const response = await fetch(
`${BASE_URL}/api/v2/token/${symbol}/${chain}`,
{ headers: { 'X-API-Key': API_KEY } }
);
return response.json();
}
const token = await getToken('PEPE', 'arbitrum');
console.log(token.crown.status); // "claimed"python
def get_token(symbol, chain):
response = requests.get(
f'{BASE_URL}/api/v2/token/{symbol}/{chain}',
headers={'X-API-Key': API_KEY}
)
response.raise_for_status()
return response.json()
token = get_token('PEPE', 'arbitrum')
print(token['crown']['status']) # "claimed"Common Recipes
Check if a Symbol is Available
Determine whether a symbol has an unclaimed registration on a specific chain:
javascript
async function isSymbolAvailable(symbol, chain) {
const data = await searchTokens(symbol, { chain });
const result = data.results.find(r => r.chainKey === chain);
if (!result) return true; // No token on this chain
return result.crown.status === 'available' || result.crown.status === 'unclaimed';
}
const available = await isSymbolAvailable('MYDOGE', 'arbitrum');
if (available) {
console.log('Symbol is available to claim!');
}python
def is_symbol_available(symbol, chain):
data = search_tokens(symbol, chain=chain)
results = [r for r in data['results'] if r['chainKey'] == chain]
if not results:
return True # No token on this chain
return results[0]['crown']['status'] in ('available', 'unclaimed')
if is_symbol_available('MYDOGE', 'arbitrum'):
print('Symbol is available to claim!')Paginate Through All Results
Iterate through all search results page by page:
javascript
async function getAllResults(symbol) {
const allResults = [];
let page = 1;
while (true) {
const data = await searchTokens(symbol, { page: String(page), pageSize: '100' });
allResults.push(...data.results);
if (!data.pagination.hasMore) break;
page++;
}
return allResults;
}python
def get_all_results(symbol):
all_results = []
page = 1
while True:
data = search_tokens(symbol, page=page, pageSize=100)
all_results.extend(data['results'])
if not data['pagination']['hasMore']:
break
page += 1
return all_resultsFilter by Registration Status
Find all unclaimed tokens for a symbol to identify claiming opportunities:
javascript
async function findClaimableTokens(symbol) {
const data = await searchTokens(symbol, { status: 'unclaimed' });
return data.results.map(r => ({
chain: r.chainName,
address: r.token.address,
marketCap: r.token.marketCap,
holders: r.token.holders
}));
}python
def find_claimable_tokens(symbol):
data = search_tokens(symbol, status='unclaimed')
return [{
'chain': r['chainName'],
'address': r['token']['address'],
'market_cap': r['token']['marketCap'],
'holders': r['token']['holders']
} for r in data['results']]Error Responses
| Status | Error | Description |
|---|---|---|
| 400 | bad_request | Missing symbol parameter or invalid length (1-20 chars) |
| 429 | rate_limit_exceeded | Daily or per-second rate limit exceeded |
See Authentication for rate limiting details and retry strategies.