CRIUS Docs
API status Get API key
Concepts

Security score: confidence and limitations

What the Crius security score can and can't see on Robinhood Chain, how to read its confidence fields, and why a low-risk result is not a guarantee a token is safe.

Updated 3 min read
Short answer

The score only reports what was checked: a honeypot simulation (only for tokens with a Uniswap v2 WETH pair), taxes measured from real trades, contract code, LP locks Crius recognises, hook history and launch buyers. Read tax.source, tax.confidence, tax.realized.samples and meta.simulation to see how much evidence stands behind each answer. A low risk means no trap was found, not that none exists.

The security score is a summary of evidence, and every piece of evidence has limits. This page lists what each check can miss, which fields show how much evidence stands behind a result, and how to use the score without over-trusting it. Read it before you gate trades, listings or alerts on risk or score.

What each check can miss

CheckHow it worksCan miss (false negatives)
Honeypot simulationeth_simulateV1 buy → transfer → approve → sell from a fresh wallet through the Uniswap v2 router, at the current block, for amount_usd (default $100).Tokens without a v2 WETH pair (v3 / v4 / curve only) are not simulated. Traps that whitelist fresh wallets, trigger later (time, block or trade count), depend on trade size, or block only certain wallets or contracts can pass.
Realized honeypot ruleFlags 20+ buys with no successful sell by anyone but the developer.A brand-new token with fewer than 20 buys can't be flagged by this rule yet. A trap that lets a few insider wallets sell to fake activity can pass.
Realized taxesThe median of the latest 50 real trades per side in the last 30 days, compared with what the pool paid out.A tax raised a minute ago only shows once new trades come in; a median hides a tax charged only on some trades (large sells, specific wallets). max_sell_pct_seen shows the worst single trade.
Contract powersFunction selectors found in the token's code (and its implementation, for proxies): mint, blacklist, pause, tax changes, limits, self-destruct.Powers behind renamed or obfuscated functions, or in another contract the token calls. An upgradeable proxy can change all of this later (it is flagged as upgradeable_proxy).
Liquidity locksLP held by burn addresses and by lockers Crius recognises (registry lockers and launchpad lock contracts).A lock in a contract Crius doesn't know shows as held by that contract, so locks can be understated, not overstated. A lock can expire: check next_unlock_ts.
Uniswap v4 hookThe hook's code, permissions, owner, its own pools' outcomes and its code family's history.A new hook with no history gets new_unknown, not a verdict. Clean history doesn't stop an owner-controlled hook from changing behaviour later.
Launch riskBuyers in the first 10 blocks, wallet farms, uniform balances and LP concentration.Insiders who fund wallets through exchanges, bridges or relayers look unrelated, and buyers after block 10 aren't counted as snipers.

How to read the confidence fields

Every security response carries the evidence behind its answer. Check these before you trust a verdict:

  • tax.source: realized (measured from real trades), realized+simulated (measured, and the simulation agrees), simulated (no recent trades, simulation only) or none (neither: the tax is unknown, not zero).
  • tax.confidence: high with 20 or more measured trades, medium with 3 or more, low below that. A low confidence tax of 0% says little.
  • tax.realized.samples: how many buys and sells the realized numbers come from, and max_sell_pct_seen, the worst single sell.
  • meta.simulation: eth_simulateV1 via Uniswap V2 router at head when a simulation ran, or no V2 WETH pair: realized tax only when it couldn’t.
  • honeypot.reason: which check made the call (simulated sell failed or buys but no successful sells by non-dev wallets).
  • hook.observed and hook.family: how many traded pools the hook verdict rests on.

Little evidence: a token with no simulation

Recast (0xb656eadd009b3b409d7a0971e50df2f0e4ddef5a) trades only on Uniswap v4. Which parts of its verdict are measured, and which are missing?

GET/v1/robinhood/token/0xb656eadd009b3b409d7a0971e50df2f0e4ddef5a/security
curl "https://api.crius.sh/v1/robinhood/token/0xb656eadd009b3b409d7a0971e50df2f0e4ddef5a/security"
Real response 200 Captured Oct 28, 2026 · 188 lines (arrays trimmed)
{
"data": {
"contract": {
"blacklist": false,
"can_change_limits": false,
"can_change_tax": false,
"cooldown": false,
"implementation": null,
"is_proxy": false,
"mintable": false,
"owner": null,
"ownership": "none",
"pausable": false,
"proxy_kind": null,
"self_destruct": false,
"trading_switch": false,
"upgradeable": false,
"verified": null
},
"flags": [
"tax_over_5pct",
"unverified"
],
"honeypot": {
"is_honeypot": false,
"reason": null,
"selective": false
},
"hook": {
"address": "0xe5e702641ea86f4ae6cc3cdaed2b886f976be044",
"capabilities": {
"can_block_swaps": false,
"can_gate_liquidity": false,
"can_modify_liquidity_amounts": false,
"can_modify_swap_amounts": true
},
"code": {
"admin_functions": [],
"checked_ts": 1793207140434,
"code_hash": "0xc21b1e6c1b45403e81a581f22ed6d9c747997af1cfdac1b1dc9f4b1d346a10db",
"family": "0xabda3266e50c",
"kind": "contract",
"logic": null,
"owner": "0x263ed295dafae1d9aadd6e56c4b6f9f38ee019dd",
"ownership": "active",
"size": 15167
},
"family": {
"honeypot_pct": 0,
"hooks": 22,
"id": "0xabda3266e50c",
"liquidity_pulled_pct": 0.684086,
"pools_traded": 10525,
"taxed_pct": 51.9715,
"verified_hooks": 1
},
"flags": [],
"name": "PonsV2MemeHook",
"observed": {
"dynamic_tax_pools": 13,
"first_trade_ts": 1785866942000,
"honeypot_pools": 0,
"last_trade_ts": 1793223683000,
"liquidity_pulled_pct": 0.66813,
"liquidity_pulled_pools": 70,
"max_buy_tax_pct": 10.99,
"max_sell_tax_pct": 0.7,
"median_pool_life_min": 53423.5,
"pools": 10478,
"pools_traded": 10477,
"tax_measured_pools": 10392,
"taxed_10pct_pools": 35,
"taxed_pools": 5463,
"volume_usd": 5384607135
},
"pattern": {
"description": "hooks that change swap amounts only",
"honeypot_pct": 0.0696347,
"id": "swap_delta_only",
"liquidity_pulled_pct": 7.93603,
"pools_traded": 43082,
"taxed_pct": 15.7537
},
"permissions": [
"beforeInitialize",
"afterSwap",
"afterSwapReturnDelta"
],
"risk": [
"can_modify_swap_amounts"
],
"risk_level": "low"
},
"known_asset": false,
"launch": {
"flags": [],
"lp_top_wallet": {
"address": "0x441568fdd10b00ddc90b4a95aee03d8d06242283",
"liquidity_usd": 2.08528,
"pct": 0.0195019
},
"sniper_supply_pct": 0.61622,
"sniper_top_wallet_pct": 0.61622,
"sniper_wallets": 1,
"sniper_window_blocks": 10,
"uniform_holders": null,
"wallet_farm": null
},
"limits": {},
"liquidity": {
"status": "locked",
"summary": {
"burned_pct": 0,
"locked_pct": 99.9805,
"next_unlock_ts": null,
"protocol_fee_pct": 0,
"unlocked_in_wallets_pct": 0.019502,
"weighting": "by pool liquidity_usd"
}
},
"primary_dex": "uniswap_v4",
"risk": "low",
"score": 80,
"tax": {
"buy_pct": 6.99,
"confidence": "high",
"realized": {
"buy_pct": 6.99,
"by_wallet_class": {
"dev_sell_pct": null,
"others_sell_pct": 0
},
"last_sample_ts": 1793223683000,
"max_sell_pct_seen": 1,
"samples": {
"buys": 1107,
"sells": 530
},
"sell_pct": 0,
"window": "30d"
},
"sell_pct": 0,
"simulated": null,
"source": "realized",
"transfer_pct": null
},
"tax_history": [
{
"from_block": 82850924,
"pct": 0,
"side": "buy"
},
{
"from_block": 82929088,
"pct": 0,
"side": "sell"
},
{
"from_block": 85677230,
"pct": 1,
"side": "buy"
},
{
"from_block": 85686101,
"pct": 0,
"side": "buy"
},
{
"from_block": 90626923,
"pct": 7,
"side": "buy"
}
],
"tax_history_total": 9,
"tax_mode": "dynamic",
"token": "0xb656eadd009b3b409d7a0971e50df2f0e4ddef5a"
},
"meta": {
"block": 100406621,
"block_age_ms": 400,
"block_ts": 1793225060000,
"chain": "robinhood",
"finalized_block": 100397649,
"lag_ms": 10,
"safe_block": 100401329,
"simulation": "no V2 WETH pair: realized tax only"
}
}

What this tells you

  • tax.simulated: null and meta.simulation: "no V2 WETH pair: realized tax only": no buy-and-sell simulation ran, because the token has no v2 WETH pair.
  • tax.source: "realized" with tax.confidence: "high": the 6.99% buy tax and 0% sell tax are measured from real trades (tax.realized.samples), so the tax answer is solid even without a simulation.
  • The honeypot verdict rests on the realized rule only: real wallets have sold, so it isn’t a honeypot for them. A trap that targets only some wallets would not show here.
Security checks reference Runs from your browser on the anonymous plan Data looks wrong? Report it

Timing: how fresh a result is

  • Results are cached for 15 seconds per token and amount_usd. On paid plans, fresh=1 skips the cache and simulates again at the current block (20 credits).
  • The simulation runs at the current block only. It says nothing about what the owner can switch on tomorrow; that is what the contract-power and proxy flags are for.
  • Realized taxes cover the last 30 days; older trades only appear in tax_history.
  • Every response’s meta.block tells you the block the answer was read at. Store it with any decision you make.

Use the score safely

  1. Gate on risk, then read the evidence. Block critical and high. For low and medium, check tax.confidence and meta.simulation before treating the tax as known.

  2. Treat missing evidence as unknown, not as safe. tax.source: "none", tax.confidence: "low" or no simulation on a token with few trades means “not enough data yet”, not “no tax”.

  3. Re-check before every trade on new tokens. Taxes, LP locks and hook behaviour can change after launch. Re-call /security (or subscribe to tax: and lp: events on the WebSocket stream) instead of caching a verdict for hours.

  4. Size for being wrong. Use the score to remove obvious traps, combine it with holder and launch data (bundles and snipers, holders), and never risk more than you can lose on a token the checks can’t fully see.

Frequently asked questions

Can a token with a score of 100 be a scam?

Yes. The score finds known trap mechanics on-chain. It can't see a team that abandons the project, a coordinated dump by wallets that look unrelated, a trap that turns on later, or a contract that treats some wallets differently from the ones the checks use. Treat the score as a filter that removes obvious traps, then size positions as if it could be wrong.

Why is `tax.simulated` null for my token?

The buy-and-sell simulation runs through the Uniswap v2 router, so it needs a v2 pool against WETH with liquidity. Tokens that trade only on Uniswap v3 or v4, or still on a launchpad curve, get no simulation; meta.simulation says no V2 WETH pair: realized tax only and the verdict rests on real trades alone.

How fresh is a security result?

Results are cached for 15 seconds per token and trade size, so they are close to live. Taxes come from the last 30 days of trades (the median of the latest 50 per side), so a tax change shows up as new trades arrive, not instantly. On paid plans fresh=1 skips the cache and simulates again at the current block.

Which result fields tell me how confident the answer is?

tax.source (realized, realized+simulated, simulated or none), tax.confidence (high with 20+ measured trades, medium with 3+, low below that), tax.realized.samples (buy and sell counts), meta.simulation (whether a simulation ran) and, for the hook, hook.observed and hook.family (how much history the verdict is based on).

Get your free Crius API key

Every example on this page works with a free key: higher rate limits than the anonymous plan, holders, wallets and the WebSocket stream. No card needed.

  • Robinhood Chain (4663) only, from our own archive nodes
  • REST + WebSocket
  • Pay on-chain or by card