The Prediction Markets
API reference

Event detail: every venue's prices

One event with every venue market, every outcome's quote, how outcomes match across venues, and the price gap for each matched outcome.

When to use it

  • Show Kalshi and Polymarket prices for the same answer side by side.
  • Get each outcome's id for price history and its stream ids for the WebSocket.
  • Read the cross-venue spreads for one event.

How to read it

  1. markets[] has one entry per venue listing. markets[].outcomes[] are the answers on that venue.
  2. Each outcome's quote has the price (probability), bid and ask, and freshness. Quotes come from the venue's live feed when TPM has it (source: "live"), otherwise from the latest poll.
  3. Outcomes with the same match.group_id are the same answer on different venues.
  4. spreads[] gives, per matched outcome (outcome_key equals match.key), the cheapest venue to buy Yes, the best venue to sell it, and the gap between them.
  5. Before treating two prices as one bet, check comparison and match.contract_compatibility. Only verified means a person checked the rules match.

Gaps are gross

gap is sell bid minus buy ask, before fees and order-book depth. A positive gap is a lead to check, not guaranteed profit.

GET/api/public/v1/events/{slug}API key required

Get one event

The sample is trimmed to one outcome per venue; the real response lists every outcome.

Parameters

NameInTypeRequiredDefaultDescription
slugpathstringYes—Event slug from /events.

Request

Request
curl -s 'https://api.thepredictionmarkets.com/api/public/v1/events/democratic-presidential-nominee-2028' \
  -H 'X-API-Key: tpm_demo_key_authorized_2026'

Response

Example 200 response. Values are illustrative and change over time.

200 OK
{
  "data": {
    "id": "4d633d66-f3da-4f36-b04c-ce41b26bb13a",
    "slug": "democratic-presidential-nominee-2028",
    "title": "Democratic Presidential Nominee 2028",
    "question": "Democratic Presidential Nominee 2028",
    "category": "politics",
    "status": "active",
    "end_date": "2028-11-07T00:00:00Z",
    "resolution": {
      "outcome": null,
      "summary": "Resolves Yes if the named individual wins and accepts the 2028 Democratic nomination for U.S. president.",
      "resolved_at": null
    },
    "comparison": "comparable",
    "volume": 1540934033.49,
    "venues": [
      "kalshi",
      "polymarket"
    ],
    "markets": [
      {
        "venue": "kalshi",
        "market_id": "KXPRESNOMD-28",
        "title": "Democratic Presidential Nominee 2028",
        "url": "https://kalshi.com/markets/kxpresnomd",
        "status": "active",
        "event_slug": "democratic-presidential-nominee-2028",
        "volume": 244696381.96,
        "liquidity": null,
        "end_date": "2028-11-07T00:00:00Z",
        "last_seen_at": "2026-10-21T08:24:28Z",
        "outcome_count": 41,
        "outcomes": [
          {
            "id": "5c66f06e-dcac-44fa-93af-ba710d2a9ed2",
            "title": "Gavin Newsom",
            "contract_id": "KXPRESNOMD-28-GN",
            "status": "active",
            "volume": 11138438.36,
            "probability_change_24h": null,
            "quote": {
              "probability": 0.16,
              "best_bid": 0.16,
              "best_ask": 0.17,
              "spread": 0.01,
              "source": "live",
              "observed_at": "2026-10-21T08:38:56Z",
              "age_seconds": 3,
              "freshness": "live"
            },
            "stream": {
              "provider": "kalshi",
              "market_id": "KXPRESNOMD-28-GN",
              "outcome_id": "yes"
            },
            "match": {
              "group_id": "b5f0c3d2-6a1e-5f7b-9c2d-1e8a4f3b7d60",
              "key": "candidate:gnew",
              "state": "AUTO_MATCHED",
              "contract_compatibility": "unverified"
            }
          }
        ],
        "rules": null
      },
      {
        "venue": "polymarket",
        "market_id": "democratic-presidential-nominee-2028",
        "title": "Democratic Presidential Nominee 2028",
        "url": "https://polymarket.com/event/democratic-presidential-nominee-2028",
        "status": "active",
        "event_slug": "democratic-presidential-nominee-2028",
        "volume": 1296237651.53,
        "liquidity": 74355239.4,
        "end_date": "2028-11-07T00:00:00Z",
        "last_seen_at": "2026-10-21T08:37:22Z",
        "outcome_count": 128,
        "outcomes": [
          {
            "id": "e11fcb39-5832-455d-97df-7d25816b33f3",
            "title": "Gavin Newsom",
            "contract_id": "0x0f49db97f71c68b1e42a6d16e3de93d85dbf7d4148e3f018eb79e88554be9f75",
            "status": "active",
            "volume": 28018699.72,
            "probability_change_24h": null,
            "quote": {
              "probability": 0.1635,
              "best_bid": 0.163,
              "best_ask": 0.164,
              "spread": 0.001,
              "source": "snapshot",
              "observed_at": "2026-10-21T08:37:22Z",
              "age_seconds": 94,
              "freshness": "fresh"
            },
            "stream": {
              "provider": "polymarket",
              "market_id": "0x0f49db97f71c68b1e42a6d16e3de93d85dbf7d4148e3f018eb79e88554be9f75",
              "outcome_id": "54533043819946592547517511176940999955633860128497669742211153063842200957669"
            },
            "match": {
              "group_id": "b5f0c3d2-6a1e-5f7b-9c2d-1e8a4f3b7d60",
              "key": "candidate:gnew",
              "state": "AUTO_MATCHED",
              "contract_compatibility": "unverified"
            }
          }
        ],
        "rules": null
      }
    ],
    "spreads": [
      {
        "outcome_key": "candidate:acor",
        "gap": 0.024,
        "buy": {
          "venue": "kalshi",
          "price": 0.14
        },
        "sell": {
          "venue": "polymarket",
          "price": 0.164
        }
      },
      {
        "outcome_key": "candidate:gnew",
        "gap": -0.004,
        "buy": {
          "venue": "polymarket",
          "price": 0.164
        },
        "sell": {
          "venue": "kalshi",
          "price": 0.16
        }
      }
    ],
    "web_url": "https://thepredictionmarkets.com/odds/democratic-presidential-nominee-2028"
  }
}

Response fields

FieldTypeDescription
id, slug, titlestringEvent identity, as in /events.
questionstring | nullThe question in full, when it differs from the title.
category, status, end_datestring | nullAs in /events.
resolutionobject{outcome, summary, resolved_at}. summary describes how it settles; outcome is set once resolved.
comparisonstring | nullverified: venues list the same bet. comparable: similar, check the rules. Absent for one venue.
volumenumber | nullTotal volume across venues, US dollars.
venuesstring[]Venues listing it.
markets[]Market[]One per venue listing; fields as in markets.
markets[].outcomes[].idstringTPM outcome id. Stable; use it for /history?outcome_id=.
markets[].outcomes[].titlestringThe answer this outcome represents, e.g. Gavin Newsom or Yes.
markets[].outcomes[].contract_idstring | nullThe venue's tradable contract: a Kalshi market ticker or a Polymarket condition id. Use it with /prices.
markets[].outcomes[].statusstring | nullVenue status of the contract, e.g. active.
markets[].outcomes[].volumenumber | nullTraded volume in US dollars, as the venue reports it.
markets[].outcomes[].probability_change_24hnumber | nullChange in probability over 24 hours, when known.
markets[].outcomes[].quote.probabilitynumber | nullThe displayed price as a probability from 0 to 1, using the venue's own display rule. 0.16 means a 16% implied chance.
markets[].outcomes[].quote.best_bidnumber | nullHighest price someone will pay for Yes right now.
markets[].outcomes[].quote.best_asknumber | nullLowest price someone will sell Yes for right now.
markets[].outcomes[].quote.spreadnumber | nullbest_ask - best_bid on this venue (not the cross-venue gap).
markets[].outcomes[].quote.source"live" | "snapshot"live: from the venue's WebSocket feed. snapshot: from TPM's REST poll of the venue.
markets[].outcomes[].quote.observed_atstring | nullWhen this price was last known to be current (UTC).
markets[].outcomes[].quote.age_secondsinteger | nullSeconds since observed_at.
markets[].outcomes[].quote.freshnessstringlive, fresh, aging, stale or unknown. See freshness.
markets[].outcomes[].streamobject | null{provider, market_id, outcome_id}: send these to subscribe on the WebSocket.
markets[].outcomes[].match.group_idstring | nullOutcomes with the same group_id on different venues are the same answer.
markets[].outcomes[].match.keystring | nullReadable outcome key, e.g. candidate:gnew or binary:yes. Joins with spreads[].outcome_key.
markets[].outcomes[].match.statestring | nullHow the link was made, e.g. AUTO_MATCHED or MANUAL.
markets[].outcomes[].match.contract_compatibilitystring | nullverified only when a person checked that both venues settle the same way; otherwise unverified.
spreads[].outcome_keystringThe matched outcome (match.key).
spreads[].gapnumber | nullSell bid minus buy ask across venues. Gross: before fees and depth.
spreads[].buy{venue, price} | nullCheapest venue to buy Yes (its ask).
spreads[].sell{venue, price} | nullBest venue to sell Yes (its bid).
web_urlstringThe event page on thepredictionmarkets.com.

Errors

HTTPCodeWhen
404not_found.eventNo event has this slug.
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.
404 not_found.event
{
  "error": {
    "code": "not_found.event",
    "message": "Event not found",
    "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.