# 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.

Source: https://docs.crius.sh/guides/check-liquidity-locked/ · Updated 2026-10-28

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.

[GET `/token/{address}/liquidity`](https://docs.crius.sh/reference/security/liquidity-locks/) [GET `/token/{address}/security`](https://docs.crius.sh/reference/security/security-checks/)

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

Example [Free plan · 5 credits](https://docs.crius.sh/reference/security/liquidity-locks/)

### 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**

```bash
curl "https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/liquidity" \
  -H "x-api-key: $CRIUS_API_KEY"
```

**JavaScript**

```js
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();
```

**Python**

```python
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)**

```json
{
  "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.

[Liquidity & locks reference](https://docs.crius.sh/reference/security/liquidity-locks/) [Data looks wrong? Report it](mailto:support@crius.sh?subject=Wrong%20data%20in%20docs%20example%3A%20CHARGE%3A%20the%20main%20pool%20permanently%20locked%2C%20a%20small%20pool%20in%20wallets&body=Page%3A%20https%3A%2F%2Fdocs.crius.sh%2Fguides%2Fcheck-liquidity-locked%2F%23locked-lp%0ARequest%3A%20GET%20%2Fv1%2Frobinhood%2Ftoken%2F0x7b8892cea949bc60d494681d1bc3ea96071ab0b8%2Fliquidity%0A%0AWhat's%20wrong%20or%20missing%3F%0A%0A)

Example [Anonymous · no key · 1 credit](https://docs.crius.sh/reference/security/security-checks/)

### Burned liquidity, checked without a key: ENDAI

Is the liquidity of Let's End AI (0xc882f10529a5518ee3393af5a80e9ff00d38d44b) locked?

GET/v1/robinhood/token/0xc882f10529a5518ee3393af5a80e9ff00d38d44b/security

  

**cURL**

```bash
curl "https://api.crius.sh/v1/robinhood/token/0xc882f10529a5518ee3393af5a80e9ff00d38d44b/security"
```

**JavaScript**

```js
const res = await fetch("https://api.crius.sh/v1/robinhood/token/0xc882f10529a5518ee3393af5a80e9ff00d38d44b/security");
const { data, meta } = await res.json();
```

**Python**

```python
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)**

```json
{
  "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](https://docs.crius.sh/guides/detect-honeypot/).

[Security checks reference](https://docs.crius.sh/reference/security/security-checks/) Runs from your browser on the anonymous plan [Data looks wrong? Report it](mailto:support@crius.sh?subject=Wrong%20data%20in%20docs%20example%3A%20Burned%20liquidity%2C%20checked%20without%20a%20key%3A%20ENDAI&body=Page%3A%20https%3A%2F%2Fdocs.crius.sh%2Fguides%2Fcheck-liquidity-locked%2F%23burned-lp%0ARequest%3A%20GET%20%2Fv1%2Frobinhood%2Ftoken%2F0xc882f10529a5518ee3393af5a80e9ff00d38d44b%2Fsecurity%0A%0AWhat's%20wrong%20or%20missing%3F%0A%0A)

## 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](https://docs.crius.sh/guides/token-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.
    

```js
// 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}`);
}
```

v2 positions during backfill

For Uniswap v2 pools, LP shares come from LP-token balances, which are complete once Crius has indexed the pool’s full history (`meta.note`). A pool whose positions aren’t indexed yet has `summary: null` and doesn’t count as unlocked; if that is most of the liquidity, `status` is `unknown`.

## 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](https://docs.crius.sh/guides/token-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

[Guide **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. Read](https://docs.crius.sh/guides/token-security-score/) [Guide **Pools and liquidity** Robinhood Chain liquidity API: list every Uniswap v2, v3 and v4 pool and launch curve of a token, with USD liquidity, fees, hooks and the price pool. No key. Read](https://docs.crius.sh/guides/get-token-pools-and-liquidity/) [Concept **Launchpads** How token launchpads on Robinhood Chain work (bonding curves, graduation to Uniswap pools, LP locks) and which launchpads Crius attributes, including Pons, Flap.sh, Bankr, Long.xyz and Flywheel. Read](https://docs.crius.sh/concepts/launchpads/) [Concept **Uniswap v2, v3 & v4** How Crius indexes Uniswap v2 pairs, v3 concentrated-liquidity pools and v4 singleton pools with hooks on Robinhood Chain, including liquidity definitions and v4 hook permissions. Read](https://docs.crius.sh/concepts/uniswap/) [API reference **Liquidity & locks API** Who owns the token's liquidity, per pool: burned, locked (which locker, until when, who can withdraw) or held by wallets. Read](https://docs.crius.sh/reference/security/liquidity-locks/)
