Opono
Skip to content
Documentation menu Opono Season Simulation ▾

API reference

Opono Season Simulation

Copy as Markdown

List season simulations

GET /v1/seasons

List, at zero credits, the competitions with a season simulation from the current world run.

Authentication: Bearer API key with data.read; active Plus or Pro plan required.

Parameters

Path parameters

NameTypeRequiredDescription
———None.

Query parameters

NameTypeRequiredDescription
———None.

Body parameters

NameTypeRequiredDescription
———None.

Example request

bash
curl 'https://api.opono.com/v1/seasons' \
  --header "Authorization: Bearer $OPONO_API_KEY"

Response

FieldTypeDescription
objectstringlist.
as_ofstring or nullWhen the run was published; null when there is none.
dataarrayCompetitions.
data[].competition_idintegerCompetition ID for the season simulation.
data[].namestring or nullCompetition name.
data[].season_idintegerSeason ID.
data[].as_ofstringThe day the simulation starts from.
data[].runsintegerSeasons simulated.
data[].teamsintegerClubs in the table.

Example response

200 response with a test key.

json
{
  "object": "list",
  "as_of": null,
  "data": []
}

Errors

StatusCodeMeaning
400parameter_invalidA parameter has an invalid value.
401invalid_api_keyThe credential cannot authenticate.
401key_revokedThe API key has been revoked.
401key_expiredThe API key has expired.
403scope_missingThe key lacks the required scope.
403tier_restrictedThe organisation plan does not include this operation.
403org_suspendedYour account is suspended.
403ip_not_allowedThe caller is outside the key's IP allowlist.
429rate_limitedA request or authentication rate limit was exceeded.
503dependency_unavailableRequest admission is unavailable.
503maintenanceThe API is paused for maintenance.

Opono Season Simulation

GET /v1/competitions/{competition_id}/season

Read Opono Robin's season simulation for 1 credit: it plays every remaining match of the season, many times over, and reports each club's chance of every finishing position, its expected points with a range, and its chances of the title, the top four and the bottom three.

Authentication: Bearer API key with data.read; active Plus or Pro plan required.

Parameters

Path parameters

NameTypeRequiredDescription
competition_idintegerYesRequest value; minimum: 1.

Query parameters

NameTypeRequiredDescription
———None.

Body parameters

NameTypeRequiredDescription
———None.

Example request

bash
curl 'https://api.opono.com/v1/competitions/8/season' \
  --header "Authorization: Bearer $OPONO_API_KEY"

Response

FieldTypeDescription
objectstringseason_simulation.
competitionobjectCompetition ID, name and season ID.
simulated_fromstringThe day the simulation starts from; matches before it are played.
runsintegerSeasons simulated.
teamsarrayClubs in order of expected finishing position.
teams[].team_id / nameinteger / string or nullClub labels.
teams[].expected_positionnumberMean finishing position.
teams[].points.mean / p10 / p50 / p90numberFinal points: the mean and the 10th, 50th and 90th percentiles.
teams[].goal_difference_meannumberMean final goal difference.
teams[].p_title / p_top4 / p_bottom3numberChance of finishing first, in the top four, in the bottom three.
teams[].p_positionarrayChance of finishing 1st, 2nd, ... last; one entry per club.
as_ofstringWhen the forecast was published, in ISO 8601 UTC.
publicationstringThe publication's day. A new day's forecast is a new paid read; the same one replays for free.
model.public_name / model.versionstring / stringOpono Robin and its release.
credits_chargednumberOne credit on first live delivery; zero for a same-publication replay or test key.
replaybooleanWhether your organisation already read this forecast from this publication.
livemodebooleanFalse for synthetic test output.
receiptobjectCredit receipt on live delivery or replay.

Example response

200 synthetic test response, shortened to one club; zero credits.

json
{
  "object": "season_simulation",
  "competition": {
    "id": 8,
    "name": "Synthetic league",
    "season_id": 1
  },
  "simulated_from": "2026-10-27",
  "runs": 1000,
  "teams": [
    {
      "team_id": 1,
      "name": "Synthetic club 1",
      "expected_position": 1,
      "points": {
        "mean": 60,
        "p10": 50,
        "p50": 60,
        "p90": 70
      },
      "goal_difference_mean": 20,
      "p_title": 0.55,
      "p_top4": 1,
      "p_bottom3": 0.45,
      "p_position": [
        0.55,
        0.3,
        0.1,
        0.05
      ]
    }
  ],
  "as_of": "2026-10-27T10:05:28.000Z",
  "publication": "synthetic",
  "model": {
    "public_name": "Opono Robin",
    "version": "synthetic"
  },
  "credits_charged": 0,
  "replay": false,
  "livemode": false
}

Errors

StatusCodeMeaning
400parameter_invalidA parameter has an invalid value.
401invalid_api_keyThe credential cannot authenticate.
401key_revokedThe API key has been revoked.
401key_expiredThe API key has expired.
403scope_missingThe key lacks the required scope.
403tier_restrictedThe organisation plan does not include this operation.
403org_suspendedYour account is suspended.
403ip_not_allowedThe caller is outside the key's IP allowlist.
429rate_limitedA request or authentication rate limit was exceeded.
503dependency_unavailableRequest admission is unavailable.
503maintenanceThe API is paused for maintenance.
402balance_too_lowYour available balance cannot cover the request.
404season_not_foundNo season simulation exists for this competition.