01Safety
0.0 / 30
What changed in the harness
Selection accuracy 100→100, token cost up 7%, unconfirmed writes 0%→0%.
Category breakdown
Earned points across the four signals Gradable measures. Safety and Legibility are scored out of 30; Economics and Discoverability are scored out of 20.
0.0 / 30
24.5 / 30
17.4 / 20
10.6 / 20
Highest-impact fix
Estimated gain +30 pointsExpose machine-readable principal/tenant confirmation and a non-mutating permission check so agents can verify both before destructive actions.
Description evidence
13 defects found across the exposed tool descriptions. Suggested rewrites make purpose, inputs, boundaries, and returns easier for an agent to understand.
| Tool | Defect types | Suggested rewrite |
|---|---|---|
propline_list_event_markets |
params_unexplained no_return_description |
List the market types (e.g. h2h, spreads, totals, player_points, pitcher_strikeouts) available for a specific event. Pass sport_key (a valid key from propline_list_sports) and event_id (the event id returned by propline_list_events). Returns the set of market keys that event carries, so you know which prop markets to request with propline_get_odds. |
propline_get_odds |
params_unexplained |
Get live odds for a sport. sport_key is a valid key from propline_list_sports (e.g. baseball_mlb, basketball_nba). If event_id is supplied, returns full per-event props for that event; otherwise returns bulk game-line odds for the whole sport. Pass markets as a comma-separated list (e.g. 'h2h,spreads,totals' or 'player_points,player_rebounds'). Response includes a bookmakers[] array across every book that carries the requested markets (currently up to 13: Bovada, DraftKings, FanDuel, Pinnacle, BetMGM, BetRivers, Unibet, Underdog, PrizePicks, Kalshi, Polymarket, Matchbook, Smarkets — coverage varies by sport). Underdog Fantasy outcomes carry a payout_multiplier (DFS boost/discount factor; null = standard pick, e.g. 1.5 = boost, 0.75 = discount) — skip non-null values when comparing DFS lines to sportsbook consensus. |
propline_get_odds_history |
params_unexplained |
Hobby+ endpoint. Returns the historical line-movement snapshot series for an event (every recorded price/point change per outcome over the event's lifetime). sport_key is a valid key from propline_list_sports; event_id is the event id returned by propline_list_events; markets is a comma-separated list of market keys (e.g. 'h2h,spreads,totals', 'player_points') — omit to fetch all markets. Free tier returns market structure with redacted snapshots and an upgrade pointer. Supports period-historical filters: from/to (absolute ISO), relative_from/relative_to (offsets to commence_time like '-3h' or '0'), interval downsample ('30s'/'1m'/'5m'/'15m'/'30m'/'1h'), and changes_only=true to drop unchanged adjacent snapshots. |
propline_get_odds_closing |
params_unexplained |
Hobby+ endpoint. Returns the closing line per (book, market, outcome) for an event — the last snapshot at or before commence_time. sport_key is a valid key from propline_list_sports; event_id is the event id returned by propline_list_events; markets is a comma-separated list of market keys (e.g. 'h2h,spreads,totals') — omit to fetch all markets. Canonical CLV-tracking helper; one call returns the data point your bet should be measured against, instead of fetching full history and post-processing. Each outcome carries a closing_at field with the snapshot's recorded_at. Free tier returns redacted structure with upgrade pointer. |
propline_get_scores |
params_unexplained |
Free-tier endpoint. Returns recent and live game scores plus status (scheduled, live, final) for a sport. sport_key is a valid key from propline_list_sports (e.g. baseball_mlb, basketball_nba). Useful for: 'is this game over yet, what was the final score'. |
propline_get_event_stats |
params_unexplained |
Book-agnostic raw box-score stats for a completed event. Pass sport_key (a valid key from propline_list_sports) and event_id (the id of a completed event from propline_list_events). Returns per-player stats (e.g. strikeouts, hits, points, rebounds, shots-on-goal) decoupled from any sportsbook's lines. Free tier. |
propline_get_event_results |
params_unexplained |
Pro-tier endpoint. Returns graded prop outcomes for a completed event — every Over/Under marked won, lost, push, or void with the actual stat value next to the line. Pass sport_key (a valid key from propline_list_sports) and event_id (the id of a completed event from propline_list_events). The single most distinctive feature vs the-odds-api: they don't grade props at any tier. Free tier returns the same structure with resolution and actual_value redacted plus an upgrade pointer. |
propline_get_event_context |
params_unexplained |
Game context for an event — the conditions a prop settles under. Pass sport_key (a valid key from propline_list_sports) and event_id (an event id from propline_list_events). MLB: probable starting pitchers and their throwing hand (L/R/S — platoon-split context for every batter prop), a confirmed-lineup flag, the home-plate umpire, and first-pitch weather (temperature, wind, precipitation) at outdoor / open-roof venues (indoor venues return weather=null). NFL & NCAAF: the venue and kickoff weather. The same block is embedded in get_event_results, so every graded prop carries its conditions — unique to PropLine. Free tier. 404 when no context is on file for the event yet. |
propline_get_event_movement |
params_unexplained |
Line movement + steam detection from the snapshot tick history. Pass sport_key (a valid key from propline_list_sports) and event_id (an event id from propline_list_events). Per (book, market, outcome): opening line, latest line, signed implied-probability shift, point shift, direction. The steam[] array flags outcomes that multiple books moved the same direction — the classic sharp-money signal, computed across all 16 books PropLine polls. When a book moves the line itself, that outcome's prob_shift is null and direction is 'line_moved' (excluded from the steam signal). No pull-only odds API can produce this. Hobby+ full; free tier redacted. |
propline_get_player_history |
params_unexplained |
Player prop history across recent games. Pass sport_key (a valid key from propline_list_sports) and player_name. Returns each prior prop this player took with line, prices, resolution, and actual value. Pro tier returns full data; free tier returns redacted resolution/actual_value with an upgrade pointer. |
propline_get_player_trends |
params_unexplained |
Hit-rate trends / last-N-games over rate for a player — unique to PropLine's prop-resolution data. Pass sport_key (a valid key from propline_list_sports) and player_name. For each market the player has graded history in, returns over/under/push splits across the last 5/10/20/50 graded games, current streak, average actual stat, and the recent line. This is the 'did X go over in N of his last M games?' surface. Omit `market` for all markets, or pass one to scope (e.g. 'player_points', 'batter_hits'). |
propline_get_event_ev |
params_unexplained |
Pro-tier endpoint. Returns cross-book +EV per outcome for an event. Pass sport_key (a valid key from propline_list_sports), event_id (an event id from propline_list_events), and optionally markets — a comma-separated list of market keys to evaluate (omit for all markets). We anchor on Pinnacle's sharp line, remove vig, derive a no-vig fair line, and compute EV% per book at the same line. Outcomes are sorted with +EV plays floated to the top of each line group. PrizePicks is excluded from EV math (DFS payouts aren't comparable to per-book prices). |
propline_get_best_line |
params_unexplained |
Cross-book line shopping (Hobby+ for prices; free tier gets the full structure with book identities + best-first ranking but prices nulled and redacted:true). Pass sport_key (a valid key from propline_list_sports) and event_id (an event id from propline_list_events). For every (market, player, line) tuple on an event, returns the single best American price across all comparable books, plus an all_prices array sorted best-first (one row per book, each with last_update). Companion to propline_get_event_ev: /ev says whether a price beats the no-vig fair line; best-line says which book pays the most. DFS pick'em books (PrizePicks, Sleeper, Dabble) are excluded; Underdog only at clean two-way lines. Optional bookmakers filter to shop only the books the user holds accounts at. |
Selection evidence
8 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
propline_get_odds |
propline_get_odds_closing |
high | User phrasing like 'what are the final/closing odds for this game' maps to both (both are odds endpoints), and get_odds is the generic catch-all while folks rarely say the exact word 'closing'; agent can easily return live odds instead of the settlement line. |
propline_get_odds |
propline_get_odds_history |
medium | Tasks like 'show how the odds moved' or 'what were the odds earlier today' could be served by either live odds or the history series; without the explicit word 'history', the generic get_odds is the likely wrong pick. |
propline_get_odds_history |
propline_get_odds_closing |
medium | Both return historical line data for an event; 'what did the line close at' can be answered by full history, so an agent may pull the heavy history tool instead of the dedicated closing-line helper (or vice versa for 'get the odds history'). |
propline_get_odds |
propline_get_best_line |
medium | 'What's the best odds/price on this game' overlaps both: get_odds returns every book's prices while get_best_line returns the single best price; agent may call the bulk odds endpoint when the user wants line shopping, or best_line when they just wanted odds. |
propline_get_event_stats |
propline_get_event_results |
medium | Both are per-event, completed-game endpoints returning player stat values; 'what were the stats/results for that game' is ambiguous, so the agent may fetch raw box scores instead of graded prop outcomes. |
propline_get_player_history |
propline_get_player_trends |
medium | Both answer player-focused questions like 'has Jokic been hitting overs lately' — one returns past props with resolutions, the other hit-rate trends; the natural-language task doesn't disambiguate which surface to use. |
propline_get_odds_history |
propline_export_odds_history |
low | A task like 'pull the odds history for the season' is ambiguous between the per-event snapshot series and the bulk CSV firehose; 'export' in the tool name is a strong cue but not always present in user phrasing. |
propline_list_events |
propline_list_event_markets |
low | Both begin with 'list…events' and share the 'event' token; a task like 'what can I bet on for tonight's game' could trigger the event list instead of the market list, though the description for markets is fairly clear. |
Compare the field