Use when an agent wants a ranked list of the most mispriced liquid prediction ma
Use when an agent wants a ranked list of the most mispriced liquid prediction markets on Hyperliquid right now, across all crypto and tokenized-stock binary price markets, in one call. Each row has model probability vs bid/ask, edge in pp, spread, depth and book age; empty and illiquid books are filtered out. For scanners, trading agents and daily briefings. Errors: 400 bad params, 404 no books (free, never charged), 402, 502. Data, not advice.
Answeringour last check, 2026-10-18
1 of 1checks answered this week
29 msmedian answer time
$0.05listed price per call
$0.05price it asked us
Paid test badge: not yet. The checks above are free: we call the tool without paying and read the payment request it sends back. The Verified badge needs paid calls whose answers match the promised output, and nobody can buy a badge.
Endpoint
GET https://perp-gap-api.perpgap.workers.dev/pm/scan
| Category | Market data |
|---|---|
| Provider host | perp-gap-api.perpgap.workers.dev |
| Networks | eip155:8453, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp |
| Payment schemes | exact |
| Self-reported calls, 30 days | 1 from 1 payers (the provider's figure, not ours) |
Our checks, last 30 days
| Day | Result | HTTP | Asked | Time |
|---|---|---|---|---|
| 2026-10-18 | valid payment request | 402 | $0.05 | 29 ms |
Example input (from the provider)
{
"method": "GET",
"queryParams": {
"max_spread_pp": "10",
"min_edge_pp": "2"
},
"type": "http"
}
Promised output schema (from the provider)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"input": {
"additionalProperties": false,
"properties": {
"method": {
"enum": [
"GET"
],
"type": "string"
},
"queryParams": {
"additionalProperties": false,
"properties": {
"kind": {
"default": "all",
"description": "Optional: crypto (BTC, ETH, HYPE, ZEC), stocks (trade.xyz stock, index and commodity perps) or all.",
"enum": [
"crypto",
"stocks",
"all"
],
"examples": [
"all"
],
"type": "string"
},
"limit": {
"default": "20",
"description": "Optional max rows, 1-50. Default 20.",
"examples": [
"10"
],
"pattern": "^\\d{1,2}$",
"type": "string"
},
"max_spread_pp": {
"default": "10",
"description": "Optional maximum bid-ask spread in percentage points. Default 10.",
"examples": [
"10"
],
"pattern": "^\\d+(\\.\\d+)?$",
"type": "string"
},
"min_depth_usd": {
"default": "50",
"description": "Optional minimum USDC depth within 5 pp of the touch on BOTH sides. Default 50.",
"examples": [
"100"
],
"pattern": "^\\d+(\\.\\d+)?$",
"type": "string"
},
"min_edge_pp": {
"default": "2",
"description": "Optional minimum edge in percentage points (model vs executable bid/ask). Default 2.",
"examples": [
"3"
],
"pattern": "^-?\\d+(\\.\\d+)?$",
"type": "string"
}
},
"required": [],
"type": "object"
},
"type": {
"const": "http",
"type": "string"
}
},
"required": [
"type",
"method"
],
"type": "object"
},
"output": {
"properties": {
"example": {
"description": "Error responses are JSON {error: string}: 400 bad min_edge_pp / max_spread_pp / min_depth_usd / limit / kind (free); 404 order-book cache empty (free, never charged); 402 payment required; 502 upstream error.",
"properties": {
"cache_updated_iso": {
"type": "string"
},
"closest": {
"description": "Only when rows is empty: the 3 liquid markets closest to min_edge_pp",
"items": {
"properties": {
"ask": {
"description": "Best Yes ask (probability, 0-1)",
"type": "number"
},
"ask_size": {
"type": "number"
},
"asset": {
"type": "string"
},
"best_edge_pp": {
"type": [
"number",
"null"
]
},
"bid": {
"description": "Best Yes bid (probability, 0-1)",
"type": "number"
},
"bid_size": {
"type": "number"
},
"book_age_s": {
"type": "integer"
},
"book_ts": {
"format": "date-time",
"type": "string"
},
"depth_usd": {
"description": "USDC notional resting within window_pp of the touch, top 5 levels",
"properties": {
"ask": {
"type": "number"
},
"bid": {
"type": "number"
},
"levels": {
"type": "integer"
},
"window_pp": {
"type": "number"
}
},
"type": "object"
},
"edge_vs_ask_pp": {
"description": "(model_prob - ask) x 100: > 0 means you could buy Yes below model value",
"type": [
"number",
"null"
]
},
"edge_vs_bid_pp": {
"description": "(bid - model_prob) x 100: > 0 means you could sell Yes above model value",
"type": [
"number",
"null"
]
},
"expiry": {
"format": "date-time",
"type": "string"
},
"hours_to_expiry": {
"type": "number"
},
"kind": {
"enum": [
"crypto",
"stocks"
],
"type": "string"
},
"liquid": {
"description": "spread <= 10 pp (scan: max_spread_pp) and >= $50 depth on both sides (scan: min_depth_usd)",
"type": "boolean"
},
"mid": {
"type": "number"
},
"model_prob": {
"description": "Model P(price > strike at expiry), 0-1",
"type": [
"number",
"null"