Prediction market odds vs perp-implied probability for every live Hyperliquid binary price market: BTC, ETH, HYPE, ZEC and tokenized stocks, indices and commodities (SP500, XYZ100, META, TSLA, CL, GOLD). You get executable bid, ask and depth, the model probability from the live perp price and realized volatility, and the edge in percentage points, as clean JSON for AI agents and trading bots.
Free: GET /pm/markets and MCP list_pm_markets · Paid: /pm/implied $0.02, /pm/scan $0.05
/pm/markets, loaded in your browser; empty books hidden)| Market | Bid | Ask | Spread | Depth (bid / ask) |
|---|---|---|---|---|
| Loading… | ||||
An agent about to buy a Hyperliquid outcome token checks whether the Yes price is above or below the perp-implied probability, using real bid/ask, not a misleading mid.
One /pm/scan call ranks every liquid binary price market by edge, already filtered for empty and thin books. Built for scanners, alert bots and daily briefings.
Holding a BTC, HYPE or SP500 perp? Compare outcome tokens near your stop or target with model value to find cheap downside or upside protection.
A research agent answering "what is the market-implied chance SP500 closes above 7,730 on Monday?" gets the market's odds, the perp-implied probability and the liquidity behind them.
GET /pm/implied?asset=BTCGET /pm/scan?min_edge_pp=3&max_spread_pp=10GET /pm/implied?outcome=13371GET /pm/markets?kind=stocks (free)GET /pm/scan?kind=crypto&min_depth_usd=100Real data from the Hyperliquid snapshot of Oct 17 2026, 13:11 UTC, trimmed to one row.
GET /pm/implied?asset=SP500 $0.02{
"asset": "SP500",
"generated_at_iso": "2026-10-17T13:11:38Z",
"spot": {
"perp": "xyz:SP500",
"mid": 7653.45,
"live": true,
"realized_vol_7d": 0.1073,
"vol_as_of": "2026-10-17T13:10:10Z"
},
"count": 1,
"filtered_out_empty_or_thin": 0,
"min_depth_usd": 0,
"markets": [
{
"outcome": 11676,
"asset": "SP500",
"perp": "xyz:SP500",
"kind": "stocks",
"question": "SP500 above 7730 at 2026-10-19 20:00:00 UTC",
"strike": 7730,
"expiry": "2026-10-19T20:00:00Z",
"hours_to_expiry": 54.81,
"settlement": {
"source": "the Pyth US500 index price",
"window_seconds": 90,
"side": "Yes pays 1 USDC if the price is above the strike at expiry"
},
"bid": 0.0676,
"ask": 0.1656,
"mid": 0.1166,
"spread_pp": 9.8,
"bid_size": 531,
"ask_size": 470,
"depth_usd": {
"bid": 96.64,
"ask": 160.58,
"window_pp": 5,
"levels": 5
},
"liquid": true,
"book_ts": "2026-10-17T13:11:38Z",
"book_age_s": 0,
"spot_mid": 7653.45,
"realized_vol_7d": 0.1073,
"model_prob": 0.1196,
"edge_vs_bid_pp": -5.2,
"edge_vs_ask_pp": -4.6,
"best_edge_pp": -4.6,
"signal": "fair"
}
],
"label": "data, not advice"
}GET /pm/scan?max_spread_pp=12 $0.05{
"generated_at_iso": "2026-10-17T13:11:39Z",
"cache_updated_iso": "2026-10-17T13:10:56Z",
"spot_live": true,
"filters": {
"min_edge_pp": 2,
"max_spread_pp": 12,
"min_depth_usd": 50,
"kind": "all",
"limit": 20
},
"scanned": 110,
"filtered_out_empty_books": 73,
"filtered_out_illiquid": 27,
"matched": 1,
"count": 1,
"median_book_age_s": 77,
"rows": [
{
"outcome": 13371,
"asset": "SP500",
"perp": "xyz:SP500",
"kind": "stocks",
"question": "SP500 above 7740 at 2026-10-23 20:00:00 UTC",
"strike": 7740,
"expiry": "2026-10-23T20:00:00Z",
"hours_to_expiry": 150.81,
"settlement": {
"source": "the Pyth US500 index price",
"window_seconds": 90,
"side": "Yes pays 1 USDC if the price is above the strike at expiry"
},
"bid": 0.2534,
"ask": 0.3658,
"mid": 0.3096,
"spread_pp": 11.2,
"bid_size": 180,
"ask_size": 186,
"depth_usd": {
"bid": 107.23,
"ask": 175.07,
"window_pp": 5,
"levels": 5
},
"liquid": true,
"book_ts": "2026-10-17T13:10:43Z",
"book_age_s": 55,
"spot_mid": 7653.45,
"realized_vol_7d": 0.1073,
"model_prob": 0.2102,
"edge_vs_bid_pp": 4.3,
"edge_vs_ask_pp": -15.6,
"best_edge_pp": 4.3,
"signal": "yes_overpriced"
}
],
"label": "data, not advice"
}# unpaid request returns the price (HTTP 402 + PAYMENT-REQUIRED header); bad input returns a free 400
$ curl -i "https://perp-gap-api.perpgap.workers.dev/pm/implied?asset=BTC"
# MCP (Streamable HTTP at https://perp-gap-api.perpgap.workers.dev/mcp)
tools/call list_pm_markets { "kind": "crypto" } # free
tools/call get_pm_implied { "asset": "BTC" } # $0.02 via x402
tools/call get_pm_scan { "min_edge_pp": 3 } # $0.05 via x402Pay per call in USDC on Base (eip155:8453) or Solana mainnet, same price on both. No account, no subscription. Bad input or no live market returns a free 400/404 before any payment.
| Route | MCP tool | Price | Returns |
|---|---|---|---|
GET /pm/markets | list_pm_markets | Free | Covered markets: id, strike, expiry, settlement, bid, ask, depth |
GET /pm/implied | get_pm_implied | $0.02 | One asset's markets vs perp-implied probability, edge vs bid/ask, liquidity flag, signal |
GET /pm/scan | get_pm_scan | $0.05 | All liquid markets ranked by edge, with filters |
P(S_T > K) under a lognormal model with zero drift, S = live Hyperliquid perp mid, sigma = 7-day realized vol from Hyperliquid 1h candles (annualized x sqrt(8760)). No options data. Edges use executable bid/ask, never mid.
Many outcome books are empty or quoted 5¢/95¢. Those are filtered out. A market is flagged liquid only with a spread of 10 pp or less and at least $50 resting within 5 pp of the touch on both sides.
Order books are refreshed every 15 minutes in paced, rotating batches; every row has book_ts and book_age_s. /pm/implied re-reads up to 6 books live. Spot comes from live Hyperliquid mids.
/pm/openapi.json · /pm/llms.txt · /pm/x402.json · /.well-known/x402 · /mcp · agents.json · Stock-perp gap API