FootQuery

How FootQuery calculates an answer

A language model reads your question. It never writes a number. FootQuery's own code calculates every answer from per-match records and shows the matches behind it.

One real question, followed through

  1. Step 1

    Question

    You type it in plain language.

    Salah 2+ shots on target in the 2025/26 Premier League season, how often?

  2. Step 2

    Routing

    A router picks exactly one typed tool call, out of about 40. It does not see results and writes no numbers.

    Tool
    Player research
    Player
    Mohamed Salah
    Stat
    Shots on target
    Threshold
    2 or more
    Window
    2025/26, Premier League

    Two routers race: a deterministic grammar plus Jev by TypeSafe AI for simple shapes, the OpenAI API for everything else. A pick is re-checked against real lookups before it wins.

  3. Step 3

    Data

    The backend fetches the match records the tool needs from API-Football, 20 fixtures per request, paced.

    38

    Premier League fixtures considered

    1

    provider request for this answer

  4. Step 4

    Own store

    What it fetches is kept in FootQuery's own Postgres store, each record with an expiry, with a short memory cache in front.

    Fetched
    2026-10-14 07:21 UTC
    Fresh until
    2026-10-14 13:21 UTC
    Served from
    Mixed live and cached

    Not a prebuilt mirror of every match ever played. The first ask about a player or team fetches on demand, later asks answer from stored data until it expires.

  5. Step 5

    Engine and proof

    Go code checks each match against the threshold and counts the yeses. The hit rate is plain division. The same question over the same matches gives the same answer.

    One bar per match. Dashed line: 2 shots on target.

    19%

    5 of 27 matches counted. 14 set aside with a reason: 3 friendlies, 11 he did not play.

What comes out

A widget, the same one you get on your board. The scope line opens the Source data: the matches used and the ones left out.

MS

Salah · 2+ SOT · 2025/26 PL

Liverpool

0 matches

met the condition, of 27 played

Aug 15Line: 5-match averageMay 24

What the engine calculates

Thresholds and hit rates
how often a player or team reached a number in a window of matches
Streaks and last occurrence
the current run, the longest run, and when something last happened
Splits
home and away, starter and substitute, by competition, by opponent
Per 90 and medians
rates scaled to minutes played, and the middle value instead of the average
Season totals
checked against the season's fixture list, so a missing match shows up as a gap
Career and multi-season walks
every season the provider lists for a player, up to 10 seasons in a trend

Gaps are shown, not filled. A missing value is missing, never zero. A season or team with no data is skipped and named in the notes.

Speed, honestly

1,174 benchmark runs. Bar: median. Tick: 90th percentile.

Uncached

2.4s median, 6.1s 90th

Cached

1.8s median, 2.4s 90th

Most answers arrive in 2 to 3 seconds. Big uncached career questions, which read every season of a player's career, take longer. Every answer says which it was: provider, fetch time, cached or fresh, and the number of provider requests. Coverage per competition and season is whatever API-Football offers. Live match hubs refresh about every 60 seconds while open.

Questions, answered

  • What is FootQuery?

    FootQuery is a football stats engine you can ask in plain language. Ask "Mbappé shots on target, last 10 matches" and it calculates the answer from per-match records, shows the matches behind every number, and keeps it as a widget on a board you can refresh, group in folders and share.

  • What can I ask it?

    Player and team research over any stretch you name: last N matches, a season, a career or all time, up to 10 seasons side by side. Thresholds and hit rates ("Salah 2+ shots on target, how often in the last 20?"), streaks, when something last happened, and splits by home or away, starter or sub, competition or opponent. Also head to head over the years, league tables, top scorers, assists and cards, title and relegation races, team stat rankings, live matches, match pages, fixtures by date, injuries and suspensions, coach history, team xG, top rated players, a player's career clubs, stadiums, odds data for one market, a pre-match prop sheet, and player or team compares.

  • How does it calculate answers? Does the AI make up numbers?

    No. The AI only reads your question and picks a typed lookup. Every number is computed by FootQuery's own calculation engine from per-match records, never written by a language model, so the same question gives the same answer. Missing values are shown as missing, never as zero.

  • Can I check where a number comes from?

    Yes. Open Source data on any answer to see the exact matches used, the data provider, when it was fetched, and the matches not counted with the reason (a friendly, a player who did not play, missing stats). Calculation lines like "14 shots on target / 10 matches" show how the number was reached.

  • Can it answer career and all time questions?

    Yes. "Haaland career goals" or "How many hat tricks has Haaland scored in his career?" read every season the provider lists for the player. Season trends go up to 10 seasons ("Messi goals per season, last 5 seasons"), and it can search back for the last matches where something happened. Seasons with no data are skipped and named in the notes.

  • Can it compare players, teams and head to head records?

    Yes. Compare two players, two teams or two seasons ("Haaland vs Kane goals this season"), and bars show the real gap between them. Head to head works over the years, for example Arsenal vs Tottenham all time.

  • Does it do league tables, leaders and fixtures?

    Yes. Standings, home and away tables, top scorers, assists and cards, title and relegation races, team stat rankings ("Which Bundesliga team has kept the most clean sheets?"), fixtures by date and matches played yesterday. Also injuries and suspensions for a team or a whole league.

  • Does it work live during matches?

    Yes. You can ask for live matches worldwide and open a match page with the live score, minute, events, lineups, team stats and player ratings. A live match refreshes about every 30 seconds while open, flashes on goals and red cards, shows stats per half and has a Live mode for watching next to a stream. Browser notifications for goals and red cards are optional and only work while the tab is open.

  • Does it predict results?

    It can give an estimated chance for one or more conditions you name, worked out from past match data. It is an extra, shown as an estimate and not as a fact or a tip, and it makes no claim to beat bookmakers. Nothing is guaranteed.

  • Can I get alerts?

    Yes. "Alert me when this changes" checks an answer once a day and sends an in-app notification when its numbers change. It is a Pro feature, free during the beta.

  • Does it help with player props?

    It helps you research them, it does not give tips. Hit rate answers have a line stepper (2+ to 3+, last 5, 10 and all side by side), a prop sheet shows likely starters' hit rates for a fixture, and Bet365 player odds are shown as data with implied probability, not a prediction. See player props.

  • Can I refine an answer with a follow-up?

    Yes. Follow-ups change the same answer instead of starting over: "only Champions League", "home matches only", "last 20 instead". Danish phrasing works too, for example "Hvor mange mål har Haaland scoret i år?".

  • What is a board?

    Every answer becomes a widget on a board that you keep. Arrange and refresh widgets, group related ones in folders and share a board. It works on phone and desktop in the browser, there is no native app.

  • Does FootQuery store its own data or call an API live?

    Both. The first time something is asked, FootQuery fetches the records from API-Football, then keeps them in its own database with an expiry, so popular players and teams answer from stored data. It is not a full copy of every match ever played.

  • What data does it use, and which leagues?

    Match, player and team data comes from API-Football, not Opta. Coverage for each competition and season is whatever API-Football provides, and per-player stats are not available for every league and season. When something is missing, the answer says so instead of filling it in. See the coverage.

  • How is it different from score apps and stats sites?

    Score apps and stats sites are built for following the game, with live scores, news, alerts and fixed pages, and many have native apps. FootQuery is built for the specific question: you ask it in plain language and see the matches behind the answer. It is not a news or alerts app, and it does not replace them.

  • How is it different from other AI football tools?

    Other AI football tools also answer in plain language, and many use the same kind of provider data, so the data alone is not the difference. FootQuery focuses on per-match research: hit rates, streaks, last occurrence and splits, with the match list behind every number, answers kept as widgets on boards, live match pages and a Discord bot.

  • How is it different from ChatGPT?

    A chatbot writes numbers from its own model or copies them from web pages, so they can change between runs and have no match-level proof. FootQuery computes each number from the matches and lists which ones, so you can check it.

  • Is there a Discord bot?

    Yes. The same questions work in Discord with the FootQuery bot. The public invite link is not available yet.

  • Is there a limit, and what does it cost?

    FootQuery is in private beta, invite only, and no payment is collected. Without an account you can ask 3 questions per day. After you sign up and while you wait for an invite you get 5 questions, and invited accounts get up to 100 per day within a fair-use data allowance. Reopening saved answers is free. A paid Pro plan is planned after launch at 69 kr per month (45 kr Founder price for beta members), 20% cheaper billed yearly, and is not on sale yet.