Underkeel

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

Published files
FileUpdatedWhat is in it
data/exit-depth.jsonevery 6 hoursEvery 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.jsonevery 6 hoursMorpho Blue liquidations on Base over the last 30 days: bonus, auction share, by pair and by day.

data/exit-depth.json

Fields of exit-depth.json
FieldTypeMeaning
schemanumberFormat version: 2. Missing in snapshots made before 13 Nov 2026 - read those as 1.
atstringSnapshot time, UTC, for example "2026-11-13 12:45 UTC".
at_isostringThe snapshot time in ISO 8601 to the second, for example "2026-11-13T12:45:07Z".
min_borrow_usdnumberThe selection threshold: markets with at least this much borrowed, USD.
sizesstring[]Sale sizes in USD, as strings: "25000", "200000", "1000000".
markets[].marketstringMorpho Blue market id (32 bytes, hex).
markets[].collateral, loanstringToken symbols as Morpho lists them.
markets[].lltvnumberLiquidation LLTV as a share, 0.86 = 86%.
markets[].bonusnumberLiquidation bonus as a share: min(0.15, 1/(0.3·LLTV + 0.7) - 1).
markets[].borrow_usdnumberBorrowed amount in USD (Morpho API).
markets[].exitobjectSize 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_rfqobjectThe 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[].venuesobjectSize 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[].nearobject"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

Fields of liquidations.json
FieldTypeMeaning
schemanumberFormat version: 1.
days, since, untilnumber, stringThe window: the last 30 days up to the snapshot (the last day is partial).
countnumberMorpho Blue liquidations on Base in the window, in Morpho-listed markets (collateral worth at most 1.2 times the debt).
bonus_usdnumberCollateral seized minus debt repaid, USD, at the oracle price in the liquidation block.
auction_bonus_usdnumberThe part of bonus_usd in liquidations that went through Chainlink SVR auctions.
auction_bids_usdnumberWhat 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