Try it
No sign up and no key. Paste this into a terminal.
What comes back. This is a real answer, read from the chain when this page was built.
{
"address": "0x39065ac5dc2d771276e9f1c913f06d9f74e41e18",
"chainId": 4663,
"checkedAt": "2026-09-20T12:58:42.989Z",
"verdict": {
"code": "ok",
"level": "ok",
"text": "buys and sells go through."
},
"flags": [
"owner_active",
"hook",
"dynamic_fee"
],
"token": {
"symbol": "KRILL",
"name": "Krill",
"decimals": 18,
"totalSupply": "1000000000",
"owner": "0xeb7c034704ef8dcd2d32324c1545f62fb4ad0862",
"ownerRenounced": false
},
"venue": {
"kind": "uniswap_v4",
"quote": "eth",
"poolFeeBps": null,
"dynamicFee": true,
"hook": "0x4e3468951d49f2eea976ed0d6e75ffcb44a9a544",
"pool": null,
"poolId": "0xbb2f506d545d56f4e35970f1255fddd9f3ebbb4fb31ed0c983d53bcb566f1bff",
"poolsFound": 1
},
"trade": {
"method": "simulated_trade",
"paid": {
"amount": "0.1",
"asset": "eth"
},
"tokensOut": "12821368.50110544460367899",
"roundTripLossBps": 298,
"feesBps": 298,
"priceImpactBps": 0,
"buyReverts": null,
"sellReverts": null
},
"price": {
"usd": 1.9525243e-05,
"marketCapUsd": 19525
},
"pons": null
}What you get back
The same fields every time. A field the nest cannot fill is null, never missing.
verdict- The answer.
codeis for your program,levelis for a colour (ok, warn, danger, unknown),textis the sentence a person reads. flags- Things worth knowing that did not decide the verdict. An owner who can still change the token, a hook on the pool, a deployer with a bad record.
token- Symbol, name, decimals, total supply, and the owner if the contract has one.
ownerRenouncedis true when the owner is the zero address. venue- Where it trades: a Pons curve, a Pons pool, Uniswap v3 or Uniswap v4.
poolFeeBpsis what the pool keeps of every swap. It is null when a hook sets the fee swap by swap. trade- The test trade.
roundTripLossBpsis what buying 0.1 ETH and selling straight back loses, in hundredths of a percent.feesBpsandpriceImpactBpssplit that loss.sellRevertsholds the reason when a sell fails. price- Price per token and market cap in dollars, from the pool itself.
pons- Only for tokens launched on Pons: curve or graduated, how full the curve is, the taxes, and the deployer record.
checkedAt- When the nest read the chain for this answer.
Verdicts
Switch on verdict.code. Colour by verdict.level. A level of unknown means the nest could not find out. It is not a pass, so do not show it as one.
| code | level | what it means |
|---|---|---|
| ok | ok | A buy and a sell both went through and the cost is ordinary. |
| cannot_sell | danger | The buy worked and the sell failed. Do not let anyone buy this. |
| cannot_buy | warn | The buy failed. Often a curve that has closed and is waiting to graduate. |
| toll_pool | danger | The pool keeps a tenth or more of every swap. Most of these keep about 81%. |
| high_fees | danger | Fees and tax take half or more of a buy and a sell. |
| heavy_fees | warn | Fees and tax take 15% or more of a buy and a sell. |
| thin_pool | warn | It trades, but the pool is nearly empty. 0.1 ETH moves the price a long way. |
| empty_pool | warn | A pool exists and holds nothing. |
| no_pool | warn | No pool found against ETH, WETH or USDG on Pons, Uniswap v3 or Uniswap v4. |
| quote_asset | ok | You asked about WETH or USDG. They are what other tokens are priced in. |
| not_a_token | unknown | The address is a contract, but not a token. |
| no_contract | unknown | Nothing is deployed at the address. |
| unproven | unknown | The pool was found but the chain would not run the test trade. Ask again. |
Flags
A token can pass the trade and still deserve a warning. These are the warnings.
| flag | what it means |
|---|---|
| owner_active | The token has an owner who has not given it up. They may still be able to change how it behaves. |
| hook | A hook runs on every swap in this pool. It can change what a trade costs. |
| dynamic_fee | The pool fee is not fixed. The hook decides it swap by swap. |
| toll_pool | The pool fee is a tenth of the swap or more. |
| thin_pool | The pool is shallow. The loss is mostly the price moving. |
| high_creator_tax | Pons only. The creator tax is 8% or more. Pons allows at most 10%. |
| serial_deployer | Pons only. The deployer has launched five or more tokens and none graduated. |
| deployer_sold | Pons only. The deployer has sold its own token before. |
| snipe_tax_active | Pons only. The launch is seconds old and the anti sniper tax is still on. |
| curve_closed | Pons only. The curve is full and closed. Selling waits for the pool to open. |
| no_liquidity | Pons only. The graduated pool has nothing in range. |
Holders
Who holds a token and how they got in. Top holders with wallet age and entry price, fresh wallets, the bundle, snipers, what the deployer did, and which winning wallets are in it.
A real answer, read from the chain when this page was built. The api sends ten holders and up to eight winners. Three and two are shown here.
{
"address": "0xa2eca2db1b65d6f2d14b91e7fb518db5ebc6df50",
"chainId": 4663,
"status": "complete",
"transfersRead": 26298,
"token": {
"symbol": "ANY",
"decimals": 18,
"totalSupply": "1000000000"
},
"marketCapUsd": 76340,
"holders": {
"count": 786,
"countIsFloor": false,
"top10Bps": 2098,
"inPoolsBps": 1721,
"burnedBps": 258,
"freshInTop": 0,
"agedInTop": 2
},
"top": [
{
"address": "0xe91d1184a90647ee38246e59c390f8b1bcc212f9",
"balance": "33698014.505865636359411007",
"supplyBps": 336,
"firstSeen": "2026-08-10T11:42:14.000Z",
"ageDays": 41,
"entryMarketCapUsd": 96854,
"multiple": 0.7882,
"soldBps": 0,
"tags": [
"contract"
]
},
{
"address": "0xa549b76aed081aec46d44af0850a822789128ede",
"balance": "31374502.274311969715723626",
"supplyBps": 313,
"firstSeen": "2026-08-20T06:14:53.000Z",
"ageDays": 31,
"entryMarketCapUsd": 129965,
"multiple": 0.5874,
"soldBps": 4911,
"tags": [
"contract"
]
},
{
"address": "0xef53f5b1a0fd9b0c855264675afcefba89fe252c",
"balance": "31118761.36927873196759561",
"supplyBps": 311,
"firstSeen": "2026-07-11T02:27:59.000Z",
"ageDays": 71,
"entryMarketCapUsd": 84074,
"multiple": 0.908,
"soldBps": 5538,
"tags": []
}
],
"launch": {
"block": 67778688,
"time": "2026-09-20T07:59:18.000Z",
"windowBlocks": 30
},
"snipers": {
"wallets": 12,
"boughtBps": 3627,
"heldBps": 0,
"soldOut": 12
},
"bundle": {
"wallets": 4,
"funder": null,
"sameTransaction": true,
"boughtBps": 2700,
"heldBps": 0
},
"deployer": {
"address": "0xbd7f2c45af65c4bb3543193a6dfcbf42b4a0f996",
"source": "pons",
"status": "burned_out",
"receivedBps": 0,
"boughtBps": 258,
"soldBps": 0,
"movedBps": 0,
"pooledBps": 0,
"burnedBps": 258,
"heldBps": 0
},
"smartMoney": {
"holding": 1,
"soldOut": 19,
"wallets": [
{
"address": "0xc87b51c71707cfdd08cd374a596a6946cb1d6a66",
"rank": 20,
"window": "24h",
"profitEth": 2.11545,
"winRate": 0.533,
"closed": 15,
"supplyBps": 33,
"entryMarketCapUsd": 116800,
"multiple": 0.6536,
"biggestWin": {
"token": "0x4d066ab4d924b7b3d01c6ecbfc142efe33aeb7fa",
"symbol": "JEV",
"profitEth": 0.948467,
"spentEth": 7.35699,
"multiple": 1.129,
"closedAt": "2026-09-20T07:22:24.000Z"
}
}
]
},
"repeatCrowd": null,
"checkedAt": "2026-09-20T12:59:54.000Z"
}
The nest reads every transfer the token ever made, back to its first block, plus every fill on its pools. So it works on any token on the chain, and an entry price is what the wallet really paid, tax included.
A very busy token answers with a status of reading first. Ask again after half a minute for the whole thing. After that it stays fast, because only new blocks are read.
Keys and limits are the same as for a check. A holders answer is shared for 60 seconds, since it costs far more to make.
statuscompletemeans every transfer the token ever made was read.readingmeans the token is very busy: this answer holds only the launch, and the full one is ready about half a minute later, so ask again.partialmeans the token is busier than the nest reads in full, and the counts are a floor.holders- How many wallets hold it, what the top ten hold together, how much sits in pools and how much sits at a burn address (
burnedBps).freshInTopis how many of the top holders were made within 3 days of their first buy, out of theagedInTopwhose age is known. Every share is in hundredths of a percent of supply. top- The ten biggest holders. Pools, the curve and burn addresses are left out.
firstSeenis the first time anything reached that wallet on the chain.entryMarketCapUsdis the market cap it bought at, averaged over its buys.multipleis the market cap now over that.soldBpsis the share of its tokens it has sold. top[].tagsdeployer,creator,sniper,bundle,fresh,winner,contractandfunded_by_deployer.launch- The block of the first buy. Snipers and bundles are looked for in that block and the 30 after it, which is 3 seconds.
snipers- Wallets that bought inside that window: how many, what they bought, what they still hold, and how many have sold out.
bundle- Three or more launch buyers that share one funder, were filled in one transaction, or were paid for by the deployer. Null when none was found.
deployer- What the launcher did with its own tokens.
statusis one ofnever_held,holds_all,holds_some,sold_out,moved_outandburned_out. Tokens sent to the dead address count as burned, never as moved or sold.sourcesays how the nest knows who it is: Pons said so, the nest saw the contract deployed, or it sent the transaction the first mint was in. smartMoney- Wallets in profit on the winners list that hold this token. For each: its rank and window (
24h,7d,30dorall, the nearest board it ranks on), profit, win rate, how much it holds, the market cap it got in at, andbiggestWin, the token it took the most ETH out of, with the profit and the multiple.soldOutcounts winners that bought it and have left. repeatCrowd- How many of the top 20 holders also bought the same deployer's other launches. Null when the deployer has no other launches the nest knows.
Keys and limits
Without a key you get 10 calls a minute. That is enough to try it and to build against it.
A key is free and gives you 60 calls a minute and 20,000 a day. To get one, open the console, type start to hatch a mite, then type key new. The key is shown once. Type key to see your keys and key off with its number to turn one off.
Send the key as a header. A bearer token works too.
Every answer carries x-ratelimit-limit and x-ratelimit-remaining. Answers for one token are shared for 15 seconds, and x-cache says hit or miss. Asking faster than that gets you the same answer, so there is no reason to.
Call it from your server when you can. A key in a web page can be read by anyone who opens it. The api allows calls from any page all the same, so a wallet or a site can use it without a key.
Errors
Errors are json too. {"error": {"code": "...", "message": "..."}}
| status | code | what happened |
|---|---|---|
| 400 | bad_address | That is not a token address. |
| 401 | bad_key | The key is wrong or was turned off. A bad key is refused, it is not treated as no key. |
| 429 | rate_limited | Too many calls this minute. retry-after says how many seconds to wait. |
| 429 | daily_limit | The key has used its calls for the day. It resets at 00:00 UTC. |
| 404 | not_a_token | Holders only. The address is not a token with holders the nest can read. WETH, USDG and stock tokens are left out. |
| 502 | upstream | The chain did not answer. Try again in a moment. |
| 502 | holders_failed | Holders only. The chain did not hand over the token's transfers. Try again in a moment. |
| 503 | holders_busy | Holders only. The nest is reading other tokens. Try again in a few seconds. |
| 503 | holders_budget | Holders only. The nest has read as many token histories as it may today. It starts again at 00:00 UTC. |
| 503 | busy | The nest is reading the chain as fast as it may. Try again in a second. |
How it decides
A price quote proves little, because a quote never moves the token. So the nest makes the trade for real, inside a simulation. It gives a wallet that does not exist some ETH, has it buy 0.1 ETH of the token, and has it sell everything straight back, through the same routers a person would use. Nothing is sent and nothing costs gas.
What comes back is the answer. A token that blocks selling fails on the sell. A transfer tax shows up as the loss. A pool that keeps 81% of every swap shows up as an 81% loss.
It then makes the same trade ten thousand times smaller. That one moves no price, so what it loses is fees and tax alone. Whatever the full trade loses on top is the pool being shallow. That is how a greedy pool is told apart from an empty one.
To find where a token trades it asks Pons, then Uniswap v3, then every Uniswap v4 pool the nest has seen. It tries the best few and keeps the one that fills best, because that is where a real buyer would end up.
What it cannot promise is tomorrow. A sell that works now can be switched off later by an owner or a hook. That is what owner_active and hook are for.
For machines
The whole api is described in openapi.json. /v1/health tells you if the nest is keeping up with the chain. The chain id is 4663.