ProofOdds

44 entries · SHA-256 chain · OpenTimestamps

The ledger

One entry per publication day. Each carries the hash of the entry before it, so the whole history is a chain: change any past prediction without rebuilding every later hash and verification fails, visibly, right here.

Chain intact across all 44 entries Head: a7a2e22aa9c27e3ded8b4e39187480a0d14c00bce69d2469cb116f25f10026d1
Proof files start with the entry published 2026-08-28 2 earlier entries are explicitly chain-only. Of 42 proofs, status is 42 with a Bitcoin block attestation and 0 pending.

Verify it yourself

The raw files are served unmodified and the repository is public. Nothing here asks you to take our word for anything.

Published Matches Entry hash Links to Generator Divisions sealed External time Raw
2026-10-11 00:08 160 a7a2e22aa9c27e3ded8b… 417302f61642… 9140473e72 17/23
  • E2 E3 EC SC1 SC2 SC3 — fixture feed is stale for this division — its newest row in football-data.co.uk fixtures.csv is 2026-10-10, before 2026-10-11 (file newest 2026-10-12)
Attestation: block 970851 2026-10-11.json
2026-10-10 00:08 277 417302f61642d73a1fc9… 68673dd3eef0… 417b262c1a 23/23 Attestation: block 970698 2026-10-10.json
2026-10-09 00:13 148 68673dd3eef09ae51ca4… e506cf7f712e… 6b0516d4d9
+ local changes
9/23
  • E2 E3 EC SP2 I2 D2 F2 B1 SC0 SC1 SC2 SC3 T1 G1 — fixture feed is stale — football-data.co.uk fixtures.csv has 46 rows, newest 2026-10-05, nothing on or after 2026-10-09
Attestation: block 970553 2026-10-09.json
2026-10-08 00:11 96 e506cf7f712eca663553… 4b121b74965a… 624450ac8d
+ local changes
8/23
  • E2 E3 EC SP2 I2 D2 F2 B1 SC0 SC1 SC2 SC3 T1 G1 — fixture feed is stale — football-data.co.uk fixtures.csv has 46 rows, newest 2026-10-05, nothing on or after 2026-10-08
  • BRA — source unreachable
Attestation: block 970412 2026-10-08.json
2026-10-07 00:09 110 4b121b74965a07396834… 67be41b4801e… c5e28ee89d
+ local changes
9/23
  • E2 E3 EC SP2 I2 D2 F2 B1 SC0 SC1 SC2 SC3 T1 G1 — fixture feed is stale — football-data.co.uk fixtures.csv has 46 rows, newest 2026-10-05, nothing on or after 2026-10-07
Attestation: block 970258 2026-10-07.json
2026-10-06 00:11 34 67be41b4801e667eb034… 502bce35c7e9… a2d71b75d1
+ local changes
2/23
  • E2 E3 EC SP2 I2 D2 F2 B1 SC0 SC1 SC2 SC3 T1 G1 — fixture feed is stale — football-data.co.uk fixtures.csv has 46 rows, newest 2026-10-05, nothing on or after 2026-10-06
  • SP1 I1 D1 F1 P1 N1 BRA — no unplayed match in the window
Attestation: block 970103 2026-10-06.json
2026-10-05 00:08 107 502bce35c7e95840c491… 9a7dfc9cec1c… 1d3e4f6097
+ local changes
10/23
  • E2 E3 EC SC1 SC2 SC3 — fixture feed is stale for this division — its newest row in football-data.co.uk fixtures.csv is 2026-10-03, before 2026-10-05 (file newest 2026-10-05)
  • I2 D2 F2 B1 SC0 T1 G1 — fixture feed carries no row for this division — football-data.co.uk fixtures.csv is current to 2026-10-05 for other divisions
Attestation: block 969925 2026-10-05.json
2026-10-04 00:08 104 9a7dfc9cec1cf7b6ea55… ae095a0ec840… 208121d0f6
+ local changes
10/23
  • E2 E3 EC SC1 SC2 SC3 — fixture feed is stale for this division — its newest row in football-data.co.uk fixtures.csv is 2026-10-03, before 2026-10-04 (file newest 2026-10-05)
  • I2 D2 F2 B1 SC0 T1 G1 — fixture feed carries no row for this division — football-data.co.uk fixtures.csv is current to 2026-10-05 for other divisions
Attestation: block 969782 2026-10-04.json
2026-10-03 00:09 136 ae095a0ec840557ee730… dbebbb3600f1… 65931aea5f
+ local changes
16/23
  • I2 D2 F2 B1 SC0 T1 G1 — fixture feed carries no row for this division — football-data.co.uk fixtures.csv is current to 2026-10-05 for other divisions
Attestation: block 969650 2026-10-03.json
2026-10-02 00:13 62 dbebbb3600f1f27bac8c… a0f6371b604d… fce96c6ee9
+ local changes
9/23
  • E2 E3 EC SP2 I2 D2 F2 B1 SC0 SC1 SC2 SC3 T1 G1 — fixture feed is stale — football-data.co.uk fixtures.csv has 12 rows, newest 2026-09-30, nothing on or after 2026-10-02
Attestation: block 969508 2026-10-02.json
2026-10-01 00:11 19 a0f6371b604d9f1fb76f… 92dddfbcfa00… 0264380bde
+ local changes
7/23
  • E0 I1 — no unplayed match in the window
  • E2 E3 EC SP2 I2 D2 F2 B1 SC0 SC1 SC2 SC3 T1 G1 — fixture feed is stale — football-data.co.uk fixtures.csv has 12 rows, newest 2026-09-30, nothing on or after 2026-10-01
Attestation: block 969373 2026-10-01.json
2026-09-30 00:09 12 92dddfbcfa00136650eb… a4138a737ba1… f04a71dbb8
+ local changes
2/23
  • E0 E1 SP1 I1 D1 F1 P1 N1 — no unplayed match in the window
  • E2 E3 SP2 I2 D2 F2 B1 SC0 SC1 SC2 SC3 T1 G1 — fixture feed carries no row for this division — football-data.co.uk fixtures.csv is current to 2026-09-30 for other divisions
Attestation: block 969230 2026-09-30.json
2026-09-29 00:08 7 a4138a737ba1365afe5b… d9a74bfa6962… 069e781c3e
+ local changes
1/23
  • E0 E1 SP1 I1 D1 F1 P1 N1 — no unplayed match in the window
  • E2 E3 EC SP2 I2 D2 F2 B1 SC0 SC1 SC2 SC3 T1 G1 — fixture feed is stale — football-data.co.uk fixtures.csv has 41 rows, newest 2026-09-28, nothing on or after 2026-09-29
Attestation: block 969072 2026-09-29.json
2026-09-28 00:09 3 d9a74bfa6962a30cab8c… b2f33ce433c8… d8b4970298
+ local changes
2/23
  • E0 E1 SP1 I1 D1 F1 P1 N1 — no unplayed match in the window
  • E2 E3 EC — fixture feed is stale for this division — its newest row in football-data.co.uk fixtures.csv is 2026-09-26, before 2026-09-28 (file newest 2026-09-28)
  • I2 D2 F2 B1 SC0 SC2 SC3 T1 G1 — fixture feed carries no row for this division — football-data.co.uk fixtures.csv is current to 2026-09-28 for other divisions
  • SC1 — fixture feed is stale for this division — its newest row in football-data.co.uk fixtures.csv is 2026-09-25, before 2026-09-28 (file newest 2026-09-28)
Attestation: block 968908 2026-09-28.json
2026-09-27 00:08 8 b2f33ce433c8ab119703… 1ba4cd7ff517… 1867924751
+ local changes
2/23
  • E0 E1 SP1 I1 D1 F1 P1 N1 — no unplayed match in the window
  • E2 E3 EC — fixture feed is stale for this division — its newest row in football-data.co.uk fixtures.csv is 2026-09-26, before 2026-09-27 (file newest 2026-09-28)
  • I2 D2 F2 B1 SC0 SC2 SC3 T1 G1 — fixture feed carries no row for this division — football-data.co.uk fixtures.csv is current to 2026-09-28 for other divisions
  • SC1 — fixture feed is stale for this division — its newest row in football-data.co.uk fixtures.csv is 2026-09-25, before 2026-09-27 (file newest 2026-09-28)
Attestation: block 968761 2026-09-27.json
2026-09-26 00:09 38 1ba4cd7ff517430f4b48… 9f36c21cae17… 39e0cbae28
+ local changes
5/23
  • E0 E1 SP1 I1 D1 F1 P1 N1 — no unplayed match in the window
  • I2 D2 F2 B1 SC0 SC2 SC3 T1 G1 — fixture feed carries no row for this division — football-data.co.uk fixtures.csv is current to 2026-09-28 for other divisions
  • SC1 — fixture feed is stale for this division — its newest row in football-data.co.uk fixtures.csv is 2026-09-25, before 2026-09-26 (file newest 2026-09-28)
Attestation: block 968608 2026-09-26.json
2026-09-25 00:09 2 9f36c21cae17f2d59daa… 36a2ec563a77… bb74986ea8
+ local changes
1/23
  • E0 E1 SP1 I1 D1 F1 P1 N1 — no unplayed match in the window
  • E2 E3 EC SP2 I2 D2 F2 B1 SC0 SC1 SC2 SC3 T1 G1 — fixture feed is stale — football-data.co.uk fixtures.csv has 198 rows, newest 2026-09-20, nothing on or after 2026-09-25
Attestation: block 968473 2026-09-25.json
2026-09-24 00:09 1 36a2ec563a77b10ad06e… 1927d04e7ff3… ec19a3ce20 1/23
  • E0 E1 SP1 I1 D1 F1 P1 N1 — no unplayed match in the window
  • E2 E3 EC SP2 I2 D2 F2 B1 SC0 SC1 SC2 SC3 T1 G1 — fixture feed is stale — football-data.co.uk fixtures.csv has 198 rows, newest 2026-09-20, nothing on or after 2026-09-24
Attestation: block 968333 2026-09-24.json
2026-09-20 00:10 62 1927d04e7ff3b854584e… 68548eb594ef… ed3908eeed 16/23
  • E2 E3 EC F2 SC1 SC2 SC3 — fixture feed is stale for this division — its newest row in football-data.co.uk fixtures.csv is 2026-09-19, before 2026-09-20 (file newest 2026-09-20)
Attestation: block 967764 2026-09-20.json
2026-09-19 00:09 187 68548eb594efb0f0af23… 289eb0a55069… 0ff77ae735 23/23 Attestation: block 967636 2026-09-19.json
2026-09-18 00:09 88 289eb0a55069b84723c2… d6b334fc107f… 1fe41d2df3 9/23
  • E2 E3 EC SP2 I2 D2 F2 B1 SC0 SC1 SC2 SC3 T1 G1 — no fixture returned and no reason reported
Attestation: block 967483 2026-09-18.json
2026-09-17 00:07 90 d6b334fc107ffcc4ad43… e66ad23ec6e4… 44a1f2da40 9/11
  • B1 SC0 — no fixture returned and no reason reported
Attestation: block 967340 2026-09-17.json
2026-09-16 00:09 95 e66ad23ec6e46e463ecc… 3f9bc8c40fcd… 71a070cbfe 9/11
  • B1 SC0 — no fixture returned and no reason reported
Attestation: block 967207 2026-09-16.json
2026-09-15 00:07 101 3f9bc8c40fcd681182b7… 3eebb2647895… ab6fd73326 9/11
  • B1 SC0 — no fixture returned and no reason reported
Attestation: block 967041 2026-09-15.json
2026-09-14 00:09 110 3eebb26478958f5abd77… 648aa01da2b8… f7fa0c790f 9/11
  • B1 SC0 — no fixture returned and no reason reported
Attestation: block 966892 2026-09-14.json
2026-09-13 00:07 138 648aa01da2b82ab567d9… 3e1539b5828d… f83fbe7427 10/11
  • SC0 — no fixture returned and no reason reported
Attestation: block 966741 2026-09-13.json
2026-09-12 00:09 190 3e1539b5828d33ee2417… b8d6cfa0b1d5… dcc8847bb7 10/11
  • SC0 — no fixture returned and no reason reported
Attestation: block 966582 2026-09-12.json
2026-09-11 00:08 153 b8d6cfa0b1d50f5a1bbf… 437baeadf01e… fc28783cd4 9/11
  • B1 SC0 — no fixture returned and no reason reported
Attestation: block 966424 2026-09-11.json
2026-09-10 00:09 109 437baeadf01e5702fcae… e843b7575c29… a8d638b6ad 9/11
  • B1 SC0 — no fixture returned and no reason reported
Attestation: block 966289 2026-09-10.json
2026-09-09 00:08 107 e843b7575c29a5c5329d… 01cbe9126940… 8388a4e70a 9/11
  • B1 SC0 — no fixture returned and no reason reported
Attestation: block 966127 2026-09-09.json
2026-09-08 00:08 112 01cbe912694017d1bb8c… 8f8bd7c42f1c… ee809428f6 9/11
  • B1 SC0 — no fixture returned and no reason reported
Attestation: block 965994 2026-09-08.json
2026-09-07 00:07 114 8f8bd7c42f1c9b75c32f… 13f831fcec32… 14b8f70e4d 9/11
  • B1 SC0 — no fixture returned and no reason reported
Attestation: block 965856 2026-09-07.json
2026-09-06 00:08 136 13f831fcec32c9aa3ef9… 6e0f96c17ae5… f0b93890f7 9/11
  • B1 SC0 — no fixture returned and no reason reported
Attestation: block 965690 2026-09-06.json
2026-09-05 00:07 187 6e0f96c17ae5a36883d1… 71a501159cc8… 2521b0bbaf — Attestation: block 965543 2026-09-05.json
2026-09-04 00:07 164 71a501159cc856b87c5e… 56ad2c5d64b1… ac5c3a3ca2 — Attestation: block 965400 2026-09-04.json
2026-09-03 00:08 115 56ad2c5d64b1c736dbc0… 49c8b8dab521… a2a44a32e5 — Attestation: block 965241 2026-09-03.json
2026-09-02 00:04 113 49c8b8dab521198b9026… 195855857621… 16e509037e — Attestation: block 965103 2026-09-02.json
2026-09-01 00:09 103 1958558576211f510eae… 28a8a175bbec… 413f77eba4 — Attestation: block 964961 2026-09-01.json
2026-08-31 00:08 105 28a8a175bbec52dbe193… 886527321f37… 158c5abbf6 — Attestation: block 964808 2026-08-31.json
2026-08-30 00:08 121 886527321f376c721238… e722d48c32c3… 77f71b173c — Attestation: block 964645 2026-08-30.json
2026-08-29 00:11 156 e722d48c32c363c55a58… 83695200adbc… 41b4c91057 — Attestation: block 964502 2026-08-29.json
2026-08-28 00:08 145 83695200adbcf98e952f… bb39ec15a61d… Not recorded — Attestation: block 964455 2026-08-28.json
2026-08-27 00:09 11 bb39ec15a61d64f223b4… 80f997ad756c… Not recorded — Chain only 2026-08-27.json
2026-08-26 12:28 10 80f997ad756cb3e92eab… — Not recorded — Chain only 2026-08-26.json

What this proves, and what it does not

Each layer below has a deliberately narrow claim, and the narrowness is the point. A proof that is described as stronger than it is does more damage than no proof at all.

Proved

Nothing was altered. Change one probability in a past entry and its hash stops recomputing; fix that and the next entry's prev_hash stops matching, and so on to the head. Rebuilding the whole chain means force-pushing over a public repository.

It existed before a Bitcoin block. Each entry from 28 August carries a detached OpenTimestamps proof, and the block in its row was mined before the first kickoff that entry covers.

Not proved

That nothing was left out. A hash chain proves no entry was edited. It cannot prove, by itself, that a fixture we priced was published rather than held back, or that the newest entry is not missing. Two things narrow it: the coverage block sealed into every entry from 2026-09-06 onward names each division the run was asked for and the reason any of them returned nothing, and the chain is pushed to a public repository on every run, so a shortened history is visible to anyone who cloned it earlier. Neither is a proof, and calling them one would be the sort of claim this page exists to avoid.

Recomputing the chain

Clone the repository and run one command. It reads every file in predictions/, recomputes each SHA-256 over the entry with its own hash field removed, and checks that each entry's prev_hash matches the one before.

git clone https://github.com/GitSimaao/proofodds
cd proofodds
python -m proofodds.verify

Or point it at a directory of files downloaded from this site. It ignores anything in there that is not a ledger entry — the build summary at /predictions/_chain.json among them — and reports only on the chain itself.

python proofodds/verify.py /path/to/downloaded/predictions

Recomputing the score

The command above proves nothing here was altered. It says nothing about whether the number on the scorecard is the right number for these files, so there is a second command for that half. It reads the sealed entries, joins them to the raw results, and recomputes the de-vigging, the log loss and the interval in a separate implementation from the one that publishes them — then fails if the two disagree. --csv writes one row per graded match, so the whole scorecard fits in a spreadsheet column.

pip install -r requirements.txt
python scripts/rescore.py --refresh --csv audit.csv

Verifying an external timestamp

For any row with a proof, download the JSON and its matching .ots file into the same directory. Compare the SHA-256 shown by ots info with the JSON, then use ots verify for full verification against Bitcoin. That last step requires access to a Bitcoin Core node. A block number on this page means the matching proof contains that attestation; it does not claim this web server independently verified the Bitcoin chain.

pip install opentimestamps-client
curl -O https://proofodds.com/predictions/YYYY-MM-DD.json
curl -o YYYY-MM-DD.json.ots https://proofodds.com/timestamps/YYYY-MM-DD.json.ots
sha256sum YYYY-MM-DD.json
ots info YYYY-MM-DD.json.ots
ots verify YYYY-MM-DD.json.ots