CRIUS Docs
API status Get API key
Safety & risk

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.

Updated 2 min read
Short answer

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?

GET/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/liquidity
curl "https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/liquidity" \
-H "x-api-key: $CRIUS_API_KEY"
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" with summary.locked_pct: 99.8878 and unlocked_in_wallets_pct: 0.1122. Nearly everything is locked; the rest is a second, tiny pool.
  • The main pool 0x871b166182fd708d5d16a4daa9a42f05a653fa51ee2b195097f425e0d9ca4913 holds $5,604.57 (liquidity_usd). Its only position (position_id: "3790055") is held by 0x267444d099b10fb5ed7c3cc7b7c767adca574952, kind: "lp_locker", locker: "pons_v2_launch_locker".
  • Its locks show a PositionLocked event at block 88461321 with permanent: true and status: "locked": the Pons launch locker never releases it. summary.next_unlock_ts: null confirms nothing is due to unlock.
  • The second pool 0xe928234e515b0c000dd6aa1c60cf5a009082367cda4775a5b63b4ff0c83dcdd3 has $6.30 in it, all in wallets: 0x2d424d69b1ead72b30de4c7fe4c53e4853e1419d holds 49.17%, 0x7aa15762e68e0f0574f1032663502d23d8b7c7e7 38.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?

GET/v1/robinhood/token/0xc882f10529a5518ee3393af5a80e9ff00d38d44b/security
curl "https://api.crius.sh/v1/robinhood/token/0xc882f10529a5518ee3393af5a80e9ff00d38d44b/security"
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_wallet names 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.
Security checks reference Runs from your browser on the anonymous plan Data looks wrong? Report it

What the fields mean

FieldMeaning
statuslocked 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_pctShares of the token's liquidity, weighted by pool liquidity_usd.
summary.next_unlock_tsThe 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

  1. Screen with /security. It’s on the anonymous plan (no key needed) and already has liquidity.status and liquidity.summary. Treat unlocked and unknown as warnings.

  2. Call /liquidity for the detail. With a free key (5 credits), show users each pool, its locker and whether the lock is permanent or when it ends.

  3. Watch the unlock date. If summary.next_unlock_ts is set, alert before it passes; after it, a lock turns unlockable and the owner can withdraw.

  4. Check who holds the unlocked part. A few dollars in wallets is normal. A large pct held by one kind: "wallet" holder in the main pool can drain it.

// List each pool's lock status for a token.
const token = "0x7b8892cea949bc60d494681d1bc3ea96071ab0b8"; // CHARGE
const 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).

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