---
title: "Scan Slate"
method: POST
path: "/v1/mcp/scan_slate"
tags: ["mcp"]
---

# Scan Slate

`POST /v1/mcp/scan_slate`

## Request

- Base URL: `https://api.infersports.dev` (the document declares no server; this is the origin it was published from)
- URL: `https://api.infersports.dev/v1/mcp/scan_slate`
- Auth: none declared

## Request body

- ScanSlateRequest
  - `sport` string, nullable: Filter: football | basketball.
  - `status` string, nullable: Filter: live | scheduled | finished.
  - `league` string, nullable: Filter by external league id (lg_…).
  - `markets` string[], nullable: Limit the value/arb scan to these markets; default all.
  - `period` string, nullable: Limit to full_time | half_time; default both.
  - `min_edge_pct` number: Value threshold for the per-match signal (default 1.0%).
  - `min_margin_pct` number: Arbitrage threshold for the per-match signal (default 0%).
  - `only_signal` boolean: If true, return only matches that have a value or arb signal.
  - `format` string: Odds format for rendered prices.
  - `limit` integer: Max entries to return (signal-first).

## Response `200`

Successful Response

- ScanSlateResult: Today's slate with each fixture's honest status + value/arb signal, signal-first. Collapses the per-fixture loop into one call. ``count`` is the whole filtered slate; entries are sorted with value/arb matches first and truncated to ``limit`` (so truncation drops the quiet ones). Line movement is NOT here (it needs the opening lookup) — drill into one fixture with get_opening_line. DETECTION ONLY / read-only, like find_value & find_arbitrage.
  - `date` string, required: The UTC date treated as 'today' (YYYY-MM-DD).
  - `count` integer, required: Total fixtures in the filtered slate (before limit).
  - `with_signal` integer, required: How many of those have a value or arb signal.
  - `returned` integer, required: How many entries are in this response.
  - `truncated` boolean, required: True if more fixtures matched than were returned.
  - `entries` SlateEntry[]
    - `event_id` string, required
    - `sport` string, required
    - `league` string, required
    - `home_team` string, required
    - `away_team` string, required
    - `status` string, required: scheduled | live | finished (finished is inferred: elapsed-time backstop plus, for football, early detection when the match clock stops and every book pulls its quotes).
    - `score` Score
      - `home` integer, required
      - `away` integer, required
    - `red_cards` Score
      - `home` integer, required
      - `away` integer, required
    - `clock` string, nullable: Match clock when live, humanized: e.g. '1st half 25'', '2nd half 47'' or 'half-time'; null otherwise.
    - `scheduled_at` string, nullable
    - `as_of` string, nullable
    - `stale` boolean, required: Freshness of this fixture's odds (W4).
    - `book_count` integer, required: Distinct books quoting this fixture (after tier gating).
    - `value_count` integer, required: Number of +EV outcomes at/above min_edge_pct.
    - `best_value` ValueBet: A single +EV outcome: a book's price exceeds the de-vigged fair price for that outcome.
      - `market_type` string, required
      - `period` string, required
      - `line` number, nullable: AH/totals line; null for 1x2.
      - `outcome` string, required: home | draw | away | over | under.
      - `bookmaker` string, required: The book offering the value price (its key).
      - `price` union, required: Best available price, in the requested format.
        - number
        - integer
      - `decimal` number, required: That price in decimal (for comparison).
      - `fair_price` number, required: De-vigged fair decimal price from the sharp reference book.
      - `edge_pct` number, required: (decimal / fair_price − 1) × 100. Positive ⇒ +EV.
      - `format` string
    - `arb_count` integer, required: Number of cross-book arbitrage opportunities at/above min_margin_pct.
    - `best_arb` ArbOpportunity: A cross-book price inefficiency: best price per outcome (same line) inverts to < 1. DETECTION ONLY — we report the margin and which book holds each leg; we do NOT size stakes or link out to place bets (InferSports is read-only).
      - `market_type` string, required
      - `period` string, required
      - `line` number, nullable: AH/totals line; null for 1x2.
      - `legs` ArbLeg[], required: Best book per outcome — one leg per outcome.
        - `outcome` string, required: home | draw | away | over | under.
        - `bookmaker` string, required: Book offering the best price for this leg (its key).
        - `price` union, required: Best price for this leg, in the requested format.
          - number
          - integer
        - `decimal` number, required: That price in decimal.
      - `inverse_sum` number, required: Σ(1/decimal) over the legs. < 1 ⇒ arbitrage.
      - `margin_pct` number, required: Guaranteed margin (1/inverse_sum − 1) × 100.
    - `favorite` Favorite: Who the market favors, in plain terms — de-vigged from the full-time 1x2 line.
      - `outcome` string, required: home | draw | away.
      - `team` string, nullable: Team name for home/away; null for a draw.
      - `win_probability` number, required: De-vigged implied probability for this outcome (0–1).
      - `source` string, nullable: Bookmaker key the 1x2 was de-vigged from.
    - `signal` string, required: One-line human summary: status + best value/arb (or 'no value/arb').
  - `summary` string, required

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/infersports/apis/infersports-api.md) · [All operations](https://skmtc.dev/infersports/apis/infersports-api/llms.txt) · [OpenAPI document](https://skmtc.dev/infersports/apis/infersports-api/revisions/1a1c3b357ea7?raw)
