Skip to content

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.

ReadWhat 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}/appsThe 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}/sitesA 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 ​

bash
curl https://api.chaindaddy.io/api/v2/public/coins/base/FLUXGP
json
{
  "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, never 0.
  • logoUrl is null for a page marked NSFW. nsfw tells you why.
  • crownId is the ID the sites read below takes.

The apps on a coin's page ​

bash
curl https://api.chaindaddy.io/api/v2/public/coins/base/FLUXGP/apps
json
{
  "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 ​

bash
curl https://api.chaindaddy.io/api/v2/public/holdings/base/0x931fce21ddea0549db70324f44ee2db1cb9f7f22/0x2ca75898788f3aad05e7e4ff247f3db13456b0b4
json
{
  "chain": "base",
  "chainId": "eip155:8453",
  "token": "0x931fce21ddea0549db70324f44ee2db1cb9f7f22",
  "wallet": "0x2ca75898788f3aad05e7e4ff247f3db13456b0b4",
  "balance": "250000000000000000000",
  "holds": true
}
  • balance is 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.
  • holds is true when 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 429 with a Retry-After header.
  • A 503 means 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 ​

bash
curl https://api.chaindaddy.io/api/v2/public/crowns/base/8/sites
json
{
  "chain": "base",
  "chainId": "eip155:8453",
  "crownId": 8,
  "symbol": "FLUXGP",
  "badgeHosts": ["chaindaddy.org"],
  "embedHosts": ["chaindaddy.org"],
  "interactive": true
}
  • badgeHosts are the sites that show Verified · the site of $SYMBOL on the Chain Daddy sign-in page.
  • embedHosts are the sites that can also run the coin's apps and take its checkout.
  • A host covers its subdomains: yourcoin.com also means shop.yourcoin.com.
  • interactive is false when there are no embedHosts, or when Chain Daddy has turned the coin's embeds off.
  • A coin with no verified sites answers 200 with 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:

js
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 sitesHoldings
Fresh forabout 1 minuteabout 30 seconds
A change shows withina few minutesabout a minute
Limit400 requests a minute per IP address60 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 ​

StatuscodeMeaning
404not_foundNo verified page for that ticker on that chain, an unknown chain, or an address that is not one on that chain
429rate_limit_exceededToo many requests. Wait for Retry-After seconds
503unavailableChain Daddy could not answer right now. Try again
json
{ "error": "not_found", "code": "not_found", "message": "Not found." }