POSTERIOR · PUBLIC RECORD
Data

Open model ledger.

A public record of Posterior's resolved MLB model entries: model probability, no-vig consensus, market gap, grade, outcome, and model version. The public ledger is the receipt. It is not the real-time feed.

Posterior publishes resolved and voided model entries after settlement. Live entries, pending rows, book-by-book movement, and full signal attribution remain inside the subscriber almanac and API.

Public entries
3,039
since 2026-05-20
Resolved
2,933
106 voided
Live slate
Gated
subscriber + API
STRONG win rate
52.2%
216/414
Download

Optional filter: ?season=2026 · public release delay: 24 hours after settlement

Schema

Simplified audit schema, no nested data, parses in pandas.read_csv.

ColumnNotes
predictionIdStable public ID for the model entry
predictedAtISO timestamp when the model entry was filed
gameDateISO date (YYYY-MM-DD) the game was scheduled for
seasonYear integer
playerNamePlayer, pitcher, team, or market subject
teamNameTeam at publish time when applicable
marketPublic market label such as 1+ hits or strikeout over
gradeSTRONG | LEAN | WATCH | SKIP
statuswon | lost | voided
actualHitsResolved hit count when the market is hit-based
modelProbabilityCalibrated model probability, 0-1
consensusProbabilityDelayed no-vig market consensus probability, 0-1
marketGapmodelProbability minus consensusProbability
entryDecimalDecimal odds captured at entry
closingDecimalClosing decimal odds when available
closingMovementResolved closing movement metric when available
modelVersionModel version label used for the entry
calibrationVersionCalibration version label used for the entry
releasedAtTimestamp when this entry became eligible for the public ledger
How to use

A 30-second example

import pandas as pd

df = pd.read_csv(
    "https://posterior.pro/data/picks.csv",
    comment="#",
)

resolved = df[df.status.isin(["won", "lost"])].copy()
resolved["actually_won"] = (resolved.status == "won").astype(int)
resolved["bucket"] = (resolved.modelProbability * 10).astype(int) / 10

calibration = resolved.groupby("bucket").agg(
    n=("actually_won", "count"),
    predicted=("modelProbability", "mean"),
    actual=("actually_won", "mean"),
)
print(calibration)

strong = resolved[resolved.grade == "STRONG"]
print(f"STRONG hit rate: {strong.actually_won.mean():.3f}")
print(f"STRONG sample size: {len(strong)}")
License + citation

Public ledger

The delayed resolved ledger is free to use with attribution to posterior.pro. Do not imply Posterior endorses downstream analysis.

Subscriber and API exports are governed by the Terms of Service. They may not be resold, scraped, mirrored, or republished in bulk without written permission.

BibTeX

@dataset{posterior_public_ledger_2026,
  author = {{Posterior Research Desk}},
  title  = {Posterior MLB Public Model Ledger},
  year   = {2026},
  url    = {https://posterior.pro/data/picks.csv},
  note   = {Delayed resolved ledger}
}