Public reads
Four reads need no API key, no sign-in and no registered site. Any server or browser can call them, from any origin. Everyone gets the same answer, and it is cached for about a minute, so they are safe to call on every page view.
| Read | What you get |
|---|---|
GET /api/v2/public/coins/{chain}/{symbol} | A verified coin: name, token address, logo, price, market cap, volume, liquidity, holders |
GET /api/v2/public/coins/{chain}/{symbol}/apps | The apps on that coin's page |
GET /api/v2/public/holdings/{chain}/{token}/{wallet} | One wallet's balance of one token |
GET /api/v2/public/crowns/{chain}/{crownId}/sites | A coin's verified sites |
{chain} is the chain's key in lowercase, as in the coin page's own address: base, eth, solana. Every field is in the API Explorer under Public reads.
A verified coin
curl https://api.chaindaddy.io/api/v2/public/coins/base/FLUXGP{
"symbol": "FLUXGP",
"name": "Flux GP",
"chain": "base",
"chainId": "eip155:8453",
"crownId": 8,
"tokenAddress": "0x931fce21ddea0549db70324f44ee2db1cb9f7f22",
"logoUrl": "https://…/fluxgp.png",
"nsfw": false,
"pageUrl": "https://chaindaddy.io/fluxgp/base",
"market": {
"priceUsd": 0.0000367632,
"marketCapUsd": 36763.2,
"volume24hUsd": 1200.5,
"liquidityUsd": 8400,
"priceChange24hPct": -2.5
},
"holders": 321
}- Only a verified coin page answers. Any other ticker answers
404. - A figure Chain Daddy does not have is
null, never0. logoUrlisnullfor a page marked NSFW.nsfwtells you why.crownIdis the ID the sites read below takes.
The apps on a coin's page
curl https://api.chaindaddy.io/api/v2/public/coins/base/FLUXGP/apps{
"symbol": "FLUXGP",
"chain": "base",
"chainId": "eip155:8453",
"crownId": 8,
"apps": [
{ "id": "core-poll", "name": "Poll", "description": "Ask your holders a question", "version": "1.0.0",
"category": "community", "icon": null, "firstParty": true, "embed": null }
]
}The list is in the page's own order. It names the apps and does not include what the owner set up inside them. Apps the owner turned off are left out, and so are apps rated NSFW. firstParty is true for an app Chain Daddy built and false for a developer's reviewed app. embed is the app's own embed declaration from its manifest, or null when it has none.
A wallet's holding
curl https://api.chaindaddy.io/api/v2/public/holdings/base/0x931fce21ddea0549db70324f44ee2db1cb9f7f22/0x2ca75898788f3aad05e7e4ff247f3db13456b0b4{
"chain": "base",
"chainId": "eip155:8453",
"token": "0x931fce21ddea0549db70324f44ee2db1cb9f7f22",
"wallet": "0x2ca75898788f3aad05e7e4ff247f3db13456b0b4",
"balance": "250000000000000000000",
"holds": true
}balanceis in the token's smallest unit, as a string, because it does not fit a JSON number. Divide by 10 to the power of the token's decimals to show it.holdsistruewhen the balance is above zero.- It works for any token on a chain Chain Daddy serves, not only verified coins.
- The answer is read from the chain and cached for about 30 seconds.
- Each caller gets 60 of these a minute. Past that the API answers
429with aRetry-Afterheader. - A
503means the chain could not be read. It never means the wallet holds nothing, so try again.
This is how a site that signed someone in with Chain Daddy checks later that they still hold a coin.
A coin's verified sites
curl https://api.chaindaddy.io/api/v2/public/crowns/base/8/sites{
"chain": "base",
"chainId": "eip155:8453",
"crownId": 8,
"symbol": "FLUXGP",
"badgeHosts": ["chaindaddy.org"],
"embedHosts": ["chaindaddy.org"],
"interactive": true
}badgeHostsare the sites that show Verified · the site of $SYMBOL on the Chain Daddy sign-in page.embedHostsare the sites that can also run the coin's apps and take its checkout.- A host covers its subdomains:
yourcoin.comalso meansshop.yourcoin.com. interactiveisfalsewhen there are noembedHosts, or when Chain Daddy has turned the coin's embeds off.- A coin with no verified sites answers
200with empty lists.
How a coin's owner verifies a site is in Your coin's verified sites.
Calling from a browser
Every read answers Access-Control-Allow-Origin: *, so a page on any site can fetch it. Send the request without credentials, which is what fetch does by default for another site:
const coin = await fetch('https://api.chaindaddy.io/api/v2/public/coins/base/FLUXGP').then((r) => r.json());A request sent with credentials: 'include' fails in the browser, because a wildcard answer cannot carry credentials. There is nothing to send: these reads take no key, no cookie and no session.
Caching and limits
| Coin, apps and sites | Holdings | |
|---|---|---|
| Fresh for | about 1 minute | about 30 seconds |
| A change shows within | a few minutes | about a minute |
| Limit | 400 requests a minute per IP address | 60 a minute per caller, within the 400 |
These answers carry no X-RateLimit-* headers, because one cached answer goes to every caller. A 404 is also cached for about a minute: a page verified just now can read as missing until then.
Errors
| Status | code | Meaning |
|---|---|---|
404 | not_found | No verified page for that ticker on that chain, an unknown chain, or an address that is not one on that chain |
429 | rate_limit_exceeded | Too many requests. Wait for Retry-After seconds |
503 | unavailable | Chain Daddy could not answer right now. Try again |
{ "error": "not_found", "code": "not_found", "message": "Not found." }