---
title: "Matched markets with identifiers, outcomes, and current reference prices"
method: GET
path: "/matched-markets/enriched"
tags: ["Sports"]
---

# Matched markets with identifiers, outcomes, and current reference prices

`GET /matched-markets/enriched`

## Request

- Base URL: `https://data.kairos.trade`
- URL: `https://data.kairos.trade/matched-markets/enriched`
- Auth: none required

Returns the same verified, live-filtered pair catalog as `/matched-markets`, with `details` and `pricing` attached to both sides. Unsupported markets, absent pricing results, and individual venue failures produce `pricing: null` without changing pair membership or pagination. Prices use each venue's API scale and are reference prices, not executable bids or asks. Returned pricing objects preserve null and zero prices and `book_unavailable` independently. Catalog or enrichment orchestration failures return 503. The page is capped at 150 pairs to bound request cost. Responses are not cacheable.

## Query parameters

- `limit` integer
- `offset` integer
- `cursor` string
- `provider` string
- `min_similarity` number, double
- `sort_by` 'similarity' | 'updated_at'
- `include_total` boolean

## Response `200`

A page of verified pairs with details and best-effort reference pricing.

- SportsEnrichedMatchedMarketsResponse
  - `pairs` object[], required
    - `a` object, required
      - `provider_id` integer, required
      - `provider` string, required
      - `market_id` string, required
      - `title` string, nullable, required: Null if metadata for this side's market isn't available.
      - `ticker` string, nullable, required
      - `image` string, nullable, required
      - `icon` string, nullable, required
      - `expires_at` string, date-time, nullable, required
      - `category` string, nullable, required: Canonical title-cased category, or null when the market is uncategorised.
      - `details` MarketsDetail, required
        - `market_id` string, required
        - `provider_id` integer, required
        - `event_id` string, nullable, required
        - `name` string, nullable, required
        - `category` string, nullable, required
        - `status` string, nullable, required
        - `condition_id` string, nullable, required
        - `token_id` string, nullable, required
        - `token_ids` string[], required: Full provider token roster, aligned by index with outcomes.
        - `outcomes` string[], required: Outcome labels aligned by index with token_ids.
        - `match_delay_ms` integer, 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 and for Polymarket markets whose delay Kairos has not observed yet.
      - `pricing` MarketsPrice, required
        - `price` number, nullable, required: Current venue reference price, including zero, or null when no quote exists. Scale is venue-dependent and is not normalized.
        - `book_unavailable` boolean: Explicit book unavailability; an independent trade reference price may still exist.
        - `volume` string, nullable
        - `liquidity` number, nullable
    - `b` object, required
      - `provider_id` integer, required
      - `provider` string, required
      - `market_id` string, required
      - `title` string, nullable, required: Null if metadata for this side's market isn't available.
      - `ticker` string, nullable, required
      - `image` string, nullable, required
      - `icon` string, nullable, required
      - `expires_at` string, date-time, nullable, required
      - `category` string, nullable, required: Canonical title-cased category, or null when the market is uncategorised.
      - `details` MarketsDetail, required
        - `market_id` string, required
        - `provider_id` integer, required
        - `event_id` string, nullable, required
        - `name` string, nullable, required
        - `category` string, nullable, required
        - `status` string, nullable, required
        - `condition_id` string, nullable, required
        - `token_id` string, nullable, required
        - `token_ids` string[], required: Full provider token roster, aligned by index with outcomes.
        - `outcomes` string[], required: Outcome labels aligned by index with token_ids.
        - `match_delay_ms` integer, 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 and for Polymarket markets whose delay Kairos has not observed yet.
      - `pricing` MarketsPrice, required
        - `price` number, nullable, required: Current venue reference price, including zero, or null when no quote exists. Scale is venue-dependent and is not normalized.
        - `book_unavailable` boolean: Explicit book unavailability; an independent trade reference price may still exist.
        - `volume` string, nullable
        - `liquidity` number, nullable
    - `similarity` number, double, required
    - `updated_at` string, date-time, required
  - `count` integer, required: Number of pairs on this page after live-status post-filtering (may be less than limit).
  - `limit` integer, required
  - `offset` integer, required
  - `has_more` boolean, required: Whether the underlying page (before live-status post-filtering) was full — not a strict function of count.
  - `next_cursor` string, nullable: Opaque cursor for the next keyset page. Present when cursor mode is requested.
  - `catalog_version` string: Full-set fingerprint shared by every page in one cursor walk.
  - `total` integer: Only present when include_total=true. Total matching-pair count under the pre-live-filter query filters.

## Other responses

- `400`: Unknown provider, invalid cursor/sort, or cursor combined with a non-zero offset.
- `409`: The catalog changed during a cursor walk; restart with an empty cursor.
- `422`: Request failed FastAPI parameter validation.
- `429`: Rate limit exceeded for this route's sliding window, keyed on the session `sub` when authenticated and on the trusted client IP otherwise. Honor `Retry-After`. A per-API-key data ceiling (set per credential) rejects with `{"detail": "API key data rate limit exceeded"}` instead of the `error` envelope below.
- `503`: Matched-market or enrichment data could not be loaded.

---

[API](https://skmtc.dev/kairos/apis/kairos-data-api.md) - [All operations](https://skmtc.dev/kairos/apis/kairos-data-api/llms.txt) - [OpenAPI document](https://skmtc.dev/kairos/apis/kairos-data-api/revisions/cf6b76079e38?raw)
