How-to build a schedule page
Welcome to the how-to build a season fixture schedule guide. This is a follow-up on the rounds, groups and stages tutorial. Rounds, groups and stages are, in fact, the building blocks of a season schedule. Now, in this how-to guide, we will use those building blocks to create a season fixture schedule. This schedule will show all the fixtures yet to come. We’ll show you how to create a season fixture schedule for the English Premier League (league id: 8) and one for the Champions League (league id: 2).

Step 1: Assemble the tools

You’re going to need the following tools:
  • Sportmonks API token
  • Code editor (Visual studio used in examples)
  • Postman (optional)

Step 2: Request the rounds of the English Premier League

We chose the English Premier League because it’s a domestic league without any different stages or groups, but it does have multiple rounds across their season. That’s why we’re going to request the rounds of the English Premier League season 20/21 (season id: 17420). We’ll use the following URL:
Request
Response
https://soccer.sportmonks.com/api/v2.0/seasons/17420?api_token={API_TOKEN}&include=rounds
{
"data": {
"id": 17420,
"name": "2020/2021",
"league_id": 8,
"is_current_season": true,
"current_round_id": 201970,
"current_stage_id": 77448322,
"rounds": {
"data": [
{
"id": 201963,
"name": 1,
"league_id": 8,
"season_id": 17420,
"stage_id": 77448322,
"start": "2020-09-12",
"end": "2020-09-14"
},
{
"id": 201964,
"name": 2,
"league_id": 8,
"season_id": 17420,
"stage_id": 77448322,
"start": "2020-09-19",
"end": "2020-09-21"
},
{
"id": 201965,
"name": 3,
"league_id": 8,
"season_id": 17420,
"stage_id": 77448322,
"start": "2020-09-26",
"end": "2020-09-28"
},
{
"id": 201966,
"name": 4,
"league_id": 8,
"season_id": 17420,
"stage_id": 77448322,
"start": "2020-10-03",
"end": "2020-10-04"
},
{
"id": 201967,
"name": 5,
"league_id": 8,
"season_id": 17420,
"stage_id": 77448322,
"start": "2020-10-17",
"end": "2020-10-19"
},
{
"id": 201968,
"name": 6,
"league_id": 8,
"season_id": 17420,
"stage_id": 77448322,
"start": "2020-10-23",
"end": "2020-10-26"
},
{
"id": 201969,
"name": 7,
"league_id": 8,
"season_id": 17420,
"stage_id": 77448322,
"start": "2020-10-30",
"end": "2020-11-02"
},
{
"id": 201970,
"name": 8,
"league_id": 8,
"season_id": 17420,
"stage_id": 77448322,
"start": "2020-11-06",
"end": "2020-11-08"
},
{
"id": 201971,
"name": 9,
"league_id": 8,
"season_id": 17420,
"stage_id": 77448322,
"start": "2020-11-21",
"end": "2020-11-23"
},
{
"id": 201972,
"name": 10,
"league_id": 8,
"season_id": 17420,
"stage_id": 77448322,
"start": "2020-11-27",
"end": "2020-11-30"
Now that we have all the English Premier League rounds, we want to check which fixture ids are associated with each round. Here are several examples of correct requests:
Request 1
Response 1
Request 2
Response 2
Request 3
Response 3
https://soccer.sportmonks.com/api/v2.0/seasons/17420?api_token={API_TOKEN}&include=rounds.fixtures
{
"data": {
"id": 17420,
"name": "2020/2021",
"league_id": 8,
"is_current_season": true,
"current_round_id": 201970,
"current_stage_id": 77448322,
"rounds": {
"data": [
{
"id": 201963,
"name": 1,
"league_id": 8,
"season_id": 17420,
"stage_id": 77448322,
"start": "2020-09-12",
"end": "2020-09-14",
"fixtures": {
"data": [
{
"id": 16924595,
"league_id": 8,
"season_id": 17420,
"stage_id": 77448322,
"round_id": 201963,
"group_id": null,
"aggregate_id": null,
"venue_id": 200,
"referee_id": null,
"localteam_id": 27,
"visitorteam_id": 14,
"winner_team_id": null,
"weather_report": {
"code": "rain",
"type": "light rain",
"icon": "https://cdn.sportmonks.com/images/weather/10n.png",
"temperature": {
"temp": 54.34,
"unit": "fahrenheit"
},
"temperature_celcius": {
"temp": 12.4,
"unit": "celcius"
},
"clouds": "100%",
"humidity": "95%",
"pressure": 1012,
"wind": {
"speed": "3 m/s",
"degree": 257
},
"coordinates": {
"lat": 53.8,
"lon": -2.23
},
"updated_at": "2020-09-11T21:45:05.220485Z"
},
"commentaries": false,
"attendance": null,
"pitch": null,
"details": null,
"neutral_venue": false,
"winning_odds_calculated": false,
"formations": {
"localteam_formation": null,
"visitorteam_formation": null
},
"scores": {
"localteam_score": 0,
"visitorteam_score": 0,
"localteam_pen_score": null,
"visitorteam_pen_score": null,
"ht_score": null,
"ft_score": null,
"et_score": null,
"ps_score": null
},
"time": {
"status": "POSTP",
"starting_at": {
"date_time": "2020-09-12 00:00:00",
"date": "2020-09-12",
"time": "00:00:00",
"timestamp": 1599868800,
"timezone": "UTC"
},
"minute": null,
"second": null,
"added_time": null,
"extra_minute": null,
"injury_time": null
},
"coaches": {
"localteam_coach_id": 455461,
"visitorteam_coach_id": 524307
},
"standings": {
"localteam_position": 4,
"visitorteam_position": 13
},
"assistants": {
"first_assistant_id": null,
"second_assistant_id": null,
"fourth_official_id": null
},
"leg": "1/1",
"colors": null,
"deleted": false
},
https://soccer.sportmonks.com/api/v2.0/seasons/17420?api_token={API_TOKEN}&include=fixtures.localTeam,fixtures.visitorTeam
{
"data": {
"id": 17420,
"name": "2020/2021",
"league_id": 8,
"is_current_season": true,
"current_round_id": 201970,
"current_stage_id": 77448322,
"fixtures": {
"data": [
{
"id": 16924595,
"league_id": 8,
"season_id": 17420,
"stage_id": 77448322,
"round_id": 201963,
"group_id": null,
"aggregate_id": null,
"venue_id": 200,
"referee_id": null,
"localteam_id": 27,
"visitorteam_id": 14,
"winner_team_id": null,
"weather_report": {
"code": "rain",
"type": "light rain",
"icon": "https://cdn.sportmonks.com/images/weather/10n.png",
"temperature": {
"temp": 54.34,
"unit": "fahrenheit"
},
"temperature_celcius": {
"temp": 12.4,
"unit": "celcius"
},
"clouds": "100%",
"humidity": "95%",
"pressure": 1012,
"wind": {
"speed": "3 m/s",
"degree": 257
},
"coordinates": {
"lat": 53.8,
"lon": -2.23
},
"updated_at": "2020-09-11T21:45:05.220485Z"
},
"commentaries": false,
"attendance": null,
"pitch": null,
"details": null,
"neutral_venue": false,
"winning_odds_calculated": false,
"formations": {
"localteam_formation": null,
"visitorteam_formation": null
},
"scores": {
"localteam_score": 0,
"visitorteam_score": 0,
"localteam_pen_score": null,
"visitorteam_pen_score": null,
"ht_score": null,
"ft_score": null,
"et_score": null,
"ps_score": null
},
"time": {
"status": "POSTP",
"starting_at": {
"date_time": "2020-09-12 00:00:00",
"date": "2020-09-12",
"time": "00:00:00",
"timestamp": 1599868800,
"timezone": "UTC"
},
"minute": null,
"second": null,
"added_time": null,
"extra_minute": null,
"injury_time": null
},
"coaches": {
"localteam_coach_id": 455461,
"visitorteam_coach_id": 524307
},
"standings": {
"localteam_position": 4,
"visitorteam_position": 13
},
"assistants": {
"first_assistant_id": null,
"second_assistant_id": null,
"fourth_official_id": null
},
"leg": "1/1",
"colors": null,
"deleted": false,
"localTeam": {
"data": {
"id": 27,
"legacy_id": 387,
"name": "Burnley",
"short_code": "BUR",
"twitter": "@BurnleyOfficial",
"country_id": 462,
"national_team": false,
"founded": 1882,
"logo_path": "https://cdn.sportmonks.com/images//soccer/teams/27/27.png",
"venue_id": 200,
"current_season_id": 17420
}
},
"visitorTeam": {
"data": {
"id": 14,
"legacy_id": 375,
"name": "Manchester United",
"short_code": "MUN",
"twitter": "@ManUtd",
"country_id": 462,
"national_team": false,
"founded": 1878,
"logo_path": "https://cdn.sportmonks.com/images//soccer/teams/14/14.png",
"venue_id": 206,
"current_season_id": 17420
}
}
https://soccer.sportmonks.com/api/v2.0/rounds/201970?api_token={API_TOKEN}&include=fixtures.localTeam,fixtures.visitorTeam
{
"data": {
"id": 201970,
"name": 8,
"league_id": 8,
"season_id": 17420,
"stage_id": 77448322,
"start": "2020-11-06",
"end": "2020-11-08",
"fixtures": {
"data": [
{
"id": 16924666,
"league_id": 8,
"season_id": 17420,
"stage_id": 77448322,
"round_id": 201970,
"group_id": null,
"aggregate_id": null,
"venue_id": 480,
"referee_id": 15241,
"localteam_id": 78,
"visitorteam_id": 27,
"winner_team_id": null,
"weather_report": {
"code": "clear",
"type": "clear sky",
"icon": "https://cdn.sportmonks.com/images/weather/01n.png",
"temperature": {
"temp": 47.01,
"unit": "fahrenheit"
},
"temperature_celcius": {
"temp": 8.3,
"unit": "celcius"
},
"clouds": "0%",
"humidity": "81%",
"pressure": 1023,
"wind": {
"speed": "6.93 m/s",
"degree": 80
},
"coordinates": {
"lat": 50.86,
"lon": -0.08
},
"updated_at": "2020-11-06T19:15:05.909812Z"
},
"commentaries": true,
"attendance": 0,
"pitch": null,
"details": null,
"neutral_venue": false,
"winning_odds_calculated": true,
"formations": {
"localteam_formation": "5-3-2",
"visitorteam_formation": "4-4-2"
},
"scores": {
"localteam_score": 0,
"visitorteam_score": 0,
"localteam_pen_score": null,
"visitorteam_pen_score": null,
"ht_score": "0-0",
"ft_score": "0-0",
"et_score": null,
"ps_score": null
},
"time": {
"status": "FT",
"starting_at": {
"date_time": "2020-11-06 17:30:00",
"date": "2020-11-06",
"time": "17:30:00",
"timestamp": 1604683800,
"timezone": "UTC"
},
"minute": 93,
"second": null,
"added_time": null,
"extra_minute": null,
"injury_time": null
},
"coaches": {
"localteam_coach_id": 452683,
"visitorteam_coach_id": 455461
},
"standings": {
"localteam_position": 16,
"visitorteam_position": 20
},
"assistants": {
"first_assistant_id": 12090,
"second_assistant_id": 14665,
"fourth_official_id": 13561
},
"leg": "1/1",
"colors": {
"localteam": {
"color": "#002B87",
"kit_colors": "#002B87,#F0F0F0,#F0F0F0,#F0F0F0,#F0F0F0,#FFDF1B,#F0F0F0"
},
"visitorteam": {
"color": "#FBED32",
"kit_colors": "#FBED32,#FBED32,#262626,#262626,#C40010,#0046A8,#940014"
}
},
"deleted": false,
"localTeam": {
"data": {
"id": 78,
"legacy_id": 409,
"name": "Brighton & Hove Albion",
"short_code": "BRH",
"twitter": "@OfficialBHAFC",
"country_id": 462,
"national_team": false,
"founded": 1901,
"logo_path": "https://cdn.sportmonks.com/images//soccer/teams/14/78.png",
"venue_id": 480,
"current_season_id": 17420
}
},
"visitorTeam": {
"data": {
"id": 27,
"legacy_id": 387,
"name": "Burnley",
"short_code": "BUR",
"twitter": "@BurnleyOfficial",
"country_id": 462,
"national_team": false,
"founded": 1882,
"logo_path": "https://cdn.sportmonks.com/images//soccer/teams/27/27.png",
"venue_id": 200,
"current_season_id": 17420
}
}
Request 3 is used when you want to request the fixtures of a specific round id.
In this example, the EPL only has one stage, but other leagues may have multiple stages. In that case, we suggest you use the following request:
https://soccer.sportmonks.com/api/v2.0/seasons/17420?api_token={API_TOKEN}&include=stages.rounds.fixtures.localTeam,stages.rounds.fixtures.visitorTeam
Your request may be too big, if that's the case, pagination will kick in. You can refer to our Pagination tutorial for more information
Our Football API 2.0 has now given you the data of every round of the English Premier League and every fixture per round. This is the data you need to create the seasonal fixture schedule of the English Premier League.
In step 3, we’re going to show you how you can do the same for the Champions League, which will be significantly harder because the Champions League works with rounds, groups and stages.

Step 3: Request the Champions League stages

Let's take a look at the Champions League season 20/21 (season id: 17299). We start from a top position. We first request all the stages and can then work-out all the fixtures per stage and group.
Request
Response
https://soccer.sportmonks.com/api/v2.0/seasons/17299?api_token={API_TOKEN}&include=stages
{
"data": {
"id": 17299,
"name": "2020/2021",
"league_id": 2,
"is_current_season": true,
"current_round_id": 211704,
"current_stage_id": 77448760,
"stages": {
"data": [
{
"id": 77447933,
"name": "Final",
"type": "Knock Out",
"league_id": 2,
"season_id": 17299,
"sort_order": 11,
"has_standings": false
},
{
"id": 77447934,
"name": "Semi-finals",
"type": "Knock Out",
"league_id": 2,
"season_id": 17299,
"sort_order": 10,
"has_standings": false
},
{
"id": 77447935,
"name": "Quarter-finals",
"type": "Knock Out",
"league_id": 2,
"season_id": 17299,
"sort_order": 9,
"has_standings": false
},
{
"id": 77447936,
"name": "8th Finals",
"type": "Knock Out",
"league_id": 2,
"season_id": 17299,
"sort_order": 8,
"has_standings": false
},
{
"id": 77448760,
"name": "Group Stage",
"type": "Group Stage",
"league_id": 2,
"season_id": 17299,
"sort_order": 7,
"has_standings": true
},
{
"id": 77447937,
"name": "Play-offs",
"type": "Qualifying",
"league_id": 2,
"season_id": 17299,
"sort_order": 6,
"has_standings": false
},
{
"id": 77447938,
"name": "3rd Qualifying Round",
"type": "Qualifying",
"league_id": 2,
"season_id": 17299,
"sort_order": 5,
"has_standings": false
},
{
"id": 77447939,
"name": "2nd Qualifying Round",
"type": "Qualifying",
"league_id": 2,
"season_id": 17299,
"sort_order": 4,
"has_standings": false
},
{
"id": 77447940,
"name": "1st Qualifying Round",
"type": "Qualifying",
"league_id": 2,
"season_id": 17299,
"sort_order": 3,
"has_standings": false
},
{
"id": 77447941,
"name": "Preliminary Round - Final",
"type": "Knock Out",
"league_id": 2,
"season_id": 17299,
"sort_order": 2,
"has_standings": false
},
{
"id": 77447942,
"name": "Preliminary Round - Semi-finals",
"type": "Knock Out",
"league_id": 2,
"season_id": 17299,
"sort_order": 1,
"has_standings": false
}
]
}
},
We can see that the Champions League has the following stages:
  • Preliminary round - Semi-finals
  • Preliminary round - Final
  • 1st Qualifying round
  • 2nd Qualifying round
  • 3rd Qualifying round
  • Play-offs
  • Group Stage
  • 8th Finals
  • Quarter-finals
  • Semi-finals
  • Final

Requesting the fixtures

While, yes, we can use the nested include.fixturesagain. This would result in a huge, hard to read response. You can see for yourself with the following request that will give you an overview of everything about the Champions League:
https://soccer.sportmonks.com/api/v2.0/seasons/17299?api_token={API_TOKEN}&include=stages.rounds.fixtures.localTeam,stages.rounds.fixtures.visitorTeam
Instead, we will use the get stage by id endpoint with fixtures as include:
Request
Response
https://soccer.sportmonks.com/api/v2.0/stages/77447942?api_token={API_TOKEN}&include=fixtures.localTeam,fixtures.visitorTeam
{
"data": {
"id": 77447942,
"name": "Preliminary Round - Semi-finals",
"type": "Knock Out",
"league_id": 2,
"season_id": 17299,
"sort_order": 1,
"has_standings": false,
"fixtures": {
"data": [
{
"id": 16744816,
"league_id": 2,
"season_id": 17299,
"stage_id": 77447942,
"round_id": null,
"group_id": null,
"aggregate_id": null,
"venue_id": 6276,
"referee_id": 32453,
"localteam_id": 5444,
"visitorteam_id": 260,
"winner_team_id": 260,
"weather_report": {
"code": "clouds",
"type": "few clouds",
"icon": "https://cdn.sportmonks.com/images/weather/02d.png",
"temperature": {
"temp": 85.82,
"unit": "fahrenheit"
},
"temperature_celcius": {
"temp": 29.9,
"unit": "celcius"
},
"clouds": "20%",
"humidity": "38%",
"pressure": 1019,
"wind": {
"speed": "6.93 m/s",
"degree": 60
},
"coordinates": {
"lat": 46.38,
"lon": 6.24
},
"updated_at": "2020-08-08T14:45:08.788657Z"
},
"commentaries": false,
"attendance": null,
"pitch": null,
"details": null,
"neutral_venue": false,
"winning_odds_calculated": true,
"formations": {
"localteam_formation": "4-3-3",
"visitorteam_formation": "4-2-3-1"
},
"scores": {
"localteam_score": 0,
"visitorteam_score": 2,
"localteam_pen_score": null,
"visitorteam_pen_score": null,
"ht_score": "0-0",
"ft_score": "0-2",
"et_score": null,
"ps_score": null
},
"time": {
"status": "FT",
"starting_at": {
"date_time": "2020-08-08 13:00:00",
"date": "2020-08-08",
"time": "13:00:00",
"timestamp": 1596891600,
"timezone": "UTC"
},
"minute": 90,
"second": null,
"added_time": null,
"extra_minute": null,
"injury_time": null
},
"coaches": {
"localteam_coach_id": 4598949,
"visitorteam_coach_id": 524279
},
"standings": {
"localteam_position": 2,
"visitorteam_position": 1
},
"assistants": {
"first_assistant_id": 19343,
"second_assistant_id": 14520,
"fourth_official_id": 36286
},
"leg": "1/1",
"colors": null,
"deleted": false,
"localTeam": {
"data": {
"id": 5444,
"legacy_id": null,
"name": "Tre Fiori",
"short_code": null,
"twitter": null,
"country_id": 3347,
"national_team": false,
"founded": 1949,
"logo_path": "https://cdn.sportmonks.com/images//soccer/teams/4/5444.png",
"venue_id": 3598,
"current_season_id": 16007
}
},
"visitorTeam": {
"data": {
"id": 260,
"legacy_id": 1929,
"name": "Linfield",
"short_code": null,
"twitter": null,
"country_id": 491,
"national_team": false,
"founded": 1886,
"logo_path": "https://cdn.sportmonks.com/images//soccer/teams/4/260.png",
"venue_id": 8014,
"current_season_id": 17602
}
}
This will request all the fixtures of the preliminary round - semi-finals (stage id #77447942). You can repeat this step for all the other stages, except for the group stages. Because there are eight groups (A-H), we want to subdivide this stage (stage id #77448760) into their respective groups. We use the nested include groups.fixtures:
Request
Response
https://soccer.sportmonks.com/api/v2.0/stages/77448760?api_token={API_TOKEN}&include=groups.fixtures