A Token Unlock List Isn't Useful Until It's Sized

Every unlock calendar reads the same way: a date, a ticker, a dollar figure. "XYZ unlocks $40M on September 1st." Is that big? Small? Nobody publishing a raw list actually answers that, because the answer depends entirely on the coin doing the unlocking — $40M is nothing against a $50B market cap and existential against a $150M one.

A crypto token unlock calendar API is only as useful as what it sizes the cliff against. GET /api/v1/supply/float and GET /api/v1/supply/unlocks price every unlock against the coin's own circulating float and market cap, so a cliff reads as "12% of circulating supply on a coin already 3x overhung" instead of a bare token count with a dollar sign in front of it.

What Dilution Overhang Actually Measures

dilution_overhang is the single most useful number on the float board: the USD value of a coin's still-locked supply, expressed as a multiple of its current market cap. Above 1.0x, the market is pricing less value than is still sitting in vesting contracts waiting to hit circulating supply.

Two coins can share the exact same float_pct and mean completely different things:

Reading float_pct alone and stopping there is how "tight float" gets mistaken for a bullish setup when it's really "most of the supply hasn't arrived yet."

Does 'No Unlock Data' Mean a Token Is Safe From Dilution?

No — and reading it that way is exactly the mistake the unlock_coverage field exists to prevent. Every row on /supply/float carries unlock_coverage, either tracked or not_tracked.

A null next_unlock paired with unlock_coverage: "not_tracked" does not mean the token has no unlock scheduled. It means no vesting schedule is published for that token in our source — DefiLlama's emissions index, which only covers protocols it has ingested. Absence of data is not evidence of absence of dilution.

Coverage is deliberately asymmetric: float_pct and dilution_overhang are computable for nearly the whole universe from public supply figures, while a dated cliff schedule only exists for protocols that publish one in a form the source tracks. The field exists so a consumer never collapses "we don't know" into "there's nothing to know."

Why the Float Board Starts at a $500M Market Cap

/supply/float defaults to min_market_cap=500000000 — not zero. Below that floor, an ascending-float ranking stops being about real vesting schedules and starts being dominated by an accounting artifact.

Measured against the live top-500 on 2026-08-19: at a $50M floor, the top of the ranking went to REUR, showing a 332x "overhang" on a $62M market cap — not because REUR has a real cliff coming, but because its reported total_supply is a nominal ceiling, not a schedule. At a $1B floor, only 64 coins survive — too thin for a cross-section.

$500M is where the board turns into a set of real, recognizable tokens: PI, HYPE, WBT, WLFI, JUP, ASTER, SUI, TAO and ONDO all show up. Pass min_market_cap=0 for the unfiltered set — the rows are still computed, they're just not what the default board is built to answer.

/supply/float vs /supply/unlocks: State vs Schedule

The two endpoints answer different questions and are meant to be read together, not as duplicates:

/supply/float/supply/unlocks
QuestionHow locked is this coin, right now?What's unlocking, and when?
Sort orderAscending float_pct — tightest floats firstAscending days_until, then descending usd
Key fieldssupply_basis, dilution_overhang, unlock_coveragetokens, usd, pct_of_float, pct_of_market_cap
CoverageNearly the whole tracked universeOnly protocols DefiLlama's emissions index tracks
Free tierTop 25 rowsNext 7 days
Pro / Pro PlusFull board + filtersFull 30-35 day horizon

Screening for Tight Float + Big Unlock Setups

A single float row, abbreviated:

curl -H "X-API-Key: cdk_live_yourkey" \
  "https://cryptodataapi.com/api/v1/supply/float?symbol=ASTER"
{
  "rows": [
    {
      "symbol": "ASTER",
      "name": "Aster",
      "market_cap": 1834000000,
      "circulating_supply": 1792000000,
      "total_supply": 8000000000,
      "max_supply": 8000000000,
      "supply_basis": "max_supply",
      "float_pct": 0.224,
      "locked_supply": 6208000000,
      "locked_usd": 6350000000,
      "dilution_overhang": 3.46,
      "next_unlock": {
        "date": "2026-09-12",
        "days_until": 17,
        "tokens": 240000000,
        "usd": 245600000,
        "pct_of_float": 0.134,
        "pct_of_market_cap": 0.134,
        "categories": ["team", "investor"]
      },
      "unlock_coverage": "tracked",
      "rank": 4
    }
  ],
  "count": 1,
  "tier_scope": "pro",
  "as_of": "2026-08-26T00:00:00Z"
}

That single response says more than any raw unlock headline could: a 22.4% float, 3.46x today's market cap still locked, and a cliff in 17 days worth 13.4% of circulating supply. Combine both endpoints in Python to screen the whole board for that pattern:

import requests

h = {"X-API-Key": "cdk_live_yourkey"}
base = "https://cryptodataapi.com/api/v1"

float_rows = requests.get(f"{base}/supply/float?max_float_pct=0.35", headers=h).json()["rows"]
unlocks = requests.get(f"{base}/supply/unlocks?window_days=30", headers=h).json()["items"]

tight = {r["symbol"] for r in float_rows}
for u in unlocks:
    if u["symbol"] in tight and (u["pct_of_float"] or 0) >= 0.08:
        print(f"{u['symbol']}: {u['pct_of_float']:.1%} of float unlocks in "
              f"{u['days_until']}d (${u['usd']:,.0f})")

That loop is the whole screen: tight float from one endpoint, a sized cliff from the other, joined on symbol.

Coverage: From 5 Tracked Events to 37 Overnight

The unlock calendar is sourced from DefiLlama's free emissions data, and its coverage moved sharply on 2026-08-19/20: a shortlist bug meant the fetcher was pulling schedules ranked by global emissions size rather than our own tracked universe, so foundations like arbitrum-foundation and sui-foundation never made the cut while pure mining-inflation entries (Bitcoin, Dogecoin, Litecoin) — correctly excluded anyway — sat at the top. Fixing the shortlist took /event/calendar?type=unlock from 5 events across 3 protocols to 37 across 27 on the same day, adding coverage for SUI, OP, ZRO, W, TON, XPL, ALT, GRASS and EIGEN.

This is a cliff calendar, not an emissions feed. Continuous release is deliberately excluded: mining inflation, linear vesting and runs of identical daily unlocks are a drip, not a step, and publishing them as catalysts buries the real ones. Absence from the calendar still means only "no dated cliff found" — see unlock_coverage above, not "nothing is unlocking."

How to Use the Token Unlock Calendar API

Three concrete uses for /supply/float and /supply/unlocks together:

Free tier gets the top 25 float rows and the next 7 days of unlocks — enough to evaluate the data. Pro and Pro Plus get the full board, every filter (min_locked_usd, max_float_pct, symbol), and the full 30-35 day unlock horizon.