{"sport":"mlb","slug":"willson-contreras","bio":{"fullName":"Willson Contreras","position":"1B","team":"BOS","heightInches":72,"weightLbs":240,"birthDate":"1992-05-13","rookieSeason":2016,"lastSeason":2026,"status":"ACT","externalIds":{"mlbam":"575929","chadwick":"1c0afc90","retro":"contw001","wikidata":"Q8023023"}},"draft":null,"statTables":[{"id":"batting","label":"Batting","columns":[{"key":"g"},{"key":"ab"},{"key":"r"},{"key":"h"},{"key":"doubles"},{"key":"triples"},{"key":"hr"},{"key":"rbi"},{"key":"sb"},{"key":"bb"},{"key":"so"},{"key":"avg"},{"key":"obp"},{"key":"slg"},{"key":"ops"}],"rows":[{"season":2016,"seasonType":"REG","team":"CHC","rowScope":"team","gamesPlayed":76,"values":{"g":76,"ab":252,"r":33,"h":71,"doubles":14,"triples":1,"hr":12,"rbi":35,"sb":2,"bb":26,"so":67,"avg":0.282,"obp":0.357,"slg":0.488,"ops":0.845}},{"season":2016,"seasonType":"POST","team":"CHC","rowScope":"team","gamesPlayed":17,"values":{"g":17,"ab":39,"r":4,"h":10,"doubles":2,"triples":0,"hr":1,"rbi":5,"sb":0,"bb":4,"so":10,"avg":0.256,"obp":0.326,"slg":0.385,"ops":0.711}},{"season":2017,"seasonType":"REG","team":"CHC","rowScope":"team","gamesPlayed":117,"values":{"g":117,"ab":377,"r":50,"h":104,"doubles":21,"triples":0,"hr":21,"rbi":74,"sb":5,"bb":45,"so":98,"avg":0.276,"obp":0.356,"slg":0.499,"ops":0.855}},{"season":2017,"seasonType":"POST","team":"CHC","rowScope":"team","gamesPlayed":10,"values":{"g":10,"ab":32,"r":5,"h":7,"doubles":0,"triples":0,"hr":2,"rbi":2,"sb":0,"bb":6,"so":11,"avg":0.219,"obp":0.342,"slg":0.406,"ops":0.748}},{"season":2018,"seasonType":"REG","team":"CHC","rowScope":"team","gamesPlayed":138,"values":{"g":138,"ab":474,"r":50,"h":118,"doubles":27,"triples":5,"hr":10,"rbi":54,"sb":4,"bb":53,"so":121,"avg":0.249,"obp":0.339,"slg":0.39,"ops":0.729}},{"season":2018,"seasonType":"POST","team":"CHC","rowScope":"team","gamesPlayed":1,"values":{"g":1,"ab":3,"r":0,"h":0,"doubles":0,"triples":0,"hr":0,"rbi":0,"sb":0,"bb":2,"so":0,"avg":0,"obp":0.4,"slg":0,"ops":0.4}},{"season":2019,"seasonType":"REG","team":"CHC","rowScope":"team","gamesPlayed":105,"values":{"g":105,"ab":360,"r":57,"h":98,"doubles":18,"triples":2,"hr":24,"rbi":64,"sb":1,"bb":38,"so":102,"avg":0.272,"obp":0.355,"slg":0.533,"ops":0.888}},{"season":2020,"seasonType":"REG","team":"CHC","rowScope":"team","gamesPlayed":57,"values":{"g":57,"ab":189,"r":37,"h":46,"doubles":10,"triples":0,"hr":7,"rbi":26,"sb":1,"bb":20,"so":57,"avg":0.243,"obp":0.356,"slg":0.407,"ops":0.763}},{"season":2020,"seasonType":"POST","team":"CHC","rowScope":"team","gamesPlayed":2,"values":{"g":2,"ab":4,"r":0,"h":1,"doubles":1,"triples":0,"hr":0,"rbi":0,"sb":0,"bb":1,"so":0,"avg":0.25,"obp":0.625,"slg":0.5,"ops":1.125}},{"season":2021,"seasonType":"REG","team":"CHC","rowScope":"team","gamesPlayed":128,"values":{"g":128,"ab":413,"r":61,"h":98,"doubles":20,"triples":0,"hr":21,"rbi":57,"sb":5,"bb":52,"so":138,"avg":0.237,"obp":0.34,"slg":0.438,"ops":0.778}},{"season":2022,"seasonType":"REG","team":"CHC","rowScope":"team","gamesPlayed":113,"values":{"g":113,"ab":416,"r":65,"h":101,"doubles":23,"triples":2,"hr":22,"rbi":55,"sb":4,"bb":45,"so":103,"avg":0.243,"obp":0.349,"slg":0.466,"ops":0.815}},{"season":2023,"seasonType":"REG","team":"STL","rowScope":"team","gamesPlayed":125,"values":{"g":125,"ab":428,"r":55,"h":113,"doubles":27,"triples":0,"hr":20,"rbi":67,"sb":6,"bb":51,"so":111,"avg":0.264,"obp":0.358,"slg":0.467,"ops":0.825}},{"season":2024,"seasonType":"REG","team":"STL","rowScope":"team","gamesPlayed":84,"values":{"g":84,"ab":301,"r":48,"h":79,"doubles":17,"triples":0,"hr":15,"rbi":36,"sb":4,"bb":45,"so":96,"avg":0.262,"obp":0.38,"slg":0.468,"ops":0.848}},{"season":2025,"seasonType":"REG","team":"STL","rowScope":"team","gamesPlayed":135,"values":{"g":135,"ab":490,"r":70,"h":126,"doubles":31,"triples":1,"hr":20,"rbi":80,"sb":5,"bb":44,"so":142,"avg":0.257,"obp":0.344,"slg":0.447,"ops":0.791}},{"season":2026,"seasonType":"REG","team":"BOS","rowScope":"team","gamesPlayed":130,"values":{"g":130,"ab":448,"r":68,"h":123,"doubles":21,"triples":3,"hr":27,"rbi":81,"sb":3,"bb":59,"so":135,"avg":0.275,"obp":0.386,"slg":0.516,"ops":0.902}},{"season":2026,"seasonType":"POST","team":"BOS","rowScope":"team","gamesPlayed":2,"values":{"g":2,"ab":6,"r":1,"h":2,"doubles":0,"triples":0,"hr":1,"rbi":1,"sb":0,"bb":2,"so":3,"avg":0.333,"obp":0.5,"slg":0.833,"ops":1.333}}],"careerTotals":{"REG":{"g":1208,"ab":4148,"r":594,"h":1077,"doubles":229,"triples":14,"hr":199,"rbi":629,"sb":40,"bb":478,"so":1170,"avg":0.26,"obp":0.356,"slg":0.466,"ops":0.822},"POST":{"g":32,"ab":84,"r":10,"h":20,"doubles":3,"triples":0,"hr":4,"rbi":8,"sb":0,"bb":15,"so":24,"avg":0.238,"obp":0.373,"slg":0.417,"ops":0.79}}},{"id":"advanced","label":"Advanced (League-Relative)","columns":[{"key":"ops_plus","label":"OPS+","description":"On-base plus slugging vs the player's own season+league (100 = league average). Park-unadjusted; OBP uses a consistent (H+BB)/(AB+BB) rate. Higher is better.","format":"int","higherIsBetter":true},{"key":"era_plus","label":"ERA+","description":"Earned-run average vs the player's own season+league (100 = league average). Park-unadjusted. Higher is better.","format":"int","higherIsBetter":true}],"rows":[{"season":2016,"seasonType":"REG","team":"CHC","values":{"ops_plus":128,"era_plus":null},"rowScope":"team"},{"season":2017,"seasonType":"REG","team":"CHC","values":{"ops_plus":128,"era_plus":null},"rowScope":"team"},{"season":2018,"seasonType":"REG","team":"CHC","values":{"ops_plus":101,"era_plus":null},"rowScope":"team"},{"season":2019,"seasonType":"REG","team":"CHC","values":{"ops_plus":132,"era_plus":null},"rowScope":"team"},{"season":2020,"seasonType":"REG","team":"CHC","values":{"ops_plus":98,"era_plus":null},"rowScope":"team"},{"season":2021,"seasonType":"REG","team":"CHC","values":{"ops_plus":112,"era_plus":null},"rowScope":"team"},{"season":2022,"seasonType":"REG","team":"CHC","values":{"ops_plus":121,"era_plus":null},"rowScope":"team"},{"season":2023,"seasonType":"REG","team":"STL","values":{"ops_plus":122,"era_plus":null},"rowScope":"team"},{"season":2024,"seasonType":"REG","team":"STL","values":{"ops_plus":132,"era_plus":null},"rowScope":"team"},{"season":2025,"seasonType":"REG","team":"STL","values":{"ops_plus":113,"era_plus":null},"rowScope":"team"},{"season":2026,"seasonType":"REG","team":"BOS","values":{"ops_plus":146,"era_plus":null},"rowScope":"team"}],"careerTotals":{"REG":{"ops_plus":121,"era_plus":null}},"advancedMeta":{"method":"computed in-house from MLB StatsAPI season batting/pitching lines, normalized to each player's own (season, league) baseline","formulas":{"era_plus":"100 * lgERA / playerERA (league ERA = 9 * ΣER / ΣIP over the season+league)","ops_plus":"100 * (OBP/lgOBP + SLG/lgSLG - 1)","career_era_plus":"innings-weighted league ERA / career ERA (B-Ref method)","career_ops_plus":"AB-weighted OBP & SLG against AB-weighted league rates"},"caveats":["PARK-UNADJUSTED: no park-factor data exists in the corpus, so these are league-relative but not park-adjusted (true B-Ref ERA+/OPS+ also divide by a park factor)","OBP baseline uses a consistent (H+BB)/(AB+BB) reached-base rate for BOTH player and league — the source feed carries no HBP or SF, so this is not the full (H+BB+HBP)/(AB+BB+HBP+SF) OBP; SLG is exact from the hit-type columns","league resolved from team code + season (most-recently-founded franchise existing by that season); the same resolver builds the baseline and looks up the player, so ratios stay internally coherent","a (season, league) bucket below the sample floor (3000 AB batting / 1000 IP pitching) yields null — no noisy baselines","regular season only; postseason lines are excluded from league baselines and metrics","AL and NL and each historical/Negro league are normalized separately — never blended across leagues or eras"]}}],"dataSources":["MLB StatsAPI (statsapi.mlb.com — official public league API; facts only, raw payloads not republished)"],"generatedAt":"2026-10-12T23:01:24.267Z"}