NewConnect Claude, Gemini, ChatGPT, and other AI agents to API Ninjas via our MCP server →

Football (Soccer) API

The Football (Soccer) API covers the Premier League, La Liga, the Bundesliga, Serie A, Ligue 1, the UEFA Champions League, the UEFA Europa League and MLS: get fixtures and match schedules, live scores with the match minute on paid plans, results with goals per half, extra time, penalty shootouts and the aggregate score of two-legged ties, league tables with the qualification and relegation places, and every club's squad. The free plan covers the current season's fixtures, results, tables and squads.

Every match, table row and club has sport: soccer and its competition in league. Looking for American football? See the American Football API.

Available endpoints:

League guides: Premier League API, La Liga API, Bundesliga API, Serie A API, Ligue 1 API, Champions League API, Europa League API and MLS API. One API key works for every sports API.

Soccer data at a glance

Fixtures and results/v1/soccermatches returns each match as a fixture before kick-off (status=scheduled), live while it is played, and as a result once it is final
Club idsOne id per club in every competition: soccer-arsenal plays Premier League and Champions League matches under the same id, and keeps it through promotion and relegation
DrawsA drawn match has equal scores and winner: null; tables count draws
Halves and extra timeperiod is 1 or 2, then 3 and 4 for extra time; clock is the match minute, e.g. 90'+3'
Penaltiesdecided_in is regulation, extra_time or penalties. A shootout's score is in penalty_scores, not in the match score, and its winner is the match winner
Cup roundsround (e.g. Round of 16, Final), leg (1 or 2) and aggregate_scores for two-legged ties
Tablespoints, draws, goal_difference, points_deducted, league_rank with each competition's tiebreakers, and qualification (e.g. Champions League, Relegation); MLS adds conference ranks
SeasonsEuropean seasons are named by their start year: season=2026 is 2026-27. MLS seasons are calendar years
Match daydate is the date in the competition's home time zone: UK time for the Premier League, Central European time for the other European competitions, US Eastern for MLS

Competitions

LeagueWhat you getLeague value
Premier LeagueEnglish top division: fixtures, live scores and results, the table with European and relegation places, clubs and squadsepl
La LigaSpanish top division: fixtures, live scores and results, the table, clubs and squadslaliga
BundesligaGerman top division: fixtures, live scores and results, the table with the relegation playoff place, clubs and squadsbundesliga
Serie AItalian top division: fixtures, live scores and results, the table, clubs and squadsseriea
Ligue 1French top division: fixtures, live scores and results, the table, clubs and squadsligue1
Champions LeagueLeague phase and knockout fixtures, two-legged ties with aggregate scores, extra time and penalties, the league phase tableucl
Europa LeagueLeague phase and knockout fixtures, two-legged ties with aggregate scores, extra time and penalties, the league phase tableuel
MLSRegular season and MLS Cup playoff fixtures, live scores and results, conference standings, clubs and squadsmls
4 endpoints

https://api.api-ninjas.com/v1/soccermatches

Returns fixtures, live scores and results. Ask for one day, a team's season or one match; with only league you get today's matches. Paid plans see matches in progress with the score, half and match minute updated throughout the match; the free plan sees their status and the final score once they end. The free plan covers the current season. Developer plans add the three previous seasons, and the Business tier and above gets the full season archive.

Parameters

Provide league, unless you pass game_id or a team id such as soccer-arsenal.

  • league  optional

    epl, laliga, bundesliga, seriea, ligue1, ucl, uel or mls.

  • date  optional

    Match day in the league's home time zone (YYYY-MM-DD). Defaults to today when no team or season is given.

  • team  optional

    Team id, abbreviation or name (e.g. ARS): that team's matches in the season.

  • season  optional

    Season, as the year it starts (2026 = 2026-27 in Europe). Defaults to the current season. On its own, returns the season's matches 50 per page; use offset for the next page.

  • season_type  optional

    Only matches of this part of the season.

  • status  optional

    Only matches with this status.

  • game_id  optional

    Return one match.

  • limit  optional Premium only

    Matches per page (1-500). Default 50.

  • offset  optional

    Matches to skip, for paging. Default 0.

Headers

  • X-Api-Key  required

    API Key associated with your account.

Response

The /v1/soccermatches endpoint returns a JSON array of matches in start order, or an error.

  • game_id

    Unique id of the game, e.g. epl-20261025-new-cry. It never changes, even when a game is moved to another date.

  • league

    epl, laliga, bundesliga, seriea, ligue1, ucl, uel or mls.

  • sport

    Always soccer.

  • season

    Season, as the year it starts: 2026 is the 2026-27 season of the European competitions and the 2026 MLS season.

  • season_label

    Display form of the season, e.g. 2026 or 2026-27.

  • season_type

    regular for league matches, postseason for the MLS Cup playoffs, and league_phase, knockout or group_stage (seasons with groups) for the UEFA competitions.

  • round

    The stage of a cup or playoff match, e.g. Round of 16, Quarterfinals or Final, or the group (e.g. Group C) in seasons with a group stage. null for league matches and the UEFA league phase.

  • leg

    1 or 2 for the first or second leg of a two-legged knockout tie, otherwise null.

  • date

    Match day in the competition's home time zone (YYYY-MM-DD): UK time for the Premier League, Central European time for La Liga, the Bundesliga, Serie A, Ligue 1 and the UEFA competitions, and US Eastern for MLS.

  • start_time

    Scheduled start in UTC (ISO 8601).

  • status

    scheduled, in_progress, final, postponed, canceled, suspended (including abandoned matches) or delayed (e.g. a baseball rain delay).

  • status_detail Premium only

    During a game: halftime, extra_time_break or penalties (while a shootout is under way). Otherwise null. While a game is in progress, the free plan sees This field is for premium subscribers only.

  • period Live values: Premium

    Current half, or the last one played once the game is final: 1 and 2, then 3 and 4 for the two halves of extra time. While a game is in progress, the free plan sees This field is for premium subscribers only.

  • clock Premium only

    While a match is in progress: the match minute, e.g. 67' or 90'+3'. The free plan sees This field is for premium subscribers only.

  • home_team, away_team

    The clubs: team_id, name and abbreviation. A club keeps one id in every competition, e.g. soccer-arsenal.

  • home_score, away_score Live values: Premium

    Current or final score (goals, not counting a penalty shootout); null before the game starts. While a game is in progress, the free plan sees This field is for premium subscribers only.

  • period_scores Live values: Premium

    Score per half for home and away, with both halves of extra time when played. Shootout goals are in penalty_scores, not here. While a game is in progress, the free plan sees This field is for premium subscribers only.

  • penalty_scores Live values: Premium

    The penalty shootout score, home and away, when a match is decided on penalties; otherwise null.

  • aggregate_scores Live values: Premium

    The aggregate score of a two-legged tie after this match, home and away as in this match; null for single matches.

  • decided_in

    For final games: regulation, extra_time or penalties.

  • winner

    team_id of the winner once the game is final, including the shootout winner of a match decided on penalties; null before that and for a draw.

  • venue

    Where the game is played: name, city, state and country (ISO 3166-1 alpha-2).

  • neutral_site

    true when neither team is at home, e.g. the Champions League and Europa League finals.

  • original_date

    For a game moved to another date: the date it was first scheduled for. Otherwise null.

  • updated_at

    When any field of the game last changed (UTC).

Live Demo

Live demo · no API key required
Query parameters
league
date
team
season
season_type
status
game_id
limit
offset

Get a free API key to get started — no credit card required.

Headers
X-Api-KeyLog in or sign up to get your API key
GET
https://api.api-ninjas.com/v1/soccermatches?league=epl
Sample response
[
{
"game_id": "epl-20261024-eve-ars",
"league": "epl",
"sport": "soccer",
"season": 2026,
"season_label": "2026-27",
"season_type": "regular",
"round": null,
"leg": null,
"date": "2026-10-24",
"start_time": "2026-10-24T14:00:00Z",
"status": "final",
"status_detail": null,
"period": 2,
"clock": null,
"home_team": {
"team_id": "soccer-arsenal",
"name": "Arsenal",
"abbreviation": "ARS"
},
"away_team": {
"team_id": "soccer-everton",
"name": "Everton",
"abbreviation": "EVE"
},
"home_score": 2,
"away_score": 0,
"period_scores": {
"home": [
1,
1
],
"away": [
0,
0
]
},
"penalty_scores": null,
"aggregate_scores": null,
"decided_in": "regulation",
"winner": "soccer-arsenal",
"venue": {
"name": "Emirates Stadium",
"city": "London",
"state": null,
"country": "GB"
},
"neutral_site": false,
"original_date": null,
"updated_at": "2026-10-27T23:14:11Z"
},
{
"game_id": "epl-20261025-lee-sun",
"league": "epl",
"sport": "soccer",
"season": 2026,
"season_label": "2026-27",
"season_type": "regular",
"round": null,
"leg": null,
"date": "2026-10-25",
"start_time": "2026-10-25T16:30:00Z",
"status": "final",
"status_detail": null,
"period": 2,
"clock": null,
"home_team": {
"team_id": "soccer-sunderland",
"name": "Sunderland",
"abbreviation": "SUN"
},
"away_team": {
"team_id": "soccer-leeds-united",
"name": "Leeds United",
"abbreviation": "LEE"
},
"home_score": 0,
"away_score": 0,
"period_scores": {
"home": [
0,
0
],
"away": [
0,
0
]
},
"penalty_scores": null,
"aggregate_scores": null,
"decided_in": "regulation",
"winner": null,
"venue": {
"name": "Stadium of Light",
"city": "Sunderland",
"state": null,
"country": "GB"
},
"neutral_site": false,
"original_date": null,
"updated_at": "2026-10-27T23:14:11Z"
}
]

Code Examples

curl -X GET "https://api.api-ninjas.com/v1/soccermatches?league=epl" \ -H "X-Api-Key: YOUR_API_KEY"

https://api.api-ninjas.com/v1/soccerstandings

Returns the table for a season, ordered by league rank, or by conference or division rank when you filter. Tables update throughout the season, shortly after each match ends. The free plan covers the current season. Developer plans add the three previous seasons, and the Business tier and above gets the full season archive.

Parameters

  • league  required

    epl, laliga, bundesliga, seriea, ligue1, ucl, uel or mls.

  • season  optional

    Season, as the year it starts. Defaults to the current season.

  • conference  optional

    Only this conference, e.g. Eastern (MLS).

Headers

  • X-Api-Key  required

    API Key associated with your account.

Response

The /v1/soccerstandings endpoint returns a JSON array of team rows, or an error. Fields that do not apply to a league are left out.

  • league, sport, season, season_label

    League, sport and season of the table.

  • team

    team_id, name and abbreviation, named as they were that season.

  • conference, division

    MLS: the club's conference (Eastern or Western). null in the European competitions.

  • group

    UEFA competitions in seasons with a group stage: the group, e.g. Group C.

  • games_played, wins, losses

    Record.

  • draws

    Drawn matches.

  • points

    Points: three for a win, one for a draw.

  • goals_for, goals_against

    Goals scored and conceded.

  • goal_difference, points_deducted

    Goal difference, and any points deducted by the competition.

  • league_rank, conference_rank, division_rank

    league_rank is the table position with the competition's tiebreakers applied; MLS adds conference_rank.

  • group_rank

    UEFA group stage: position in the group.

  • qualification

    What the table position leads to, e.g. Champions League or Relegation; left out for mid-table positions.

  • final

    true once the regular season or league phase is over and the table no longer changes.

Live Demo

Live demo · no API key required
Query parameters
league
season
conference

Get a free API key to get started — no credit card required.

Headers
X-Api-KeyLog in or sign up to get your API key
GET
https://api.api-ninjas.com/v1/soccerstandings?league=epl
Sample response
[
{
"league": "epl",
"sport": "soccer",
"season": 2026,
"season_label": "2026-27",
"team": {
"team_id": "soccer-manchester-city",
"name": "Manchester City",
"abbreviation": "MNC"
},
"conference": null,
"division": null,
"games_played": 8,
"wins": 7,
"draws": 0,
"losses": 1,
"points": 21,
"goals_for": 20,
"goals_against": 9,
"goal_difference": 11,
"league_rank": 1,
"qualification": "Champions League",
"final": false
}
]

Code Examples

curl -X GET "https://api.api-ninjas.com/v1/soccerstandings?league=epl" \ -H "X-Api-Key: YOUR_API_KEY"

https://api.api-ninjas.com/v1/soccerclubs

Lists clubs with their domestic league, country and home venue. Available on every plan.

Parameters

  • league  optional

    Only this league: epl, laliga, bundesliga, seriea, ligue1, ucl, uel or mls. Without it, every club of the sport is listed.

  • team  optional

    Team id, abbreviation or name (e.g. ARS): return one club.

  • active  optional

    false lists former teams that appear in past seasons.

Headers

  • X-Api-Key  required

    API Key associated with your account.

Response

The /v1/soccerclubs endpoint returns a JSON array of clubs, or an error. A club that plays in several competitions is listed once.

  • team_id

    Unique id, e.g. soccer-arsenal, the same in every competition. Use it, the abbreviation or the name in other endpoints.

  • league

    The club's domestic league (e.g. epl), or null for a club from another country's league that plays in the UEFA competitions.

  • sport

    Always soccer.

  • abbreviation, name, city

    Identity of the team.

  • short_name, country

    Short name and country (ISO 3166-1 alpha-2).

  • venue

    Home venue: name, city, state, country.

  • active

    true for current clubs.

Live Demo

Live demo · no API key required
Query parameters
league
team
active

Get a free API key to get started — no credit card required.

Headers
X-Api-KeyLog in or sign up to get your API key
GET
https://api.api-ninjas.com/v1/soccerclubs?league=epl
Sample response
[
{
"team_id": "soccer-arsenal",
"league": "epl",
"sport": "soccer",
"abbreviation": "ARS",
"name": "Arsenal",
"short_name": "Arsenal",
"city": "London",
"country": "GB",
"venue": {
"name": "Emirates Stadium",
"city": "London",
"state": null,
"country": "GB"
},
"active": true
}
]

Code Examples

curl -X GET "https://api.api-ninjas.com/v1/soccerclubs?league=epl" \ -H "X-Api-Key: YOUR_API_KEY"

https://api.api-ninjas.com/v1/soccerplayers

Returns current squads and player profiles, by team or by name. Rosters refresh every day. Available on every plan.

Parameters

Provide league with team or name, or a player_id.

  • league  optional

    epl, laliga, bundesliga, seriea, ligue1, ucl, uel or mls.

  • team  optional

    Team id, abbreviation or name: that club's current squad.

  • name  optional

    Full or partial player name. Case and accents are ignored.

  • player_id  optional

    Return one player.

  • position  optional

    Only this position, e.g. F.

  • limit  optional Premium only

    Players per page (1-500). Default 50.

  • offset  optional

    Players to skip, for paging. Default 0.

Headers

  • X-Api-Key  required

    API Key associated with your account.

Response

The /v1/soccerplayers endpoint returns a JSON array of players, or an error. League-specific fields are left out where they do not apply.

  • player_id

    Unique id, e.g. soccer-p-34d3e18f49. It stays the same when a player changes teams or leagues.

  • league

    League of the player's current roster.

  • team

    Current team: team_id, name and abbreviation; null for a player whose roster_status is not_on_roster.

  • name, first_name, last_name

    Player name.

  • position, jersey_number

    Position abbreviation (G, D, M or F) and jersey number.

  • height_in, height_cm, weight_lb, weight_kg

    Height and weight.

  • birth_date

    Date of birth.

  • roster_status

    active, suspended or not_on_roster.

  • nationality

    Nationality, e.g. England.

Live Demo

Live demo · no API key required
Query parameters
league
team
name
player_id
position
limit
offset

Get a free API key to get started — no credit card required.

Headers
X-Api-KeyLog in or sign up to get your API key
GET
https://api.api-ninjas.com/v1/soccerplayers?league=epl&team=ARS
Sample response
[
{
"player_id": "soccer-p-34d3e18f49",
"league": "epl",
"team": {
"team_id": "soccer-arsenal",
"name": "Arsenal",
"abbreviation": "ARS"
},
"name": "Bukayo Saka",
"first_name": "Bukayo",
"last_name": "Saka",
"position": "F",
"jersey_number": "7",
"height_in": 70,
"height_cm": 178,
"weight_lb": 141,
"weight_kg": 64,
"birth_date": "2001-09-05",
"birth_place": null,
"roster_status": "active",
"nationality": "England"
}
]

Code Examples

curl -X GET "https://api.api-ninjas.com/v1/soccerplayers?league=epl&team=ARS" \ -H "X-Api-Key: YOUR_API_KEY"

Frequently Asked Questions

  • Yes, but you must have a premium subscription. Commercial use of the Football (Soccer) API is not permitted on the free tier. See our pricing page to choose a plan that fits your needs.
  • Sign up for a free account to instantly get your API key, then pass it in the X-Api-Key header on every request. The documentation above includes ready-to-run examples in cURL, Python, JavaScript, Node.js, and more.
  • Your API requests will simply be denied once you hit your monthly quota — you will never be charged more than the plan you signed up for. To increase your quota, you can upgrade your plan any time on our pricing page.
  • The API responds with a standard HTTP status code and a JSON error message describing the problem. See our error codes reference for the full list of codes and how to resolve each one, or contact support if you need help.
  • Yes. The free plan covers the current season of the Premier League, La Liga, the Bundesliga, Serie A, Ligue 1, the Champions League, the Europa League and MLS: fixtures, results, league tables, clubs and squads. Paid plans add live scores with the match minute and the three previous seasons.
  • The Premier League (epl), La Liga (laliga), the Bundesliga (bundesliga), Serie A (seriea), Ligue 1 (ligue1), the UEFA Champions League (ucl), the UEFA Europa League (uel) and MLS (mls). Pass the value as league; names such as premier league also work.
  • Call /v1/soccermatches?league=epl for today's matches, or add date=YYYY-MM-DD for another match day. Fixtures have status=scheduled, matches being played in_progress and results final.
  • Yes. soccer-arsenal is Arsenal in the Premier League, the Champions League and any other competition, and the id survives promotion and relegation. /v1/soccermatches?team=soccer-arsenal returns its matches this season, and each match's league tells you the competition.
  • A draw has equal scores and winner: null. A cup match decided after extra time has decided_in=extra_time; one decided on penalties has decided_in=penalties, the shootout score in penalty_scores and the shootout winner in winner. Two-legged ties add leg and aggregate_scores.
  • In its own API: the NFL is served by the American Football API. The same API key works for both.

API Ninjas is not affiliated with or endorsed by the NFL, the NBA, the NHL or any other league, competition or team. League, competition and team names are trademarks of their owners and are used only to identify them.