---
title: "All active props for one player"
method: GET
path: "/api/v1/props/player"
tags: ["Props"]
---

# All active props for one player

`GET /api/v1/props/player`

## Request

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

Every active prop for one player across today's board for a sport, in the same shape as the market scan, filtered by name (exact normalized match preferred, case-insensitive contains match as a fallback; see matchType) instead of stat.

## Query parameters

- `name` string, required: Player name or gamertag. Matched exactly (normalized, case-insensitive) when possible; falls back to a substring match only when no exact match exists. See matchType on the response.
- `sport` string

## Response `200`

Matching prop rows

- PlayerPropsResponse
  - `player` string, required
  - `sport` string, required
  - `count` integer, required
  - `rows` ScanRow[], required
    - `player` string, required
    - `stat` string, required: Stat key. NBA: points | rebounds | assists | threes | pra. Other sports use descriptive keys (strikeouts, total_bases, passing_yards, goals, ...).
    - `line` number, required: The posted over/under line.
    - `overOdds` number: American odds for the over / higher.
    - `underOdds` number: American odds for the under / lower.
    - `bookCount` integer, required: Number of sources contributing this line (currently 1).
    - `playerId` string: The source's own player id (Underdog today). Not canonical: it changes if the source renumbers.
    - `flashPlayerId` string: Canonical Flash player id: deterministic from sport + normalized name, so spelling variants of one player share it and the same name in two sports does not. Pass it to GET /changes?playerId=.
    - `teamSide` 'home' | 'away': Which side of the event this player is on, as the source assigns it (its team id for this appearance matched to the event's home/away team id). Pair with homeTeam/awayTeam on scan rows. Absent when the source does not say, e.g. head-to-head events. Never inferred.
    - `liveValue` number: Current in-game stat count (live games only).
    - `gameClock` string
    - `gameState` 'pre' | 'live' | 'final'
    - `variant` 'main' | 'alternate' | 'goblin' | 'demon' | 'milestone' | 'other': Which line within the market. main = the standard two-way line. goblin = easier line at a reduced payout. demon = harder line at a boosted payout. Classified from the provider’s own payout multiplier, never guessed from the number.
    - `variantLabel` string
    - `isMainLine` boolean: True for the standard line. Filter with ?mainLinesOnly=true.
    - `alternateLine` boolean
    - `payoutMultiplier` number: Provider payout multiplier. 1.0 is standard.
    - `sourceLineId` string: The provider’s id for this specific line.
    - `market` object: Self-describing market metadata (label, family, scope, unit, projectability) for this row. Always present on API responses; optional only on the internal pre-enrichment shape.
      - `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.
    - `flashProjection` FlashProjection: Flash's own baseline projection, present when the sport's registered provider models this market and its pack covers the player. Absent = no model, never fabricated; see market.projection.reason. Check `basis`: prior_season is not current form.
      - `value` number, required: Flash season-baseline projection, rounded to 0.5.
      - `sampleN` integer, required: Baseline sample size (maps/games), never the smaller recent-form n.
      - `method` string, required: How the baseline was built. Carries the season in parentheses when basis is prior_season.
      - `marketKey` string, required: Key into /context/player's `markets` map for this same prop.
      - `basis` 'current_season' | 'prior_season' | 'mixed_history', required: Which season's play this projection is built from. current_season = the season the prop is for. prior_season = an earlier season, because the prop season has no usable data in the pack. mixed_history = a few current-season games topped up with the most recent prior-season games. A prior_season projection is NOT current form and must never be presented as such; a mixed_history one is only partly current form.
      - `seasonId` string, nullable, required: The season the underlying play came from, when the pack records it. Null when unknown.
      - `basisNote` string, nullable, required: Plain-English provenance caveat. Always set when basis is prior_season or mixed_history; null otherwise.
    - `projectionAvailability` ProjectionAvailability: Whether this row is projected and, when it is not, a stable reasonCode (identity_ambiguous, insufficient_history, unsupported_market, ...). Absent when there is no row-level explanation to give; never guessed.
      - `status` 'projected' | 'line_only', required
      - `reasonCode` 'no_provider' | 'unsupported_market' | 'insufficient_history' | 'identity_unresolved' | 'identity_ambiguous' | 'source_stale' | 'source_unavailable' | 'rights_blocked' | 'model_shadow_only' | 'market_shadow_only' | 'missing_opponent' | 'missing_event' | 'invalid_line' | 'offseason' | 'quality_gate_failed' | 'null', nullable, required: Stable machine-readable reason a row is line-only. Null when status is projected.
      - `reason` string, nullable, required: Plain-English explanation. Null when status is projected.
    - `eventId` string, required
    - `sport` string, required
    - `homeTeam` string, required
    - `awayTeam` string, required
    - `startTime` string, required
    - `source` string, required
    - `fetchedAt` number, required: Epoch ms when the upstream snapshot this row came from was taken.
    - `sourceType` 'dfs' | 'sportsbook' | 'exchange' | 'model' | 'unknown', required: What kind of operator produced this price. Underdog is a DFS pick’em, NOT a sportsbook: its odds come from a fixed-line payout multiplier and should not be treated as an independently wagerable two-way book price.
    - `pricingModel` 'posted' | 'implied' | 'effective' | 'consensus' | 'unknown', required: How the number relates to a real price: posted by the operator, derived, adjusted, or aggregated across books.
    - `pricingNote` string, nullable, required: Caveat when the price is not a plain single-book posted price.
  - `matchType` 'exact' | 'contains' | 'null', nullable, required: "exact" when "name" matched a gamertag exactly (normalized, case-insensitive) -- the reliable case. "contains" means no exact match existed and rows came from a substring fallback (can span multiple similarly-named players in rare cases); treat as lower-confidence. null when nothing matched.

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