PredictorSDK

List markets

Returns a paginated list of unified markets from all supported prediction market providers.

GET
/v1/markets

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
AuthorizationBearer <token>

In: header

Query Parameters

limit?integer

Maximum number of markets to return per page. Range 1–100, default 25.

Range1 <= value <= 100
Default25
cursor?string

Opaque 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.

category?string

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"
provider?string

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"  }}