Get a Robinhood Chain token security score
Score any Robinhood Chain token from 0 to 100 with one API call. Honeypot, buy and sell taxes, owner powers, LP locks, v4 hook risk and insider launches, with real examples.
Call GET /v1/robinhood/token/{address}/security. It returns a score from 0 to 100, a risk level (low, medium, high, critical) and the flags that cost points: honeypot (−100), taxes over 10% (−30), insider launch (−50), unlocked liquidity (−20), risky Uniswap v4 hook (−10 to −60) and more. No API key needed.
The security score is a single number, 0 to 100, that sums up everything Crius checks about a Robinhood Chain token: whether you can sell it, what it really costs to buy and sell, what the owner can still change, whether the liquidity can be pulled, how risky its Uniswap v4 hook is and whether insiders bought the launch. You start at 100 and each problem found subtracts points.
Get the score in one call
A clean graduated Pons token: score 95
sockets (0xddccd4690cc99cf19d2e0bdbcb390d17e913958a) launched on Pons and graduated to Uniswap v4. Is it safe to trade?
curl "https://api.crius.sh/v1/robinhood/token/0xddccd4690cc99cf19d2e0bdbcb390d17e913958a/security"const res = await fetch("https://api.crius.sh/v1/robinhood/token/0xddccd4690cc99cf19d2e0bdbcb390d17e913958a/security");const { data, meta } = await res.json();import requests
r = requests.get( "https://api.crius.sh/v1/robinhood/token/0xddccd4690cc99cf19d2e0bdbcb390d17e913958a/security",)body = r.json()print(body["data"])Real response 200 Captured Oct 28, 2026 · 187 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": [ "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": "0x34062c5519d27d399b1deb897b6c769683ec7fa3", "liquidity_usd": 106.386, "pct": 0.549474 }, "sniper_supply_pct": 30.1177, "sniper_top_wallet_pct": 24.0035, "sniper_wallets": 6, "sniper_window_blocks": 10, "uniform_holders": null, "wallet_farm": null }, "limits": {}, "liquidity": { "status": "partially_locked", "summary": { "burned_pct": 0, "locked_pct": 98.9946, "next_unlock_ts": null, "protocol_fee_pct": 0, "unlocked_in_wallets_pct": 1.00542, "weighting": "by pool liquidity_usd" } }, "primary_dex": "uniswap_v4", "risk": "low", "score": 95, "tax": { "buy_pct": 2.69, "confidence": "high", "realized": { "buy_pct": 2.69, "by_wallet_class": { "dev_sell_pct": null, "others_sell_pct": 0 }, "last_sample_ts": 1793225076000, "max_sell_pct_seen": 65.93, "samples": { "buys": 4144, "sells": 3423 }, "sell_pct": 0, "window": "30d" }, "sell_pct": 0, "simulated": null, "source": "realized", "transfer_pct": null }, "tax_history": [ { "from_block": 100193859, "pct": 0, "side": "buy" }, { "from_block": 100193869, "pct": 0, "side": "sell" }, { "from_block": 100213206, "pct": 3, "side": "buy" }, { "from_block": 100342818, "pct": 0, "side": "buy" }, { "from_block": 100344806, "pct": 3, "side": "buy" } ], "tax_history_total": 7, "tax_mode": "dynamic", "token": "0xddccd4690cc99cf19d2e0bdbcb390d17e913958a" }, "meta": { "block": 100406831, "block_age_ms": 624, "block_ts": 1793225081000, "chain": "robinhood", "finalized_block": 100397649, "lag_ms": 32, "safe_block": 100401329, "simulation": "no V2 WETH pair: realized tax only" }}What this tells you
score: 95,risk: "low": the only flag isunverified(−5), because the contract source isn’t published on an explorer.honeypot.is_honeypot: false: thousands of wallets have sold.tax.buy_pctis about 2.7% andtax.sell_pctis 0, measured from real trades (tax.source: "realized",confidence: "high"). The buy side is Pons’s standard fee.contract.ownership: "none": nobody can mint, blacklist, pause or change taxes.liquidity.summary.locked_pctis about 97%: the LP sits in Pons’s permanent launch locker.hook.risk_level: "low": the PonsV2MemeHook has thousands of traded pools with no honeypots.
An insider launch: score 45
Rebot (0x192b126efea71ca5e7767bc6fc53038d869fbbba) has a clean contract and locked liquidity, but its price fell 97% within hours. What does the score see?
curl "https://api.crius.sh/v1/robinhood/token/0x192b126efea71ca5e7767bc6fc53038d869fbbba/security"const res = await fetch("https://api.crius.sh/v1/robinhood/token/0x192b126efea71ca5e7767bc6fc53038d869fbbba/security");const { data, meta } = await res.json();import requests
r = requests.get( "https://api.crius.sh/v1/robinhood/token/0x192b126efea71ca5e7767bc6fc53038d869fbbba/security",)body = r.json()print(body["data"])Real response 200 Captured Oct 28, 2026 · 180 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": [ "unverified", "insider_launch" ], "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": [ "insider_launch" ], "lp_top_wallet": { "address": "0x6e8244ba97cbb7d136aafc667e8da302140dbc5b", "liquidity_usd": 5.70259, "pct": 0.0996139 }, "sniper_supply_pct": 60.9726, "sniper_top_wallet_pct": 53.1794, "sniper_wallets": 4, "sniper_window_blocks": 10, "uniform_holders": null, "wallet_farm": null }, "limits": {}, "liquidity": { "status": "partially_locked", "summary": { "burned_pct": 0, "locked_pct": 99.7392, "next_unlock_ts": null, "protocol_fee_pct": 0, "unlocked_in_wallets_pct": 0.260807, "weighting": "by pool liquidity_usd" } }, "primary_dex": "uniswap_v4", "risk": "high", "score": 45, "tax": { "buy_pct": 2.64, "confidence": "high", "realized": { "buy_pct": 2.64, "by_wallet_class": { "dev_sell_pct": 0, "others_sell_pct": 0 }, "last_sample_ts": 1793224833000, "max_sell_pct_seen": 0.69, "samples": { "buys": 1417, "sells": 1990 }, "sell_pct": 0, "window": "30d" }, "sell_pct": 0, "simulated": null, "source": "realized", "transfer_pct": null }, "tax_history": [ { "from_block": 100238946, "pct": 0, "side": "buy" }, { "from_block": 100238968, "pct": 0, "side": "sell" }, { "from_block": 100239845, "pct": 3, "side": "buy" } ], "tax_history_total": 3, "tax_mode": "dynamic", "token": "0x192b126efea71ca5e7767bc6fc53038d869fbbba" }, "meta": { "block": 100406835, "block_age_ms": 974, "block_ts": 1793225081000, "chain": "robinhood", "finalized_block": 100397649, "lag_ms": 46, "safe_block": 100401329, "simulation": "no V2 WETH pair: realized tax only" }}What this tells you
score: 45,risk: "high":insider_launch(−50) andunverified(−5).launch.sniper_supply_pctis about 61%: four wallets, including the developer’s, bought most of the supply in the first 10 blocks.launch.sniper_top_wallet_pctshows one wallet took 53%.- The contract itself is clean and the liquidity is locked, so nothing in the code is a trap. The risk was who held the supply: insiders sold into the buyers who came after.
What costs points
Every deduction appears in flags, so you can show users exactly why a token scored what it did.
| Flag | Points | What it means |
|---|---|---|
honeypot | −100 | The sell simulation failed, or 20+ buys and no non-dev sells. Always critical. |
admin_scam_flag | −100 | Reviewed and marked as a scam by Crius. |
selective_honeypot | −60 | Only the developer has managed to sell. |
transfer_events_dont_match_balances | −60 | Transfer events don't add up to balances (spoofed events). |
hook_critical_risk | −60 | The pool's v4 hook has no code, is a delegated wallet, or its code family is behind many honeypots. |
insider_launch | −50 | Most of the supply was sniped at launch by a few wallets, including insiders. Always high. |
wallet_farm | −50 | Holders are a farm of wallets created and funded together. |
high_tax | −30 | Buy or sell tax above 10%. |
hook_high_risk | −30 | The hook can block swaps, or its code family has a record of rugs. |
uniform_holders | −30 | Holder balances are suspiciously equal (an airdrop to controlled wallets). |
lp_single_wallet | −25 | One wallet holds most of the unlocked liquidity. |
lp_unlocked | −20 | The liquidity can be withdrawn at any time. |
tax_over_5pct | −15 | Buy or sell tax between 5% and 10%. |
mintable, blacklist, upgradeable_proxy | −15 each | The owner can mint, blacklist wallets, or swap the contract's code. |
ownership_active, pausable, tax_changeable, tax_mismatch, hook_medium_risk | −10 each | Owner powers that are still live, or a simulated tax that disagrees with what buyers really paid. |
unverified | −5 | The source isn't verified on an explorer. |
Owner powers (mintable, blacklist, pausable, tax_changeable) only count while someone owns the contract: once ownership is renounced they can’t be used.
How the verdict is decided
risk is not just the score cut into bands:
critical: a honeypot, whatever else the token has.high: a score under 50, or anyinsider_launch,wallet_farmorhook_critical_risk, even if the score is higher.low: a score of 80 or more.medium: everything in between.
Known assets (known_asset: true: WETH, USDG, tokenized stocks) are always low.
Use it in your app
-
Call
/securitybefore you list or trade a token. It’s on the anonymous plan, so a backend can call it for every new token without a key; with a key it costs 1 credit. -
Gate on
risk, explain withflags. Blockcritical, warn onhigh, and show the flags as plain-language reasons. The table above has wording you can reuse. -
Show the evidence.
tax.realized.samplestells users how many trades the tax is based on,liquidity.summaryhow much is locked or burned, andlaunchwho bought the first blocks. -
Watch for changes. Taxes and LP status can change after launch. Subscribe to the WebSocket stream for tax and LP events, or re-check on a schedule.
// Minimal risk gate for a trading bot or token list.const res = await fetch(`https://api.crius.sh/v1/robinhood/token/${token}/security`);const { data } = await res.json();
if (data.risk === "critical") throw new Error("honeypot: can't sell");if (data.risk === "high") console.warn(`high risk (${data.score}/100): ${data.flags.join(", ")}`);console.log(`buy tax ${data.tax.buy_pct ?? "?"}%, sell tax ${data.tax.sell_pct ?? "?"}%`);Frequently asked questions
What is a good security score?
80 or more is low risk: no honeypot, taxes at or under 5%, no owner powers that matter, liquidity locked or burned, a clean hook and a fair launch. 50–79 is medium. Under 50, or any insider launch, wallet farm or critical hook, is high; a honeypot is always critical. Treat the score as a summary and read the flags: they say exactly what cost points.
Does the score need an API key?
No. /security is on the anonymous plan (1 credit per call with a key). Without a key you get a low per-IP rate; a free key raises it and adds fresh=1 re-simulation on paid plans.
How fresh is the score?
Results are cached for 15 seconds per token and trade size; on paid plans fresh=1 simulates again at the current block. Realized taxes come from the last 30 days of trades (the median of the latest 50 per side), so a tax change appears as new trades arrive. meta.block tells you the block the answer was read at.
Can a token with a high score still go to zero?
Yes. The score measures what can be checked on-chain: the contract, the taxes buyers actually paid, the liquidity and who bought the launch. It can't see a team walking away or a market losing interest. A score of 95 means no trap was found, not that the price will hold.
Why is a well-known token marked low risk with flags?
Known assets (WETH, USDG, tokenized stocks) have known_asset: true and are always low risk; their flags (an upgradeable proxy, for example) are shown for information but don't change the verdict.
Related
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