API & data · data teams

The Rondo model,
in JSON.

Match probabilities, score matrix, team strengths, season projection and calibration: the model’s outputs, dated and documented, ready to plug into your pipelines. Eight endpoints, twenty-four competitions, the same figures as our pages.

Access on requesthttps://api.rondoresearch.com/v1

Table and projection
curl -G "https://api.rondoresearch.com/v1/competition-classement" \
  -d competition=1 \
  -H "Authorization: Bearer $RONDO_KEY"
Response · captured on 09/10/2026
{
  "status": true,
  "message": "Classement et projection",
  "data": {
    "equipes": [
      {
        "teamId": 9,
        "nom": "Manchester City",
        "rang": 1,
        "points": 15,
        "attaque": 1.6035,
        "defense": 0.8308,
        "projection": {
          "titre": 0.58332,
          "ldc": 0.97586,
          "descente": 0,
          "pointsMoyen": 80.24
        }
      },
      /* … 19 more */
    ]
  }
}
8Endpoints
24Competitions tracked
50,000Simulated seasons
2,094Calibration matches
Built for your models

Conventions you will not have to guess.

One envelope, always the same

Every response is { status, message, data }. The status lives in the body: a reasoned refusal (unknown match, nothing published) comes back with status: false and a readable message.

Probabilities between 0 and 1

Never percentages, never display rounding: 0.58332, exactly as the simulation produces it. Formatting is up to you.

null is not zero

A league without a play-off returns barrage: null, not 0. A missing value is stated, never dressed up as a plausible one.

Model status, made explicit

Three booleans per competition — strengths, projection, match — and a motif when one is missing. You build your rules on them, not on a list you have to maintain.

Documentation

Eight endpoints, one real response each.

Pick an endpoint: the request in curl, JavaScript or Python, the response exactly as served on 09/10/2026, and every field explained. Field names are those of the response, in French.

Table and projection

The actual table, each team’s strengths and the end-of-season projection over 50,000 simulated seasons.

GEThttps://api.rondoresearch.com/v1/competition-classement
  • competition required — The competition’s leaguesId, as listed by /competitions.
curl -G "https://api.rondoresearch.com/v1/competition-classement" \
  -d competition=1 \
  -H "Authorization: Bearer $RONDO_KEY"

Reserved host, access on request: your key and the exact header format are issued when access is opened.

200 · application/jsonreal response captured on 09/10/2026
{
  "status": true,
  "message": "Classement et projection",
  "data": {
    "competition": {
      "leaguesId": 1,
      "nom": "Premier League (England)",
      "logo": "https://cdn.sportmonks.com/images/soccer/leagues/8/8.png",
      "slug": "premier-league"
    },
    "calcul": {
      "saison": "2026/2027",
      "date": "2026-09-27 03:31:13",
      "modele": "dixon-coles",
      "nRencontres": 2652,
      "nSimulations": 50000,
      "journeesJouees": 5
    },
    "equipes": [
      {
        "teamId": 9,
        "nom": "Manchester City",
        "ecusson": "https://cdn.sportmonks.com/images/soccer/teams/9/9.png",
        "promu": false,
        "rang": 1,
        "joues": 5,
        "points": 15,
        "butsPour": 13,
        "butsContre": 5,
        "attaque": 1.6035,
        "defense": 0.8308,
        "rangForce": 2,
        "projection": {
          "titre": 0.58332,
          "ldc": 0.97586,
          "europe": 0.99482,
          "barrage": null,
          "descente": 0,
          "pointsMoyen": 80.24,
          "rangMoyen": 1.66,
          "rangMedian": 1,
          "loiPosition": [0.58332, 0.27446, 0.08528, /* … 17 more */]
        }
      },
      {
        "teamId": 19,
        "nom": "Arsenal",
        "ecusson": "https://cdn.sportmonks.com/images/soccer/teams/19/19.png",
        "promu": false,
        "rang": 2,
        "joues": 5,
        "points": 12,
        "butsPour": 8,
        "butsContre": 4,
        "attaque": 1.3644,
        "defense": 0.6802,
        "rangForce": 1,
        "projection": {
          "titre": 0.30818,
          "ldc": 0.9323,
          "europe": 0.98124,
          "barrage": null,
          "descente": 0,
          "pointsMoyen": 76.14,
          "rangMoyen": 2.26,
          "rangMedian": 2,
          "loiPosition": [0.30818, 0.39714, 0.16074, /* … 17 more */]
        }
      },
      {
        "teamId": 78,
        "nom": "Brighton & Hove Albion",
        "ecusson": "https://cdn.sportmonks.com/images/soccer/teams/14/78.png",
        "promu": false,
        "rang": 3,
        "joues": 5,
        "points": 10,
        "butsPour": 16,
        "butsContre": 5,
        "attaque": 1.3721,
        "defense": 1.0237,
        "rangForce": 3,
        "projection": {
          "titre": 0.06738,
          "ldc": 0.5609,
          "europe": 0.7502,
          "barrage": null,
          "descente": 0.00132,
          "pointsMoyen": 65.11,
          "rangMoyen": 4.96,
          "rangMedian": 4,
          "loiPosition": [0.06738, 0.13734, 0.21012, /* … 17 more */]
        }
      },
      /* … 17 more */
    ],
    "modele": {
      "etat": "forces",
      "probabiliteRencontre": false,
      "projectionSaison": true,
      "forces": true,
      "motifCode": null,
      "motif": null
    },
    "lecture": {
      "forces": "Ce sont des multiplicateurs autour de 1, pas des buts par match. En defense, plus bas est meilleur.",
      "barrage": "`barrage` a null signifie que ce championnat n a pas de barrage. Ne jamais l afficher comme 0 %."
    }
  }
}

Response captured from …/public/competition-classement?competition=1, arrays truncated to three items.

Fields

FieldTypeDescription
competitionobjectleaguesId, nom, logo and slug of the competition.
calcul.datestring (UTC)Computation timestamp, YYYY-MM-DD HH:MM:SS, in UTC with no time zone written.
calcul.nRencontresintegerHistorical matches the model was fitted on.
calcul.nSimulationsintegerSeasons simulated for the projection (Monte Carlo).
equipes[].rangintegerPosition in the actual table.
equipes[].attaquedecimalAttacking multiplier around 1 (not goals per match).
equipes[].defensedecimalDefensive multiplier around 1: lower is better.
equipes[].projection.titreprobabilityShare of simulated seasons finished in first place.
equipes[].projection.ldcprobabilityChampions League qualification.
equipes[].projection.barrageprobability | nullnull: this league has no play-off. Never display it as 0%.
equipes[].projection.descenteprobabilityDirect relegation.
equipes[].projection.pointsMoyendecimalMean end-of-season points total.
equipes[].projection.loiPositionprobability[]The full distribution: the probability of finishing 1st, 2nd… last.
modeleobjectWhat the model publishes here: three booleans forces, projectionSaison, probabiliteRencontre, plus motif when one is missing. Rely on the booleans, never on etat.
Coverage

What /competitions serves, right now.

Read live from the catalogue; most recent computation on 9 October 2026. A missing capability is struck through, not hidden: it is a deliberate scope, and the response says why.

Champions Leagueid 7Strengths: publishedProjection: not publishedMatches: published
Europa Leagueid 8Strengths: not publishedProjection: not publishedMatches: published
Premier Leagueid 1Strengths: publishedProjection: publishedMatches: published
La Ligaid 2Strengths: publishedProjection: publishedMatches: published
Serie Aid 3Strengths: publishedProjection: publishedMatches: published
Bundesligaid 5Strengths: publishedProjection: publishedMatches: published
Ligue 1id 6Strengths: publishedProjection: publishedMatches: published
Primeira Ligaid 11Strengths: publishedProjection: publishedMatches: published
Eredivisieid 10Strengths: publishedProjection: publishedMatches: published
Pro Leagueid 13Strengths: publishedProjection: not publishedMatches: not published
Süper Ligid 27Strengths: publishedProjection: publishedMatches: published
Championshipid 12Strengths: publishedProjection: publishedMatches: published
La Liga 2id 26Strengths: publishedProjection: publishedMatches: published
Serie Bid 4Strengths: publishedProjection: publishedMatches: published
Premiershipid 14Strengths: publishedProjection: not publishedMatches: not published
Super Leagueid 28Strengths: publishedProjection: not publishedMatches: not published
Austrian Bundesligaid 22Strengths: publishedProjection: not publishedMatches: not published
Allsvenskanid 16Strengths: publishedProjection: publishedMatches: published
Eliteserienid 17Strengths: publishedProjection: publishedMatches: published
Superligaid 15Strengths: publishedProjection: not publishedMatches: not published
Ekstraklasaid 21Strengths: publishedProjection: publishedMatches: published

14 competitions with a full projection, 16 with match probabilities, 5 with strengths only; 3 out of scope (domestic cups). The details →

The data

A goals model, and everything that follows from it.

01

Match probabilities

Win, draw, loss, goal totals, both teams to score, exact scores. Everything comes from the same matrix, so nothing contradicts anything else.

02

Score matrix

The full 11 × 11 grid, cell by cell. Recompute any outcome yourself, or feed it into your own model.

03

Team strengths

Attack and defence as multipliers, an overall index, and the gap to the points table: who is better than their position.

04

Season projection

Title, Europe, relegation and the full distribution of every position, over 50,000 simulated seasons.

05

Trajectories

Matchday by matchday, actual then projected: points, mean position, probability of being top.

06

Published calibration

For every outcome, forecast against observed over more than 2,000 matches. Your models know how much confidence each figure deserves.

Widgets

The same data, ready to drop into a page.

Four widgets rendered live from the model — shown here on the Premier League. One line to embed, no maintenance on your side.

Premier League · table and projection

50,000 simulated seasons

#TeamPPtsProj.TitleUCLRel.
1Manchester City5158058%98%—
2Arsenal5127631%93%—
3Brighton & Hove Albion510657%56%< 1%
4Brentford59591%27%< 1%
5Leeds United5956< 1%17%1%
6Liverpool59632%42%< 1%
7Everton5953< 1%8%2%
8Hull City5845< 1%2%18%
Computed on 27 September 2026Rondo Research

Table and projection

Available on request

The actual table, and what the simulation draws from it: projected points, title, Champions League, relegation.

Embed code
<iframe src="https://rondoresearch.com/en/publics/equipes-data/widgets/classement?competition=premier-league"
  title="Table and projection · Rondo Research"
  width="100%" height="640" loading="lazy"
  style="border:0"></iframe>
Open the widget on its own ↗

Premier League · Matchday 6

Saturday 10 October · 13:30

Arsenal2nd in the table
vs
Leeds United5th in the table
Expected goals

1.63–0.72

Most likely scores
  • 1–014%
  • 2–013%
  • 1–112%
Computed on 27 September 2026Rondo Research

Match probabilities

Available on request

The next fixture, or one of your choosing: 1X2, expected goals and the most likely scores.

Embed code
<iframe src="https://rondoresearch.com/en/publics/equipes-data/widgets/rencontre?competition=premier-league"
  title="Match probabilities · Rondo Research"
  width="100%" height="420" loading="lazy"
  style="border:0"></iframe>
Open the widget on its own ↗

Premier League · power ranking

Team strength as estimated by the model, luck stripped out

  1. 1ArsenalAtt. 1.36Def. 0.68+1
  2. 2Manchester CityAtt. 1.60Def. 0.83-1
  3. 3Brighton & Hove AlbionAtt. 1.37Def. 1.02=
  4. 4LiverpoolAtt. 1.33Def. 1.02+2
  5. 5Manchester UnitedAtt. 1.31Def. 1.10+7
  6. 6BrentfordAtt. 1.24Def. 1.05-2
  7. 7Leeds UnitedAtt. 1.05Def. 0.98-2
  8. 8AFC BournemouthAtt. 1.16Def. 1.09+9
Computed on 27 September 2026Rondo Research

Power ranking

Available on request

Teams ranked by underlying strength, with the gap to their position in the table.

Embed code
<iframe src="https://rondoresearch.com/en/publics/equipes-data/widgets/forces?competition=premier-league"
  title="Power ranking · Rondo Research"
  width="100%" height="640" loading="lazy"
  style="border:0"></iframe>
Open the widget on its own ↗

Premier League · title race

Cumulative points: 5 matchdays played, the rest projected

020406080projectedMD1MD5MD38
  • Manchester City80 pts62%
  • Arsenal77 pts33%
  • Brighton & Hove Albion65 pts3%
  • Liverpool63 pts1%

Percentage: probability of finishing top after matchday 38.

Computed on 27 September 2026Rondo Research

Title race

Available on request

The contenders’ points, played then projected through to the final matchday.

Embed code
<iframe src="https://rondoresearch.com/en/publics/equipes-data/widgets/trajectoire?competition=premier-league"
  title="Title race · Rondo Research"
  width="100%" height="440" loading="lazy"
  style="border:0"></iframe>
Open the widget on its own ↗
Access

Three ways to use it.

No public price list: scope (competitions, cadence, format) sets the price, and we agree it with you.

Evaluation

Access on request

A test key on live data, so you can wire up your pipelines and assess the calibration before committing.

  • All eight endpoints
  • Every competition covered
  • A named technical contact
Request a key

Integration

Quote on request

The API in production: nightly cadence, the competitions you choose, format and delivery tailored to your stack.

  • Production key
  • JSON delivery, or export to your warehouse
  • Schema changes announced in advance
Request a key

Widgets

Quote on request

Rondo widgets in your pages, in your colours or ours, without a line of code on your side.

  • Table, match, power ranking, title race
  • Embedded via iframe
  • Competitions of your choice
Request a key
Get started

Three steps to your first figure.

  1. 1

    Request a key

    Tell us your use case and the competitions you need. We open an evaluation access.

  2. 2

    Read the catalogue

    First call: /competitions. It returns the identifiers and what the model publishes for each.

  3. 3

    Build on modele

    Check the booleans before reading a projection or a probability: your rules hold as coverage evolves.

Questions

What we are asked before integration.

Is the API open to the public?

No: access is on request, with a key. The address https://api.rondoresearch.com/v1 is reserved and will be issued with your key. The responses shown on this page, however, are real captures of the model’s output.

How often does the data change?

The model is recomputed overnight; every response carries the date of its computation (calcul.date, in UTC). Rely on that field rather than on the time of your call.

Why are the fields in French?

Because French is the language of the model and its reading notes. The names are stable: we document each field exactly as it is served rather than maintain a translation that would drift.

What happens when a value is missing?

It is null, never 0, and the modele object says why (league format that cannot be simulated, domestic cup not modelled…). An absence is information, not an outage.

Are the probabilities reliable?

They are measured: the /calibration endpoint publishes, bin by bin, the observed frequency against the forecast probability. It is the same figure we show on the methodology page.

Request a key

Tell us what you are going to build.

Your stack, the competitions you need, the cadence you require. We will come back to you with evaluation access.

Read the model’s methodology →

API key request

An evaluation key on live data, with no commitment.