PredictorSDK

Get event with nested markets

Returns a single event and the markets nested under it on the identified provider.

GET
/v1/events/{event_id}

Returns a single event and the markets nested under it on the identified provider. The event_id is the provider's native identifier — a Kalshi event_ticker, a Polymarket event slug, an SX Bet eventId, a Predict market identifier, a Hyperliquid question/outcome integer id, an AlphaArcade market ULID, or a Pred parent market id. The provider is inferred from the ID format when unambiguous (KX… → Kalshi, L\d+ → SX Bet). The composite form returned by GET /v1/markets ({provider}:{native_id}, e.g. predict:1607914) also dispatches unambiguously by prefix.

A bare numeric id or kebab-case slug does not name its provider. Polymarket and Predict share both shapes, so when ?provider= is omitted the service probes every candidate and answers only if exactly one of them holds that identifier. If two do, the identifier names two different real events and the request fails with 409 listing both — it does not pick one. Retry with ?provider= or the composite form. Hyperliquid integer ids also collide with those numerics and require ?provider=hyperliquid (alias hl). AlphaArcade ULIDs are not inferred in v1 either — require ?provider=alpha-arcade (alias aa). ProphetX event ids are bare positive integers that collide with Polymarket/Predict numerics — require ?provider=prophetx (aliases prophet-x, px) or the composite form (prophetx:1700008812). Limitless event ids are kebab-case slugs that collide with Polymarket/Predict slugs — require ?provider=limitless or the composite form (limitless:england-vs-sri-lanka-1789383376774). Pred event ids are parent market ids (0x + 64 hex) that collide textually with SX Bet market hashes — require ?provider=pred or the composite form (pred:0x…). An AlphaArcade multi-choice market resolves to an event whose nested markets are its options; a binary market (or a single option id) resolves to a single-market event.

If you already know the provider, always say so. Every listing that hands you an identifier also hands you its provider, so ?provider={row.provider} (or the composite form) costs nothing, skips the probe, and cannot 409. It is also strictly more available: the probe has to reach both candidates to prove there is no collision, so it fails when either is having an outage, while a named provider only depends on that one.

The response is deliberately minimal: each market is returned with its provider-native market_id and a human-readable title. Send it to GET /v1/markets/{market_id} with this response's provider as ?provider= (or as the composite {provider}:{market_id}). Pricing, volume, status, and timestamps are not in this response yet — they will be added as additive fields to EventMarket. The endpoint mirrors the /v1/markets rollout pattern (titles first, fields later).

Kalshi sibling fanout. A single Kalshi sports game lives across multiple event tickers that share a game suffix — e.g. KXMLBGAME-26OCT152000MILLAD holds the moneyline, KXMLBF5TOTAL-26OCT152000MILLAD holds the first-five-innings totals, and so on. When the supplied event_ticker belongs to a sport in the sibling registry (MLB, NBA, NFL, NHL, WNBA today), this endpoint fans out across known sibling series in parallel and merges their markets into one response. Siblings that don't exist for a particular game silently drop. Siblings that error are reported under fanout.siblings_missing; the primary event still returns 200 in that case. Only the primary fetch failing produces a 4xx/5xx — partial fanouts never fail the request.

Polymarket events already nest the moneyline plus all spread/totals/game-level prop markets under a single event slug, so no fanout is performed. SX Bet fixtures similarly bundle game lines per eventId, but only while the fixture trades: SX Bet lists a fixture's markets through its active-markets route, which drops the fixture once it stops trading, and has no keyless route that lists them by fixture id afterwards. The L… id of a game that has ended answers 404, although a matching row keeps carrying it through the day after the game; the same row's market_id still resolves on GET /v1/markets/{market_id} (status settled). Predict currently treats event_id as a market identifier and wraps the single market as a 1-element event response, since the upstream event concept on Predict is closer to a category than to a multi-market container. Hyperliquid maps a question id to its named outcome markets, or wraps a standalone outcome id as a single-market event.

Authorization

BearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

event_id*string

Provider-native event identifier. Examples per provider: Kalshi event ticker (KXNBAGAME-26OCT20OKCSAS), Polymarket event slug (nfl-pit-ne-2026-09-20), SX Bet event id (L19766755), Predict market id (1607914), Hyperliquid question or outcome integer id (requires ?provider=hyperliquid since integer ids aren't inferred), Pred parent market id (0x…64hex, requires ?provider=pred since the shape collides with SX Bet market hashes). The composite {provider}:{native_id} form (e.g. predict:1607914) is accepted here too and dispatches without probing.

A bare numeric id or slug is not unique across providers. Polymarket and Predict both use these shapes and their id spaces overlap, so sending one without a provider can fail with 409 (see that response). Pass ?provider= — every source market in GET /v1/matching-markets/sports carries the provider that goes with its event_id.

Sports identifiers expire. Game tickers and slugs are delisted once an event settles, and a Hyperliquid id lives as long as its question: its daily-recurring price outcomes roll over every day, while a season-long question stays listed until it resolves. Take current ones from GET /v1/matching-markets/sports (every source market carries its provider's event_id) rather than copying one out of this reference.

Query Parameters

provider?string

Optional provider override, spelled like the provider field of this response and every other one (it was platform until 2026-10-09; ?platform= now answers 400 naming this parameter). When omitted, inferred from the event_id format: KX… → Kalshi, L\d+ → SX Bet. Numeric IDs and kebab-case slugs are shared shape between Polymarket and Predict; in that case the service probes both and returns 409 rather than guessing if the identifier resolves on both. Hyperliquid question/outcome integer ids collide with these numerics and are not inferred — pass ?provider=hyperliquid (alias hl). Pred parent ids share the 0x…64hex shape with SX Bet market hashes and are not inferred either — pass ?provider=pred. Passing provider explicitly skips the probe entirely and is the recommended call whenever you know it. Supplying a value that contradicts a composite {provider}: prefix is a 400.

Value in

  • "kalshi"
  • "polymarket"
  • "predict"
  • "sxbet"
  • "hyperliquid"
  • "alpha-arcade"
  • "prophetx"
  • "limitless"
  • "pred"

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/events/KXNBAGAME-26OCT20OKCSAS"

{  "event_id": "KXMLBGAME-26OCT152000MILLAD",  "provider": "kalshi",  "title": "Game 4: Milwaukee vs Los Angeles D",  "markets": [    {      "market_id": "KXMLBGAME-26OCT152000MILLAD-MIL",      "title": "Milwaukee wins"    },    {      "market_id": "KXMLBGAME-26OCT152000MILLAD-LAD",      "title": "Los Angeles D wins"    },    {      "market_id": "KXMLBEXTRAS-26OCT152000MILLAD-EXTRAS",      "title": "Will there be extra innings in the Milwaukee vs Los Angeles D game originally scheduled for Oct 15, 2026?"    }  ],  "fanout": {    "siblings_attempted": [      "KXMLBSPREAD-26OCT152000MILLAD",      "KXMLBTOTAL-26OCT152000MILLAD",      "KXMLBTEAMTOTAL-26OCT152000MILLAD",      "KXMLBF3-26OCT152000MILLAD",      "KXMLBF5-26OCT152000MILLAD",      "KXMLBF5SPREAD-26OCT152000MILLAD",      "KXMLBF5TOTAL-26OCT152000MILLAD",      "KXMLBF7-26OCT152000MILLAD",      "KXMLBRFI-26OCT152000MILLAD",      "KXMLBEXTRAS-26OCT152000MILLAD"    ],    "siblings_returned": [      "KXMLBEXTRAS-26OCT152000MILLAD"    ],    "siblings_missing": [      "KXMLBF3-26OCT152000MILLAD",      "KXMLBF5-26OCT152000MILLAD",      "KXMLBF5SPREAD-26OCT152000MILLAD",      "KXMLBF5TOTAL-26OCT152000MILLAD",      "KXMLBF7-26OCT152000MILLAD",      "KXMLBRFI-26OCT152000MILLAD",      "KXMLBSPREAD-26OCT152000MILLAD",      "KXMLBTEAMTOTAL-26OCT152000MILLAD",      "KXMLBTOTAL-26OCT152000MILLAD"    ]  }}