ENSign in
Commit and reveal · how to check us

Check any pick
in your own browser.

Every pick is published as a SHA-256 hash before kick-off, and the exact string behind that hash is released once the day has settled. That turns the record into something you check rather than something you believe. This page explains how it works, walks through a real day from the archive, and hashes it in your own browser — no answer here comes from our server.

The mechanism

A hash before,
the string after.

Before kick-off

We publish a hash, and nothing else

The date, the fixture, the market, the selection, the line, the price, the minimum price, the kick-off time and a random salt are joined with a | and run through SHA-256. What goes out before the game is the 64-character digest. It reads the same whichever side we took, so it tells you nothing about the pick — which is the point, because you have not paid for it yet.

After settlement

We publish the string it was made from

Once the day is graded the whole string goes out, salt included. Now the selection can be read — and it is far too late for it to have been chosen. Hash the string yourself and compare it against the digest published hours earlier.

In between

Nothing in the middle can be changed

SHA-256 runs one way. Nobody knows how to take a published digest and find a second string that produces it, so once the hash is out the pick behind it is fixed. If we edited the selection afterwards, the string we released would stop matching the hash we published — and the thing that notices is your browser, not our server.

The salt

Why the random salt
is not decoration.

Without it the hash would be worth nothing, and this is the part most commitment claims quietly get wrong. The string being hashed is short and predictable: a date, two team names, a market, a price. Before kick-off there is a handful of games on the board and two sides in each one, so anybody could hash every possibility and read our selection straight off the published digest. On a laptop that is seconds of work.

The salt is 64 random characters generated with the pick and held back until the day settles. It makes the list of strings to try unenumerable, so the digest gives nothing away while the game is being played and still pins the selection exactly. The salt is what makes the commitment binding rather than a gesture: not guessable forwards, and not changeable once published.

The attack

What we would have to do
to fake this.

Swap the string behind the hash

Closed. Finding a second string with the same SHA-256 digest is not something anybody knows how to do. Edit the selection after the fact and the published hash stops matching — and the checker below says so in plain words, on our own page, about our own record.

Show you only the days that worked

Closed by the archive rather than by the arithmetic. Every day we published is there, losses included, each with its own address and its own hash — and the box below takes any string and any hash you care to type. We do not get to choose which rows can be checked.

Publish the hash later than we say we did

It was open, and it is not any more. A timestamp authority signs the commitment hash beside a time, and the signature checks against their certificate rather than against our own server's word. What that leaves is a different gap: a signed hash proves that hash existed, not that we published every day we ran, and the completeness of the archive still rests on us.

What would close it, in full →
The recipe

The exact string,
field by field.

The fixture and the final result

Competition, teams, kick-off, the exact market, and the score the row settles on. None of it belongs to us — it is on the league's own site and at your own bookmaker. If a row says won and the score says otherwise, it shows without leaving the page.

Join these nine values with a | and take the SHA-256: the date (YYYY-MM-DD), the teams, the market, the selection, the line to exactly two decimals (empty when there is none, so the two bars sit together), the odds to exactly two decimals, the minimum odds to exactly two decimals, the kick-off time in ISO-8601 with its offset, and the salt on the row. The result must equal the hash published before kick-off. The formats matter — 1.9 and 1.90 hash differently. Rows committed before the side and the line were split out of the market carry commit_version 1 and bind seven values instead, without the selection and the line; the row publishes its own commit_version, and commit_payload is the exact string we hashed. Example: 2026-08-29|Texas Rangers — Milwaukee Brewers|spread|Texas Rangers +1.5|1.50|-165.00|-165.00|2026-08-29T23:15:00+00:00|<salt>

Watch a hash being published

The commit hash goes out in the Telegram channel before kick-off, as text, while the selection is still sealed. The payload follows once the day settles — so both halves of the check arrive in the same place, in the order that makes the check mean something.

@betsbeats on Telegram
Worked example

One real day,
end to end.

Not an invented row. This is the most recent day in the archive whose salt has been released, carrying the same figures as the day's own page.

The dayThursday, November 5, 2026
FixtureUTSA Roadrunners — Florida Atlantic Owls
The betUTSA Roadrunners · moneyline
Published at2026-11-05T16:04:16+00:00
Authorityhttps://freetsa.org/tsr
Stamped at2026-11-05T16:04:17+00:00
Kick-off2026-11-06T00:30:00+00:00
Token serial09c6dd0e
Published hash8db69b4206a28a5c2cd7e22d3535de98c276f89f6fca16154579990fff177ade
The string hashed2026-11-05|UTSA Roadrunners — Florida Atlantic Owls|moneyline|UTSA Roadrunners||-230.00|-230.00|2026-11-06T00:30:00+00:00|WMxF3veWpR6D34JsFMKSYX5t26VbILukcg8SpBrkjyRLK8L7CtWlWw5qfQE3TWpt
printf '%s' '2026-11-05|UTSA Roadrunners — Florida Atlantic Owls|moneyline|UTSA Roadrunners||-230.00|-230.00|2026-11-06T00:30:00+00:00|WMxF3veWpR6D34JsFMKSYX5t26VbILukcg8SpBrkjyRLK8L7CtWlWw5qfQE3TWpt' | shasum -a 256

Run that line in a terminal and the output is the hash above, character for character. If it were not, we would have edited the record after publishing it — and you would be looking at the proof.

curl -sO https://api.betsbeats.com/api/v1/public/timestamps/8db69b4206a28a5c2cd7e22d3535de98c276f89f6fca16154579990fff177ade.tsr
curl -sO https://freetsa.org/files/cacert.pem
openssl ts -verify -digest 8db69b4206a28a5c2cd7e22d3535de98c276f89f6fca16154579990fff177ade -in 8db69b4206a28a5c2cd7e22d3535de98c276f89f6fca16154579990fff177ade.tsr -CAfile cacert.pem

Download the token (.tsr)The authority's certificate

Fetch both files, run the line, and openssl answers Verification: OK. Change one character of the hash and it answers message imprint mismatch instead. That settles when the hash existed — not that this archive holds every day we ran, and not that the pick was a good one.

The checker

Run it
in your browser.

Everything below happens inside this page, using your browser's own crypto.subtle. Nothing you type is sent to us, and no verdict here comes from our server — an answer from us about our own record would be worth precisely nothing on a page about not having to trust us.

Recently published
The limit of the claim

What this
does not prove.

Stamped

That the hash itself went out before kick-off

The hash proves the row was not edited. A timestamp authority that is not us has now signed that same hash beside a time, and the signature checks against their certificate rather than against our word. The authority was never shown the pick — the request is a digest and a nonce — which is why a pick can be stamped while it is still locked.

What it still does not proveThat this index is complete. A signed time says one hash existed; it does not say we published every day we ran, and stamping ten picks to show you the one that landed would leave every stamp valid. The gapless archive above, one row per day, is the other half of it — and it is the half that still rests on us. The Bitcoin anchor is a second artefact that only completes hours later, and it is not built.
pick.tsr · RFC 3161 · 09c6dd0e — pick.ots · Bitcoin · NA curl -sO https://api.betsbeats.com/api/v1/public/timestamps/8db69b4206a28a5c2cd7e22d3535de98c276f89f6fca16154579990fff177ade.tsr curl -sO https://freetsa.org/files/cacert.pem openssl ts -verify -digest 8db69b4206a28a5c2cd7e22d3535de98c276f89f6fca16154579990fff177ade -in 8db69b4206a28a5c2cd7e22d3535de98c276f89f6fca16154579990fff177ade.tsr -CAfile cacert.pemDownload the token (.tsr)
Unverified

That the result is set by someone other than us

The settlement rules name a source (league-official) and a tiebreak (league-wins), and they are served as data rather than typed onto a page. What is not published is the reading: today a person looks up the public result and marks the row, so the rule is declared and the reading is still ours.

What would actually prove itThe raw response from the named provider stored beside the row, with the market rule quoted, so the reading can be checked as well as the rule.
Unverified

That a settled row is never touched afterwards

The commitment hash covers the pick as it was written. It says nothing about the fields added at settlement — the score, the verdict, the timestamp — and a page that quietly edits itself would not tell you.

What would actually prove itThe same stamp again at settlement: the hash of the settled row anchored to a signed time. Anyone could re-hash it years later and see whether one character moved.

It covers the days published here

One row per day published here: the main pick, the only one that moves the counter. A day delivered only in Telegram or by hand, if there is one, is counted in the record and has no row here, because it was never published on this page. Only a published day carries a hash and a permanent address, so only a published day can be checked this way.

159 days are published here today.

The archive, and what it counts →

It proves the pick was not altered. It says nothing about whether it was any good

A commitment is a claim about tampering and about nothing else. A hash that matches proves the selection is the one fixed before the game started; it does not make it a sound bet. A day that lost verifies exactly as cleanly as a day that won, and this page would be dishonest if it let the two blur.

Today's free pick (not the main pick)

Today's free pick, for your email

Team, bet, price and the hash it was sealed under, on this page the moment you send. Lose or win, it stays public.

Unlock today's pick in Telegram →Telegram channel: sealed picks and the record, 21+ →

or by email

Public record of the main pick, losses included: 115 won, 44 lost. See every pick

One free pick a day by email until you unsubscribe, in one click. 21+.