Spreads: cross-venue price gaps
Where the same outcome is cheaper to buy on one venue than it sells for on the other, largest gap first. Built from executable bid and ask.
A lead, not guaranteed arbitrage
Gaps are gross
A gap is the sell bid on one venue minus the buy ask on the other. It ignores trading fees, withdrawal costs and how much size the order books can fill. Settlement rules can differ between venues too. Treat every gap as a lead to check, not money on the table.
- By default (
parity=reviewed) you only get outcomes whose settlement rules a person checked match.parity=anyadds every matched outcome; rules may differ. price_stateisactionable,indicativeorstale. Onlyactionablegaps use current executable prices on both venues.
/api/public/v1/spreadsAPI key requiredList spreads
Largest gaps first. Returns pagination: null.
Parameters
| Name | In | Type | Required | Default | Description |
|---|---|---|---|---|---|
| event | query | string | No | — | Only this event slug. |
| min_gap | query | number | No | 0.02 | Minimum gap in probability points, 0 to 1. 0.02 = 2 points. |
| min_volume | query | number | No | 1000 | Minimum volume in US dollars on each venue. |
| parity | query | "reviewed" | "any" | No | reviewed | reviewed: only outcomes whose rules a person checked match. any: every matched outcome. |
| limit | query | integer | No | 50 | Rows, 1 to 200. |
Request
curl -s 'https://api.thepredictionmarkets.com/api/public/v1/spreads?min_gap=0.02&limit=5' \
-H 'X-API-Key: tpm_demo_key_authorized_2026'Response
Example 200 response. Values are illustrative and change over time.
{
"data": [
{
"event_slug": "democratic-presidential-nominee-2028",
"event_title": "Democratic Presidential Nominee 2028",
"outcome_key": "candidate:acor",
"outcome_title": "Alexandria Ocasio-Cortez",
"gap": 0.024,
"buy": {
"venue": "kalshi",
"price": 0.14
},
"sell": {
"venue": "polymarket",
"price": 0.164
},
"quote_basis": "executable_bid_ask",
"price_state": "actionable",
"quote_age_seconds": 4,
"match_quality": "auto_high"
}
],
"pagination": null
}Response fields
| Field | Type | Description |
|---|---|---|
| event_slug, event_title | string | The event. |
| outcome_key, outcome_title | string | The matched outcome. |
| gap | number | Gross gap in probability points: sell.price - buy.price. |
| buy | {venue, price} | Where Yes is cheapest to buy (its ask). |
| sell | {venue, price} | Where Yes sells highest (its bid). |
| quote_basis | string | null | executable_bid_ask when both legs are live bid/ask. |
| price_state | string | null | actionable, indicative or stale. |
| quote_age_seconds | integer | null | Age of the quotes behind the gap. |
| match_quality | string | null | How confident the outcome match is, e.g. auto_high. |
Errors
| HTTP | Code | When |
|---|---|---|
| 400 | validation.invalid_parameter | A filter is out of range, e.g. min_gap=2. |
| 401 | auth.missing_key | No X-API-Key header was sent. |
| 401 | auth.invalid_key | The key is wrong or was revoked. |
| 429 | rate_limit.per_second | Too many requests this second. Wait for Retry-After. |
{
"error": {
"code": "validation.invalid_parameter",
"message": "min_gap: Input should be less than or equal to 1",
"request_id": "0f8969a6-0968-4d7c-9cbb-de379e8c19c4"
}
}All codes are listed on the errors page.
Try it
Runs a live request from your browser. Pre-filled with the shared demo key (5 requests per second for everyone); paste your own key for steadier results.
Press Send to run this request.Related
Build with TPM
Get your free API key
One key gives you Kalshi and Polymarket events, prices with freshness, price history, cross-venue gaps and the live quotes WebSocket.