Skip to content
Statistics and squads

Football squads API for competition rosters

A squad list is the roster a club has for a competition, the pool from which every matchday selection is drawn. The squads feed returns those rosters for one competition at a time. This page covers how to model squads, why membership is not selection, and how to keep rosters current through transfer windows.

Primary endpoint

GET/api/v1/football/squads

  • leagueId required, numeric string, e.g. 1204

Access: All plans; Starter limited to your five saved leagues. Header: X-API-Key.

Illustration of numbered shirts hanging on a dressing-room rail beneath a competition pennant.
A squad is the pool of registered players; a line-up is a selection from it.
01

Rosters for a whole competition

The squads feed takes one required parameter, leagueId, and returns the squads the source supplies for that competition. One request gives you every club's roster in the league, which makes it far more efficient than building squad pages team by team. The cache time is about an hour, reflecting how slowly squads change outside transfer windows.

Responses arrive in the gateway envelope. The data object holds the source structure as supplied, without a normalised schema of ours, and meta records the feed, UTC fetch time, cache time and qualification. Team and player identifiers are strings, and attributes from source attributes keep their at-sign prefix. Read a sample response to find how teams and players are nested before you write a mapping.

Which details accompany each player, such as a shirt number or a position label, depends on what the source records for the competition. Treat every such attribute as optional.

02

Membership is not selection

A squad tells you who is registered or associated with a club for a competition. It does not tell you who will play on Saturday, who is fit, or who started last week. Products sometimes blur those lines, for example by showing the first eleven names in a squad as if they were a team. Readers who know the club will spot it immediately, and readers who do not will be misled.

Keep the concepts separate in your data model and your interface. Squad pages list the roster. Predicted line-up pages show an expected selection, clearly labelled as a prediction. Match pages show selections that the source confirms for that match. Injury information, where your plan includes it, is a separate layer again and should not be inferred from a player's absence from anything.

  • Squad: the pool of players for a competition.
  • Predicted line-up: an expectation before kick-off, labelled as such.
  • Match selection: what the source reports for a specific match.
  • Never derive one of these from another.
Squad roster modelFlow: request squads by leagueId, group players under each team by string IDs, compare with the previous copy to find joins and departures, and link players to profiles where available.01squadsleagueId02Team groupsstring IDs03Comparejoins, exits04Link playersby player ID
Squad roster model. Rosters are stored per competition and team, compared over time and linked to players by ID.
03

Storing squads with a history

The Python example requests a competition's squads and records the date of each copy. Comparing successive copies by player identifier within each team tells you who joined and who left. That comparison is the basis for a transfer tracker, a squad changes page, or simply an alert to your editors that a club page needs attention.

Do not delete a player from your database because they vanished from one squad response. They may have moved to another club in the same competition, in which case they appear under a new team, or they may have left the competition entirely. Record the departure with a date and let your data keep the history.

Python: dated squad snapshot for one competitionpython
import os, json, datetime, requests

r = requests.get(
    "https://footballapi.net/api/v1/football/squads",
    params={"leagueId": "1204"},
    headers={"X-API-Key": os.environ["FOOTBALLAPI_KEY"]},
    timeout=30,
)
body = r.json()
if r.ok:
    day = datetime.date.today().isoformat()
    json.dump(body, open(f"squads-1204-{day}.json", "w"))
else:
    print(r.status_code, body.get("code"), body.get("requestId"))
04

Transfer windows and loan moves

Squads change most around transfer windows and least in the middle of a season. A sensible refresh rhythm is daily during windows and weekly otherwise, with an extra refresh before the first round of a new season. Polling hourly in October spends requests for very little benefit.

Loans complicate squad pages. A player on loan may appear in the squad of the club they are playing for, and how the source represents the parent club, if at all, varies. Do not infer a loan relationship from two appearances; show what the response contains and, if your editors know more, add it as editorial context rather than data.

Players sometimes appear in more than one competition's squad for the same club, for example a domestic league and a continental cup. Joining on the player identifier lets you show one player profile with several competition memberships rather than duplicated people.

05

Squad pages that age well

Club sites and fan communities often want a squad page grouped by position. If the source supplies position labels, group by them and keep the labels as given; different competitions may use different conventions. If it does not, an alphabetical or shirt-number order is more honest than a position grouping you invented.

Add the date of your last refresh to the page. Squad information has a natural shelf life, and readers trust a page that tells them when it was last checked. Link each player to a profile page if your plan includes player profiles, joining on the player identifier.

06

Squads in fantasy and selection tools

Fantasy tools use squads as the player pool from which managers pick. That use raises two specific questions. First, what happens when a player leaves the competition mid-season? Your tool needs a rule, and the squad history you stored gives you the date to apply it. Second, how do you present a player whose details are thin? Show what is supplied and let the manager decide, rather than hiding the player or filling gaps with guesses.

Pair squads with predicted line-ups to help managers plan, but keep the prediction label visible. A manager who picks a player because a predicted line-up included them should understand that the prediction was not a team sheet.

07

Squads change through a season

A squad is a snapshot. Players join and leave in transfer windows, loans begin and end, and youth players are promoted. Refresh squads weekly in ordinary periods and daily during transfer windows, and record when each player first and last appeared. That history lets you show who left a club rather than silently removing them, which matters for archive pages that link to former players.

08

Membership is not selection

Being in a squad means a player is registered or listed for the competition, as the source records it. It does not mean the player is fit, in form or likely to play. Label squad lists accordingly and keep them visually distinct from predicted or confirmed line-ups.

09

Errors and partial data

A 400 invalid_parameter response usually means a malformed leagueId. A 403 means the competition is outside your plan's selection. If a refresh fails, keep the stored squad with its last-checked time and retry later; never empty a squad page because one request failed.

10

Plan scope

Squads is a league-addressed feed and is available on all three plans for entitled leagues. On Starter at EUR 29 a month, the leagueId must be one of your five saved leagues. Growth at EUR 99 and Pro at EUR 249 cover all available package leagues. Player and team profile services are separate global services that are not included in Starter, so a Starter squad page can list players but cannot link to profile data from those services.

Five leagues refreshed daily is five successful requests a day, which barely registers against any inclusion. Requests above the inclusion are EUR 0.002 each on the monthly EUR invoice; failed and denied requests are not billed.

Questions developers ask

Does a squad tell me who will play?
No. A squad is the pool of players for a competition. Use predicted line-ups for expected selections, clearly labelled.
What parameter does squads require?
leagueId, a positive numeric competition identifier sent as a string.
How often should I refresh squads?
Daily during transfer windows and weekly otherwise. The feed is cached for about an hour.
Can a player appear in more than one squad?
Yes, across competitions. Join on the string player identifier to avoid duplicate people.
Does Starter include player profiles for squad members?
No. Player and team profiles are not included in Starter, though squads for saved leagues are.

Check the plan before you write the integration.

Starter EUR 29, Growth EUR 99, Pro EUR 249 per month. No free trial. No VAT currently charged.