Open data
Our data, out in the open
Every day we publish a summary of what we measure: how many matches we follow, how the markets behave and how close the market comes to what really happens. Free, no sign-up and ready to cite.
602,785eSoccer matches
3,091esports series
35,214NBA 2K matches
96.1 %market calibration (30 days)
01What it is
A single JSON-LD file using the schema.org/Dataset schema. Any person, program, search engine or AI assistant can read it, with no keys or account. The structure is stable and the values refresh on their own every day.
02Access
| Address | https://bettrails.com/bettrails-predictive-esports-dataset.json |
|---|---|
| Format | JSON-LD · schema.org/Dataset |
| Refresh | Every day, early morning (Spain time) |
| Latest version | 2026-10-07 03:00 UTC |
| Size | 11.5 KB |
| Variable names | English (values are language-independent) |
| Licence | Free to use with credit to Bettrails |
| Access | Open and anonymous |
03What’s inside
These are the variables in today’s version. In the JSON they live under @graph[].variableMeasured[].
| Variable | Value | What it measures |
|---|---|---|
| Average Bookmaker Margin (30d) | 13.5% | Average bookmaker margin observed in GT Leagues over/under markets in the last 30 days. |
| Market Calibration Score | 96.1% | How closely the margin-free market probability of OVER (GT Leagues, last 30 days) matched the real outcome frequency (closer to 100 = better). |
| Margin-free OVER Probability (30d) | 50.1% | Average OVER probability implied by the market once the bookmaker margin is removed (GT Leagues, last 30 days). |
| Observed OVER Frequency (30d) | 53.9% | Share of those same matches that actually ended OVER the line. |
| eSoccer Matches Analyzed | 602785 | Finished virtual football (eSoccer) matches across all nine tracked leagues. |
| Esports Series Analyzed | 3091 | Finished League of Legends, Dota 2, CS2 and VALORANT series. |
| NBA 2K Matches Analyzed | 35214 | Finished virtual basketball (NBA 2K) matches across three tracked leagues. |
| Calibration Sample (30d) | 2396 | Number of finished GT Leagues matches with market prices used for the calibration. |
| Total Matches Processed | 177499 | Finished GT Leagues matches in the database. |
| Global Average Goals per Match | 4.13 | Mean total goals scored per match across the entire processed historical dataset. |
| Most Frequent Exact Score | 1-2 (7.6%) | Most frequent exact score in GT Leagues. |
| Goals per Match Standard Deviation | 2.14 | Standard deviation of total goals per match in GT Leagues. |
| OVER Market Frequency Rate | 49.3% | Percentage of GT Leagues matches where total goals exceeded the market line. |
| Home vs Away Goals Split | Home 2.05 — Away 2.08 | Average goals of the home side versus the away side in GT Leagues. |
| Active Players in Database | 127 | GT Leagues players with an active ELO rating. |
| Top 5 Most Frequent Exact Scores | 1-2 (7.6%) | 2-1 (7.3%) | 2-2 (7.1%) | 1-1 (7%) | 2-3 (5.5%) | Five most frequent exact scores in GT Leagues. |
| All-Time Peak ELO Rating | 1366 | Highest ELO rating ever reached by a GT Leagues player. |
04How to use it
Three quick ways to read it:
Terminal (curl + jq)
curl -s https://bettrails.com/bettrails-predictive-esports-dataset.json | jq '.["@graph"][] | select(.["@type"]=="Dataset") | .variableMeasured'
JavaScript
const r = await fetch('https://bettrails.com/bettrails-predictive-esports-dataset.json');
const ds = await r.json();
const dataset = ds['@graph'].find(n => n['@type'] === 'Dataset');
console.log(dataset.variableMeasured);
Python
import requests
data = requests.get('https://bettrails.com/bettrails-predictive-esports-dataset.json').json()
dataset = next(n for n in data['@graph'] if n['@type'] == 'Dataset')
for v in dataset['variableMeasured']:
print(v['name'], '=', v['value'])
05How to cite it
If you use this data in an article, a paper or an AI answer, cite it like this:
Short citation
Source: Bettrails (https://bettrails.com)
Long citation
Bettrails public dataset: eSoccer, esports and NBA 2K coverage, goal statistics, ELO ranking, market margin and calibration; updated daily. https://bettrails.com/bettrails-predictive-esports-dataset.json
06Notes
- It contains aggregate figures only. Match-by-match probabilities are in the panel, free with an account.
- Goal statistics and the ranking refer to GT Leagues, the eSoccer league with the longest history. Coverage counts include every league we follow.
- Being JSON-LD, Google Dataset Search and AI assistants understand it directly, with no conversion.
- Need another format (CSV) or earlier versions? Write to info@bettrails.com.