Searcher
Data Feed
A normalized, profit-ranked liquidation feed across Aave V3, Compound V3, Euler V2, and Morpho — including the oracle-lag signal that flags positions liquidatable at the real market price before the on-chain oracle updates.
Every endpoint is read-only and returns JSON.
Base URL
https://api.mevryx.xyz/v1
hello@mevryx.xyz to request a key — see Get Access.Authentication
Every request needs your API key. Pass it as a bearer token:
curl -H "Authorization: Bearer $MEVRYX_KEY" \ https://api.mevryx.xyz/v1/positions?limit=5
An x-api-key header is also accepted if that suits your client better:
curl -H "x-api-key: $MEVRYX_KEY" https://api.mevryx.xyz/v1/stats
To verify a key is live, call the index endpoint — it echoes back the label the key is registered under:
/v1{
"ok": true,
"authenticated_as": "your-label",
"endpoints": ["/v1/positions", "/v1/oracle/lag", "..."]
}Positions
The core feed: positions across all four protocols, normalized to one schema and sorted by net profit after gas. Filter with the parameters below rather than narrowing the response yourself — the feed is a ranked page, so client-side filtering can only narrow what that page happened to contain.
/v1/positionscurl -H "Authorization: Bearer $MEVRYX_KEY" \ "https://api.mevryx.xyz/v1/positions?limit=100&protocols=aave_v3,euler_v2"
{
"positions": [ { /* see Position Schema */ } ],
"count": 100
}Both filter forms are equivalent:
?protocols=aave_v3,euler_v2 ?protocols=aave_v3&protocols=euler_v2
Position Schema
Identical across all four protocols — your execution logic never needs to know which protocol a position came from.
{
id: string // "{protocol}-{owner}-{market}"
protocol: "aave_v3" | "compound_v3" | "euler_v2" | "morpho"
chain: string
owner: string // borrower wallet address
collateralAsset: string
borrowAsset: string
collateralValueUSD: number
debtValueUSD: number
healthScore: number // < 1.0 = liquidatable on-chain now
distanceToThreshold: number // % move to liquidation (negative = under)
liquidationBonusPct: number // e.g. 0.05 = 5%
liquidationProfitUSD: number // gross
gasCostUSD: number
liquidationProfitNetUSD: number // gross minus gas — the ranking key
isProfitable: boolean
repayNotionalUSD: number // USD of debt the liquidation repays
isCapped: boolean // true = capped estimate, not protocol max
isHidden: boolean // oracle-lag window (PREFIRE)
oraclePrice: number
oracleLagAsset: string
needsFlashLoan: boolean // Aave only
isVerifiedCollateral: boolean
lltv?: number // Morpho only
lastUpdatedBlock: number
lastUpdatedMs: number
updatedAt: string
}1.0 is safe, below 1.0 is liquidatable — including Morpho, which has no native health factor and is derived from its LLTV.Profit is a capturable estimate
Profit is derived from repayNotionalUSD — the debt a liquidation actually repays. That notional is capped so the feed ranks on what a liquidator could realistically execute: a protocol's close factor alone lets a very large position imply an enormous bonus that assumes flash-loaning hundreds of millions and unwinding the collateral at no slippage.
When the protocol maximum exceeds that ceiling, isCapped is true and the profit shown is the capturable estimate rather than the theoretical maximum. Size your own execution from debtValueUSD and collateralValueUSD if you want the uncapped figure.
Reading isHidden
isHidden: true means the position is underwater at the live market price while the on-chain oracle still reads healthy. It is not yet liquidatable on-chain — it is about to be. That window is typically one to four minutes.
Oracle Lag
Live divergence between market prices and on-chain Chainlink feeds, refreshed every 60 seconds.
/v1/oracle/lagETH/USD summary, plus how many tracked positions are currently in the lag window:
{
"asset": "ETH",
"chainlink_price": 2612.40,
"real_price": 2598.10,
"lag_pct": 0.55,
"seconds_since_update": 214,
"hidden_count": 7
}/v1/oracle/lag/allPer-asset status across every feed we monitor (ETH, BTC, LINK, USDC):
{
"assets": [
{ "asset": "ETH", "livePrice": 2598.10, "onChainPrice": 2612.40,
"lagPct": 0.55, "isLagging": true }
],
"anyLagging": true,
"detectedAt": "2026-09-13T10:22:04.118Z"
}Liquidations
Recent on-chain liquidations Mevryx detected — use it to benchmark your own execution against what actually landed.
/v1/missed{
"events": [
{ "wallet": "0x…", "liquidator": "0x…", "block_number": "…",
"timestamp": "2026-09-13T09:41:12.000Z" }
]
}Stats
Aggregate state of the feed right now.
/v1/stats{
"total_monitored": 10508,
"at_risk": 2033,
"top_opportunity": { "protocol": "aave_v3", "liquidationProfitNetUSD": 13450 },
"oracle_lag": 0.55
}Cascade Simulation
Model how much liquidatable volume opens up if ETH moves to a given price — useful for pre-positioning ahead of volatility.
/v1/cascadecurl -H "Authorization: Bearer $MEVRYX_KEY" \ "https://api.mevryx.xyz/v1/cascade?eth_price=2400"
Errors
{
"error": "Invalid or missing API key. Pass it as `Authorization: Bearer <key>` or `x-api-key: <key>`."
}Get Access
We're onboarding early users by hand while the feed is in active development, which means you get a key and a direct line to us rather than a signup form.
Email hello@mevryx.xyz with what you're building and which protocols you care about, and we'll send a key back.