---
title: "Market metadata (stat vocabulary) for a sport"
method: GET
path: "/api/v1/markets"
tags: ["Meta"]
---

# Market metadata (stat vocabulary) for a sport

`GET /api/v1/markets`

## Request

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

The machine-readable stat vocabulary: for each live market, its label, family, scope (map1/maps13/full_game), unit, display order, and whether a Flash projection is supported (with a reason when not). Pass ?sport= for one sport, or ?all=1 for every live sport. This is what turns a raw stat key like "kills_on_game_1" into "Map 1 Kills" without re-deriving it client-side.

## Query parameters

- `sport` string: Sport id. Omit for the in-season sport.
- `all` boolean, nullable: Include the full catalog, not just markets live right now.

## Response `200`

Market metadata

- MarketsResponse
  - `sport` string, required
  - `count` integer, required
  - `markets` MarketMetadata[], required
    - `statKey` string, required: Raw normalized stat key on the prop row.
    - `label` string, required: Human display label.
    - `family` string, required: Market family: kills | fantasy | points | total_bases | ...
    - `scopeKind` 'map' | 'maps' | 'full_game' | 'match' | 'season', required: What the scope spans.
    - `scope` string, required: Stable scope filter key: map1 | maps13 | full_game.
    - `scopeLabel` string, required
    - `unit` string, nullable, required: The noun the number counts, or null when ambiguous.
    - `displayOrder` integer, required: Reading order within the sport (lower first).
    - `uiGroup` string, required: Recommended grouping bucket (= family).
    - `projection` MarketProjectionSupport, required
      - `supported` boolean, required: Whether a Flash projection is available for this market.
      - `unsupported` 'not_modeled' | 'fantasy_scoring' | 'scoped_market' | 'no_provider' | 'null', nullable, required: Machine-readable reason a market is not projectable. not_modeled = a real stat the provider does not model yet (makes a board partial); fantasy_scoring, scoped_market and no_provider are structural. Null when supported.
      - `reason` string, nullable, required: Why a projection is unavailable. Never null when supported=false (no silent omission).
    - `contextSupported` boolean, required: /context/player carries recent-form for this market.
    - `lineOnly` boolean, required: No Flash projection for this market today.
    - `alternateLine` boolean, required: Reserved; false until an alternate-line feed exists.
    - `rawStat` string, required: The stat key exactly as the source posted it, before alias resolution. The board posts several spellings for one market (receiving_yds vs receiving_yards), so statKey is normalized for grouping while this preserves the original.
    - `aliased` boolean, required: True when rawStat resolved to a different canonical statKey.

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