Check if a token's liquidity is locked or burned
Find out whether a Robinhood Chain token's liquidity is locked, burned or held by wallets that can pull it, pool by pool, with the locker and unlock date. Real examples from Pons tokens.
Call GET /v1/robinhood/token/{address}/liquidity (Free plan, 5 credits). status is locked, burned, partially_locked, unlocked, unknown or no_liquidity, and summary gives the locked_pct, burned_pct and unlocked_in_wallets_pct weighted by each pool's liquidity. Each pool lists who holds the LP and every lock, with permanent or an unlock time. The same status and summary are in /security without a key.
Locked liquidity is the guarantee that a token’s pool can’t be emptied: the LP tokens or position NFTs that own the pool’s funds are burned or held in a locker contract, so nobody can withdraw them and leave holders with nothing to sell into. Crius checks this for every pool of a Robinhood Chain token: who holds each LP position, which locker it is in, whether the lock is permanent, and how much of the token’s liquidity is still in wallets that could pull it.
Check the locks in one call
CHARGE: the main pool permanently locked, a small pool in wallets
Charge AI (0x7b8892cea949bc60d494681d1bc3ea96071ab0b8) graduated from Pons to Uniswap v4. Is its liquidity locked?
curl "https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/liquidity" \ -H "x-api-key: $CRIUS_API_KEY"const res = await fetch("https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/liquidity", { headers: { "x-api-key": process.env.CRIUS_API_KEY },});const { data, meta } = await res.json();import os, requests
r = requests.get( "https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/liquidity", headers={"x-api-key": os.environ["CRIUS_API_KEY"]},)body = r.json()print(body["data"])Real response 200 Captured Oct 28, 2026 · 133 lines (arrays trimmed)
{ "data": { "pools": [ { "breakdown": [ { "holder": "0x267444d099b10fb5ed7c3cc7b7c767adca574952", "kind": "lp_locker", "locker": "pons_v2_launch_locker", "pct": 100, "position_id": "3790055", "tags": [ "lp_locker" ] } ], "dex": "uniswap_v4", "liquidity_usd": 5604.57, "locks": [ { "amount_raw": 81632653061224486519505762, "last_block": 88461321, "last_event": "TokenSupplyLocked", "lock_id": null, "locked_block": 88461321, "locker": "pons_v2_launch_locker", "locker_address": "0x267444d099b10fb5ed7c3cc7b7c767adca574952", "permanent": true, "status": "locked" }, { "last_block": 88461321, "last_event": "PositionLocked", "lock_id": "3790055", "locked_block": 88461321, "locker": "pons_v2_launch_locker", "locker_address": "0x267444d099b10fb5ed7c3cc7b7c767adca574952", "permanent": true, "status": "locked" } ], "lp_type": "nft_positions", "pool": "0x871b166182fd708d5d16a4daa9a42f05a653fa51ee2b195097f425e0d9ca4913", "summary": { "burned_pct": 0, "locked_pct": 100, "protocol_fee_pct": 0, "unlocked_in_wallets_pct": 0 } }, { "breakdown": [ { "holder": "0x2d424d69b1ead72b30de4c7fe4c53e4853e1419d", "kind": "wallet", "locker": null, "pct": 49.1677, "position_id": "3807218", "tags": [] }, { "holder": "0x7aa15762e68e0f0574f1032663502d23d8b7c7e7", "kind": "wallet", "locker": null, "pct": 38.0286, "position_id": "3846225", "tags": [] }, { "holder": "0x0e6710b35de6960a3e4140d10e9f94e0c5a855d1", "kind": "wallet", "locker": null, "pct": 7.61082, "position_id": "3850136", "tags": [] } ], "dex": "uniswap_v4", "liquidity_usd": 6.29539, "locks": [ { "amount_raw": 81632653061224486519505762, "last_block": 88461321, "last_event": "TokenSupplyLocked", "lock_id": null, "locked_block": 88461321, "locker": "pons_v2_launch_locker", "locker_address": "0x267444d099b10fb5ed7c3cc7b7c767adca574952", "permanent": true, "status": "locked" }, { "last_block": 88461321, "last_event": "PositionLocked", "lock_id": "3790055", "locked_block": 88461321, "locker": "pons_v2_launch_locker", "locker_address": "0x267444d099b10fb5ed7c3cc7b7c767adca574952", "permanent": true, "status": "locked" } ], "lp_type": "nft_positions", "pool": "0xe928234e515b0c000dd6aa1c60cf5a009082367cda4775a5b63b4ff0c83dcdd3", "summary": { "burned_pct": 0, "locked_pct": 0, "protocol_fee_pct": 0, "unlocked_in_wallets_pct": 100 } } ], "status": "partially_locked", "summary": { "burned_pct": 0, "locked_pct": 99.8878, "next_unlock_ts": null, "protocol_fee_pct": 0, "unlocked_in_wallets_pct": 0.1122, "weighting": "by pool liquidity_usd" } }, "meta": { "block": 100406846, "block_age_ms": 1266, "block_ts": 1793225082000, "chain": "robinhood", "finalized_block": 100397649, "lag_ms": 100, "note": "V2 LP shares from LP-token balances (complete once history backfill finishes); V3/V4 by position NFT owner (live ownerOf)", "safe_block": 100401329 }}What this tells you
status: "partially_locked"withsummary.locked_pct: 99.8878andunlocked_in_wallets_pct: 0.1122. Nearly everything is locked; the rest is a second, tiny pool.- The main pool
0x871b166182fd708d5d16a4daa9a42f05a653fa51ee2b195097f425e0d9ca4913holds $5,604.57 (liquidity_usd). Its only position (position_id: "3790055") is held by0x267444d099b10fb5ed7c3cc7b7c767adca574952,kind: "lp_locker",locker: "pons_v2_launch_locker". - Its
locksshow aPositionLockedevent at block 88461321 withpermanent: trueandstatus: "locked": the Pons launch locker never releases it.summary.next_unlock_ts: nullconfirms nothing is due to unlock. - The second pool
0xe928234e515b0c000dd6aa1c60cf5a009082367cda4775a5b63b4ff0c83dcdd3has $6.30 in it, all in wallets:0x2d424d69b1ead72b30de4c7fe4c53e4853e1419dholds 49.17%,0x7aa15762e68e0f0574f1032663502d23d8b7c7e738.03%. They can withdraw it, but it’s 0.11% of the token’s liquidity. summary.weighting: "by pool liquidity_usd": the percentages weight each pool by its size, so a dust pool can’t make a locked token look unlocked, or the other way round.
Burned liquidity, checked without a key: ENDAI
Is the liquidity of Let's End AI (0xc882f10529a5518ee3393af5a80e9ff00d38d44b) locked?
curl "https://api.crius.sh/v1/robinhood/token/0xc882f10529a5518ee3393af5a80e9ff00d38d44b/security"const res = await fetch("https://api.crius.sh/v1/robinhood/token/0xc882f10529a5518ee3393af5a80e9ff00d38d44b/security");const { data, meta } = await res.json();import requests
r = requests.get( "https://api.crius.sh/v1/robinhood/token/0xc882f10529a5518ee3393af5a80e9ff00d38d44b/security",)body = r.json()print(body["data"])Real response 200 Captured Oct 28, 2026 · 140 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": "0x0000000000000000000000000000000000000000", "ownership": "renounced", "pausable": false, "proxy_kind": null, "self_destruct": false, "trading_switch": true, "upgradeable": false, "verified": "none" }, "flags": [ "honeypot", "unverified", "uniform_holders" ], "honeypot": { "is_honeypot": true, "reason": "simulated sell failed", "selective": false }, "hook": null, "known_asset": false, "launch": { "flags": [ "uniform_holders" ], "lp_top_wallet": { "address": "0xabe3a51937eb4c76ab6449e9823dbffd4409776f", "liquidity_usd": 8.58651, "pct": 0.0253312 }, "sniper_supply_pct": 0.000299049, "sniper_top_wallet_pct": 0.000299049, "sniper_wallets": 1, "sniper_window_blocks": 10, "uniform_holders": { "balance_pct": 0.112731, "holders": 51, "of_top": 100 }, "wallet_farm": null }, "limits": { "max_tx": "1000000000", "max_tx_getter": "maxTxAmount()", "max_tx_pct": 100, "max_wallet": "1000000000", "max_wallet_getter": "maxWalletSize()", "max_wallet_pct": 100 }, "liquidity": { "status": "burned", "summary": { "burned_pct": 99.9715, "locked_pct": 0, "next_unlock_ts": null, "protocol_fee_pct": 0, "unlocked_in_wallets_pct": 0.0284848, "weighting": "by pool liquidity_usd" } }, "primary_dex": "uniswap_v2", "risk": "critical", "score": 0, "tax": { "buy_pct": 0, "confidence": "high", "realized": { "buy_pct": 0, "by_wallet_class": { "dev_sell_pct": null, "others_sell_pct": 0 }, "last_sample_ts": 1793224820000, "max_sell_pct_seen": 0, "samples": { "buys": 27197, "sells": 3423 }, "sell_pct": 0, "window": "30d" }, "sell_pct": 0, "simulated": { "amount_eth": 0.042454083286938696, "buy_gas": 159144, "buy_pct": 0, "can_buy": true, "can_sell": false, "can_transfer": true, "from": "eoa", "revert_reason": { "code": 3, "data": "0x08c379a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000245472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c454400000000000000000000000000000000000000000000000000000000", "message": "execution reverted: TransferHelper: TRANSFER_FROM_FAILED" }, "router": "0x89e5db8b5aa49aa85ac63f691524311aeb649eba", "sell_gas": 229228, "sell_pct": null, "transfer_pct": 0 }, "source": "realized", "transfer_pct": 0 }, "tax_history": [ { "from_block": 62239227, "pct": 0, "side": "buy" }, { "from_block": 62240181, "pct": 0, "side": "sell" } ], "tax_history_total": 2, "tax_mode": "static", "token": "0xc882f10529a5518ee3393af5a80e9ff00d38d44b" }, "meta": { "block": 100406838, "block_age_ms": 1257, "block_ts": 1793225081000, "chain": "robinhood", "finalized_block": 100397649, "lag_ms": 14, "safe_block": 100401329, "simulation": "eth_simulateV1 via Uniswap V2 router at head" }}What this tells you
liquidity.status: "burned",liquidity.summary.burned_pct: 99.9715,locked_pct: 0: the LP was sent to a burn address and can never be withdrawn.launch.lp_top_walletnames the largest unlocked holder,0xabe3a51937eb4c76ab6449e9823dbffd4409776f, with 0.0253% of the liquidity (about $8.59): too little to matter.- The same response has
honeypot.is_honeypot: true. Burned liquidity stops the pool being pulled; it doesn’t stop a token from blocking sells. See How to detect a honeypot.
What the fields mean
| Field | Meaning |
|---|---|
status | locked or burned (locked plus burned is over 99.9%), partially_locked, unlocked (nothing locked or burned), unknown (positions not indexed yet), no_liquidity. |
summary.locked_pct, burned_pct, unlocked_in_wallets_pct, protocol_fee_pct | Shares of the token's liquidity, weighted by pool liquidity_usd. |
summary.next_unlock_ts | The earliest unlock time (ms) of a lock still in force; null when none is due. |
pools[] | The token's deepest pools (up to 8), each with pool, dex, liquidity_usd, lp_type (erc20 for v2 LP tokens, nft_positions for v3 and v4) and its own summary. |
pools[].breakdown[] | Who holds the LP: holder, kind (burn, lp_locker, protocol_fee, launchpad, wallet), locker, pct, position_id. |
pools[].locks[] | Each lock: locker, locker_address, lock_id, locked_block, last_event, permanent, unlock_ts (ms) when the locker sets an unlock time, and status (locked, relocked, unlockable, withdrawn). |
In the security score, status: "unlocked" costs 20 points (lp_unlocked), and one wallet holding 40% or more of the token’s liquidity unlocked costs 25 (lp_single_wallet). A small share in wallets next to a locked main pool, as with CHARGE, costs nothing.
Use it in your app
-
Screen with
/security. It’s on the anonymous plan (no key needed) and already hasliquidity.statusandliquidity.summary. Treatunlockedandunknownas warnings. -
Call
/liquidityfor the detail. With a free key (5 credits), show users each pool, its locker and whether the lock is permanent or when it ends. -
Watch the unlock date. If
summary.next_unlock_tsis set, alert before it passes; after it, a lock turnsunlockableand the owner can withdraw. -
Check who holds the unlocked part. A few dollars in wallets is normal. A large
pctheld by onekind: "wallet"holder in the main pool can drain it.
// List each pool's lock status for a token.const token = "0x7b8892cea949bc60d494681d1bc3ea96071ab0b8"; // CHARGEconst res = await fetch(`https://api.crius.sh/v1/robinhood/token/${token}/liquidity`, { headers: { "x-api-key": process.env.CRIUS_API_KEY },});const { data } = await res.json();
console.log(`${data.status}: ${data.summary.locked_pct}% locked, ${data.summary.burned_pct}% burned`);for (const p of data.pools) { const lock = p.locks.find((l) => l.status === "locked" || l.status === "relocked"); const until = lock?.permanent ? "permanent" : lock?.unlock_ts ? new Date(lock.unlock_ts).toISOString() : "no lock"; console.log(`${p.pool} $${p.liquidity_usd}: ${p.summary?.unlocked_in_wallets_pct ?? "?"}% in wallets, ${until}`);}Frequently asked questions
Is the liquidity locked?
Call GET https://api.crius.sh/v1/robinhood/token/{address}/liquidity with a free key and read status and summary.locked_pct. locked or burned means more than 99.9% of the liquidity (weighted by pool size) can't be withdrawn; partially_locked means some can, and pools[].breakdown shows exactly who holds it. Without a key, /security returns the same liquidity.status and liquidity.summary.
What's the difference between burned and locked liquidity?
Burned liquidity was sent to a burn address (0x0000000000000000000000000000000000000000 or 0x000000000000000000000000000000000000dead) and can never be withdrawn. Locked liquidity sits in a locker contract until an unlock time, or forever when the lock is permanent: true (the Pons launch locker). After an unlock time passes, a lock shows status: "unlockable" and the owner can take the LP back.
Does locked liquidity mean a token is safe?
No. It means the pool can't be emptied by withdrawing the LP. The token can still block sells, charge a high tax or be dumped by insiders who bought the launch. Let's End AI has 99.97% of its liquidity burned and Crius flags it as a honeypot. Check the full security score.
Which lockers does Crius recognize?
The Pons launch locker, UNCX v2, v3 and v4, Team Finance, TitanLocker and HoodLock. LP held by any address Crius doesn't recognize as a burn address, locker or protocol fee sink is reported as kind: "wallet" and counts as unlocked.
What happens after liquidity is unlocked?
Crius keeps following the LP: the lock moves to status: "withdrawn", and the breakdown shows the wallet that now holds it, until it is removed from the pool or locked again (relocked).
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