---
title: "One prop's full evidence: book line, Flash line, gap, form, splits, movement"
method: GET
path: "/api/v1/evidence"
tags: ["Props"]
---

# One prop's full evidence: book line, Flash line, gap, form, splits, movement

`GET /api/v1/evidence`

## Request

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

The whole story of a single prop in one call: posted book line, Flash line + unrounded baseline, gap and gap%, recent form (mean/median/volatility) with hit rate vs the POSTED book line, sport-native splits (home/away + opponent, plus CoD mode splits + map log), a Confidence Layer, and line movement. Available when the sport's registered provider models this market (see /sports and /markets); otherwise returns found:false with a reason. No picks, no advice. TIERED: free gets a teaser (book + Flash line + gap, analysis locked), Builder adds recent form + Confidence read + movement delta + teaser splits, Pro returns the full stack (all splits, movement series, full Confidence reasons). Paywall metadata { gated, preview, requiredTier, lockedFields, upgradeMessage } says exactly what is locked. Every absent section carries an explicit missingReason.

## Query parameters

- `player` string, required: Player gamertag (case-insensitive contains match). Required.
- `stat` string, required: Stat key (see GET /markets). Required.
- `sport` string: Sports whose registered provider models this market return evidence (see /sports, /markets); others found:false with a reason.
- `event` string: Restrict to one event id.

## Response `200`

Assembled prop evidence

- EvidenceResponse
  - `found` boolean, required: False when neither a posted line nor a Flash model exists for this prop.
  - `sport` string, required
  - `player` object, required
    - `name` string, required
    - `gamertag` string, nullable, required
    - `team` string, nullable, required
    - `role` string, nullable, required
  - `market` 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.
  - `event` object, nullable, required
    - `eventId` string, required
    - `homeTeam` string, required
    - `awayTeam` string, required
    - `startTime` string, required
  - `book` object, nullable, required
    - `line` number, required
    - `source` string, required
    - `overOdds` number, nullable, required
    - `underOdds` number, nullable, required
  - `flash` object, nullable, required
    - `line` number, required: Flash line, rounded to 0.5.
    - `rawBaseline` number, required: Unrounded season baseline.
    - `method` string, required
    - `version` string, required
    - `sampleN` integer, required
    - `sampleStrength` 'thin' | 'solid' | 'deep', required
    - `mode` string, required
    - `modeLabel` string, required
  - `gap` number, nullable, required: flash.line - book.line, signed.
  - `gapPct` number, nullable, required: gap as a percent of the book line.
  - `form` object, nullable, required
    - `n` integer, required
    - `recentMean` number, required
    - `median` number, nullable, required
    - `stdev` number, nullable, required: Volatility: population stddev of the recent values.
    - `min` number, nullable, required
    - `max` number, nullable, required
    - `hitRateVsBookLine` object, nullable, required: How often recent results went over the POSTED book line. Null when no live line.
      - `overs` integer, required
      - `of` integer, required
      - `pct` number, required
    - `hitRateVsFlashLine` object, required: How often recent results went over the Flash line (from the pack).
      - `overs` integer, required
      - `of` integer, required
      - `pct` number, required
    - `recent` number[], required: Recent observed values, chronological.
  - `splits` object[], required: Sport-native split tables (home/away, by opponent) as generic {title, rows}. Real values only; empty for sports whose pack carries no splits (and for CoD, which uses modeSplit/recentMaps below).
    - `title` string, required
    - `rows` object[], required
      - `label` string, required
      - `n` integer, required
      - `mean` number, required
  - `modeSplit` object[], nullable, required: CoD-only season mode split (Hardpoint/SnD/Overload). Null for other sports.
    - `mode` string, required
    - `kd` number, required
    - `kills` integer, required
    - `deaths` integer, required
    - `games` integer, required
  - `opponentSplit` object[], nullable, required: Legacy by-opponent split (also present in `splits`). Busiest first.
    - `opponent` string, required
    - `n` integer, required
    - `mean` number, required
  - `recentMaps` RecentMapRow[], required
    - `date` string, required
    - `mapName` string, required
    - `mode` string, required
    - `opponent` string, nullable, required
    - `won` boolean, required
    - `kills` integer, required
    - `deaths` integer, required
  - `movement` object, nullable, required
    - `openedLine` number, nullable, required
    - `currentLine` number, nullable, required
    - `delta` number, nullable, required
    - `lastChangedAt` number, nullable, required
    - `series` object[]: Full point series (Pro tier only; free tier gets opened/current/delta).
      - `capturedAt` number, required
      - `line` number, required
  - `freshness` object, required
    - `contextGeneratedAt` string, nullable, required: When the Flash pack was BUILT (ISO).
    - `ageHours` number, nullable, required: Pack build age in hours.
    - `stale` boolean, required: Pack build older than the staleness threshold.
    - `observedThrough` string, nullable, required: Newest ingested data-row date (ISO). Real age of the form data, vs the build time above. Null when the pack does not stamp it.
    - `observedAgeHours` number, nullable, required: Form-data age in hours (from observedThrough).
    - `observedStale` boolean, required: Form data older than the form-staleness threshold, even if the pack rebuilt recently.
    - `note` string, nullable, required: Human form-data-freshness line, e.g. "Form data through Jun 28, 2026 (18d old)."
  - `missingReasons` string[], required: Explicit reasons any section is absent. Never a silent omission.
  - `disclaimer` string, required
  - `confidence` Confidence, nullable, required
    - `tier` 'thin' | 'watch' | 'solid' | 'strong', required
    - `score` integer, required: Descriptive weight of evidence, 0..100. Not a win probability.
    - `reasons` string[], required: What lifted the read (empty on Builder; the full list is Pro).
    - `warnings` string[], required: Honesty caveats (thin sample, stale pack, no live line, ...).
  - `gated` boolean, required: True when data was withheld for your tier.
  - `preview` boolean, required: True when this is a reduced/preview view.
  - `requiredTier` 'starter' | 'pro' | 'enterprise' | 'null', nullable, required: Lowest tier that unlocks the first locked field. Null when nothing is gated.
  - `lockedFields` string[], required: Dot-paths of the fields withheld for your tier.
  - `upgradeMessage` string, nullable, required: Human upgrade prompt, or null when nothing is gated.

## Other responses

- `400`: Invalid request
- `401`: Missing or invalid API key
- `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)
