Data · snapshot
Data
Everything on this site as files, rebuilt every 6 hours. The pages are drawn from these two files and nothing else.
Files
| File | Updated | What is in it |
|---|---|---|
| data/exit-depth.json | every 6 hours | Every listed Morpho Blue market on Base with at least $100k borrowed: bonus, exit cost by size with and without RFQ quotes, venues, collateral near liquidation. |
| data/liquidations.json | every 6 hours | Morpho Blue liquidations on Base over the last 30 days: bonus, auction share, by pair and by day. |
data/exit-depth.json
| Field | Type | Meaning |
|---|---|---|
schema | number | Format version: 2. Missing in snapshots made before 13 Nov 2026 - read those as 1. |
at | string | Snapshot time, UTC, for example "2026-11-13 12:45 UTC". |
at_iso | string | The snapshot time in ISO 8601 to the second, for example "2026-11-13T12:45:07Z". |
min_borrow_usd | number | The selection threshold: markets with at least this much borrowed, USD. |
sizes | string[] | Sale sizes in USD, as strings: "25000", "200000", "1000000". |
markets[].market | string | Morpho Blue market id (32 bytes, hex). |
markets[].collateral, loan | string | Token symbols as Morpho lists them. |
markets[].lltv | number | Liquidation LLTV as a share, 0.86 = 86%. |
markets[].bonus | number | Liquidation bonus as a share: min(0.15, 1/(0.3·LLTV + 0.7) - 1). |
markets[].borrow_usd | number | Borrowed amount in USD (Morpho API). |
markets[].exit | object | Size to exit cost (share of the sale lost, all sources). null: no route at that size (a size above one with no route is not asked again and is null too). Size missing: not measured in this snapshot. |
markets[].exit_no_rfq | object | The same without RFQ quotes. Asked only when the best route uses RFQ, otherwise equal to exit. null: no route without RFQ. Size missing: not measured. |
markets[].venues | object | Size to a list of {venue, kind, share}: the share of the collateral each KyberSwap source takes on the first hops. kind: rfq, maker_pool, vault or amm. Size missing: not measured; an empty list: no route. |
markets[].near | object | "1.1" and "1.25": collateral in USD of positions with health factor below 1.1 and below 1.25 (the second includes the first). |
null and a missing size are different. null is a measured answer: KyberSwap found no route
for that sale. A size missing from exit, exit_no_rfq or venues was not measured in this
snapshot: the quote failed or the token has no Morpho API price. Snapshots made before 13 Nov 2026 have no
exit_no_rfq or venues and wrote a failed quote as null too.
Format versions. Both files carry schema, a number that changes whenever the meaning of a
field changes; new fields alone do not change it. exit-depth.json: 2 since 13 Nov 2026 (a size not measured is
missing, null is always no route); files without schema are version 1, where null also
stood for a failed quote. liquidations.json: 1.
Clearance and the clearing size are not stored: clearance = bonus - exit[size]; the statuses on the
pages follow from the same two fields.
data/liquidations.json
| Field | Type | Meaning |
|---|---|---|
schema | number | Format version: 1. |
days, since, until | number, string | The window: the last 30 days up to the snapshot (the last day is partial). |
count | number | Morpho Blue liquidations on Base in the window, in Morpho-listed markets (collateral worth at most 1.2 times the debt). |
bonus_usd | number | Collateral seized minus debt repaid, USD, at the oracle price in the liquidation block. |
auction_bonus_usd | number | The part of bonus_usd in liquidations that went through Chainlink SVR auctions. |
auction_bids_usd | number | What auction winners paid back as bids. |
pairs[] | object[] | The 10 pairs with the most bonus: pair, count, bonus_usd, auction_bonus_usd. |
by_day[] | object[] | day (UTC date) and bonus_usd. |
Examples
Clearance at $1M for every market with a route:
curl -s https://underkeel.xyz/data/exit-depth.json \
| jq '.markets[] | select(.exit["1000000"] != null)
| {pair: "\(.collateral)/\(.loan)", lltv, clearance_1m_pp: ((.bonus - .exit["1000000"]) * 100)}'
Markets not measured at $1M in this snapshot (not the same as no route):
curl -s https://underkeel.xyz/data/exit-depth.json \
| jq -r '.markets[] | select((.exit | has("1000000")) | not) | "\(.collateral)/\(.loan) not measured at $1M"'
Repeat one exit cost: token addresses, decimals and USD prices come from the Morpho API
(https://blue-api.morpho.org/graphql, query markets), the route from KyberSwap's public API:
curl -s "https://aggregator-api.kyberswap.com/base/api/v1/routes?tokenIn=COLLATERAL&tokenOut=LOAN&amountIn=RAW_AMOUNT"
# RAW_AMOUNT = size / collateral USD price x 10^collateral decimals (Morpho API)
# add &excludeRFQSources=true for the on-chain-only cost
# exit cost = 1 - (amountOut / 10^loan decimals x loan USD price) / size
Updates and attribution
A new snapshot every 6 hours; a snapshot spoiled by a failing API is not published and the previous one stays. Every published snapshot is one commit in the site's public repository, so the repository history is the history of exit depth by market.
Quotes: KyberSwap Aggregator public API. Markets and positions: Morpho API. Liquidations: Morpho Blue events on Base. Each source's terms apply to what is derived from it.
When you use these numbers, cite them as below; the data sha256 is that of data/exit-depth.json of this snapshot
(shasum -a 256), so a reader can check the file they have.
Cite as: Underkeel, Clearance v2, Morpho Blue markets on Base, snapshot 2026-11-14T21:23Z, data sha256 81b87af3. https://underkeel.xyz/data.html