---
title: "Compare Prob"
method: POST
path: "/v1/mcp/compare_prob"
tags: ["mcp"]
---

# Compare Prob

`POST /v1/mcp/compare_prob`

## 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/compare_prob`
- Auth: none declared

## Request body

- CompareProbRequest
  - `query` string, required: Natural-language fixture, e.g. 'France vs Argentina' or a team.
  - `external_prob` number, required: The external (e.g. prediction-market) implied probability for `outcome`, in (0,1). Pre-net it for the venue's fee/spread (we don't ingest prediction-market data).
  - `market_type` string: 1x2 | asian_handicap | totals.
  - `period` string: full_time | half_time.
  - `outcome` string: Which leg the external_prob is for: home/draw/away (1x2), home/away (asian_handicap), over/under (totals).
  - `external_label` string, nullable: Cosmetic source label echoed back, e.g. 'polymarket' | 'kalshi'.
  - `sport` string, nullable: Optional filter: football | basketball.
  - `date` string, nullable: Optional UTC date YYYY-MM-DD to disambiguate.

## Response `200`

Successful Response

- CompareProbResult: Is an external probability good vs our sharp de-vigged fair line? DETECTION ONLY (read-only). ``status``: ``ok`` (fair line found, edge computed), ``no_line`` (no sharp fair for that market/period — can't judge), ``ambiguous`` (alternatives + ask_user; never guessed), or ``not_found``. ``edge_pp = (fair_prob − external_prob)·100`` (positive ⇒ the external YES price is cheap vs the sharp fair). The caller owns the prediction-market→probability mapping; ``caveats`` flags the traps (1x2 regulation/draw, AH push mass, staleness).
  - `status` string, required
  - `query` string, required
  - `summary` string, required
  - `match` MatchSummary: A fixture flattened for agent consumption (teams as names, optional live score).
    - `event_id` string, required: Canonical event id (evt_…); pass to get_match_odds / compare_lines.
    - `sport` string, required: football | basketball
    - `league` string, required: League name, e.g. 'English Premier League'.
    - `home_team` string, required
    - `away_team` string, required
    - `scheduled_at` string, nullable: Kickoff, ISO-8601 UTC.
    - `scheduled_at_local` string, nullable: Kickoff in the requested timezone (ISO-8601); null when no timezone was given.
    - `status` string, required: scheduled | live | finished
    - `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 for display: e.g. '1st half 25'', '2nd half 47'' (the real minute, not estimated) or 'half-time'; null pre-match or when the feed omits it. Basketball clocks (e.g. 'Q2 4:12') pass through as-is.
    - `confidence` number, nullable: Fuzzy-match confidence 0–1 (find_match only; null elsewhere).
    - `summary` string, nullable: One-line human-readable status, e.g. "Man City vs Arsenal — LIVE 1h 23 2-1." or "… — Kicks off 18:00 UTC on Jun 01." — ready to read to a user.
  - `market_type` string, nullable
  - `period` string, nullable
  - `outcome` string, nullable
  - `line` number, nullable: Consensus line used (AH/totals; null for 1x2).
  - `fair_prob` number, nullable: Sharp de-vigged fair probability for `outcome` (0–1).
  - `fair_decimal` number, nullable: Same fair value as decimal odds.
  - `fair_from` string, nullable: Bookmaker key the fair line was de-vigged from.
  - `external_prob` number, nullable
  - `external_label` string, nullable
  - `edge_pp` number, nullable: (fair_prob − external_prob)·100, in percentage points. Positive ⇒ external YES is cheap.
  - `ev_roi` number, nullable: Expected ROI buying YES at external_prob = edge/external_prob.
  - `verdict` string, nullable: good | marginal | no_edge (vs a market-shape noise floor).
  - `devig_method` string, nullable: proportional | power (power for 3-way 1x2).
  - `as_of` string, nullable
  - `stale` boolean, nullable
  - `caveats` string[]: Mapping/freshness traps to respect before acting.
  - `alternatives` MatchAlternative[]
    - `event_id` string, required
    - `label` string, required: 'Home vs Away' label for disambiguation.
    - `confidence` number, required
  - `ask_user` string, nullable

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