Skip to main content

LeagueRepublic API: Get Match Hub

Written by Pedro Maia

Before you start

Who this is for: this endpoint only works for leagues on the Gold subscription that have switched the API on. To switch it on, tick Enable JSON API in your league's API Settings. If either is missing, every web address in this article returns an error instead of your data.

What is this? The JSON API lets another website, app or program read your league's fixtures, results and tables straight from LeagueRepublic. Think of it like a waiter: your website asks for something ("today's matches, please"), and LeagueRepublic brings back the answer.

How do you ask? You visit a web address, just like opening a web page. Instead of a nice-looking page, you get back plain text in a format called JSON. Your web developer's code reads that text and turns it into whatever they design.

What does JSON look like? It is a list of labels and values, a bit like a form that has been filled in:

{ "homeTeamName": "Arthurlie", "homeScore": "2" }

The word before the colon is the field name (the label on the form). The bit after it is the value (what was written in the box). The tables later in this article explain what each field name means.

What is an ID? Every season, team and match in LeagueRepublic has its own number, called an ID. It works like a membership number: it never changes, and no two things share one. You put IDs into the web address to say which season or team you want.

How do I find my IDs? Your season ID comes from Get Seasons For League. Your team IDs come from Get Teams For Fixture Group. Both are described in the main API help article.

Who can use it? Leagues on the Gold plan that have ticked Enable JSON API in their API Settings.

Is there a limit? Yes. Each league can make up to 60 requests a minute. If you go over, you get a "Rate limit exceeded" message and need to wait a minute before trying again.

A few words you will see

Word

What it means

Road

The away team. LeagueRepublic says "road" where most people say "away".

Fixture

A match, whether it has been played yet or not.

Fixture group

A division (such as "Premier Division") or a cup round.

Result

A fixture that has a score.

null

The box is empty. The league did not enter it, or it does not apply.

true / false

Yes / no.

Get Match Hub

Get Match Hub gives you everything on your website's Match Hub page for one day, in a single request: the matches, the scores, and the league tables for the divisions playing that day.

It saves your developer a lot of work. Without it, they would need to ask for the seasons, then the divisions, then every division's matches, then every table, and piece it all together themselves.

The web address

For the default day (the same day your Match Hub page opens on):

For a day you choose:

Replace {seasonID} with your season's ID, and {date} with the day you want, written as year, month, day with no spaces. For example, 3 October 2026 is 20261003:

To see matches that do not have a date yet ("To Be Confirmed"), use tbc instead of a date:

What you get back

The answer is like a folder with four parts:

  1. The seasons your league has, so you can offer a season picker.

  2. The match days in the season, each with how many matches and results it has. This lets you build a strip of dates to click through, like the one on your Match Hub page.

  3. The day's round-up, if your league has match hub recaps switched on.

  4. The day's matches, grouped by division or cup round. Each division also comes with its league table.

Here is a real example, trimmed to one match:

{

"seasonID": 236635540,

"seasonList": [

{ "seasonID": 922046009, "seasonName": "2025-2026" },

{ "seasonID": 236635540, "seasonName": "2026-2027" }

],

"matchHubRecapContentText": null,

"matchHubRecapLoadDateTime": null,

"matchHubDate": "20261002",

"dateList": [

{ "matchHubDate": "20261002", "matchCount": 1, "resultCount": 0, "liveResultCount": 0 },

{ "matchHubDate": "20261003", "matchCount": 57, "resultCount": 0, "liveResultCount": 0 },

{ "matchHubDate": "tbc", "matchCount": 5, "resultCount": null, "liveResultCount": null }

],

"fixtureGroupList": [

{

"fixtureGroupDesc": "Scottish Gas Scottish Cup - Round 1",

"fixtureGroupIdentifier": 406990226,

"fixtureTypeID": 2,

"fixtures": [

{

"fixtureID": 45132961,

"fixtureDate": "20261002 19:30",

"fixtureDateInMilliseconds": 1790965800000,

"homeTeam": 551804519,

"homeTeamName": "Cumnock Juniors",

"roadTeam": 363729896,

"roadTeamName": "Auchinleck Talbot",

"homeScore": null,

"roadScore": null,

"result": false,

"approved": false,

"roundDesc": "Round 1",

"venueAndSubVenueDesc": "Townhead Park"

}

],

"standings": null

}

]

}

This match has not been played yet, so the scores are empty (null). It is a cup match, so there is no league table ("standings": null).

The main parts

Field name

What it means

seasonID

The season you asked for.

seasonList

All your league's seasons, each with its ID and name.

matchHubDate

The day you are looking at, written like 20261003. Shows tbc for undated matches.

dateList

Every match day in the season (see the next table).

matchHubRecapContentText

The day's written round-up. Empty if your league does not use recaps.

matchHubRecapLoadDateTime

When the round-up was written. Empty if there is none.

fixtureGroupList

The day's matches, grouped by division or cup round.

Each match day (in dateList)

Field name

What it means

matchHubDate

The day, written like 20261003, or tbc for matches with no date yet.

matchCount

How many matches that day have not been played yet.

resultCount

How many matches that day have a result.

liveResultCount

How many matches that day have a live score. Only used if your league has live results switched on.

Each division or cup round (in fixtureGroupList)

Field name

What it means

fixtureGroupDesc

Its name, for example "Premier Division" or "Scottish Gas Scottish Cup - Round 1".

fixtureGroupIdentifier

Its ID.

fixtureTypeID

What kind it is: 1 = division, 2 = cup, 4 = other.

fixtures

The matches in it that day (see the next table).

standings

Its league table. Empty for cups and other groups.

Each match (in fixtures)

These use exactly the same names as the match lists in the other LeagueRepublic API endpoints, such as Get Fixtures For Season, so your developer can reuse the same code.

Field name

What it means

fixtureID

The match's ID.

fixtureDate

Date and kick-off time, written like 20261002 19:30.

fixtureDateInMilliseconds

The same date and time as a single number. Developers find this easier to sort by.

fixtureDateStatusID / fixtureDateStatusDesc

Whether the date is fixed: 1 = "Normal / Scheduled", 2 = "To Be Confirmed".

fixtureStatus / fixtureStatusDesc

Whether the match is going ahead: 0 = "Normal", 2 = "Postponed".

homeTeam / roadTeam

The home and away teams' IDs.

homeTeamName / roadTeamName

The home and away teams' names.

homeScore / roadScore

The score. Written as text, so it can also hold a letter such as "P" for postponed. Empty if not played.

homeScoreNote / roadScoreNote

A note next to a score. Usually empty.

additionalScore

Extra score detail, such as "(HT 2-0)" or "(Pens 4-5)".

result

true if the match has a result.

approved

true if the result has been approved by the league. A result can appear before it is approved.

noResultOutcome

true if the match was recorded as having no result.

fixtureNote

A note about the match, if the league shows one.

roundDesc

The cup round, for example "Round 2" or "Final".

shortCode

A one-letter code for the type of match: L = league, C = cup, O = other.

venueAndSubVenueDesc

Where it is played, for example "Holm Park".

matchInsightsExist

true if there is a match preview for it on your website.

liveLastUpdated / liveSourceDesc

For live scores: when the score last changed, and where it came from. Empty if not used.

gameGroups

The individual games within the match, for sports like darts and pool (see below). Empty for other sports.

innings

The score for each innings, quarter or period (see below). Empty for sports that do not use them.

homeScoreHits / roadScoreHits

Hits, for softball and baseball. Written as plain numbers.

homeScoreErrors / roadScoreErrors

Errors, for softball and baseball. Written as plain numbers.

Games within a match (darts, pool and similar)

In some sports, a match is made up of smaller games, such as pairs and singles in darts. Here is a real darts example, trimmed:

"gameGroups": [

{

"gameGroupDesc": "Pairs",

"gameGroupDescShort": "PRS",

"homeWinCount": 2,

"roadWinCount": 1,

"games": [

{ "sequence": 1, "homeScoreLevel1": "2", "roadScoreLevel1": "0" },

{ "sequence": 2, "homeScoreLevel1": "2", "roadScoreLevel1": "0" },

{ "sequence": 3, "homeScoreLevel1": "0", "roadScoreLevel1": "2" }

]

}

]

Field name

What it means

gameGroupDesc

The type of game, for example "Pairs" or "Singles".

gameGroupDescShort

A short version of the name, for example "PRS".

homeWinCount / roadWinCount

How many of these games each side won.

games

Each game, in order.

sequence

The game's position in the order: 1 is the first game, 2 the second, and so on.

homeScoreLevel1 / roadScoreLevel1

The game's score, for example legs or frames won.

The players' names are not included here. To get them, use Get Full Fixture Details for that one match.

Innings, quarters and periods

Some sports split a match into innings, quarters or periods. Each one is listed in order. Here is a real basketball example that went to overtime:

"innings": [

{ "inningsNumber": 1, "homeScore": "13", "roadScore": "19", "overtime": false },

{ "inningsNumber": 2, "homeScore": "26", "roadScore": "18", "overtime": false },

{ "inningsNumber": 3, "homeScore": "9", "roadScore": "16", "overtime": false },

{ "inningsNumber": 4, "homeScore": "22", "roadScore": "17", "overtime": false },

{ "inningsNumber": 5, "homeScore": "6", "roadScore": "8", "overtime": true }

]

Field name

What it means

inningsNumber

Its position in the match: 1 is the first, 2 the second, and so on.

homeScore / roadScore

Each side's score in that innings, quarter or period.

overtime

true if this was extra time. To show "OT 1", "OT 2", count the overtime entries in order.

The innings scores and the final score are entered separately by the league, so they do not always add up. For example, an awarded result may have a final score but no innings.

The league table (standings)

Each division comes with its table. It is exactly the same as Get Standings For Fixture Group, so it uses the same field names. Here is the top of a real table, trimmed:

"standings": {

"standingsDesc": "Premier Division",

"standingsLines": [

{

"position": "1",

"teamID": 191899149,

"teamName": "Arthurlie",

"overallPlayed": 6,

"overallWon": 5,

"overallTied": 0,

"overallLoss": 1,

"overallScoreFor": 15,

"overallScoreAgainst": 8,

"scoreDifference": 7,

"points": 15,

"recentForm": "WLWWWW"

}

]

}

Each team's line also has the same figures split into home matches (names starting home) and away matches (names starting road). A table where everyone has played 0 shows zeros everywhere. That is normal for a division that has not started yet.

Good to know

  • Results appear straight away. The Match Hub shows results as soon as they are entered, before the league approves them. Use approved to tell the difference.

  • A day with no matches shows the default day instead. If you ask for a date with no matches, you get the same day your Match Hub page would open on. Check matchHubDate to see which day you actually got.

  • Undated matches are kept separate. Matches marked "To Be Confirmed" only appear when you ask for tbc, not on any dated day.

If something goes wrong

Message

What it means

Supplied seasonID is not numeric

The season ID has letters or symbols in it. It should be numbers only.

Season does not exist for supplied season ID

There is no season with that ID. Check you copied it correctly.

Supplied date is not valid, expected format yyyyMMdd or tbc

The date is not written as year, month, day (for example 20261003), or is not a real date.

League is not authorised to access webservices

The league is not on the Gold plan.

JSON api is disabled for league

Enable JSON API is not ticked in your API Settings.

Rate limit exceeded

More than 60 requests in a minute. Wait a minute, then try again.

Build it with an AI assistant

You do not need to be a developer to try this endpoint. AI assistants such as ChatGPT or Claude can build a simple web page from your league's data if you tell them what you want. Below is a ready-made request (called a prompt) you can copy and paste.

How to use the prompt

  1. Copy the prompt from the grey box.

  2. Fill in your season ID. Replace [MY SEASON ID] with your own number. See "How do I find my IDs?" at the start of this article.

  3. Add a real example. Open the web address from the prompt in your browser, select everything on the page, and paste it under the prompt where it says to. The AI then sees your actual data, which makes it far more likely to get things right first time.

  4. Say how you want it to look. Describe your colours and style, or attach a screenshot of your website or a design you like (ChatGPT and Claude both accept pictures). A picture usually works best. If you don't say anything, the AI will pick a plain design.

  5. Paste it all into the AI and send it.

  6. Check the result against your league website. If something looks wrong, tell the AI what is wrong in plain words, for example "the scores are the wrong way round". It will fix it.

If the page the AI makes shows no data, tell the AI exactly what you see. It may need to suggest a different way of loading the data.

Prompt: a match hub page

I run a sports league on LeagueRepublic. Build me a single web page (one HTML file I can open in my browser) that shows my league's match hub, using the LeagueRepublic JSON API.

Get the data from this web address:

For a different day, add the date as year, month, day, for example:

Use "tbc" instead of a date to get matches that do not have a date yet.

The page should:

1. Show a row of clickable dates across the top, built from "dateList". Each date shows how many matches ("matchCount") and results ("resultCount") it has. Clicking a date loads that day. When the page opens, scroll the row of dates so the day being shown is visible.

2. Show the day's matches grouped under the division or cup name. The groups are in "fixtureGroupList", and each group's name is "fixtureGroupDesc".

3. For each match in "fixtures", show the kick-off time from "fixtureDate", the home team ("homeTeamName"), the score ("homeScore" and "roadScore") and the away team ("roadTeamName"). "Road" means away.

4. If a match has no score yet, show the kick-off time instead. If a match has a result but "approved" is false, show a small "provisional" label next to it.

5. Under each division, show its league table from "standings" > "standingsLines": position ("position"), team ("teamName"), played ("overallPlayed"), won ("overallWon"), drawn ("overallTied"), lost ("overallLoss"), difference ("scoreDifference") and points ("points"). Cups have no table.

6. Show empty values (null) as blank. Never show the word "null".

7. Do not fetch the data more than once a minute. The API allows 60 requests a minute.

Keep the design clean and easy to read on a phone. Explain in simple steps how to open and use the file. Ask me if anything is unclear.

Design: [DESCRIBE THE LOOK YOU WANT, OR ATTACH A SCREENSHOT]

Here is an example of what the web address returns:

[PASTE THE EXAMPLE HERE]

Did this answer your question?