---
title: "List supported sports with live status + capability"
method: GET
path: "/api/v1/sports"
tags: ["Meta"]
---

# List supported sports with live status + capability

`GET /api/v1/sports`

## Request

- Base URL: `https://api.flashodds.live`
- URL: `https://api.flashodds.live/api/v1/sports`
- Auth: HTTP bearer

The sport catalog with, per sport: tier access, live status, active game/prop/projected counts, projection + context capability, projectable markets, market families live now, source, freshness, archive-observed coverage, and the snapshotId of the board the counts describe. Capability is resolved from the registered provider registry at request time, so read it here instead of hard-coding which sports are modeled.

## Response `200`

Sport catalog with live metadata

- SportsResponse
  - `sports` SportMetadata[], required
    - `id` string, required
    - `name` string, required
    - `category` 'sports' | 'esports', required
    - `enabled` boolean, required: Allowed on your current tier.
    - `status` 'live' | 'idle' | 'offseason', required: live = props posted now. idle = none posted now, but lines were archived recently (coverage.state active). offseason = no lines archived for longer than the offseason threshold, or never. Derived from observed lines, never a calendar.
    - `activeGames` integer, required
    - `activeProps` integer, required
    - `projectedProps` integer, required: Rows carrying a Flash projection right now.
    - `projectionCapability` 'posted_lines_only' | 'partial_flash_projection' | 'flash_projection' | 'advanced_context', required: Structural ceiling: how deep the Flash model can go for this sport.
    - `effectiveProjection` 'posted_lines_only' | 'partial_flash_projection' | 'flash_projection' | 'advanced_context', required: Ceiling tempered by live data (posted_lines_only when nothing is projected right now).
    - `contextCapability` 'none' | 'deep', required
    - `marketFamilies` string[], required: Market families live for this sport now.
    - `supportedMarkets` string[], required
    - `sources` string[], required
    - `lastFetchedAt` number, nullable, required: Epoch ms of the snapshot, or null if upstream is down.
    - `cacheAgeSeconds` number, nullable, required
    - `shapeCanaryTripped` boolean, required: Upstream looked shape-broken; serving last known-good data.
    - `legalLine` string, required: Per-sport affiliation disclaimer.
    - `notes` string[], required: Honest caveats, e.g. "Posted lines only for this sport".
    - `dataStatus` 'fresh' | 'stale' | 'partial' | 'unavailable', required: Whether this board's data can currently be trusted. 'fresh' = current. 'partial' = serving current rows, some dropped as finished. 'stale' = present but too old to rely on; treat as no slate. 'unavailable' = no usable source data.
    - `dataReason` string, nullable, required: Why dataStatus is not 'fresh'. Null when fresh, always set otherwise.
    - `projectableMarkets` string[], required: The subset of supportedMarkets a registered provider can project right now (market-level projection metadata).
    - `projectionBasis` object, required: Counts of projected rows by basis. currentSeason, priorSeason and mixedHistory are disjoint and sum to projectedProps. A nonzero priorSeason means some projections are prior-season baselines, not current form; a nonzero mixedHistory means some are only partly current form.
      - `currentSeason` integer, required: Projected rows with basis current_season.
      - `priorSeason` integer, required: Projected rows with basis prior_season.
      - `mixedHistory` integer, required: Projected rows with basis mixed_history: a few current-season games topped up with prior-season games.
      - `priorSeasons` string[], required: Distinct seasons the prior_season rows were built from.
    - `coverage` SportCoverage, required: Archive-observed line coverage. Tells a quiet league apart from a dead feed without a calendar.
      - `state` 'active' | 'offseason' | 'never', required
      - `lastLineAt` string, nullable, required
      - `daysDark` integer, nullable, required
    - `snapshotId` string, nullable, required: Identity of the exact board these counts describe. Deterministic over board content and projection pack version; equal ids on /sports, /games and /props mean the same logical board. Not a freshness timestamp.
    - `event` object, nullable, required: Current event framing, only when a trustworthy runtime source states it. Never inferred from a calendar.
      - `label` string, required
      - `source` string, required
    - `season` object, nullable, required: Season/phase/week, only when a trustworthy runtime source states it. Null otherwise.
      - `id` string, required
      - `phase` string, nullable, required
      - `week` integer, nullable, required
      - `source` string, required

## Other responses

- `400`: Invalid request
- `401`: Missing or invalid API key
- `403`: Not permitted on your tier
- `429`: Rate limit or daily quota exceeded

---

[API](https://skmtc.dev/flashodds/apis/flash-props-api.md) · [All operations](https://skmtc.dev/flashodds/apis/flash-props-api/llms.txt) · [OpenAPI document](https://skmtc.dev/flashodds/apis/flash-props-api/revisions/044161ffbfd8?raw)
