# OpenLigaDB

> Pull German football results and fixtures into a workflow from OpenLigaDB, the open sports database behind the Bundesliga, its second and third tiers, the DFB-Pokal, the women's Bundesliga, national-team tournaments and hundreds of other competitions, ice hockey and handball among them. Read a matchday's scores goal by goal, a league's table, its scoring charts, one team's fixtures across every competition it plays in, or the record between two clubs. Check the next kick-off for a reminder, or watch a matchday for changes so a workflow only runs when something has actually happened. No account or API key required.

App · Sports · 16 actions. Web page: https://docs.lodol.com/docs/integrations/openligadb

## Actions

### Get a match

Get one match by its id, with its goals minute by minute, the score at each stage it was recorded at, the venue and the attendance. Match ids come back from List matches and from the next and last match actions, so this is the step that follows one of those. No API key required.

**Inputs**

- Match id (`match_id`, number, required): OpenLigaDB's id for the match, as returned by List matches, Get the next match or Get the last match. At least 1.

**Outputs**

- `match` (object): One match, with its score, its stage scores and its goals.

**Example output**

```json
{
  "match": {
    "goal_count": 5,
    "goals": [
      {
        "comment": null,
        "goal_id": 116409,
        "is_overtime": false,
        "is_own_goal": false,
        "is_penalty": false,
        "minute": 12,
        "score_team1": 0,
        "score_team2": 1,
        "scorer_id": 14289,
        "scorer_name": "Granit Xhaka",
        "scoring_team_id": 6
      },
      {
        "comment": null,
        "goal_id": 116410,
        "is_overtime": false,
        "is_own_goal": false,
        "is_penalty": false,
        "minute": 38,
        "score_team1": 0,
        "score_team2": 2,
        "scorer_id": 18494,
        "scorer_name": "F. Wirtz",
        "scoring_team_id": 6
      },
      {
        "comment": null,
        "goal_id": 116412,
        "is_overtime": false,
        "is_own_goal": false,
        "is_penalty": false,
        "minute": 59,
        "score_team1": 1,
        "score_team2": 2,
        "scorer_id": 18490,
        "scorer_name": "N. Elvedi",
        "scoring_team_id": 87
      },
      {
        "comment": null,
        "goal_id": 116413,
        "is_overtime": false,
        "is_own_goal": false,
        "is_penalty": false,
        "minute": 85,
        "score_team1": 2,
        "score_team2": 2,
        "scorer_id": 18551,
        "scorer_name": "T. Kleindienst",
        "scoring_team_id": 87
      },
      {
        "comment": "+11",
        "goal_id": 116414,
        "is_overtime": true,
        "is_own_goal": false,
        "is_penalty": true,
        "minute": 90,
        "score_team1": 2,
        "score_team2": 3,
        "scorer_id": 18494,
        "scorer_name": "F. Wirtz",
        "scoring_team_id": 6
      }
    ],
    "goals_team1": 2,
    "goals_team2": 3,
    "group_id": 45117,
    "half_time_team1": 0,
    "half_time_team2": 2,
    "is_finished": true,
    "kickoff_local": "2024-08-23T20:30:00",
    "kickoff_utc": "2024-08-23T18:30:00Z",
    "last_update": "2024-08-24T11:29:10.647",
    "league_id": 4741,
    "league_name": "1. Fu\u00dfball-Bundesliga 2024/2025",
    "league_season": "2024",
    "league_shortcut": "bl1",
    "location_city": "M\u00f6nchengladbach",
    "location_id": 32,
    "location_stadium": "Borussia Park",
    "match_id": 72214,
    "matchday": 1,
    "matchday_label": "Matchday 1",
    "matchday_name": "1. Spieltag",
    "matchday_url": "https://www.openligadb.de/Matches/bl1/2024/1",
    "number_of_viewers": null,
    "results": [
      {
        "description": "Ergebnis nach Ende der ersten Halbzeit",
        "kind": "HalfTime",
        "label": "Half-time",
        "name": "Halbzeitergebnis",
        "order": 1,
        "points_team1": 0,
        "points_team2": 2,
        "result_id": 111413,
        "result_type_id": 1
      },
      {
        "description": "Ergebnis nach Ende der offiziellen Spielzeit",
        "kind": "After90Minutes",
        "label": "Full-time",
        "name": "Endergebnis",
        "order": 2,
        "points_team1": 2,
        "points_team2": 3,
        "result_id": 111414,
        "result_type_id": 2
      }
    ],
    "score": "2:3",
    "score_source": "result",
    "status": "finished",
    "team1_icon_url": "https://i.imgur.com/KSIk0Eu.png",
    "team1_id": 87,
    "team1_name": "Borussia M\u00f6nchengladbach",
    "team1_short_name": "Gladbach",
    "team2_icon_url": "https://www.bundesliga-reisefuehrer.de/sites/default/files/B04_Standard_Logo_RGB.png",
    "team2_id": 6,
    "team2_name": "Bayer 04 Leverkusen",
    "team2_short_name": "Leverkusen",
    "time_zone_id": "W. Europe Standard Time",
    "winner": "team2",
    "winner_name": "Bayer 04 Leverkusen",
    "winner_team_id": 6
  }
}
```

### Get group tables

Get the standings of a tournament that plays in groups, one table per group, as at a World Cup or a European Championship. Only a competition with a group stage has these; a league that plays one table answers with a message pointing at Get the league table. No API key required.

**Inputs**

- League (`league`, text, required): The competition to read, picked from every league OpenLigaDB holds. The list is ordered with the long running competitions first, so the Bundesliga, its lower tiers and the DFB-Pokal are near the top.
- Season (`season`, text, required): Which season of that league. A season is named for the year it starts in, so 2025 is the 2025/2026 season. The list shows only the seasons this league actually has.

**Outputs**

- `count` (number): How many rows are in this page.
- `groups` (list): The groups, each with its own table.
- `league` (text): The league shortcut the answer is about.
- `season` (text): The season the answer is about.
- `team_count` (number): How many teams there are across every group.

**Example output**

```json
{
  "count": 9,
  "groups": [
    {
      "count": 2,
      "group_id": 209,
      "name": "Gruppe A",
      "table": [
        {
          "drawn": 0,
          "goal_difference": 2,
          "goals_against": 0,
          "goals_for": 2,
          "icon_url": "http://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Flag_of_Ecuador.svg/20px-Flag_of_Ecuador.svg.png",
          "lost": 0,
          "name": "Ecuador",
          "played": 1,
          "points": 3,
          "position": 1,
          "short_name": "ECU",
          "team_id": 2670,
          "won": 1
        },
        {
          "drawn": 0,
          "goal_difference": -2,
          "goals_against": 2,
          "goals_for": 0,
          "icon_url": "https://upload.wikimedia.org/wikipedia/commons/6/65/Flag_of_Qatar.svg",
          "lost": 1,
          "name": "Katar",
          "played": 1,
          "points": 0,
          "position": 2,
          "short_name": "QAT",
          "team_id": 4912,
          "won": 0
        }
      ]
    }
  ],
  "league": "WM2022",
  "season": "2022",
  "team_count": 32
}
```

### Get head to head

Get every match two teams have played against each other, with the record worked out: how many each has won, how many were drawn, and the goals either way. OpenLigaDB answers with their whole shared history across every competition it holds, and fixtures still to come are included alongside. No API key required.

**Inputs**

- League (`league`, text, required): The league to pick the two teams from. It only fills the team lists: the answer covers every competition the two have met in.
- Season (`season`, text, required): Which season of that league. A season is named for the year it starts in, so 2025 is the 2025/2026 season. The list shows only the seasons this league actually has.
- First team (`team_1`, text, required): One of the two teams. The record is reported from this team's point of view.
- Second team (`team_2`, text, required): The other team. It must be a different one.
- Match status (`status`, list): Optional. Keep only matches in these states. A match counts as in progress once its kick-off has passed and OpenLigaDB has not yet marked it finished. Choose none to keep them all. One or more of: `finished`, `live` (In progress), `upcoming` (Not started).
- Newest first (`newest_first`, true/false): Optional. Return the latest kick-off first instead of the earliest. Off by default, which is fixture-list order. Default: `false`.
- Number of rows (`limit`, number): Optional. How many rows to return. Between 1 and 500; 25 by default. From 1 to 500. Default: `25`.
- Skip (`offset`, number): Optional. How many rows to skip before this page. Use the next offset from the previous result to page through. 0 by default. At least 0. Default: `0`.

**Outputs**

- `count` (number): How many rows are in this page.
- `draws` (number): How many were drawn.
- `has_more` (true/false): True when more rows matched than this page holds.
- `league` (text): The league the teams were picked from, which does not limit the meetings returned.
- `matches` (list): The matches in this page.
- `next_offset` (number): The offset that fetches the next page. Null when this is the last one.
- `played` (number): How many of their meetings have been played. The record below counts only these.
- `season` (text): The season the answer is about.
- `team_1_goals` (number): Goals the first team has scored in them.
- `team_1_id` (number): The first team's id.
- `team_1_wins` (number): How many the first team won.
- `team_2_goals` (number): Goals the second team has scored in them.
- `team_2_id` (number): The second team's id.
- `team_2_wins` (number): How many the second team won.
- `total_count` (number): How many rows matched in total, across every page.

**Example output**

```json
{
  "count": 1,
  "draws": 19,
  "has_more": true,
  "league": "bl1",
  "matches": [
    {
      "goal_count": 5,
      "goals": [
        {
          "comment": null,
          "goal_id": 116409,
          "is_overtime": false,
          "is_own_goal": false,
          "is_penalty": false,
          "minute": 12,
          "score_team1": 0,
          "score_team2": 1,
          "scorer_id": 14289,
          "scorer_name": "Granit Xhaka",
          "scoring_team_id": 6
        },
        {
          "comment": null,
          "goal_id": 116410,
          "is_overtime": false,
          "is_own_goal": false,
          "is_penalty": false,
          "minute": 38,
          "score_team1": 0,
          "score_team2": 2,
          "scorer_id": 18494,
          "scorer_name": "F. Wirtz",
          "scoring_team_id": 6
        },
        {
          "comment": null,
          "goal_id": 116412,
          "is_overtime": false,
          "is_own_goal": false,
          "is_penalty": false,
          "minute": 59,
          "score_team1": 1,
          "score_team2": 2,
          "scorer_id": 18490,
          "scorer_name": "N. Elvedi",
          "scoring_team_id": 87
        },
        {
          "comment": null,
          "goal_id": 116413,
          "is_overtime": false,
          "is_own_goal": false,
          "is_penalty": false,
          "minute": 85,
          "score_team1": 2,
          "score_team2": 2,
          "scorer_id": 18551,
          "scorer_name": "T. Kleindienst",
          "scoring_team_id": 87
        },
        {
          "comment": "+11",
          "goal_id": 116414,
          "is_overtime": true,
          "is_own_goal": false,
          "is_penalty": true,
          "minute": 90,
          "score_team1": 2,
          "score_team2": 3,
          "scorer_id": 18494,
          "scorer_name": "F. Wirtz",
          "scoring_team_id": 6
        }
      ],
      "goals_team1": 2,
      "goals_team2": 3,
      "group_id": 45117,
      "half_time_team1": 0,
      "half_time_team2": 2,
      "is_finished": true,
      "kickoff_local": "2024-08-23T20:30:00",
      "kickoff_utc": "2024-08-23T18:30:00Z",
      "last_update": "2024-08-24T11:29:10.647",
      "league_id": 4741,
      "league_name": "1. Fu\u00dfball-Bundesliga 2024/2025",
      "league_season": "2024",
      "league_shortcut": "bl1",
      "location_city": "M\u00f6nchengladbach",
      "location_id": 32,
      "location_stadium": "Borussia Park",
      "match_id": 72214,
      "matchday": 1,
      "matchday_label": "Matchday 1",
      "matchday_name": "1. Spieltag",
      "matchday_url": "https://www.openligadb.de/Matches/bl1/2024/1",
      "number_of_viewers": null,
      "results": [
        {
          "description": "Ergebnis nach Ende der ersten Halbzeit",
          "kind": "HalfTime",
          "label": "Half-time",
          "name": "Halbzeitergebnis",
          "order": 1,
          "points_team1": 0,
          "points_team2": 2,
          "result_id": 111413,
          "result_type_id": 1
        },
        {
          "description": "Ergebnis nach Ende der offiziellen Spielzeit",
          "kind": "After90Minutes",
          "label": "Full-time",
          "name": "Endergebnis",
          "order": 2,
          "points_team1": 2,
          "points_team2": 3,
          "result_id": 111414,
          "result_type_id": 2
        }
      ],
      "score": "2:3",
      "score_source": "result",
      "status": "finished",
      "team1_icon_url": "https://i.imgur.com/KSIk0Eu.png",
      "team1_id": 87,
      "team1_name": "Borussia M\u00f6nchengladbach",
      "team1_short_name": "Gladbach",
      "team2_icon_url": "https://www.bundesliga-reisefuehrer.de/sites/default/files/B04_Standard_Logo_RGB.png",
      "team2_id": 6,
      "team2_name": "Bayer 04 Leverkusen",
      "team2_short_name": "Leverkusen",
      "time_zone_id": "W. Europe Standard Time",
      "winner": "team2",
      "winner_name": "Bayer 04 Leverkusen",
      "winner_team_id": 6
    }
  ],
  "next_offset": 1,
  "played": 58,
  "season": "2024",
  "team_1_goals": 45,
  "team_1_id": 87,
  "team_1_wins": 12,
  "team_2_goals": 88,
  "team_2_id": 6,
  "team_2_wins": 27,
  "total_count": 67
}
```

### Get the current matchday

Find which round a league is on right now. This is the one action that needs no season: OpenLigaDB works out which season is running and which round of it is next, which is what a weekly digest needs before it can ask for the fixtures. No API key required.

**Inputs**

- League (`league`, text, required): The competition to read, picked from every league OpenLigaDB holds. The list is ordered with the long running competitions first, so the Bundesliga, its lower tiers and the DFB-Pokal are near the top.

**Outputs**

- `found` (true/false): True when the league is between or during matchdays. False when it is not running at all, which is a normal answer out of season.
- `group_id` (number): OpenLigaDB's id for the round.
- `label` (text): The same round in English, e.g. Matchday 1.
- `league` (text): The league shortcut the answer is about.
- `matchday` (number): The round number, counting from 1.
- `name` (text): The round's name in German, e.g. 1. Spieltag.

**Example output**

```json
{
  "found": true,
  "group_id": 50633,
  "label": "Matchday 1",
  "league": "bl1",
  "matchday": 1,
  "name": "1. Spieltag"
}
```

### Get the last change date

Find when a matchday's data last changed. This is the cheap check to run on a schedule: compare the answer with the one from the previous run and only fetch the matches when it has moved, rather than pulling a whole matchday every few minutes. Leave the matchday blank to watch whichever round the league is currently on. No API key required.

**Inputs**

- League (`league`, text, required): The competition to read, picked from every league OpenLigaDB holds. The list is ordered with the long running competitions first, so the Bundesliga, its lower tiers and the DFB-Pokal are near the top.
- Season (`season`, text, required): Which season of that league. A season is named for the year it starts in, so 2025 is the 2025/2026 season. The list shows only the seasons this league actually has.
- Matchday (`matchday`, text): Optional. One round of the season, called a Spieltag in the German leagues. Leave blank for the whole season.
- Changed since (`since`, date and time): Optional. A moment to compare against, usually the last change date the previous run reported. The answer then says outright whether anything has changed. A time with no zone is read as UTC.

**Outputs**

- `has_changed` (true/false): True when the change is newer than the moment given. Null when no moment was given, so branch on it only when you passed one.
- `last_change` (text): When the matchday last changed, exactly as OpenLigaDB reports it: its own clock, with no time zone attached. Store this and pass it back as Changed since next run.
- `last_change_utc` (text): The same moment read as UTC and formatted consistently, e.g. 2025-08-24T19:25:06Z.
- `league` (text): The league shortcut the answer is about.
- `matchday` (number): The matchday that was checked.
- `matchday_url` (text): The page on openligadb.de showing that round.
- `season` (text): The season the answer is about.
- `used_current_matchday` (true/false): True when no matchday was given and the league's current one was used.

**Example output**

```json
{
  "has_changed": true,
  "last_change": "2024-08-27T17:07:06.143",
  "last_change_utc": "2024-08-27T17:07:06Z",
  "league": "bl1",
  "matchday": 1,
  "matchday_url": "https://www.openligadb.de/Matches/bl1/2024/1",
  "season": "2024",
  "used_current_matchday": false
}
```

### Get the last match

Get the most recently played match in a league, or the last one a single team played. With no team this is the league's last kick-off and no season is needed. Pair it with the table for a results round-up. No API key required.

**Inputs**

- League (`league`, text, required): The competition to read, picked from every league OpenLigaDB holds. The list is ordered with the long running competitions first, so the Bundesliga, its lower tiers and the DFB-Pokal are near the top.
- Season (`season`, text): Optional. Which season of that league, named for the year it starts in: 2025 is the 2025/2026 season. Leave blank for the most recent season the league has.
- Team (`team`, text): Optional. One of the teams in the league and season chosen above. Leave blank to cover every team.

**Outputs**

- `found` (true/false): True when there was a match to report. False is a normal answer: a league whose season has not started has no last match, and one that has ended has no next match. Branch on this before reading the match.
- `league` (text): The league shortcut the answer is about.
- `match` (object): One match, with its score, its stage scores and its goals.
- `team` (number): The team that was asked about. Null when the league's last match was asked for.

**Example output**

```json
{
  "found": true,
  "league": "bl1",
  "match": {
    "goal_count": 5,
    "goals": [
      {
        "comment": null,
        "goal_id": 116409,
        "is_overtime": false,
        "is_own_goal": false,
        "is_penalty": false,
        "minute": 12,
        "score_team1": 0,
        "score_team2": 1,
        "scorer_id": 14289,
        "scorer_name": "Granit Xhaka",
        "scoring_team_id": 6
      },
      {
        "comment": null,
        "goal_id": 116410,
        "is_overtime": false,
        "is_own_goal": false,
        "is_penalty": false,
        "minute": 38,
        "score_team1": 0,
        "score_team2": 2,
        "scorer_id": 18494,
        "scorer_name": "F. Wirtz",
        "scoring_team_id": 6
      },
      {
        "comment": null,
        "goal_id": 116412,
        "is_overtime": false,
        "is_own_goal": false,
        "is_penalty": false,
        "minute": 59,
        "score_team1": 1,
        "score_team2": 2,
        "scorer_id": 18490,
        "scorer_name": "N. Elvedi",
        "scoring_team_id": 87
      },
      {
        "comment": null,
        "goal_id": 116413,
        "is_overtime": false,
        "is_own_goal": false,
        "is_penalty": false,
        "minute": 85,
        "score_team1": 2,
        "score_team2": 2,
        "scorer_id": 18551,
        "scorer_name": "T. Kleindienst",
        "scoring_team_id": 87
      },
      {
        "comment": "+11",
        "goal_id": 116414,
        "is_overtime": true,
        "is_own_goal": false,
        "is_penalty": true,
        "minute": 90,
        "score_team1": 2,
        "score_team2": 3,
        "scorer_id": 18494,
        "scorer_name": "F. Wirtz",
        "scoring_team_id": 6
      }
    ],
    "goals_team1": 2,
    "goals_team2": 3,
    "group_id": 45117,
    "half_time_team1": 0,
    "half_time_team2": 2,
    "is_finished": true,
    "kickoff_local": "2024-08-23T20:30:00",
    "kickoff_utc": "2024-08-23T18:30:00Z",
    "last_update": "2024-08-24T11:29:10.647",
    "league_id": 4741,
    "league_name": "1. Fu\u00dfball-Bundesliga 2024/2025",
    "league_season": "2024",
    "league_shortcut": "bl1",
    "location_city": "M\u00f6nchengladbach",
    "location_id": 32,
    "location_stadium": "Borussia Park",
    "match_id": 72214,
    "matchday": 1,
    "matchday_label": "Matchday 1",
    "matchday_name": "1. Spieltag",
    "matchday_url": "https://www.openligadb.de/Matches/bl1/2024/1",
    "number_of_viewers": null,
    "results": [
      {
        "description": "Ergebnis nach Ende der ersten Halbzeit",
        "kind": "HalfTime",
        "label": "Half-time",
        "name": "Halbzeitergebnis",
        "order": 1,
        "points_team1": 0,
        "points_team2": 2,
        "result_id": 111413,
        "result_type_id": 1
      },
      {
        "description": "Ergebnis nach Ende der offiziellen Spielzeit",
        "kind": "After90Minutes",
        "label": "Full-time",
        "name": "Endergebnis",
        "order": 2,
        "points_team1": 2,
        "points_team2": 3,
        "result_id": 111414,
        "result_type_id": 2
      }
    ],
    "score": "2:3",
    "score_source": "result",
    "status": "finished",
    "team1_icon_url": "https://i.imgur.com/KSIk0Eu.png",
    "team1_id": 87,
    "team1_name": "Borussia M\u00f6nchengladbach",
    "team1_short_name": "Gladbach",
    "team2_icon_url": "https://www.bundesliga-reisefuehrer.de/sites/default/files/B04_Standard_Logo_RGB.png",
    "team2_id": 6,
    "team2_name": "Bayer 04 Leverkusen",
    "team2_short_name": "Leverkusen",
    "time_zone_id": "W. Europe Standard Time",
    "winner": "team2",
    "winner_name": "Bayer 04 Leverkusen",
    "winner_team_id": 6
  },
  "team": 40
}
```

### Get the league table

Get a league's table for a season: every team with its points, its played, won, drawn and lost, its goals either way and its goal difference, in the order OpenLigaDB ranks them. For a tournament that plays in groups, use Get group tables instead. No API key required.

**Inputs**

- League (`league`, text, required): The competition to read, picked from every league OpenLigaDB holds. The list is ordered with the long running competitions first, so the Bundesliga, its lower tiers and the DFB-Pokal are near the top.
- Season (`season`, text, required): Which season of that league. A season is named for the year it starts in, so 2025 is the 2025/2026 season. The list shows only the seasons this league actually has.

**Outputs**

- `count` (number): How many rows are in this page.
- `leader` (text): The team at the top of the table.
- `leader_points` (number): How many points that team has.
- `league` (text): The league shortcut the answer is about.
- `matches_played` (number): The most matches any team has played, which is how far into the season the table is.
- `season` (text): The season the answer is about.
- `table` (list): The table, best placed team first.

**Example output**

```json
{
  "count": 18,
  "leader": "FC Bayern M\u00fcnchen",
  "leader_points": 82,
  "league": "bl1",
  "matches_played": 34,
  "season": "2024",
  "table": [
    {
      "drawn": 7,
      "goal_difference": 67,
      "goals_against": 32,
      "goals_for": 99,
      "icon_url": "https://upload.wikimedia.org/wikipedia/commons/1/1f/Logo_FC_Bayern_M%C3%BCnchen_%282002%E2%80%932017%29.svg",
      "lost": 2,
      "name": "FC Bayern M\u00fcnchen",
      "played": 34,
      "points": 82,
      "position": 1,
      "short_name": "Bayern",
      "team_id": 40,
      "won": 25
    },
    {
      "drawn": 12,
      "goal_difference": 29,
      "goals_against": 43,
      "goals_for": 72,
      "icon_url": "https://www.bundesliga-reisefuehrer.de/sites/default/files/B04_Standard_Logo_RGB.png",
      "lost": 3,
      "name": "Bayer 04 Leverkusen",
      "played": 34,
      "points": 69,
      "position": 2,
      "short_name": "Leverkusen",
      "team_id": 6,
      "won": 19
    }
  ]
}
```

### Get the next match

Get the next match still to be played in a league, or the next one for a single team. With no team this is the league's next kick-off whoever is playing, and no season is needed. This is the action a reminder workflow runs on a schedule. No API key required.

**Inputs**

- League (`league`, text, required): The competition to read, picked from every league OpenLigaDB holds. The list is ordered with the long running competitions first, so the Bundesliga, its lower tiers and the DFB-Pokal are near the top.
- Season (`season`, text): Optional. Which season of that league, named for the year it starts in: 2025 is the 2025/2026 season. Leave blank for the most recent season the league has.
- Team (`team`, text): Optional. One of the teams in the league and season chosen above. Leave blank to cover every team.

**Outputs**

- `found` (true/false): True when there was a match to report. False is a normal answer: a league whose season has not started has no last match, and one that has ended has no next match. Branch on this before reading the match.
- `league` (text): The league shortcut the answer is about.
- `match` (object): One match, with its score, its stage scores and its goals.
- `team` (number): The team that was asked about. Null when the league's next match was asked for.

**Example output**

```json
{
  "found": true,
  "league": "bl1",
  "match": {
    "goal_count": 5,
    "goals": [
      {
        "comment": null,
        "goal_id": 116409,
        "is_overtime": false,
        "is_own_goal": false,
        "is_penalty": false,
        "minute": 12,
        "score_team1": 0,
        "score_team2": 1,
        "scorer_id": 14289,
        "scorer_name": "Granit Xhaka",
        "scoring_team_id": 6
      },
      {
        "comment": null,
        "goal_id": 116410,
        "is_overtime": false,
        "is_own_goal": false,
        "is_penalty": false,
        "minute": 38,
        "score_team1": 0,
        "score_team2": 2,
        "scorer_id": 18494,
        "scorer_name": "F. Wirtz",
        "scoring_team_id": 6
      },
      {
        "comment": null,
        "goal_id": 116412,
        "is_overtime": false,
        "is_own_goal": false,
        "is_penalty": false,
        "minute": 59,
        "score_team1": 1,
        "score_team2": 2,
        "scorer_id": 18490,
        "scorer_name": "N. Elvedi",
        "scoring_team_id": 87
      },
      {
        "comment": null,
        "goal_id": 116413,
        "is_overtime": false,
        "is_own_goal": false,
        "is_penalty": false,
        "minute": 85,
        "score_team1": 2,
        "score_team2": 2,
        "scorer_id": 18551,
        "scorer_name": "T. Kleindienst",
        "scoring_team_id": 87
      },
      {
        "comment": "+11",
        "goal_id": 116414,
        "is_overtime": true,
        "is_own_goal": false,
        "is_penalty": true,
        "minute": 90,
        "score_team1": 2,
        "score_team2": 3,
        "scorer_id": 18494,
        "scorer_name": "F. Wirtz",
        "scoring_team_id": 6
      }
    ],
    "goals_team1": 2,
    "goals_team2": 3,
    "group_id": 45117,
    "half_time_team1": 0,
    "half_time_team2": 2,
    "is_finished": true,
    "kickoff_local": "2024-08-23T20:30:00",
    "kickoff_utc": "2024-08-23T18:30:00Z",
    "last_update": "2024-08-24T11:29:10.647",
    "league_id": 4741,
    "league_name": "1. Fu\u00dfball-Bundesliga 2024/2025",
    "league_season": "2024",
    "league_shortcut": "bl1",
    "location_city": "M\u00f6nchengladbach",
    "location_id": 32,
    "location_stadium": "Borussia Park",
    "match_id": 72214,
    "matchday": 1,
    "matchday_label": "Matchday 1",
    "matchday_name": "1. Spieltag",
    "matchday_url": "https://www.openligadb.de/Matches/bl1/2024/1",
    "number_of_viewers": null,
    "results": [
      {
        "description": "Ergebnis nach Ende der ersten Halbzeit",
        "kind": "HalfTime",
        "label": "Half-time",
        "name": "Halbzeitergebnis",
        "order": 1,
        "points_team1": 0,
        "points_team2": 2,
        "result_id": 111413,
        "result_type_id": 1
      },
      {
        "description": "Ergebnis nach Ende der offiziellen Spielzeit",
        "kind": "After90Minutes",
        "label": "Full-time",
        "name": "Endergebnis",
        "order": 2,
        "points_team1": 2,
        "points_team2": 3,
        "result_id": 111414,
        "result_type_id": 2
      }
    ],
    "score": "2:3",
    "score_source": "result",
    "status": "finished",
    "team1_icon_url": "https://i.imgur.com/KSIk0Eu.png",
    "team1_id": 87,
    "team1_name": "Borussia M\u00f6nchengladbach",
    "team1_short_name": "Gladbach",
    "team2_icon_url": "https://www.bundesliga-reisefuehrer.de/sites/default/files/B04_Standard_Logo_RGB.png",
    "team2_id": 6,
    "team2_name": "Bayer 04 Leverkusen",
    "team2_short_name": "Leverkusen",
    "time_zone_id": "W. Europe Standard Time",
    "winner": "team2",
    "winner_name": "Bayer 04 Leverkusen",
    "winner_team_id": 6
  },
  "team": null
}
```

### List a team's matches

Get one club's matches around today across every competition OpenLigaDB holds, so a cup tie, a friendly and a league fixture come back together. Pick the team from a league to get its id, or type part of its name to search without one. The two dates set the window; leave them blank for today plus four weeks. No API key required.

**Inputs**

- League (`league`, text): Optional. The league to pick the team from. It only fills the team list: the matches come back from every competition the team plays in, not just this one.
- Season (`season`, text): Optional. Which season of that league, named for the year it starts in: 2025 is the 2025/2026 season. Leave blank for the most recent season the league has.
- Team (`team`, text): Optional. One of the teams in the league and season chosen above. Leave blank to cover every team.
- Or search by name (`team_name`, text): Optional. Part of a team's name, for a team that is not in the league above. Matching is on any part of the name, so Bayern finds FC Bayern Muenchen. Use this or the team list, not both.
- From date (`from_date`, date): Optional. Only matches kicking off on or after this day, compared in UTC.
- To date (`to_date`, date): Optional. Only matches kicking off on or before this day, compared in UTC.
- Match status (`status`, list): Optional. Keep only matches in these states. A match counts as in progress once its kick-off has passed and OpenLigaDB has not yet marked it finished. Choose none to keep them all. One or more of: `finished`, `live` (In progress), `upcoming` (Not started).
- Newest first (`newest_first`, true/false): Optional. Return the latest kick-off first instead of the earliest. Off by default, which is fixture-list order. Default: `false`.
- Number of rows (`limit`, number): Optional. How many rows to return. Between 1 and 500; 25 by default. From 1 to 500. Default: `25`.
- Skip (`offset`, number): Optional. How many rows to skip before this page. Use the next offset from the previous result to page through. 0 by default. At least 0. Default: `0`.

**Outputs**

- `count` (number): How many rows are in this page.
- `from_date` (text): The first day of the window that was applied, YYYY-MM-DD.
- `has_more` (true/false): True when more rows matched than this page holds.
- `league` (text): The league the team was picked from, which does not limit the matches returned.
- `matches` (list): The matches in this page.
- `next_offset` (number): The offset that fetches the next page. Null when this is the last one.
- `season` (text): The season the answer is about.
- `team` (number): The team id that was asked about. Null when a name was searched instead.
- `team_name` (text): The name that was searched. Null when a team was picked from the list instead.
- `to_date` (text): The last day of the window that was applied, YYYY-MM-DD.
- `total_count` (number): How many rows matched in total, across every page.

**Example output**

```json
{
  "count": 1,
  "from_date": "2024-08-01",
  "has_more": false,
  "league": "bl1",
  "matches": [
    {
      "goal_count": 5,
      "goals": [
        {
          "comment": null,
          "goal_id": 116409,
          "is_overtime": false,
          "is_own_goal": false,
          "is_penalty": false,
          "minute": 12,
          "score_team1": 0,
          "score_team2": 1,
          "scorer_id": 14289,
          "scorer_name": "Granit Xhaka",
          "scoring_team_id": 6
        },
        {
          "comment": null,
          "goal_id": 116410,
          "is_overtime": false,
          "is_own_goal": false,
          "is_penalty": false,
          "minute": 38,
          "score_team1": 0,
          "score_team2": 2,
          "scorer_id": 18494,
          "scorer_name": "F. Wirtz",
          "scoring_team_id": 6
        },
        {
          "comment": null,
          "goal_id": 116412,
          "is_overtime": false,
          "is_own_goal": false,
          "is_penalty": false,
          "minute": 59,
          "score_team1": 1,
          "score_team2": 2,
          "scorer_id": 18490,
          "scorer_name": "N. Elvedi",
          "scoring_team_id": 87
        },
        {
          "comment": null,
          "goal_id": 116413,
          "is_overtime": false,
          "is_own_goal": false,
          "is_penalty": false,
          "minute": 85,
          "score_team1": 2,
          "score_team2": 2,
          "scorer_id": 18551,
          "scorer_name": "T. Kleindienst",
          "scoring_team_id": 87
        },
        {
          "comment": "+11",
          "goal_id": 116414,
          "is_overtime": true,
          "is_own_goal": false,
          "is_penalty": true,
          "minute": 90,
          "score_team1": 2,
          "score_team2": 3,
          "scorer_id": 18494,
          "scorer_name": "F. Wirtz",
          "scoring_team_id": 6
        }
      ],
      "goals_team1": 2,
      "goals_team2": 3,
      "group_id": 45117,
      "half_time_team1": 0,
      "half_time_team2": 2,
      "is_finished": true,
      "kickoff_local": "2024-08-23T20:30:00",
      "kickoff_utc": "2024-08-23T18:30:00Z",
      "last_update": "2024-08-24T11:29:10.647",
      "league_id": 4741,
      "league_name": "1. Fu\u00dfball-Bundesliga 2024/2025",
      "league_season": "2024",
      "league_shortcut": "bl1",
      "location_city": "M\u00f6nchengladbach",
      "location_id": 32,
      "location_stadium": "Borussia Park",
      "match_id": 72214,
      "matchday": 1,
      "matchday_label": "Matchday 1",
      "matchday_name": "1. Spieltag",
      "matchday_url": "https://www.openligadb.de/Matches/bl1/2024/1",
      "number_of_viewers": null,
      "results": [
        {
          "description": "Ergebnis nach Ende der ersten Halbzeit",
          "kind": "HalfTime",
          "label": "Half-time",
          "name": "Halbzeitergebnis",
          "order": 1,
          "points_team1": 0,
          "points_team2": 2,
          "result_id": 111413,
          "result_type_id": 1
        },
        {
          "description": "Ergebnis nach Ende der offiziellen Spielzeit",
          "kind": "After90Minutes",
          "label": "Full-time",
          "name": "Endergebnis",
          "order": 2,
          "points_team1": 2,
          "points_team2": 3,
          "result_id": 111414,
          "result_type_id": 2
        }
      ],
      "score": "2:3",
      "score_source": "result",
      "status": "finished",
      "team1_icon_url": "https://i.imgur.com/KSIk0Eu.png",
      "team1_id": 87,
      "team1_name": "Borussia M\u00f6nchengladbach",
      "team1_short_name": "Gladbach",
      "team2_icon_url": "https://www.bundesliga-reisefuehrer.de/sites/default/files/B04_Standard_Logo_RGB.png",
      "team2_id": 6,
      "team2_name": "Bayer 04 Leverkusen",
      "team2_short_name": "Leverkusen",
      "time_zone_id": "W. Europe Standard Time",
      "winner": "team2",
      "winner_name": "Bayer 04 Leverkusen",
      "winner_team_id": 6
    }
  ],
  "next_offset": null,
  "season": "2024",
  "team": 87,
  "team_name": null,
  "to_date": "2024-08-31",
  "total_count": 1
}
```

### List leagues

Find a competition and the shortcut that addresses it. OpenLigaDB holds over 800 league seasons, from the Bundesliga and the DFB-Pokal down to local amateur competitions, so narrow the list by season, sport or a word from the name. Every other action takes the shortcut and season this returns. No API key required.

**Inputs**

- Season (`season`, text): Optional. Only leagues that ran in this season, which is named for the year it starts in: 2025 means 2025/2026. Leave blank for every season, which is a much larger list.
- Sport (`sport`, text): Optional. Only leagues in this sport. Leave blank for all of them.
- Name contains (`query`, text): Optional. Only leagues whose name or shortcut contains this text. Matching ignores capitals.
- Number of leagues (`limit`, number): Optional. How many leagues to return. Between 1 and 500; 50 by default. From 1 to 500. Default: `50`.
- Skip (`offset`, number): Optional. How many rows to skip before this page. Use the next offset from the previous result to page through. 0 by default. At least 0. Default: `0`.

**Outputs**

- `count` (number): How many rows are in this page.
- `has_more` (true/false): True when more rows matched than this page holds.
- `leagues` (list): The leagues in this page, newest season first.
- `next_offset` (number): The offset that fetches the next page. Null when this is the last one.
- `season` (text): The season that was filtered on. Null when every season was searched.
- `total_count` (number): How many rows matched in total, across every page.

**Example output**

```json
{
  "count": 1,
  "has_more": false,
  "leagues": [
    {
      "league_id": 4741,
      "matches_url": "https://www.openligadb.de/Matches/bl1/2024/",
      "name": "1. Fu\u00dfball-Bundesliga 2024/2025",
      "season": "2024",
      "shortcut": "bl1",
      "sport_id": 1,
      "sport_label": "Fu\u00dfball (Football)",
      "sport_name": "Fu\u00dfball"
    }
  ],
  "next_offset": null,
  "season": "2024",
  "total_count": 1
}
```

### List matchdays

List the rounds a league's season is played over, each with its number and its name. A German league calls a round a Spieltag and numbers them; a cup names them instead, so a quarter-final comes back under that name. No API key required.

**Inputs**

- League (`league`, text, required): The competition to read, picked from every league OpenLigaDB holds. The list is ordered with the long running competitions first, so the Bundesliga, its lower tiers and the DFB-Pokal are near the top.
- Season (`season`, text, required): Which season of that league. A season is named for the year it starts in, so 2025 is the 2025/2026 season. The list shows only the seasons this league actually has.

**Outputs**

- `count` (number): How many rows are in this page.
- `league` (text): The league shortcut the answer is about.
- `matchdays` (list): The matchdays, in the order they are played.
- `season` (text): The season the answer is about.

**Example output**

```json
{
  "count": 34,
  "league": "bl1",
  "matchdays": [
    {
      "group_id": 45117,
      "label": "Matchday 1",
      "matchday": 1,
      "matchday_url": "https://www.openligadb.de/Matches/bl1/2024/1",
      "name": "1. Spieltag"
    },
    {
      "group_id": 45118,
      "label": "Matchday 2",
      "matchday": 2,
      "matchday_url": "https://www.openligadb.de/Matches/bl1/2024/2",
      "name": "2. Spieltag"
    }
  ],
  "season": "2024"
}
```

### List matches

Get the fixtures and results of a league's season, each with its kick-off, its score at half-time and full time, and every goal that was scored. Narrow it to one matchday, to one team's whole season, or to the days a weekend covers, and keep only the matches that have finished, are being played, or are still to come. No API key required.

**Inputs**

- League (`league`, text, required): The competition to read, picked from every league OpenLigaDB holds. The list is ordered with the long running competitions first, so the Bundesliga, its lower tiers and the DFB-Pokal are near the top.
- Season (`season`, text, required): Which season of that league. A season is named for the year it starts in, so 2025 is the 2025/2026 season. The list shows only the seasons this league actually has.
- Matchday (`matchday`, text): Optional. One round of the season, called a Spieltag in the German leagues. Leave blank for the whole season.
- Team (`team_name`, text): Optional. One of the teams in the league and season chosen above. Leave blank for every team's matches.
- From date (`from_date`, date): Optional. Only matches kicking off on or after this day, compared in UTC.
- To date (`to_date`, date): Optional. Only matches kicking off on or before this day, compared in UTC.
- Match status (`status`, list): Optional. Keep only matches in these states. A match counts as in progress once its kick-off has passed and OpenLigaDB has not yet marked it finished. Choose none to keep them all. One or more of: `finished`, `live` (In progress), `upcoming` (Not started).
- Newest first (`newest_first`, true/false): Optional. Return the latest kick-off first instead of the earliest. Off by default, which is fixture-list order. Default: `false`.
- Number of rows (`limit`, number): Optional. How many rows to return. Between 1 and 500; 25 by default. From 1 to 500. Default: `25`.
- Skip (`offset`, number): Optional. How many rows to skip before this page. Use the next offset from the previous result to page through. 0 by default. At least 0. Default: `0`.

**Outputs**

- `count` (number): How many rows are in this page.
- `has_more` (true/false): True when more rows matched than this page holds.
- `league` (text): The league shortcut the answer is about.
- `matchday` (number): The matchday that was filtered on. Null when the whole season was read.
- `matches` (list): The matches in this page.
- `next_offset` (number): The offset that fetches the next page. Null when this is the last one.
- `season` (text): The season the answer is about.
- `team_name` (text): The team that was filtered on. Null when every team was included.
- `total_count` (number): How many rows matched in total, across every page.

**Example output**

```json
{
  "count": 1,
  "has_more": true,
  "league": "bl1",
  "matchday": 1,
  "matches": [
    {
      "goal_count": 5,
      "goals": [
        {
          "comment": null,
          "goal_id": 116409,
          "is_overtime": false,
          "is_own_goal": false,
          "is_penalty": false,
          "minute": 12,
          "score_team1": 0,
          "score_team2": 1,
          "scorer_id": 14289,
          "scorer_name": "Granit Xhaka",
          "scoring_team_id": 6
        },
        {
          "comment": null,
          "goal_id": 116410,
          "is_overtime": false,
          "is_own_goal": false,
          "is_penalty": false,
          "minute": 38,
          "score_team1": 0,
          "score_team2": 2,
          "scorer_id": 18494,
          "scorer_name": "F. Wirtz",
          "scoring_team_id": 6
        },
        {
          "comment": null,
          "goal_id": 116412,
          "is_overtime": false,
          "is_own_goal": false,
          "is_penalty": false,
          "minute": 59,
          "score_team1": 1,
          "score_team2": 2,
          "scorer_id": 18490,
          "scorer_name": "N. Elvedi",
          "scoring_team_id": 87
        },
        {
          "comment": null,
          "goal_id": 116413,
          "is_overtime": false,
          "is_own_goal": false,
          "is_penalty": false,
          "minute": 85,
          "score_team1": 2,
          "score_team2": 2,
          "scorer_id": 18551,
          "scorer_name": "T. Kleindienst",
          "scoring_team_id": 87
        },
        {
          "comment": "+11",
          "goal_id": 116414,
          "is_overtime": true,
          "is_own_goal": false,
          "is_penalty": true,
          "minute": 90,
          "score_team1": 2,
          "score_team2": 3,
          "scorer_id": 18494,
          "scorer_name": "F. Wirtz",
          "scoring_team_id": 6
        }
      ],
      "goals_team1": 2,
      "goals_team2": 3,
      "group_id": 45117,
      "half_time_team1": 0,
      "half_time_team2": 2,
      "is_finished": true,
      "kickoff_local": "2024-08-23T20:30:00",
      "kickoff_utc": "2024-08-23T18:30:00Z",
      "last_update": "2024-08-24T11:29:10.647",
      "league_id": 4741,
      "league_name": "1. Fu\u00dfball-Bundesliga 2024/2025",
      "league_season": "2024",
      "league_shortcut": "bl1",
      "location_city": "M\u00f6nchengladbach",
      "location_id": 32,
      "location_stadium": "Borussia Park",
      "match_id": 72214,
      "matchday": 1,
      "matchday_label": "Matchday 1",
      "matchday_name": "1. Spieltag",
      "matchday_url": "https://www.openligadb.de/Matches/bl1/2024/1",
      "number_of_viewers": null,
      "results": [
        {
          "description": "Ergebnis nach Ende der ersten Halbzeit",
          "kind": "HalfTime",
          "label": "Half-time",
          "name": "Halbzeitergebnis",
          "order": 1,
          "points_team1": 0,
          "points_team2": 2,
          "result_id": 111413,
          "result_type_id": 1
        },
        {
          "description": "Ergebnis nach Ende der offiziellen Spielzeit",
          "kind": "After90Minutes",
          "label": "Full-time",
          "name": "Endergebnis",
          "order": 2,
          "points_team1": 2,
          "points_team2": 3,
          "result_id": 111414,
          "result_type_id": 2
        }
      ],
      "score": "2:3",
      "score_source": "result",
      "status": "finished",
      "team1_icon_url": "https://i.imgur.com/KSIk0Eu.png",
      "team1_id": 87,
      "team1_name": "Borussia M\u00f6nchengladbach",
      "team1_short_name": "Gladbach",
      "team2_icon_url": "https://www.bundesliga-reisefuehrer.de/sites/default/files/B04_Standard_Logo_RGB.png",
      "team2_id": 6,
      "team2_name": "Bayer 04 Leverkusen",
      "team2_short_name": "Leverkusen",
      "time_zone_id": "W. Europe Standard Time",
      "winner": "team2",
      "winner_name": "Bayer 04 Leverkusen",
      "winner_team_id": 6
    }
  ],
  "next_offset": 1,
  "season": "2024",
  "team_name": null,
  "total_count": 9
}
```

### List result types

List the stages a score can be recorded at. With no league this is the five OpenLigaDB shares across the whole database, which is what the kind on a match result refers to. With one it is the stages that league actually records, usually half-time and full time. No API key required.

**Inputs**

- League (`league`, text): Optional. Only the stages this league records. Leave blank for the five OpenLigaDB defines globally.
- Season (`season`, text): Optional. Which season of that league, named for the year it starts in: 2025 is the 2025/2026 season. Leave blank for the most recent season the league has.

**Outputs**

- `count` (number): How many rows are in this page.
- `league` (text): The league that was asked about. Null when the global stages were returned.
- `league_id` (number): The numeric league id the stages were read from. Null for the global stages.
- `result_types` (list): The result stages, in the order they occur in a match.
- `season` (text): The season the answer is about.

**Example output**

```json
{
  "count": 2,
  "league": "bl1",
  "league_id": 4741,
  "result_types": [
    {
      "description": "Ergebnis nach Ende der ersten Halbzeit",
      "global_id": 1,
      "global_name": "Halbzeit",
      "kind": "HalfTime",
      "label": "Half-time",
      "name": "Halbzeitergebnis",
      "order": 1,
      "result_type_id": 5676
    },
    {
      "description": "Ergebnis nach Ende der offiziellen Spielzeit",
      "global_id": 2,
      "global_name": "nach 90 Minuten",
      "kind": "After90Minutes",
      "label": "Full-time",
      "name": "Endergebnis",
      "order": 2,
      "result_type_id": 5677
    }
  ],
  "season": "2024"
}
```

### List sports

List the sports OpenLigaDB holds leagues for: football first and foremost, but also ice hockey, handball, basketball and several more. Each comes back with the id that filters the league list. No API key required.

**Inputs**: None.

**Outputs**

- `count` (number): How many rows are in this page.
- `sports` (list): The sports, as OpenLigaDB numbers them.

**Example output**

```json
{
  "count": 13,
  "sports": [
    {
      "label": "Fu\u00dfball (Football)",
      "name": "Fu\u00dfball",
      "sport_id": 1
    },
    {
      "label": "Eishockey (Ice Hockey)",
      "name": "Eishockey",
      "sport_id": 2
    }
  ]
}
```

### List teams

List the teams in a league's season, with the crest and the team id that the head-to-head and team fixture actions take. In a tournament each team also comes back with the group it was drawn into. No API key required.

**Inputs**

- League (`league`, text, required): The competition to read, picked from every league OpenLigaDB holds. The list is ordered with the long running competitions first, so the Bundesliga, its lower tiers and the DFB-Pokal are near the top.
- Season (`season`, text, required): Which season of that league. A season is named for the year it starts in, so 2025 is the 2025/2026 season. The list shows only the seasons this league actually has.

**Outputs**

- `count` (number): How many rows are in this page.
- `league` (text): The league shortcut the answer is about.
- `season` (text): The season the answer is about.
- `teams` (list): The teams, in alphabetical order.

**Example output**

```json
{
  "count": 18,
  "league": "bl1",
  "season": "2024",
  "teams": [
    {
      "group_name": null,
      "icon_url": "https://upload.wikimedia.org/wikipedia/commons/9/9d/1._FC_Heidenheim_1846.svg",
      "name": "1. FC Heidenheim 1846",
      "short_name": "Heidenheim",
      "team_id": 199
    },
    {
      "group_name": null,
      "icon_url": "https://assets.dfb.de/uploads/000/018/232/small_union-Berlin.jpg",
      "name": "1. FC Union Berlin",
      "short_name": "Union Berlin",
      "team_id": 80
    }
  ]
}
```

### List top scorers

Get a league season's scoring charts, most goals first, each player with their goal count and their id. This is the Torjaegerliste OpenLigaDB keeps for the competition. No API key required.

**Inputs**

- League (`league`, text, required): The competition to read, picked from every league OpenLigaDB holds. The list is ordered with the long running competitions first, so the Bundesliga, its lower tiers and the DFB-Pokal are near the top.
- Season (`season`, text, required): Which season of that league. A season is named for the year it starts in, so 2025 is the 2025/2026 season. The list shows only the seasons this league actually has.
- Number of rows (`limit`, number): Optional. How many rows to return. Between 1 and 500; 25 by default. From 1 to 500. Default: `25`.
- Skip (`offset`, number): Optional. How many rows to skip before this page. Use the next offset from the previous result to page through. 0 by default. At least 0. Default: `0`.

**Outputs**

- `count` (number): How many rows are in this page.
- `has_more` (true/false): True when more rows matched than this page holds.
- `league` (text): The league shortcut the answer is about.
- `next_offset` (number): The offset that fetches the next page. Null when this is the last one.
- `scorers` (list): The scoring charts, most goals first.
- `season` (text): The season the answer is about.
- `top_scorer` (text): The player at the top of the charts.
- `top_scorer_goals` (number): How many goals that player has scored.
- `total_count` (number): How many rows matched in total, across every page.

**Example output**

```json
{
  "count": 2,
  "has_more": true,
  "league": "bl1",
  "next_offset": 2,
  "scorers": [
    {
      "goals": 27,
      "name": "H. Kane",
      "player_id": 18898,
      "position": 1
    },
    {
      "goals": 21,
      "name": "S. Guirassy",
      "player_id": 19545,
      "position": 2
    }
  ],
  "season": "2024",
  "top_scorer": "H. Kane",
  "top_scorer_goals": 27,
  "total_count": 321
}
```
