Where it comes from
Squiggle — fixtures, venues, and final scores. A free community API run by footy-stats people. This is our schedule and our results feed.
Public stat archives — every player's statistics for every game, maintained by volunteers and community archivists since long before us. This is the raw material for all 118,048 player records.
Each league's own match data — the NRL and the NBL both publish a full match centre. The fixtures, the rosters and the per-player stat lines for those two codes come from there.
Betfair — every race card, runner, barrier, jockey, weight and starting price. Australian racing data is licence-gated by statute; Betfair is a licensed operator that already holds the approvals, which is why the racing pages exist at all.
Open-Meteo — historical and forecast weather for each venue's coordinates. This is how we know which past games were wet, and what Saturday looks like.
Most of that is free and public. One feed we pay for: bookmaker lines and prices come from a commercial data provider, and buying them is the point — it is how the site can show you what you're being offered without taking a cent from the bookmaker offering it. The full list, with links, is on the credits page.
The cycle
Every code's results are pulled automatically at least once a day — AFL, NRL and the NBL twice — and each run reads the completed games, attaches the weather each was actually played in, and loads the database. Bookmaker prices are separate and much faster: they refresh every fifteen minutes, all day. Nothing on the site is ever more than a day behind the last siren.
The rule that runs everything: fail loud
If a source changes its format, the pipeline stops and shouts — it never quietly writes garbage. Missing data costs us a day. Wrong data would cost us the only thing we sell. Our failure mode by design is silence, never confident nonsense.
Nothing is pre-baked
There are no stored averages or saved hit rates in the database. Every figure on your screen — the hit rate, the conceded rank, the wet-weather split — is computed fresh from raw game rows the moment you ask. That's slightly slower to build, but it means one corrected data error fixes itself everywhere at once, and it means every number can be traced back to specific games on specific days.
The quiet decision underneath it all
Every player-game row carries the opponent stamped onto it. That's what lets us answer "how many disposals does Hawthorn give up, and where does that rank?" — the most useful question in props research — in a single query instead of four websites.
What we don't do
- No tips, selections, or advice of any kind — we publish numbers, the call is yours.
- No black-box models. There is one projection, on the player page, and it is a base rate plus a stack of labelled adjustments in the stat's own units — every term visible, nothing weighted out of sight. No other "expected" stats.
- No bookmaker money. We licence prices and display them; we earn nothing whether you bet or not, and we link to no operator.
- No smoothing over small samples — under 4 games, the UI flags it as thin evidence.
- No deleting inconvenient history. Corrections are logged and applied, not buried.
Does our projection actually beat the market?
A closing line — the last number a bookmaker offered before the bounce — is the sharpest public forecast there is. Thousands of people and a bookmaker's own model have pushed it to where it sits. So it is the fairest possible test of ours, and we run it against ourselves in public.
The test is not whether a bet won. That is one coin flip. It is whether our NUMBER landed closer to what the player actually did than the market's number did, measured in the stat's own units across every prop we can score. Each projection is rebuilt using only the games that had been played before that match — scoring a forecast against a log containing the game it was forecasting would be marking our own homework.
- 4,146 props scored across 27 games — clearances, disposals, goals, handballs, kicks, marks, tackles.
- Our number landed closer 66% of the time. 17 props tied and are excluded rather than counted as half.
- Average miss: 2.12 for us against 2.84 for the market.
Our number is currently landing closer on average. That is worth something and it is not a guarantee — it is a measured result over a finite sample, and it can turn.
We grade our hit rates the same way
The projection is not the only number we check in public. Every hit rate the site has shown gets replayed against what then happened — when we showed 70%, did it land near 70%? The running answer, per sport and per band, lives on the Self-grade page, thin samples flagged and all.
Found an error?
Tell us the player and the round at data@projectpunt.com.au (placeholder). Because everything derives from raw rows, one fix corrects every page that touches it.