Skip to content
Identifiers and updates

Updated football team IDs API for targeted refreshes

Keeping hundreds of team profiles current by re-requesting all of them is wasteful. The updated teams feed lists team identifiers the source has recently changed, so you can refresh just those. This page explains how to use it as a hint, why it is not a complete change log, and how to combine it with a periodic sweep.

Primary endpoint

GET/api/v1/football/updated-teams

No query parameters.

Access: Growth and Pro. Header: X-API-Key.

Illustration of a noticeboard with several pinned club shields, three of them marked with small refresh arrows.
The update list marks teams worth refreshing; it does not promise to mark every change.
01

A list of teams worth a second look

The updated teams feed takes no parameters and returns team identifiers that the source reports as recently updated. It is cached for about an hour. Responses use the standard envelope, with data holding the source structure and meta recording the feed, UTC fetch time, cache time and qualification. Identifiers are strings; keep them that way so they match the team identifiers you already store.

What counts as an update, and over what period the list looks back, is defined by the source and has not been certified by us. Read several samples over a few days to get a feel for how many identifiers appear and how often the list changes before you design around it.

02

A hint, not a change log

The most important property of this feed is what it does not promise. It is not a complete change log. A team whose profile changed may not appear, the list may not say what changed, and an identifier may appear without any visible difference in the profile. It is also not a push notification or webhook; nothing is sent to you. You poll it like any other feed.

Used as a hint, it is very valuable. Most of the time it points you at the profiles that actually need refreshing, and lets you skip the hundreds that do not. Used as a guarantee, it will eventually let a stale profile sit on your site for weeks. Design for the first use.

  • Poll the feed; it does not push.
  • Refresh the profiles it lists.
  • Run a periodic full sweep anyway.
  • Do not infer what changed from the list alone.
Hint-driven profile refreshFlow: poll updated-teams, intersect the listed IDs with teams you hold, refresh those profiles, and run a slower full sweep to catch changes the list missed.01updated-teamspoll02Intersectteams you hold03Refreshteam profile04Full sweepweekly net
Hint-driven profile refresh. Refresh what the hint lists, then sweep everything occasionally as a safety net.
03

Refreshing only what is listed

The example polls the feed, keeps only identifiers for teams you actually hold, and refreshes each of those profiles with a pause between requests. Identifiers for teams you do not cover are ignored; there is no need to fetch profiles you will never show.

Python: targeted team profile refreshpython
import os, time, requests

H = {"X-API-Key": os.environ["FOOTBALLAPI_KEY"]}
BASE = "https://footballapi.net/api/v1/football"

r = requests.get(f"{BASE}/updated-teams", headers=H, timeout=30)
r.raise_for_status()
listed = set(read_team_ids(r.json()["data"]))   # strings, via your mapping

for team_id in sorted(listed & teams_we_hold()):
    p = requests.get(f"{BASE}/team", params={"teamId": team_id}, headers=H, timeout=20)
    if p.ok:
        store_profile(team_id, p.json())
    time.sleep(0.5)
04

The safety-net sweep

Because the list is not complete, combine it with a slow sweep that refreshes every profile you hold over a longer cycle. A common pattern is to refresh one seventh of your teams each day, so the whole set is refreshed weekly, alongside the hint-driven refreshes. The sweep catches changes the hint missed; the hint catches changes faster than the sweep would.

Spread the sweep evenly through the day rather than running it in one burst. It keeps your request rate smooth and well below the 100 requests per second account ceiling, and it means a transient upstream problem affects a small slice rather than the whole run.

05

Working out what changed

If your product cares about what changed, compare the newly fetched profile with your stored copy. A simple structural diff of the data object will show added, removed and modified attributes. Record the differences with timestamps. That history is useful for editors and for spotting source corrections that might affect other pages, such as a renamed club whose name appears in archived match reports.

Do not assume that every listed team will show a difference. Sometimes nothing visible changes in the attributes you store. That is normal and not an error.

06

Other things worth refreshing

A team identifier appearing in the list can also be a cue to refresh related data you hold for that team, such as its crest from the team image service. Crest changes are infrequent but visible, and a club that has updated its badge will notice an outdated one on your site.

Be judicious. Refreshing every related service for every listed team multiplies requests. Choose the few that matter for your product.

07

Choosing a polling cadence

The feed is cached for about an hour, so hourly polling is the natural upper bound on ordinary days. Many products poll less often, perhaps every few hours, because team profiles rarely change urgently. Around the start of a season and during transfer windows, clubs update details more often, and hourly polling is worthwhile. On quiet days in mid-season, three or four polls a day are usually enough.

Whatever cadence you choose, record the time of each poll and the identifiers it returned. That log lets you measure how often listed teams actually changed, which tells you how much to rely on the hint for your competitions.

08

Teams you do not hold

The list may include teams from competitions you do not cover. Ignore them unless you have a reason to add those teams. Requesting profiles for every listed team regardless of relevance would waste requests and fill your database with clubs you never show. Intersect the list with your own set of team identifiers before doing anything else.

Conversely, a team you hold that never appears in the list is not necessarily unchanged. That is what the safety-net sweep is for.

09

Making refresh jobs repeatable

Refresh jobs fail part-way through for ordinary reasons: a timeout, a deploy, a transient upstream error. Design the job so it can be re-run safely. Store a refreshed-at time per team, skip teams refreshed since the list was fetched, and process identifiers in a stable order. A job built this way can be interrupted and restarted without double-counting requests or leaving some teams permanently behind.

10

Reading errors during refreshes

A 403 response with the subscription_required code during a refresh usually means the team profile service is not activated for your account, even though the update feed is. Both need activation. A 404 for a listed team can mean the source no longer holds a profile for that identifier; record it and stop refreshing that team until it reappears. Keep every requestId from error bodies in your logs so support can trace specific calls.

11

Keeping your own change history

The feed does not record what changed. When a refresh alters a stored profile, write the old and new values with a timestamp to your own history table. That history answers editorial questions, supports corrections and shows how reliable the hint is for your competitions over time.

12

Testing the refresh

Test that only teams you hold are refreshed and that restarts skip teams refreshed recently.

13

Plan scope

Updated teams is a global service that is not included in Starter. It requires Growth at EUR 99 a month or Pro at EUR 249 and activation for your account. Because the profiles it helps you refresh are also Growth and Pro services, the two are typically used together.

Polling the list hourly is 24 successful requests a day, plus the profile refreshes it triggers. Requests above the daily inclusion cost EUR 0.002 each on the monthly EUR invoice; failed and denied requests are not billed. No free trial is offered.

Questions developers ask

Is updated-teams a complete change log?
No. It is a hint about which teams to refresh. Combine it with a periodic full sweep.
Does it push notifications to me?
No. It is a REST feed you poll. There is no webhook delivery.
Does it say what changed?
Not reliably. Compare the refreshed profile with your stored copy to see differences.
Does it take parameters?
No. One request returns the current list.
Is it included in Starter?
No. It requires Growth or Pro and separate service activation.

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.