Built and run by one person.
Run Your Own SQL on My Cricket Database. T20 and ODI Ball by Ball Since 2002, Free, No Signup and No Key.

Run Your Own SQL on My Cricket Database. T20 and ODI Ball by Ball Since 2002, Free, No Signup and No Key.

Published: August 17, 2026

Cricket data analysts, now run your own SQL on my cricket database, free, with no signup and no key. T20 & ODI Ball by ball since 2002, 2M+ deliveries, 6000+ matches, PostGres & DuckDB over API or connect your agent via MCP.

Match level detail like winner, venue, toss and player of the match in a second table you join on match_id, so whether a ground favours batting first, or how a batter goes against a particular bowler, is a single query.

The service has been live for a week and usage is growing faster than I was expecting... it went up as an experiment on a small quota and the latencies show it. Some queries have been timing out under load and I have been optimizing performance. Next - both engines are moving to my dedicated API server over the next few days, with the query performance and concurrency tuned properly. Same endpoints throughout, nothing changes at your end.

More questions the same two tables answer

Other than the ones on the image, a few more that come out of the same two tables.

A few things on the data side

match_info carries every format, so it holds more matches than either ball table does. Roughly 6,900 rows in there, of which about 2,600 are ODI and about 3,500 are T20, and the remaining 900 or so are Tests where the match level detail is present but the ball by ball is not. Join on match_id and filter on match_type, otherwise the denominator is wrong and the answer still looks reasonable.

The ball tables are format scoped per engine, ODI on Postgres and T20 on DuckDB, so no single query spans both, you run it twice and compare.

It is men's internationals, and that includes the Associate nations, so a plain top run scorers over the whole ball table pools every level of international cricket together. team1_icc_type and event sit in match_info if you want to narrow it.

Results cap at 1000 rows and the response carries a truncated flag, so check that before treating a leaderboard as the full list.

And the schema is small on purpose, two tables per engine, so information_schema or DESCRIBE will tell you everything there is rather than you guessing at column names.