API Reference

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
Access
The feed is key-gated and currently onboarded manually while we work with early users. Email 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:

GET/v1
{
  "ok": true,
  "authenticated_as": "your-label",
  "endpoints": ["/v1/positions", "/v1/oracle/lag", "..."]
}
Keep keys server-side
Treat the key like a password. It belongs in your bot's environment, never in browser code — anything shipped to a browser is readable by anyone.

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.

GET/v1/positions
limitnumberMax positions to return. Default 500, capped at 2000.
protocolsstringFilter by protocol. Comma-list or repeated param. One or more of: aave_v3, compound_v3, euler_v2, morpho.
max_hfnumberOnly positions at or below this health score. 1.0 = liquidatable now; at or below 1.2 is served from a dedicated at-risk index.
min_profitnumberOnly positions with at least this net profit in USD.
curl -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
}
Health score is universal
Each protocol's own risk model is mapped to one convention: above 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.

GET/v1/oracle/lag

ETH/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
}
GET/v1/oracle/lag/all

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

GET/v1/missed
limitnumberHow many events to return. Default 50, capped at 200.
{
  "events": [
    { "wallet": "0x…", "liquidator": "0x…", "block_number": "…",
      "timestamp": "2026-09-13T09:41:12.000Z" }
  ]
}

Stats

Aggregate state of the feed right now.

GET/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.

GET/v1/cascade
eth_pricenumberRequired. Target ETH price to simulate, e.g. 2600.
curl -H "Authorization: Bearer $MEVRYX_KEY" \
  "https://api.mevryx.xyz/v1/cascade?eth_price=2400"

Errors

401statusMissing or invalid API key.
400statusBad parameter — e.g. an unknown protocol in the filter, or a non-positive eth_price. The body names the offending field.
{
  "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.

Request a keyHow we read each protocol →