Meta Parser Coverage
Per-book per-sport market-coverage matrix. Public, no auth, no credits.
Answers the customer question "which markets do you actually parse from Caesars on NBA?" or "what markets does Pinnacle expose on table_tennis?" by aggregating observed market_keys from the prop_snapshots and odds_snapshots tables over the requested window.
Returns: { "as_of": "...", "window_hours": 72, "book_count": 32, // operators, the keys /odds serves "source_count": 45, // raw ingest feeds behind them "variants": {"unibet": ["unibet", "unibet_au", ...], ...}, "by_book": { "draftkings": { "baseball_mlb": { "markets": ["player_home_runs", "player_strikeouts", ...], "row_count": 14821, "latest_age_s": 12.3 }, ... }, ... } }
book_count counts operators, not feeds: an operator that publishes country-licensed feeds off one platform (Kindred runs 14 Unibet feeds) is one book, the same one /odds and /props serve. Its markets are the union of its feeds' markets and its row_count their sum. source_count keeps the raw feed total visible and variants names the members, so nothing is hidden by the fold. Naming one feed with ?source= returns it under its own name.
The aggregate never runs inline on this request. It is two sequential scans measured at 12.9 to 29.9 s on prod, so it runs in one background task per cache key, and a caller holding no matrix at all waits on that task for at most _PARSER_COV_BUDGET_S before being refused by name. The task is shielded, so the refusal does not throw the scan away. This handler therefore either serves a completed matrix or refuses by name:
- fresh matrix (inside the 300 s TTL) -> 200, payload exactly as above
- stale matrix under _PARSER_COV_MAX_STALE_S -> 200 with the same payload plus stale: true, stale_age_s and a _note saying whether a refresh is in fact running behind it
- stale matrix older than that -> 503, reason stale_too_old
- no matrix yet, and the compute does not land inside _PARSER_COV_BUDGET_S -> 503, reason compute_budget_exceeded
- no matrix yet, and another worker owns the refresh -> 503, reason refresh_in_progress
- no matrix yet, and this worker is already running _PARSER_COV_MAX_INFLIGHT computes -> 503, reason refresh_saturated
- no matrix yet, and this window's compute has failed _PARSER_COV_FAIL_THRESHOLD times in a row -> 503, reason compute_repeatedly_failed, with Retry-After set to what is left of the backoff rather than the usual constant
Every refusal is 503 COVERAGE_MATRIX_UNAVAILABLE with Retry-After. Never a 500, and never an empty by_book, which would claim we parse nothing anywhere.
Memory rule compliance: read-only on metadata. No prices touched.
Request
- Base URL: https://parlay-api.com
- URL: https://parlay-api.com/v1/meta/parser-coverage
- Auth: none declared
Query parameters
Optional filter to one book.
Optional filter to one sport.
Response
Successful Response
Changes
No recorded changes to this operation across all 1 revision of this API.