---
title: "Top live/upcoming sports markets matched across Polymarket and Kalshi"
method: GET
path: "/sports/trending-matched"
tags: ["Sports"]
---

# Top live/upcoming sports markets matched across Polymarket and Kalshi

`GET /sports/trending-matched`

## Request

- Base URL: `https://data.kairos.trade`
- URL: `https://data.kairos.trade/sports/trending-matched`
- Auth: none required

Finds games that have BOTH a Polymarket and a Kalshi entry in the cross-venue sports match cache, drops any entry whose embedded date is older than yesterday (UTC), enriches each surviving Kalshi side with a live volume figure (`volume_1h` falling back to `volume_total`), sorts descending by that volume, and truncates to `limit`. Title and `tokenId` come from the cached match record itself, not from a live provider call. Responses are cacheable at the edge.

## Query parameters

- `limit` integer

## Response `200`

Trending cross-provider matched markets. Returns `{"matches": [], "count": 0}` immediately if the matching cache is empty.

- SportsTrendingMatchedResponse: Top matched sports markets ranked by live Kalshi volume.
  - `matches` SportsTrendingMatch[], required
    - `slug` string, required: Game slug, used as the matching-cache key.
    - `title` string, required: Human-readable game title, from the matching cache.
    - `image` string, nullable, required: Always null — not populated by this endpoint.
    - `icon` string, nullable, required: Always null — not populated by this endpoint.
    - `volume1h` number, double, required: Kalshi 1h (or total, as fallback) volume used for ranking, from the discover cache.
    - `polymarket` SportsTrendingMatchPolymarketSide, required
      - `marketId` string, required: Equal to the game slug (Polymarket has no separate market id in this cache entry).
      - `tokenId` string, nullable, required: Polymarket CLOB token id, from the matching cache.
      - `price` number, double, nullable, required
    - `kalshi` SportsTrendingMatchKalshiSide, required
      - `marketId` string, nullable, required
      - `eventTicker` string, nullable, required
      - `price` number, double, nullable, required
  - `count` integer, required: Number of items in matches (after truncation to limit).

## Other responses

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

---

[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)
