The Prediction Markets
API reference

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=any adds every matched outcome; rules may differ.
  • price_state is actionable, indicative or stale. Only actionable gaps use current executable prices on both venues.
GET/api/public/v1/spreadsAPI key required

List spreads

Largest gaps first. Returns pagination: null.

Parameters

NameInTypeRequiredDefaultDescription
eventquerystringNo—Only this event slug.
min_gapquerynumberNo0.02Minimum gap in probability points, 0 to 1. 0.02 = 2 points.
min_volumequerynumberNo1000Minimum volume in US dollars on each venue.
parityquery"reviewed" | "any"Noreviewedreviewed: only outcomes whose rules a person checked match. any: every matched outcome.
limitqueryintegerNo50Rows, 1 to 200.

Request

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.

200 OK
{
  "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

FieldTypeDescription
event_slug, event_titlestringThe event.
outcome_key, outcome_titlestringThe matched outcome.
gapnumberGross 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_basisstring | nullexecutable_bid_ask when both legs are live bid/ask.
price_statestring | nullactionable, indicative or stale.
quote_age_secondsinteger | nullAge of the quotes behind the gap.
match_qualitystring | nullHow confident the outcome match is, e.g. auto_high.

Errors

HTTPCodeWhen
400validation.invalid_parameterA filter is out of range, e.g. min_gap=2.
401auth.missing_keyNo X-API-Key header was sent.
401auth.invalid_keyThe key is wrong or was revoked.
429rate_limit.per_secondToo many requests this second. Wait for Retry-After.
400 validation.invalid_parameter
{
  "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.

HTTP: —Time: —Rows: —Remaining this second: —Request: —
Press Send to run this request.

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.