Built because nobody sells the whole game.
Every sports data vendor sells a slice. One does odds. One does soccer. One does the US big four and charges per league. One has beautiful play-by-play and no lines.
None of them sells a match — the fixture, the lineups, the stats, the odds and the model output, in one response, with the same field names across every sport.
So integrating sports data is never one integration. It is six, plus the reconciliation nobody quotes you for: three vendors spelling the same club three ways, two different ideas of what a game id is, and a season boundary that moves depending on who you ask. Change one thing and something downstream breaks.
We were building a sports intelligence application when we ran into all of it. The comparison we kept coming back to was Stripe — one schema, predictable URLs, errors that explain themselves. Why can’t sports data be like Stripe?
The integration was not the hard part
The hard part was finding out what we actually had. Not what a vendor’s marketing said, or even its documentation — what was really in the responses, for which leagues, going back how far, updated how often.
That took months of trial and error, and we were still discovering gaps long after we thought we understood the data.
Nobody publishes that. Every provider will tell you what they cover. Almost none will tell you where the coverage stops, which seasons are thin, or when a feed last actually moved.
That is the reason this exists in the shape it does.
Which is why the whole site works the way it does
- Coverage is published, not described.
- The numbers on our coverage and league pages are read from the API at page load, not written by hand. If a figure looks low, that is the real one.
- Freshness is on the page.
- Each group of fields carries when it last updated, because “real-time” means six different things across six vendors.
- Our comparison pages carry the date we last checked.
- When we audited them in August 2026, five of fourteen were out of date and we corrected them — including two that were wrong in our own favour.
- We publish a number when we can measure it correctly, and not before.
- We do not show an uptime figure today, because our health check has been wrong and we would rather say that than publish something we do not trust.
None of that is a policy we adopted. It is the documentation we could not find when we needed it, so nobody else has to spend those months.
- 1,066
- developers with a key
- 1,355
- API keys issued
- 2,160,709
- API calls served
Read from the database when this page was built, not typed in.
What you get
- One envelope. The JSON you parse for a Premier League match is the JSON you parse for an NBA game — same field names, same coordinate conventions.
- One key. Not one per sport, not one per league.
- Published prices. Every tier is on the pricing page. No quote form.
- A free tier you can ship on. Commercial use is permitted — you can build a product on it, not just evaluate.
Who we are
A small team of sports enthusiasts who started by building something else.
The company behind it has been operating since 2003. This part of it is young — the site has only been up a short time — but it has been years in the making, and the investment is not only technical. It is industry relationships, data licensing, and the attorneys who make those workable. That is not a footnote: it is why our free tier permits commercial use at all, where most entry tiers are evaluation-only.
We have put too much into this to turn off the lights.
What’s next
Keep it as simple as possible. Documentation and error responses that make problems easy to fix and easy to build on — an error should tell you what to do next, not just what went wrong.
More coverage, in breadth and in depth. More sports. Staying easy for agents and AI tools to consume.
And listening to what developers actually ask for. The “request a stat” box on every sport page is not decoration — it is how we decide what to add.
Start on any sport
Every sport hub. The same envelope on each.