List markets
Returns a paginated list of unified markets from all supported prediction market providers.
Returns a paginated list of unified markets from all supported prediction market providers. Uses cursor-based pagination with default limit=25, max 100.
Providers are walked in a fixed sequence, so without a filter the first pages are all Kalshi. Narrow the traversal with provider and/or category; both are membership filters on the same immutable catalog snapshot, both compose, and pagination.total always counts the filtered set rather than the whole catalog.
This endpoint reads a stored snapshot rather than calling the venues, so the rows are as old as the last ingestion crawl, not as old as the request. snapshot.observed_at reports that age and is stable across a cursor traversal.
The catalog lists markets that were open when their venue was last crawled; closed and settled markets are not in it, and rows carry no status. A listed market may have closed since that crawl, so read its current status from GET /v1/markets/{market_id}, which asks the venue at request time.
Kalshi's multivariate-event markets (user-built parlays under KXMVECROSSCATEGORY… tickers) are excluded from the catalog and from pagination.total; every leg they combine is listed individually. A parlay ticker still resolves on GET /v1/markets/{market_id}.
Authorization
BearerAuth In: header
Query Parameters
Maximum number of markets to return per page. Range 1–100, default 25.
1 <= value <= 10025Opaque cursor from a previous response's pagination.nextCursor in the SDKs (raw JSON: pagination.next_cursor). Market cursors stay bound to the immutable catalog snapshot that issued them. Replaced snapshots normally remain available for up to 8 hours, but storage pressure can evict a retained snapshot sooner; retry from the first page after a stale-cursor 400.
Canonical top-level category filter. This is PredictorSDK's normalized category, not a provider-native tag. Cursors are bound to the category filter used to create them.
Value in
- "sports"
- "politics"
- "crypto"
- "finance"
- "economics"
- "weather"
- "culture"
- "technology"
- "entertainment"
- "other"
- "unknown"
Restrict the page to one provider, matched against each row's own provider value. Without it, providers are walked in the order below and a caller wanting a later one has to paginate through every earlier provider's rows first.
Only the canonical provider IDs are accepted, case-insensitively. Any other value returns 400 listing the legal ones — an unrecognized filter is never ignored, because a silently dropped filter returns a full unfiltered page that looks filtered.
pagination.total counts only the selected provider's rows, and cursors are bound to the filter that created them: replay a next_cursor with the same provider value, or start again from the first page.
This is a catalog membership filter, and it is spelled provider because that is the field it selects on. The same name is the override on GET /v1/markets/{market_id} and GET /v1/events/{event_id}, where it names the provider an identifier should be resolved against rather than filtering a list.
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
curl -X GET "https://example.com/v1/markets"{ "data": [ { "id": "kalshi:AMAZONFTC-29DEC31", "provider": "kalshi", "title": "Will a court find that Amazon has illegally maintained a monopoly?", "category": "politics" }, { "id": "kalshi:APPLEUS-29DEC31", "provider": "kalshi", "title": "DOJ wins their anti-trust case against Apple?", "category": "finance" } ], "snapshot": { "observed_at": "2026-10-09T15:22:30.534Z" }, "pagination": { "limit": 25, "total": 546912, "has_more": true, "next_cursor": "eyJzIjoiNDQxMzZmYTMiLCJ0IjoiMjAyNi0xMC0wOVQxNToyMzoyNi41ODM0MThaIiwiaSI6ImthbHNoaTpBUFBMRVVTLTI5REVDMzEifQ" }}Look up matched sports events by identifier GET
Finds the matched sports events that hold identifiers you already have, in one unpaginated call: a canonical event key as event_id, and any identifier a venue publishes (a market's market_id, market_slug or event_id; on Polymarket, Predict and AlphaArcade an outcome token; on Polymarket also a conditionId) as source_id={provider}:{id}.
List categories GET
Returns the canonical top-level categories that can be used to filter unified market discovery with GET /v1/markets?category=....