swarm0x

Check any token.

One request tells you if a token on Robinhood Chain can be bought and sold, and what a round trip costs. The nest makes a real buy and sell inside a simulation to find out. Free to use.

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. code is for your program, level is for a colour (ok, warn, danger, unknown), text is 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. ownerRenounced is true when the owner is the zero address.
venue
Where it trades: a Pons curve, a Pons pool, Uniswap v3 or Uniswap v4. poolFeeBps is what the pool keeps of every swap. It is null when a hook sets the fee swap by swap.
trade
The test trade. roundTripLossBps is what buying 0.1 ETH and selling straight back loses, in hundredths of a percent. feesBps and priceImpactBps split that loss. sellReverts holds 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.

codelevelwhat it means
okokA buy and a sell both went through and the cost is ordinary.
cannot_selldangerThe buy worked and the sell failed. Do not let anyone buy this.
cannot_buywarnThe buy failed. Often a curve that has closed and is waiting to graduate.
toll_pooldangerThe pool keeps a tenth or more of every swap. Most of these keep about 81%.
high_feesdangerFees and tax take half or more of a buy and a sell.
heavy_feeswarnFees and tax take 15% or more of a buy and a sell.
thin_poolwarnIt trades, but the pool is nearly empty. 0.1 ETH moves the price a long way.
empty_poolwarnA pool exists and holds nothing.
no_poolwarnNo pool found against ETH, WETH or USDG on Pons, Uniswap v3 or Uniswap v4.
quote_assetokYou asked about WETH or USDG. They are what other tokens are priced in.
not_a_tokenunknownThe address is a contract, but not a token.
no_contractunknownNothing is deployed at the address.
unprovenunknownThe 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.

flagwhat it means
owner_activeThe token has an owner who has not given it up. They may still be able to change how it behaves.
hookA hook runs on every swap in this pool. It can change what a trade costs.
dynamic_feeThe pool fee is not fixed. The hook decides it swap by swap.
toll_poolThe pool fee is a tenth of the swap or more.
thin_poolThe pool is shallow. The loss is mostly the price moving.
high_creator_taxPons only. The creator tax is 8% or more. Pons allows at most 10%.
serial_deployerPons only. The deployer has launched five or more tokens and none graduated.
deployer_soldPons only. The deployer has sold its own token before.
snipe_tax_activePons only. The launch is seconds old and the anti sniper tax is still on.
curve_closedPons only. The curve is full and closed. Selling waits for the pool to open.
no_liquidityPons 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.

status
complete means every transfer the token ever made was read. reading means 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. partial means 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). freshInTop is how many of the top holders were made within 3 days of their first buy, out of the agedInTop whose 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. firstSeen is the first time anything reached that wallet on the chain. entryMarketCapUsd is the market cap it bought at, averaged over its buys. multiple is the market cap now over that. soldBps is the share of its tokens it has sold.
top[].tags
deployer, creator, sniper, bundle, fresh, winner, contract and funded_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. status is one of never_held, holds_all, holds_some, sold_out, moved_out and burned_out. Tokens sent to the dead address count as burned, never as moved or sold. source says 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, 30d or all, the nearest board it ranks on), profit, win rate, how much it holds, the market cap it got in at, and biggestWin, the token it took the most ETH out of, with the profit and the multiple. soldOut counts 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": "..."}}

statuscodewhat happened
400bad_addressThat is not a token address.
401bad_keyThe key is wrong or was turned off. A bad key is refused, it is not treated as no key.
429rate_limitedToo many calls this minute. retry-after says how many seconds to wait.
429daily_limitThe key has used its calls for the day. It resets at 00:00 UTC.
404not_a_tokenHolders only. The address is not a token with holders the nest can read. WETH, USDG and stock tokens are left out.
502upstreamThe chain did not answer. Try again in a moment.
502holders_failedHolders only. The chain did not hand over the token's transfers. Try again in a moment.
503holders_busyHolders only. The nest is reading other tokens. Try again in a few seconds.
503holders_budgetHolders only. The nest has read as many token histories as it may today. It starts again at 00:00 UTC.
503busyThe 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.