---
title: "Get futures for a sport"
method: GET
path: "/api/v2/sports/{sportID}/futures"
tags: ["V2 Futures"]
---

# Get futures for a sport

`GET /api/v2/sports/{sportID}/futures`

## Request

- Base URL: `https://therundown.io`
- URL: `https://therundown.io/api/v2/sports/{sportID}/futures`
- Auth: API key in header `X-TheRundown-Key`

Returns futures/outright **competition events** (e.g. tournament winner) for a sport, with future-class markets in the standard V2 market → participants → lines → prices shape and per-market settlement state. Competition events are excluded from the dated game endpoints and served only here. **Early access: requires an Ultra plan or higher.**

A competition is an **interval**, not an instant: `event_date` is when it starts and `settle_by` is when it must have graded. Futures events carry no `teams` array and no score: the human-readable identity is `schedule.event_name`.

**Date filtering uses interval overlap.** An event is returned when its `[event_date, settle_by]` span intersects the requested window: `settle_by >= from` and `event_date <= to`. So the default `from=now` means "in flight right now" and matches a season future that started months ago.

**Paging is keyset-based** (no skip parameter). When more results exist the response carries `meta.next_cursor`; pass it back verbatim as `cursor`. Ordering is soonest-to-resolve first: `settle_by`, then `event_date`, then `event_id`. `meta.count` is the number of events on the page, `meta.has_more` says whether another page exists, and `meta.total` is the number of events matching your filters across all pages, so a single call tells you the size of the listing.

**Default visibility:** settled markets are removed per market, an event is hidden once every requested future-class market on it has settled, and terminal (final/canceled/abandoned) events are excluded. `include_settled=true` lifts all of those **and** the default `from=now`, so settled history is reachable.

**Delta bootstrap:** On known zero-delay access, `meta.delta_last_id` can seed `GET /api/v2/markets/delta` only when this snapshot explicitly reports `X-Data-Delay-Seconds: 0`; it is a positive whole-integer cursor. With a positive, absent, or invalid delay header, keep using scoped snapshots and do not substitute `0`. Futures market IDs are **not** in the delta feed's default set: pass them explicitly (e.g. `market_ids=1141`) when polling. See the [Futures guide](/guides/futures) for the full integration recipe.

## Path parameters

- `sportID` integer, required

## Query parameters

- `from` string
- `to` string
- `offset` integer
- `limit` integer
- `cursor` string
- `include_settled` boolean
- `market_ids` string
- `affiliate_ids` string

## Response `200`

Futures events retrieved successfully

- FuturesEventsResponse
  - `meta` FuturesMeta
    - `delta_last_id` union: Positive whole-integer cursor for `/api/v2/markets/delta`. The API may return it as an integer or a numeric string. Use a snapshot value to begin market-delta polling only for known zero-delay access when that snapshot explicitly reports `X-Data-Delay-Seconds: 0`; otherwise use scoped snapshots and never substitute `0`.
      - integer
      - string
    - `next_cursor` string: Opaque keyset token for the next page. Present only while more rows exist; absent on the last page. Pass back verbatim as `cursor`.
    - `count` integer: Number of events on this page (the length of `events`). Always present.
    - `has_more` boolean: `true` while more pages exist (the same signal as `next_cursor`, as a boolean). `false` on the last page. Always present.
    - `total` integer: Number of events matching your filters across ALL pages, so you can size a listing without walking every page. Counts events, not markets; the keyset cursor does not affect it. Always present.
  - `events` FuturesEvent[]
    - `event_id` string: Opaque hash identifying the competition. Stable for the life of the competition: the public handle across snapshots and the delta feed.
    - `sport_id` integer
    - `event_date` string, date-time: When the competition starts (interval start).
    - `settle_by` string, date-time: Settlement horizon: when the competition must have graded (interval end).
    - `event_status` string: Event status. Season-long team competitions currently remain `STATUS_SCHEDULED` for the life of the board (live in-progress status for team seasons is not yet populated); short competitions like golf tournaments do transition to `STATUS_IN_PROGRESS` and `STATUS_FINAL`.
    - `settlement` object: Per-market settlement state, keyed by market ID. Empty (`{}`) until grading begins: a market with no entry has not entered grading.
    - `schedule` FuturesSchedule: Trimmed schedule block for a competition event.
      - `event_name` string: Human-readable competition name: the display identity of the event.
      - `season_year` integer
      - `league_name` string: League or tour label, when applicable (e.g. `PGA Tour`). Omitted otherwise.
    - `markets` MarketResponse[]: Future-class markets in the standard V2 market/participant/line/price shape.
      - `id` integer
      - `market_id` integer
      - `period_id` integer
      - `name` string
      - `market_description` string
      - `participants` MarketParticipantResponse[]
        - `id` integer: Stable, joinable participant identifier. Join on this field rather than name to avoid shared-name collisions. Its meaning depends on `type`: for `TYPE_TEAM` it is the normalized team ID (stable across seasons, matches `event.teams[].team_id`; full record at GET /api/v2/teams/{team_id}); for `TYPE_PLAYER` it is the player ID (full record at GET /api/v2/players/{player_id}); for `TYPE_RESULT` it is a small outcome index (e.g. 0/1 for Over/Under) and is not a team or player resource key.
        - `type` 'TYPE_TEAM' | 'TYPE_PLAYER' | 'TYPE_RESULT': Kind of participant. Determines what `id` points to (team, player, or result outcome).
        - `name` string: Display name. Not guaranteed unique across participants: join on `id`, not `name`.
        - `lines` MarketLinesResponse[]
          - `id` string
          - `value` string: Line value. For spreads/totals this is numeric; for some prop and special markets it can be a method, round, threshold, or other display value. When `line_value_is_participant` is true, the participant usually carries the selection.
          - `selection` string
          - `handicap` string
          - `prices` object: Prices keyed by affiliate ID

## Other responses

- `400`: Invalid parameter (malformed date, cursor, or ID list)
- `403`: Plan does not include futures markets

## Changes

- **2026-09-08** `8d16611813bf`: 1 breaking
  - response property `meta/delta_last_id` list-of-types was widened by adding types `integer` to media type `application/json` of response `200`
- **2026-08-28** `30772119de1a`: 3 info
  - added the optional property `meta/count` to the response with the `200` status
  - added the optional property `meta/has_more` to the response with the `200` status
  - added the optional property `meta/total` to the response with the `200` status
- **2026-08-13** `5aa0aa5c5f66`: 1 info
  - added the optional property `events/items/markets/items/participants/items/lines/items/prices/additionalProperties/liquidity_usd` to the response with the `200` status
- **2026-08-09** `6122c314b11a`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/therundown/apis/therundown-sports-api/changes/api/v2/sports/:sportID/futures/get.md)

---

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