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.
Resolved ledger →
0 rows · won, lost, and voided entries only
Full live feed →
Current slate, pending rows, book movement, and full signal attribution
Optional filter: ?season=2026 · public release delay: 24 hours after settlement
Simplified audit schema, no nested data, parses in pandas.read_csv.
| Column | Notes |
|---|---|
| predictionId | Stable public ID for the model entry |
| predictedAt | ISO timestamp when the model entry was filed |
| gameDate | ISO date (YYYY-MM-DD) the game was scheduled for |
| season | Year integer |
| playerName | Player, pitcher, team, or market subject |
| teamName | Team at publish time when applicable |
| market | Public market label such as 1+ hits or strikeout over |
| grade | STRONG | LEAN | WATCH | SKIP |
| status | won | lost | voided |
| actualHits | Resolved hit count when the market is hit-based |
| modelProbability | Calibrated model probability, 0-1 |
| consensusProbability | Delayed no-vig market consensus probability, 0-1 |
| marketGap | modelProbability minus consensusProbability |
| entryDecimal | Decimal odds captured at entry |
| closingDecimal | Closing decimal odds when available |
| closingMovement | Resolved closing movement metric when available |
| modelVersion | Model version label used for the entry |
| calibrationVersion | Calibration version label used for the entry |
| releasedAt | Timestamp when this entry became eligible for the public ledger |
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)}")
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}
}