Markets

Get full market metadata (rules, images, contract spec)

Returns the full metadata document for one market. Resolution order: (1) a fast cached-metadata path — for Polymarket, a cache hit derives status/category/images from the cached upstream payload; (2) on a miss, falls back to a live provider-API fetch (Kalshi ticker + event metadata for images; Polymarket; Opinion; predict.fun) — this covers markets too new to be indexed yet (e.g. short-lived 15-minute crypto markets); (3) if the cache hit is non-null but carries empty resolution_rules (both primary and secondary blank), an extra provider-API call backfills resolution_rules (and description if also empty) without discarding the rest of the cached document. Only the cached-metadata path populates condition_id/event_id/contract.settlement_ts — the live provider-API fallback leaves those null. Finally, for polymarket/predictfun, a best-effort liquidity-rewards enrichment mutates extra in place (never blocks or fails the response): Polymarket sets extra.clobRewards ([{rewardsDailyRate}] or []), extra.rewardsMaxSpread, extra.rewardsMinSize; predict.fun sets extra.rewards.current (an active reward-window object, or null). 404 only if no source has the market at all.

get/markets/metadata

Request

  • Base URL
    https://data.kairos.trade
  • Auth
    API key in header X-Client-Id and API key in header X-Api-Key and API key in header X-Api-Secret

Query parameters

tickerstring required

Market ticker/ID.

providerstring required

kalshi or polymarket (also accepts any other active provider — e.g. predictfun, opinion — via the API fallback path).

Response

Full market metadata.

tickerstring required
providerstring required
namestring required
descriptionstring required
external_urlstring nullable
condition_idstring nullable

Only populated for some response paths; null when the response comes from a provider-API fallback.

event_idstring nullable

Only populated for some response paths.

ctf_neg_riskboolean required
extraobject required

Raw upstream/provider payload, plus router-side enrichment: for polymarket, clobRewards ([{rewardsDailyRate}] or []), rewardsMaxSpread, rewardsMinSize; for predictfun, rewards.current (active reward-window object or null).

activeboolean required

False if the market is delisted/resolved and not tradable.

match_delay_msinteger nullable

Polymarket's matching delay in milliseconds, i.e. how long Polymarket holds an order before matching it. Sports markets hold every order for whole seconds (e.g. 1000 or 3000), and the value can change while a market trades, typically at game start; some crypto "Up or Down" markets hold taker orders for 250. When both apply, this is the longer one. 0 means no delay. null for non-Polymarket markets, for Polymarket markets whose delay Kairos has not observed yet, and when the response comes from a provider-API fallback.

Example response

{
  "match_delay_ms": 1000
}

Changes

No recorded changes to this operation across all 1 revision of this API.