Verification Guide

Last updated: 24 July 2026

The short version: every published pick is committed with a SHA-256 hash the moment it goes live. The exact text that was hashed is shown next to every settled pick — run SHA-256 over it yourself and compare. A match proves the pick’s numbers were frozen before kickoff and never edited after the result.

01What a hash proves (and what it doesn't)

SHA-256 is a one-way fingerprint: change a single character of the input and the fingerprint changes completely, and nobody — including us — can construct a different input that produces the same fingerprint. Because each pick’s hash is published before kickoff, a matching hash proves the selection, model probability, odds and publish timestamp are exactly what we committed to at publish time.

It does not prove the model is good, that the odds were available to you, or that following picks is wise. It proves only integrity: nothing was rewritten after the whistle.

02Verify a pick in four steps

  • 1. Open the pick. Go to the track record and click any pick’s hash. The dialog shows the “Hash payload” — the exact text that was hashed — and the published SHA-256 next to it.
  • 2. Copy the payload exactly as shown, with no extra spaces or trailing newline.
  • 3. Compute SHA-256. On macOS or Linux: printf '%s' 'PAYLOAD' | shasum -a 256 (the printf avoids the newline that echo would add). On Windows PowerShell, or if you prefer a browser, any reputable online SHA-256 tool works — the payload contains nothing secret.
  • 4. Compare. The 64-character hex digest must equal the published pick hash, character for character.

03The payload format

A 1X2 pick’s payload is five fields joined by pipes:

fixtureId|selection|modelProbability|marketOdds|publishTimestamp

  • fixtureId — the numeric match id (also in the match page URL);
  • selectionhome, draw or away;
  • modelProbability— the model’s probability for that selection, 4 decimal places;
  • marketOdds — the archived closing odds the pick is staked at, 2 decimal places;
  • publishTimestamp — the model-run timestamp the hash was computed over (shown verbatim in the payload).

Goal-market picks (Over/Under, both-teams-to-score) insert the market key as a second field:

fixtureId|market|selection|modelProbability|marketOdds|publishTimestamp

where market is ou15ou55 (the half-goal line × 10, e.g. ou35 = Over/Under 3.5) or btts, and selection is over/under or yes/no. You never need to reconstruct any of this by hand — the dialog shows the finished payload — but the format means you can also archive payloads independently and audit the whole ledger.

04Verify the odds and the result

  • Every settled pick links its odds source (“verify market odds”) — an archived, publicly checkable closing price. Compare it against the odds in the payload.
  • Results and settlement follow the 90-minute score, extra time excluded — every market here (1X2, goal totals, BTTS) settles on 90 minutes. Knockout games level after 90 minutes settle as a draw, and the match page shows both the final and the 90-minute score whenever they differ. Goal-total picks quote half-goal lines only, so no push/void result exists.
  • The kickoff time is on every pick card; the publish timestamp in the payload predates it.

05Prediction hashes on match pages

Match predictions carry their own anchor (the “✓ Hash” badge on each match page). The committed payload is the fixture id, both team names, the three match probabilities at 4 decimal places and the model-run timestamp, joined by pipes — same verification procedure as picks.

06Something doesn't check out?

If a hash you compute doesn’t match, first check for copy artifacts (smart quotes, added whitespace, a trailing newline). If it still doesn’t match, we want to know immediately — email vestra@vestra.is with the pick and your computed digest.

How the numbers are produced in the first place is covered in the methodology.