---
title: "Season/tournament futures markets across sports"
method: GET
path: "/sports/futures"
tags: ["Sports"]
---

# Season/tournament futures markets across sports

`GET /sports/futures`

## Request

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

Returns futures-style (non-per-game) sports markets for providers Polymarket and Predict.fun (open/active status only). Per-match/per-game rows are excluded; each event is classified into a (category, league) pair from a large token/phrase table, falling back to an "other" bucket, and titles that look like props/game lines/drafts or, for the "other" bucket only, non-sport mis-tags are dropped. Each event is capped at 30 outcomes (highest-priced first, unpriced sink to the bottom); the "other" bucket is additionally capped at 150 events (richest-first); recognized-sport events are uncapped. Results are sorted by market count descending. Responses are served from a cache kept warm in the background. With no parameters the whole list is returned; `mode`, `category`, `providers` and `q` filter it, and `limit` switches to pages carrying `total` and `nextOffset`.

## Query parameters

- `mode` 'sports' | 'esports'
- `category` string
- `providers` string
- `q` string
- `offset` integer
- `limit` integer

## Response `200`

Futures/outright markets grouped by event, each with its priced outcomes.

- SportsFuturesResponse
  - `futures` SportsFuturesEvent[], required
    - `eventId` string, required
    - `title` string, required
    - `image` string, nullable, required
    - `sport` string, required: Sports-catalog category id, or "other" if not classified into a known sport.
    - `sportFamily` string, required: Canonical category id from the sports catalog; equal to sport on this route.
    - `league` string, nullable, required
    - `provider` 'polymarket' | 'predictfun', required
    - `volume` number, double, required: Sum of contender market volumes. Always 0 for predictfun legs (no volume field upstream).
    - `outcomes` SportsFuturesOutcome[], required: Capped at 30 outcomes per event, highest-priced first with unpriced outcomes sunk to the bottom.
      - `label` string, required
      - `price` number, double, nullable, required
      - `marketId` string, required
      - `tokenId` string, nullable, required
      - `conditionId` string, nullable, required
    - `marketsCount` integer, required: Equal to len(outcomes) after capping.
  - `total` integer: Futures matching the filters across every page. Present only when `limit` is set.
  - `nextOffset` integer, nullable: `offset` for the next page, or null on the last. Present only when `limit` is set.

## Other responses

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