📖
Playbooks: block catalog & JSON schema
Every field and block you can screen on, and the exact JSON a playbook is made of.
A playbookis a saved screen: a tree of filter blocks over every batter and starting pitcher on tonight's MLB slate, plus an optional weighted score that ranks whatever survives. This page is generated from the same registry the builder and the validator read, so it can never drift out of date.
Writing one with an AI assistant? Paste this page into the assistant, ask for a playbook/v1 document, then load it via the builder's JSON tab. Import is fail-closed: an unknown block type or field is rejected with the path that caused it, never silently dropped.
Playbooks is a research tool. It screens historical and contextual data. It does not predict anything. Use or tail at your own risk. Not betting advice.
How a playbook is evaluated
The order is fixed, and it matters:
1. scope to the playbook's entity (batter or pitcher)
2. apply the odds policy
3. apply the filter tree <- a row that fails here is gone
4. score the survivors <- Advanced Mode only
5. apply the score gate
6. sort by score, then cap to top_n
Scoring runs after filtering, over the survivors only. No weight can bring back a player who failed a filter. The score gate runs before the cap, so top_n never pads the list back out with rows that missed the gate.
Missing data is not zero
A field is NA when it was never measured, no Statcast sample, no posted price, a pitcher with no prior game logs, wind in a domed park. A field is 0only when zero was actually observed. These are never conflated: a screen for “fewer than 1 home run in the last 5” matches a player who genuinely hit none, not a player who has not batted.
| Policy | Effect |
|---|
| na_default: "remove" | A row is dropped when a filter references a stat it does not have. The strict default. |
| na_default: "keep" | The row survives, and the results table marks it as kept despite the missing stat. |
| na (per block) | Overrides the global policy for one block. |
| sample_gate | Always fails an unknown sample, whatever the NA policy says. Demanding evidence cannot be satisfied by its absence. |
| presence | Tests missingness itself, so it never takes the NA branch. |
Projected vs confirmed lineups
Early in the day most batting orders are projected. Rows carry a lineup_status of projected, confirmed or unknown, and the universe is rebuilt through the evening as orders post, so a saved playbook updates in place. Non-confirmed rows are flagged with an orange ! in the results table. A pitcher row counts as confirmed once the order he faces is posted.
What you cannot screen on
Slatery model output is not available as an input: no model probabilities, no Hit/K/HR sheet numbers, no edges or pick flags. Playbooks are meant to express your own reasoning over raw evidence, and the models are a separate product to be compared against, not fed from. Market prices and book-implied probabilities are allowed. Those are market data.
The playbook/v1 document
{
"schema": "playbook/v1",
"meta": {
"name": "Barrel + Park",
"entity": "batter",
"target_market": "hr"
},
"policies": {
"na_default": "remove",
"odds": "show_without",
"odds_market": "homeruns"
},
"filters": {
"op": "and",
"children": [
{
"type": "metric_compare",
"field": "barrel_rate",
"op": "gte",
"value": 0.06
},
{
"type": "context_compare",
"field": "park_hr_factor",
"op": "gte",
"value": 1.02
},
{
"type": "sample_gate",
"field": "pa_l30",
"value": 30
},
{
"type": "lineup_status",
"allow": [
"projected",
"confirmed"
]
}
]
},
"advanced": {
"enabled": true,
"terms": [
{
"field": "barrel_rate",
"transform": "z_slate",
"weight": 1.5
},
{
"field": "park_hr_factor_vs_hand",
"transform": "raw",
"weight": 0.8
}
],
"score_gate": null,
"top_n": 10
}
}| Key | Required | Notes |
|---|
| schema | yes | Must be exactly "playbook/v1". |
| meta.name | yes | Up to 80 characters. |
| meta.entity | yes | "batter" or "pitcher". Fields are entity-specific. |
| meta.target_market | no | hits, hr, k, runline, game_total |
| policies.na_default | no | "remove" (default) or "keep". |
| policies.odds | no | "show_without" (default) or "require". |
| policies.odds_market | with require | homeruns, hits, bases, runs, rbis, strikeouts, er, ml, run_line, game_total |
| filters | yes | A logic group: {"op":"and"|"or"|"not","children":[…]}. |
| advanced.enabled | no | Turns on weighted scoring. |
| advanced.terms[] | with enabled | { field, transform, weight } |
| advanced.score_gate | no | Minimum score. Requires advanced.enabled. |
| advanced.top_n | no | 1–25, or null for all. |
| Limit | Value |
|---|
| Blocks per playbook | 40 |
| Group nesting depth | 2 |
| Score terms | 20 |
| top_n maximum | 25 |
| Saved playbooks per account | 10 |
| Import size | 256 KB |
Block types
| type | What it does | Parameters | Example |
|---|
| metric_compare | Compare any catalog field to a threshold (or a range with "between"). | field, op, value, value2, na | {"type":"metric_compare","field":"barrel_rate","op":"gte","value":0.06} |
| context_compare | Same comparison, but for game-level context (park, weather, bullpen). Kept distinct so the palette can group it. | field, op, value, value2, na | {"type":"context_compare","field":"wind_mph","op":"gte","value":8.5} |
| percentile_compare | Compare a field to its percentile across today’s slate, e.g. barrel rate in the top 10%. | field, op, value, na | {"type":"percentile_compare","field":"barrel_rate","op":"gte","value":0.9} |
| window_count | Count an event over any window of recent games, "HR in the last 7", "strikeouts in the last 4". The window is a parameter, not a fixed field, and is computed from the player’s real game log. Defaults to requiring a full window, because a count over three games is not comparable to one over seven. | stat, window, op, value, value2, min_games, na | {"type":"window_count","stat":"hr","window":7,"op":"gte","value":2} |
| window_rate | A rate over any window of recent games. AVG over the last 12, K rate over the last 5 starts. Gated on the denominator (AB / PA / batters faced) rather than the game count, because that is what makes a rate trustworthy. | stat, window, op, value, value2, min_denom, na | {"type":"window_rate","stat":"avg","window":12,"op":"gte","value":0.28} |
| window_streak | Consecutive recent games with an event ("hit streak ≥ 5"), or games since it last happened ("no HR in 12 games"). Counted back from the most recent game. | stat, mode, op, value, na | {"type":"window_streak","stat":"h","mode":"streak","op":"gte","value":5} |
| sample_gate | Require a minimum sample behind a stat before the row qualifies. | field, value | {"type":"sample_gate","field":"pa_l30","value":40} |
| lineup_status | Allow only projected, only confirmed, or both. A pitcher row is "confirmed" once the order he faces is posted. | allow | {"type":"lineup_status","allow":["confirmed"]} |
| batting_order | Filter by lineup slot, 1–9. | op, value, value2 | {"type":"batting_order","op":"lte","value":5} |
| presence | Require a field to be measured (or explicitly missing) without testing its value. | field, present | {"type":"presence","field":"barrel_rate","present":true} |
| odds_available | Require a market to exist for this player. | market, present | {"type":"odds_available","market":"homeruns","present":true} |
| odds_range | Filter on the American price for a market side. | market, side, op, value, value2, na | {"type":"odds_range","market":"homeruns","side":"over","op":"between","value":-120,"value2":400} |
| odds_line | Filter on the posted line (e.g. total bases 1.5). | market, op, value, value2, na | {"type":"odds_line","market":"bases","op":"lte","value":1.5} |
| implied_prob | Book-implied probability from the posted price (vig included). Market data, not a Slatery model number. | market, side, op, value, value2, na | {"type":"implied_prob","market":"hits","side":"over","op":"lte","value":0.6} |
| team_is | Restrict to specific teams, or to home / away only. | teams, side | {"type":"team_is","side":"home"} |
| venue_is | Filter on roofed/domed parks and the sky condition. The weather feed reports outdoor readings even for roofed parks, so this is the honest way to drop indoor games from a wind or temperature screen. | dome, conditions | {"type":"venue_is","dome":"no"} |
| hand_is | Filter on the batter’s side (or the pitcher’s throwing hand), and optionally the platoon matchup. | hand, oppHand | {"type":"hand_is","hand":["L"]} |
| logic_group | Combine child blocks. Nesting is limited to 2 levels deep. | op, children | {"op":"or","children":[]} |
| comment | A methodology note. Never affects evaluation. | text | {"type":"comment","text":"Loosen the barrel gate in cold weather."} |
Rolling windows
Window blocks (window_count, window_rate, window_streak) do not take a field id. They take a stat and a window. A number of recent games from 1 to 25, and are computed from the player's real game-by-game log rather than from a precomputed column. That is why there is no hr_l7 field: {"type":"window_count","stat":"hr","window":7} is the same question with the window as a parameter.
Counts default to requiring a full window: a player with two games logged reports NA for "HR in the last 7" rather than a count of zero, because those are not the same measurement. Override with min_games.
Rates gate on their own denominator instead (at-bats, plate appearances, batters faced), because a rate already normalises for opportunity. Override with min_denom. A batter with zero at-bats has no average, not an average of .000.
| entity | stat | Counting stat |
|---|
| Batters | h | Hits |
| Batters | hr | Home runs |
| Batters | tb | Total bases |
| Batters | bb | Walks |
| Batters | so | Strikeouts |
| Batters | ab | At-bats |
| Batters | pa | Plate appearances |
| Starting pitchers | so | Strikeouts |
| Starting pitchers | h | Hits allowed |
| Starting pitchers | hr | HR allowed |
| Starting pitchers | bb | Walks allowed |
| Starting pitchers | er | Earned runs |
| Starting pitchers | bf | Batters faced |
| Starting pitchers | outs | Outs recorded |
| entity | stat | Rate | Denominator | Default minimum |
|---|
| Batters | avg | Batting average | AB | 10 |
| Batters | slg | Slugging | AB | 10 |
| Batters | h_pa | Hits per PA | PA | 10 |
| Batters | hr_pa | HR per PA | PA | 10 |
| Batters | k_pa | Strikeout rate | PA | 10 |
| Batters | bb_pa | Walk rate | PA | 10 |
| Starting pitchers | k_bf | K rate (per batter faced) | BF | 20 |
| Starting pitchers | k9 | K per 9 | OUTS | 15 |
| Starting pitchers | h9 | Hits per 9 | OUTS | 15 |
| Starting pitchers | hr9 | HR per 9 | OUTS | 15 |
| Starting pitchers | bb9 | Walks per 9 | OUTS | 15 |
| Starting pitchers | era | ERA | OUTS | 15 |
| Starting pitchers | ip_per_start | Innings per start | games | 1 |
| entity | stat | Streak event |
|---|
| Batters | h | a hit |
| Batters | hr | a home run |
| Batters | bb | a walk |
| Batters | so | a strikeout |
| Starting pitchers | hr | a HR allowed |
| Starting pitchers | er | an earned run |
| Starting pitchers | bb | a walk allowed |
A window can also be scored on. Advanced Mode terms accept the reserved field id w:count:<stat>:<n> or w:rate:<stat>:<n>, for example w:rate:k9:10 is K/9 over the last 10 starts. These are ranked against the whole slate exactly like any catalog field.
Operators & transforms
| op | Meaning |
|---|
| gte | ≥. at least |
| gt | >. more than |
| lte | ≤. at most |
| lt | <. less than |
| eq | =. exactly |
| neq | ≠. not |
| between | between. between (needs value2) |
| transform | Meaning |
|---|
| raw | Use the number as-is. |
| z_slate | Standard deviations above the slate mean for this field. |
| percentile_slate | 0–1 rank against every other row on the slate. |
| invert | Negates the value so a lower number scores higher. |
| invert_z | Z-score, negated, for lower-is-better fields. |
A score term whose field is NA is skipped, not scored as zero. A missing Statcast sample is a data gap, not evidence of a bad hitter.
Field catalog
185 fields. The same id can mean different things per entity, barrel_rate is contact quality on a batter row and barrels allowed on a pitcher row, so always check the entity column.
Batter Form
| field | Entity | Description | Direction |
|---|
| ops_split | batters | On-base plus slugging over the last 30 days, regressed for small samples.also: ops, on base plus slugging, regressed ops | higher is better |
| ops_l3 | batters | On-base plus slugging over the last 3 games.also: ops last 3, hot bat, recent ops | higher is better |
| avg_l7 | batters | Batting average over the last 7 games.also: batting average last 7, avg last week | higher is better |
| avg_l20 | batters | Batting average over the last 20 games.also: batting average last 20, baseline average | higher is better |
| streak_delta | batters | AVG L7 minus AVG L20. Positive means heating up.also: heating up, trend, hot cold, form delta | higher is better |
| hr_l5 | batters | Home runs hit in the batter’s last 5 games.also: home runs last 5, recent power, hr l5 | higher is better |
| hits_l3 | batters | Hits in the batter’s last 3 games.also: hits last 3, recent hits | higher is better |
| h_pa | batters | Hits divided by plate appearances over the last 30 days.NA when the batter had no plate appearances in the window.also: h/pa, hits per plate appearance | higher is better |
| hr_pa | batters | Home runs divided by plate appearances over the last 30 days.NA when the batter had no plate appearances in the window.also: hr/pa, home run rate | higher is better |
| h_pa_vs_hand | batters | Career hits per PA against this starter’s throwing hand (regressed under 15 PA).NA when the starter’s hand is unknown.also: h/pa vs hand, platoon hits, vs lefty, vs righty | higher is better |
| ab_pg_l20 | batters | Average at-bats per game over the last 20 games. A proxy for opportunity.also: at bats per game, opportunity, volume | higher is better |
Batter Statcast
| field | Entity | Description | Direction |
|---|
| xwoba | batters | Expected weighted on-base average from batted-ball quality.NA when the batter has no recent tracked batted balls.also: expected woba, xwoba, quality of contact | higher is better |
| xwoba_split | batters | Expected wOBA against the opposing starter’s throwing hand.NA when the starter’s hand is unknown or the split has no sample.also: xwoba split, xwoba vs lefty, xwoba vs righty, platoon xwoba | higher is better |
| barrel_rate | batters | Share of batted balls hit at the ideal exit-velocity / launch-angle combination.NA when the batter has no recent tracked batted balls.also: barrel, barrels, barrel %, power quality | higher is better |
| hardhit_rate | batters | Share of batted balls at 95+ mph exit velocity.NA when the batter has no recent tracked batted balls.also: hard hit, hardhit, exit velocity, ev | higher is better |
| vs_fb_xwoba | batters | Expected wOBA against four-seams, sinkers, cutters.also: vs fastball, fb xwoba, heater | higher is better |
| vs_fb_whiff | batters | Swing-and-miss rate against fastballs.also: fastball whiff, swing miss fastball | lower is better |
| vs_br_xwoba | batters | Expected wOBA against sliders, curves, sweepers.also: vs breaking, slider curve, br xwoba | higher is better |
| vs_br_whiff | batters | Swing-and-miss rate against breaking balls.also: breaking whiff, slider whiff | lower is better |
| vs_os_xwoba | batters | Expected wOBA against changeups, splitters.also: vs offspeed, changeup, os xwoba | higher is better |
| vs_os_whiff | batters | Swing-and-miss rate against offspeed pitches.also: offspeed whiff, changeup whiff | lower is better |
Opposing Starter
| field | Entity | Description | Direction |
|---|
| opp_sp_fip | batters | Fielding-independent pitching for the opposing starter over 15 starts.NA when the starter has no prior game logs (the report substitutes league averages there).also: opposing pitcher fip, starter fip, sp fip | lower is better |
| opp_sp_last_5_era | batters | Earned run average for the opposing starter over 5 starts.NA when the starter has no prior game logs.also: opposing era, starter era, sp era | lower is better |
| opp_sp_h_bf | batters | Hits allowed per batter faced by the opposing starter (L15).also: hits per batter faced, h/bf, hittable | lower is better |
| opp_sp_hr_bf | batters | Home runs allowed per batter faced by the opposing starter (L15).also: home runs per batter faced, hr/bf, homer prone | higher is better |
| opp_sp_hr_game | batters | Home runs allowed per start by the opposing starter (L15).also: hr per game allowed, homers allowed | higher is better |
| opp_sp_h_game | batters | Hits allowed per start by the opposing starter (L15).also: hits per game allowed | lower is better |
| opp_sp_h_ip | batters | Hits allowed per inning by the opposing starter (L15).also: hits per inning, whip-ish | lower is better |
| opp_sp_hr_ip | batters | Home runs allowed per inning by the opposing starter (L15).also: hr per inning | higher is better |
| opp_sp_hr_allowed_l5 | batters | Total home runs the opposing starter has allowed in 5 starts.also: homers allowed last 5, hr allowed | higher is better |
| opp_sp_barrel_rate | batters | Barrel rate the opposing starter allows.also: barrels allowed, sp barrel | higher is better |
| opp_sp_hardhit_rate | batters | Hard-hit rate the opposing starter allows.also: hard hit allowed, sp hardhit | higher is better |
| opp_sp_whiff_rate | batters | Swing-and-miss rate the opposing starter generates.also: opposing whiff, sp whiff, strikeout stuff | lower is better |
| opp_sp_runs_allowed_avg | batters | Average earned runs the opposing starter has allowed per start.also: runs allowed average | higher is better |
| opp_sp_h_bf_vs_hand | batters | Hits per batter faced the starter allows to this batter’s side (L15). Switch hitters resolved.NA when the starter’s splits are unavailable or the batter’s side is unknown.also: platoon hits allowed, h/bf vs hand, split hits | lower is better |
| opp_sp_h_bf_szn_vs_hand | batters | Season-long hits per batter faced against this batter’s side. The Hits wizard input.NA when the starter’s splits are unavailable or the batter’s side is unknown.also: season split hits, h/bf season vs hand | lower is better |
| opp_sp_hr_bf_vs_hand | batters | Home runs per batter faced allowed to this batter’s side.also: platoon hr allowed, split home runs | higher is better |
| opp_sp_hr_game_vs_hand | batters | Home runs per start allowed to this batter’s side.also: split hr per game | higher is better |
| opp_sp_hr_ip_vs_hand | batters | Home runs per inning allowed to this batter’s side.also: split hr per inning | higher is better |
| opp_sp_h_ip_vs_hand | batters | Hits per inning allowed to this batter’s side.also: split hits per inning | lower is better |
| opp_sp_h_game_vs_hand | batters | Hits per start allowed to this batter’s side.also: split hits per game | lower is better |
| opp_sp_hr_l5_vs_hand | batters | Home runs the starter has allowed to this batter’s side in 5 starts.also: split hr last 5 | higher is better |
| opp_sp_xwoba_vs_hand | batters | Expected wOBA the starter allows to this batter’s side.also: split xwoba allowed | higher is better |
| opp_sp_whiff_vs_hand | batters | Swing-and-miss rate the starter generates against this batter’s side.also: split whiff | lower is better |
Pitcher Form
| field | Entity | Description | Direction |
|---|
| fip | starting pitchers | Fielding-independent pitching over the last 15 starts.NA when the pitcher has no prior game logs.also: fielding independent, fip | lower is better |
| last_5_era | starting pitchers | Earned run average over the last 5 starts.NA when the pitcher has no prior game logs.also: era last 5, recent era | lower is better |
| h_bf | starting pitchers | Hits allowed per batter faced.also: hits per batter faced | lower is better |
| h_ip | starting pitchers | Hits allowed per inning.also: hits per inning | lower is better |
| h_game | starting pitchers | Hits allowed per start.also: hits per start | lower is better |
| hr_bf | starting pitchers | Home runs allowed per batter faced.also: hr per batter faced | lower is better |
| hr_ip | starting pitchers | Home runs allowed per inning.also: hr per inning | lower is better |
| hr_game | starting pitchers | Home runs allowed per start.also: hr per start | lower is better |
| hr_allowed_l5 | starting pitchers | Total home runs allowed over 5 starts.also: homers allowed last 5 | lower is better |
| runs_allowed_avg | starting pitchers | Average earned runs allowed per start.also: runs allowed average | lower is better |
| h_bf_vL | starting pitchers | Hits per batter faced allowed to lefties.NA when the pitcher has no measured splits.also: split hits vs lefty | lower is better |
| h_bf_vR | starting pitchers | Hits per batter faced allowed to righties.NA when the pitcher has no measured splits.also: split hits vs righty | lower is better |
| h_bf_vL_szn | starting pitchers | Season-long hits per batter faced allowed to lefties.also: season split vs lefty | lower is better |
| h_bf_vR_szn | starting pitchers | Season-long hits per batter faced allowed to righties.also: season split vs righty | lower is better |
| hr_bf_vL | starting pitchers | Home runs per batter faced allowed to lefties.also: hr split vs lefty | lower is better |
| hr_bf_vR | starting pitchers | Home runs per batter faced allowed to righties.also: hr split vs righty | lower is better |
| hr_l5_vL | starting pitchers | Home runs allowed to lefties over 5 starts.also: hr last 5 vs lefty | lower is better |
| hr_l5_vR | starting pitchers | Home runs allowed to righties over 5 starts.also: hr last 5 vs righty | lower is better |
| h_ip_vL | starting pitchers | Hits per inning allowed to lefties.also: hits per inning vs lefty | lower is better |
| h_ip_vR | starting pitchers | Hits per inning allowed to righties.also: hits per inning vs righty | lower is better |
| hr_ip_vL | starting pitchers | Home runs per inning allowed to lefties.also: hr per inning vs lefty | lower is better |
| hr_ip_vR | starting pitchers | Home runs per inning allowed to righties.also: hr per inning vs righty | lower is better |
| h_game_vL | starting pitchers | Hits per start allowed to lefties.also: hits per game vs lefty | lower is better |
| h_game_vR | starting pitchers | Hits per start allowed to righties.also: hits per game vs righty | lower is better |
| hr_game_vL | starting pitchers | Home runs per start allowed to lefties.also: hr per game vs lefty | lower is better |
| hr_game_vR | starting pitchers | Home runs per start allowed to righties.also: hr per game vs righty | lower is better |
Pitcher Statcast
| field | Entity | Description | Direction |
|---|
| whiff_rate | starting pitchers | Swing-and-miss rate generated.also: whiff, swinging strike, swing and miss, stuff | higher is better |
| barrel_rate | starting pitchers | Barrel rate allowed on batted balls.also: barrels allowed | lower is better |
| hardhit_rate | starting pitchers | Hard-hit rate allowed on batted balls.also: hard hit allowed | lower is better |
| vL_xwoba | starting pitchers | Expected wOBA allowed to left-handed batters.also: vs lefty xwoba, lhb xwoba | lower is better |
| vR_xwoba | starting pitchers | Expected wOBA allowed to right-handed batters.also: vs righty xwoba, rhb xwoba | lower is better |
| vL_whiff | starting pitchers | Swing-and-miss rate against left-handed batters.also: whiff vs lefty, lhb whiff | higher is better |
| vR_whiff | starting pitchers | Swing-and-miss rate against right-handed batters.also: whiff vs righty, rhb whiff | higher is better |
Lineup Faced
| field | Entity | Description | Direction |
|---|
| opp_lineup_avg_xwoba | starting pitchers | Mean xwOBA of the batting order this starter faces (NA members skipped).also: opposing lineup quality, lineup xwoba | lower is better |
| opp_lineup_avg_barrel | starting pitchers | Mean barrel rate of the batting order this starter faces.also: lineup power, lineup barrel | lower is better |
| opp_lineup_avg_ops | starting pitchers | Mean regressed OPS of the batting order this starter faces.also: lineup ops, lineup strength | lower is better |
| opp_lineup_lhb_count | starting pitchers | Number of batters facing this starter from the left side (switch hitters resolved).also: lefties faced, lhb, handedness mix | higher is better |
| opp_lineup_rhb_count | starting pitchers | Number of batters facing this starter from the right side.also: righties faced, rhb, handedness mix | higher is better |
Our Side
| field | Entity | Description | Direction |
|---|
| sp_fip | teams | Fielding-independent pitching.also: our starter,, fip, fip | lower is better |
| sp_last_5_era | teams | Earned-run average over the last five starts.also: our starter,, era l5, last 5 era | lower is better |
| sp_whiff_rate | teams | Share of swings missed.also: our starter,, whiff rate, whiff rate | higher is better |
| sp_barrel_rate | teams | Share of batted balls allowed that were barrelled.also: our starter,, barrel rate allowed, barrel rate | lower is better |
| sp_hardhit_rate | teams | Share of batted balls allowed at 95+ mph.also: our starter,, hard-hit rate allowed, hardhit rate | lower is better |
| sp_h_bf | teams | Hits allowed divided by batters faced.also: our starter,, hits per batter faced, h bf | lower is better |
| sp_h_ip | teams | Hits allowed per inning pitched.also: our starter,, hits per inning, h ip | lower is better |
| sp_h_game | teams | Average hits allowed per start.also: our starter,, hits per start, h game | lower is better |
| sp_hr_bf | teams | Home runs allowed divided by batters faced.also: our starter,, hr per batter faced, hr bf | lower is better |
| sp_hr_ip | teams | Home runs allowed per inning pitched.also: our starter,, hr per inning, hr ip | lower is better |
| sp_hr_game | teams | Average home runs allowed per start.also: our starter,, hr per start, hr game | lower is better |
| sp_hr_allowed_l5 | teams | Home runs allowed over the last five starts.also: our starter,, hr allowed l5, hr allowed l5 | lower is better |
| sp_runs_allowed_avg | teams | Average runs allowed per start.also: our starter,, runs allowed per start, runs allowed avg | lower is better |
| sp_ip_l5 | teams | Innings pitched over the last five starts. Workload, and how early the pen is exposed.also: our starter,, innings l5, ip l5 | higher is better |
| sp_ip_l15 | teams | Innings pitched over the last fifteen starts.also: our starter,, innings l15, ip l15 | higher is better |
| own_bp_health_index | teams | Composite freshness score for the pen. Higher is fresher.also: our bullpen,, bullpen health, health index | higher is better |
| own_bp_era_l10 | teams | Relief earned-run average over the last ten days.also: our bullpen,, bullpen era l10, era l10 | lower is better |
| own_bp_fip_l10 | teams | Relief fielding-independent pitching over the last ten days.also: our bullpen,, bullpen fip l10, fip l10 | lower is better |
| own_bp_fatigue_l3 | teams | Share of the pen used in the last three days. Higher is more tired.also: our bullpen,, bullpen fatigue l3, fatigue l3 | lower is better |
| own_bp_ready_count | teams | How many relievers are available tonight.also: our bullpen,, fresh arms, ready count | higher is better |
| own_bp_arm_count | teams | How many relievers are on the staff.also: our bullpen,, bullpen size, arm count | higher is better |
| own_bp_available_era | teams | Earned-run average of only the arms who can pitch tonight.also: our bullpen,, available-arm era, available era | lower is better |
| own_bp_available_fip | teams | Fielding-independent pitching of only the arms who can pitch tonight.also: our bullpen,, available-arm fip, available fip | lower is better |
| own_bp_best_available_fip | teams | FIP of the single best reliever who can pitch tonight.also: our bullpen,, best available arm fip, best available fip | lower is better |
| own_lineup_avg_xwoba | teams | Average expected weighted on-base average across the posted order.also: our order,, lineup xwoba, avg xwoba | higher is better |
| own_lineup_avg_barrel | teams | Average barrel rate across the posted order.also: our order,, lineup barrel rate, avg barrel | higher is better |
| own_lineup_avg_ops | teams | Average regressed OPS across the posted order.also: our order,, lineup ops, avg ops | higher is better |
| own_lineup_lhb_count | teams | How many left-handed bats the order fields against tonight’s starter.also: our order,, left-handed bats, lhb count | higher is better |
| own_lineup_rhb_count | teams | How many right-handed bats the order fields against tonight’s starter.also: our order,, right-handed bats, rhb count | higher is better |
Their Side
| field | Entity | Description | Direction |
|---|
| opp_sp_fip | teams | Fielding-independent pitching.also: their starter,, fip, fip | lower is better |
| opp_sp_last_5_era | teams | Earned-run average over the last five starts.also: their starter,, era l5, last 5 era | lower is better |
| opp_sp_whiff_rate | teams | Share of swings missed.also: their starter,, whiff rate, whiff rate | higher is better |
| opp_sp_barrel_rate | teams | Share of batted balls allowed that were barrelled.also: their starter,, barrel rate allowed, barrel rate | lower is better |
| opp_sp_hardhit_rate | teams | Share of batted balls allowed at 95+ mph.also: their starter,, hard-hit rate allowed, hardhit rate | lower is better |
| opp_sp_h_bf | teams | Hits allowed divided by batters faced.also: their starter,, hits per batter faced, h bf | lower is better |
| opp_sp_h_ip | teams | Hits allowed per inning pitched.also: their starter,, hits per inning, h ip | lower is better |
| opp_sp_h_game | teams | Average hits allowed per start.also: their starter,, hits per start, h game | lower is better |
| opp_sp_hr_bf | teams | Home runs allowed divided by batters faced.also: their starter,, hr per batter faced, hr bf | lower is better |
| opp_sp_hr_ip | teams | Home runs allowed per inning pitched.also: their starter,, hr per inning, hr ip | lower is better |
| opp_sp_hr_game | teams | Average home runs allowed per start.also: their starter,, hr per start, hr game | lower is better |
| opp_sp_hr_allowed_l5 | teams | Home runs allowed over the last five starts.also: their starter,, hr allowed l5, hr allowed l5 | lower is better |
| opp_sp_runs_allowed_avg | teams | Average runs allowed per start.also: their starter,, runs allowed per start, runs allowed avg | lower is better |
| opp_sp_ip_l5 | teams | Innings pitched over the last five starts. Workload, and how early the pen is exposed.also: their starter,, innings l5, ip l5 | higher is better |
| opp_sp_ip_l15 | teams | Innings pitched over the last fifteen starts.also: their starter,, innings l15, ip l15 | higher is better |
| opp_bp_health_index | teams | Composite freshness score for the pen. Higher is fresher.also: their bullpen,, bullpen health, health index | higher is better |
| opp_bp_era_l10 | teams | Relief earned-run average over the last ten days.also: their bullpen,, bullpen era l10, era l10 | lower is better |
| opp_bp_fip_l10 | teams | Relief fielding-independent pitching over the last ten days.also: their bullpen,, bullpen fip l10, fip l10 | lower is better |
| opp_bp_fatigue_l3 | teams | Share of the pen used in the last three days. Higher is more tired.also: their bullpen,, bullpen fatigue l3, fatigue l3 | lower is better |
| opp_bp_ready_count | teams | How many relievers are available tonight.also: their bullpen,, fresh arms, ready count | higher is better |
| opp_bp_arm_count | teams | How many relievers are on the staff.also: their bullpen,, bullpen size, arm count | higher is better |
| opp_bp_available_era | teams | Earned-run average of only the arms who can pitch tonight.also: their bullpen,, available-arm era, available era | lower is better |
| opp_bp_available_fip | teams | Fielding-independent pitching of only the arms who can pitch tonight.also: their bullpen,, available-arm fip, available fip | lower is better |
| opp_bp_best_available_fip | teams | FIP of the single best reliever who can pitch tonight.also: their bullpen,, best available arm fip, best available fip | lower is better |
| opp_lineup_avg_xwoba | teams | Average expected weighted on-base average across the posted order.also: their order,, lineup xwoba, avg xwoba | higher is better |
| opp_lineup_avg_barrel | teams | Average barrel rate across the posted order.also: their order,, lineup barrel rate, avg barrel | higher is better |
| opp_lineup_avg_ops | teams | Average regressed OPS across the posted order.also: their order,, lineup ops, avg ops | higher is better |
| opp_lineup_lhb_count | teams | How many left-handed bats the order fields against tonight’s starter.also: their order,, left-handed bats, lhb count | higher is better |
| opp_lineup_rhb_count | teams | How many right-handed bats the order fields against tonight’s starter.also: their order,, right-handed bats, rhb count | higher is better |
Bullpen
| field | Entity | Description | Direction |
|---|
| opp_bp_health_index | batters | Composite 0–100 freshness/quality score for the bullpen the batter’s team will face.also: bullpen health, pen strength, tired pen | lower is better |
| opp_bp_era_l10 | batters | Bullpen earned run average over the last 10 games.also: bullpen era, pen era | higher is better |
| opp_bp_fip_l10 | batters | Bullpen fielding-independent pitching over the last 10 games.also: bullpen fip | higher is better |
| opp_bp_fatigue_l3 | batters | Bullpen workload over the last 3 team games (batters faced). Typically 100-330; higher means more used up.also: bullpen fatigue, overworked pen, gassed | higher is better |
| opp_bp_ready_count | batters | Relievers at 70%+ freshness tonight.also: fresh arms, available arms, ready count, rested relievers | lower is better |
| opp_bp_available_era | batters | Mean ERA of only the arms that are fresh tonight.NA when no arm clears the freshness bar.also: available era, fresh arm quality | higher is better |
| opp_bp_available_fip | batters | Mean FIP of only the arms that are fresh tonight.NA when no arm clears the freshness bar.also: available fip | higher is better |
| opp_bp_best_available_fip | batters | FIP of the single best fresh reliever available.NA when no arm clears the freshness bar.also: best arm, closer quality | higher is better |
| own_bp_health_index | starting pitchers | Composite 0–100 score for the bullpen behind this starter.also: my bullpen, pen behind me | higher is better |
| own_bp_era_l10 | starting pitchers | Earned run average of the bullpen behind this starter.also: own pen era | lower is better |
| own_bp_fatigue_l3 | starting pitchers | Workload behind this starter over the last 3 games (batters faced). Typically 100-330. A tired pen means a longer leash.also: own pen fatigue, longer leash | higher is better |
| own_bp_ready_count | starting pitchers | Fresh relievers behind this starter.also: own fresh arms | higher is better |
| own_bp_available_era | starting pitchers | Mean ERA of the fresh arms behind this starter.NA when no arm clears the freshness bar.also: own available era | lower is better |
| own_bp_fip_l10 | starting pitchers | Fielding-independent pitching of the bullpen behind this starter.also: own pen fip, bullpen fip behind me | lower is better |
| own_bp_available_fip | starting pitchers | Mean FIP of only the fresh arms behind this starter.NA when no arm clears the freshness bar.also: own available fip | lower is better |
| own_bp_best_available_fip | starting pitchers | FIP of the single best fresh reliever behind this starter.NA when no arm clears the freshness bar.also: own best arm, own closer quality | lower is better |
Park & Weather
| field | Entity | Description | Direction |
|---|
| park_hr_factor | all | Home run park factor, normalised so 1.00 is neutral.also: park factor, hr park, hitter friendly, bandbox | higher is better |
| park_run_factor | all | Run-scoring park factor, normalised so 1.00 is neutral.also: run factor, scoring park | higher is better |
| park_hr_factor_lhb | all | Home run park factor for left-handed batters.also: park lefty, short porch | higher is better |
| park_hr_factor_rhb | all | Home run park factor for right-handed batters.also: park righty | higher is better |
| park_hr_factor_vs_hand | batters | Home run park factor for the side this batter actually hits from.NA when the batter’s effective side is unknown.also: park factor my hand, handed park factor | higher is better |
| temp_f | all | First-pitch temperature. Warm air carries the ball further.Present even for roofed parks. It is the outdoor reading at the park’s coordinates. Pair with the Venue block to exclude domes.also: temperature, hot, cold, degrees | higher is better |
| wind_mph | all | First-pitch wind speed.Present even for roofed parks. It is the outdoor reading at the park’s coordinates, which does not describe indoor play. Use the Venue block to exclude domes rather than assuming wind is NA there.also: wind, breeze, blowing out, gust | higher is better |
| wind_dir | all | Compass bearing the wind blows from, 0–360.Present even for roofed parks. See wind speed.also: wind direction, bearing | higher is better |
| environment_score | all | Combined park + temperature + wind score from the weather report. Positive favours hitters.also: weather score, hitters edge, pitchers edge, conditions | higher is better |
Wizard Composites
| field | Entity | Description | Direction |
|---|
| wiz_hr_score | batters | The Lineup Slate Wizard HR preset: pitcher HR factor × batter HR factor, recomputed server-side.NA when the starter has no measured hand splits or the batter has no Statcast sample.also: hr wizard, wizard home run, hr matchup score | higher is better |
| wiz_hr_pitcher_factor | batters | The pitcher half of the HR wizard score. How homer-prone this starter is to this side.also: pitcher hr factor | higher is better |
| wiz_hr_batter_factor | batters | The batter half of the HR wizard score. This hitter’s power profile.also: batter hr factor | higher is better |
| wiz_hits_score | batters | The Lineup Slate Wizard Hits preset: batter H/PA vs hand × starter H/BF vs hand (season).NA when either side of the product is unavailable.also: hits wizard, wizard hits, hit matchup score | higher is better |
| wiz_k_score | starting pitchers | The Lineup Slate Wizard K preset: whiff rate weighted by the lineup’s handedness mix, scaled by FIP.NA when the pitcher’s splits, FIP or the opposing lineup are unavailable.also: k wizard, wizard strikeout, strikeout score | higher is better |
| wiz_k_weighted_whiff | starting pitchers | Whiff rate weighted by how many lefties/righties this starter actually faces.also: weighted whiff, lineup adjusted whiff | higher is better |
Sample Size
| field | Entity | Description | Direction |
|---|
| games_played_l30 | batters | Games in the last 30 days. Low values mean the trailing rates are stale.also: recency, games last 30, active | higher is better |
| pa_l30 | batters | Plate appearances in the last 30 days. The denominator behind the L30 rates.also: pa, sample size, plate appearances | higher is better |
| ab_l30 | batters | At-bats in the last 30 days.also: ab, at bats | higher is better |
| opp_sp_ip_l5 | batters | Innings pitched by the opposing starter over 5 starts.also: innings last 5, workload | higher is better |
| opp_sp_ip_l15 | batters | Innings pitched by the opposing starter over 15 starts. The sample behind their L15 rates.also: innings last 15, starter sample | higher is better |
| ip_l5 | starting pitchers | Innings pitched over the last 5 starts.also: workload, innings last 5 | higher is better |
| ip_l15 | starting pitchers | Innings pitched over the last 15 starts. The sample behind the L15 rates.also: innings last 15, sample | higher is better |
| opp_lineup_size | starting pitchers | How many batters are in the posted order (9 when fully confirmed).also: lineup size, order posted | higher is better |
| opp_bp_arm_count | batters | Relievers on the staff, fresh or not.also: pen size | higher is better |
| own_bp_arm_count | starting pitchers | Relievers on the staff behind this starter, fresh or not.also: own pen size | higher is better |
| own_lineup_size | teams | How many batters are posted. Below 9 means the lineup is incomplete.also: our order,, order size, size | higher is better |
| own_lineup_xwoba_n | teams | How many batters in the order actually had a measured xwOBA.also: our order,, order xwoba sample, xwoba n | higher is better |
| opp_lineup_size | teams | How many batters are posted. Below 9 means the lineup is incomplete.also: their order,, order size, size | higher is better |
| opp_lineup_xwoba_n | teams | How many batters in the order actually had a measured xwOBA.also: their order,, order xwoba sample, xwoba n | higher is better |
Sample-size fields
Used with sample_gateto require a minimum amount of evidence behind a stat. Worth adding to almost any screen: trailing rates stay on a player's record even when they have not played for weeks.
| field | Entity | Meaning |
|---|
| pa_l30 | batter | Plate appearances (L30) |
| ab_l30 | batter | At-bats (L30) |
| games_played_l30 | batter | Games played (L30) |
| pa_vs_hand | batter | Career PA vs this hand |
| opp_sp_ip_l15 | batter | Opp starter innings (L15) |
| opp_bp_arm_count | batter | Opp bullpen arm count |
| ip_l5 | pitcher | Innings (L5) |
| ip_l15 | pitcher | Innings (L15) |
| opp_lineup_size | pitcher | Batters posted in order faced |
| opp_lineup_xwoba_n | pitcher | Lineup members with xwOBA |
| own_bp_arm_count | pitcher | Own bullpen arm count |
Market odds
Odds come from the same feed the rest of the site quotes, preferring DraftKings, then FanDuel, BetMGM, bet365, Caesars. Player prop coverage in this feed is thin. Most players on a given slate have no posted price, and home runs and RBIs are quoted one-sided (an over price only, no under). Setting the odds policy to require will therefore cut a slate down hard.
| market | Sides published |
|---|
| homeruns | over only |
| hits | over and under |
| bases | over and under |
| runs | over and under |
| rbis | over only |
| strikeouts | over and under |
| er | over and under |
| ml | over only |
| run_line | over only |
| game_total | over and under |
Weather is an outdoor reading, even indoors
Temperature, wind speed and wind direction come from a forecast at the ballpark's coordinates. They are reported for every park, including domed and roofed ones, on a recent slate all 60 rows at roofed venues carried a wind speed. That number does not describe indoor play. A screen like wind_mph ≥ 8 will therefore include domed games unless you say otherwise, so pair weather filters with the venue_is block set to open air:
{"op":"and","children":[
{"type":"context_compare","field":"wind_mph","op":"gte","value":8},
{"type":"venue_is","dome":"no"}
]}Known data gaps
Statcast lag. Pitch-level data lands on a delay of a few days, so xwoba, barrel_rate and hardhit_rate reflect games up to roughly three days before today. Trailing box-score fields are current.
Thin prop coverage. Most players on a slate have no posted player prop. Home runs and RBIs are quoted one-sided (an over price only). Setting the odds policy to require a price will cut a slate down hard. On a recent slate it dropped 127 of 162 batters when requiring a hits price. That is the market, not a bug.
Recency vs staleness. Trailing rates like avg_l7stay on a player's record even if they have not played for weeks, and a player with no plate appearances in the window reports NA rather than a zero rate. Add a sample_gate on pa_l30 or games_played_l30 to any screen where that matters. Every shipped template does.
Starter templates
15 worked examples ship in the builder. Load one and edit it rather than starting from an empty canvas.
| Template | Market | Idea |
|---|
| hr_barrel_park | hr | Barrel + Park. Hitters squaring the ball up, in a park that rewards it. The plainest power screen there is. |
| hr_recent_power | hr | Recent power. Bats that have already gone deep lately and are still making contact. Form, not projection. |
| hr_wind_order | hr | Wind + top of order. Extra plate appearances at the top of the order, with the ball carrying. Wind is NA in domes, so domes drop out. |
| hr_wizard_port | hr | Lineup Wizard: HR preset. The Lineup Report HR wizard, rebuilt as an editable playbook. Scores on the same pitcher-HR-factor × batter-HR-factor composite, with the handedness split resolved server-side. |
| hr_pen_fatigue | hr | Tired pen + power. Power bats against a bullpen with few fresh arms. The late innings are where a thin pen shows up. |
| hits_contact | hits | Contact form. Hot bats by trailing average. The simplest hits screen, with a recency gate so stale lines cannot sneak in. |
| hits_xwoba | hits | Quality of contact. Expected-stat form rather than results. XwOBA and hits-per-PA against this starter’s hand. |
| hits_wizard_port | hits | Lineup Wizard: Hits preset. The Lineup Report Hits wizard as a playbook: batter H/PA vs this starter’s hand × the starter’s season H/BF vs this batter’s side. |
| hits_order_volume | hits | Order + volume. Opportunity first: top-of-order bats with high at-bats per game, facing a starter who gives hits up. |
| hits_odds_band | hits | Priced hits band. Only players with a hits price posted, inside a chosen band. Note the feed carries hits prices for very few players. |
| k_whiff_fip | k | Whiff + FIP. Swing-and-miss stuff behind a decent FIP. The baseline strikeout screen. |
| k_wizard_port | k | Lineup Wizard: K preset. The Lineup Report K wizard as a playbook: whiff rate weighted by how many lefties and righties this starter actually faces, scaled by FIP. |
| k_vs_weak_lineup | k | Weak lineup faced. Strikeout arms against the softest batting orders on the slate, once the order is actually posted. |
| k_platoon_edge | k | Platoon whiff edge. Starters whose better whiff side matches the majority of the order they face. A handedness mismatch screen. |
| k_workhorse | k | Workhorse innings. Strikeouts need innings. Starters going deep, with a rested pen behind them so the leash is longer. |
Missing a block you need? The catalog grows from requests. Tell us the stat, the window and what you would screen for with it. Back to the builder.