Bettrails
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

Addresshttps://bettrails.com/bettrails-predictive-esports-dataset.json
FormatJSON-LD · schema.org/Dataset
RefreshEvery day, early morning (Spain time)
Latest version2026-10-07 03:00 UTC
Size11.5 KB
Variable namesEnglish (values are language-independent)
LicenceFree to use with credit to Bettrails
AccessOpen and anonymous

03What’s inside

These are the variables in today’s version. In the JSON they live under @graph[].variableMeasured[].

VariableValueWhat 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 Score96.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 Analyzed602785Finished virtual football (eSoccer) matches across all nine tracked leagues.
Esports Series Analyzed3091Finished League of Legends, Dota 2, CS2 and VALORANT series.
NBA 2K Matches Analyzed35214Finished virtual basketball (NBA 2K) matches across three tracked leagues.
Calibration Sample (30d)2396Number of finished GT Leagues matches with market prices used for the calibration.
Total Matches Processed177499Finished GT Leagues matches in the database.
Global Average Goals per Match4.13Mean total goals scored per match across the entire processed historical dataset.
Most Frequent Exact Score1-2 (7.6%)Most frequent exact score in GT Leagues.
Goals per Match Standard Deviation2.14Standard deviation of total goals per match in GT Leagues.
OVER Market Frequency Rate49.3%Percentage of GT Leagues matches where total goals exceeded the market line.
Home vs Away Goals SplitHome 2.05 — Away 2.08Average goals of the home side versus the away side in GT Leagues.
Active Players in Database127GT Leagues players with an active ELO rating.
Top 5 Most Frequent Exact Scores1-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 Rating1366Highest 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