Skip to main content
GET
cURL
Browse whale-active Polymarket markets with status, category, keyword, and sort filters. Use this endpoint when you need a market list before you know a condition_id.

Read the entries

  • Each data item has type set to group or standalone. A group carries event_slug, parent_title, and up to 12 markets. A standalone carries one market.
  • market.id is the mkt_ market ID. market.condition_id is the raw provider ID. Both work on the single-market endpoints.
  • market.url_slug is the first-party page slug. market.slug is the provider slug.
  • market.freshness.enrichment_status and market.freshness.price_status are available or unavailable. Read them before you show a price field.
  • total appears on the first page only. Cursor pages omit it.
  • facets.categories and facets.platforms are value, label, and count rows for the current filter. Facet values are canonical buckets.
  • computed_at and fresh_for_seconds describe the 60-second explore cache. Remaining freshness is fresh_for_seconds minus the age of computed_at.
Explore is Polymarket-only. platform accepts only polymarket and does not change the result. A canonical category such as Basketball matches every provider member (NBA, WNBA, NCAAB). A raw provider value also resolves to its bucket. sort accepts trending (default), hot, expiring, whales, volume, and newest. limit is 1 to 48 with a default of 24.

Cache the feed

The 200 response carries an ETag. Send If-None-Match to get 304 Not Modified with an empty body when the payload is unchanged. computed_at and fresh_for_seconds are excluded from the validator, so a recomputed body with identical data keeps its ETag. Search Markets finds a market by keyword across Polymarket and Kalshi.

Authorizations

Authorization
string
header
required

API key authentication. Send your key in the Authorization header as Bearer oxi_sk_live_.... Live keys require an active Pro subscription and return live data.

Headers

If-None-Match
string

Conditional GET validator from a previous ETag. Matching values return 304 Not Modified with an empty body.

Query Parameters

category
string

Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Facet values are returned as the canonical bucket.

status
enum<string>
default:all

Filter by market status.

Available options:
active,
closed,
all
platform
enum<string>
default:polymarket

Filter by source platform. Explore is Polymarket-only; polymarket is the only supported value and the parameter is accepted for backward-compatibility but does not change the result set.

Available options:
polymarket
sort
enum<string>
default:trending

Sort order for the discovery feed.

Available options:
trending,
hot,
expiring,
whales,
volume,
newest
cursor
string

Opaque pagination cursor from the previous response.

limit
integer
default:24

Page size.

Required range: 1 <= x <= 48
q
string

Keyword search against market titles.

Response

Grouped market discovery results

object
string
required
Allowed value: "list"
data
object[]
required
has_more
boolean
required
facets
object
required
meta
object
required
next_cursor
string | null
total
integer | null

Total matching visible entries after grouping. Present on the first page and omitted on cursor pages.

computed_at
string<date-time>

When this response body was computed. Present whenever the body came from, or was just written to, the 60s explore cache. Pair it with fresh_for_seconds to derive how much longer the body may be reused: fresh_for_seconds - age(computed_at). Excluded from the ETag validator, so a body recomputed with identical data keeps its validator.

fresh_for_seconds
integer

How long the body computed at computed_at is good for, in seconds. Deliberately not pre-subtracted: a cached body cannot carry a number that changes while it sits in the cache. Excluded from the ETag validator.