GUIDE

FIFA World Cup 2026 API: Live Fixtures, Scores & Stats for Developers

How to get FIFA World Cup 2026 data via REST API: all 104 fixtures, live scores, lineups, xG, player stats, and odds. Code examples in Python and JavaScript.

9 min read

The 2026 FIFA World Cup is the biggest the tournament has ever been: 48 teams, 12 groups, 16 host cities across the USA, Canada, and Mexico, and 104 matches over 39 days. If you are building a prediction app, a fantasy game, a live-score widget, a media product, or a betting tool, you need a fast, reliable way to pull World Cup data into your code.

This guide walks through how to get FIFA World Cup 2026 data via a REST API - the fixtures, live scores, lineups, xG, player stats, and odds you actually need to ship a product before kickoff on June 11, 2026.

What World Cup 2026 data is available

A modern football API exposes the same building blocks for every competition. For the 2026 World Cup, those blocks are:

  • Fixtures - all 104 matches with kickoff times (UTC), venues, host cities, and stage (group / R32 / R16 / QF / SF / 3rd / Final)
  • Live scores and match events - goals, cards, substitutions, VAR decisions, possession by half
  • Lineups - starting XI and bench for both teams, with shirt numbers and positions
  • Player statistics - goals, assists, shots, xG, minutes, conversion rates
  • Team statistics - possession, shots, xG, expected points, pass completion
  • Standings - all 12 group tables with full FIFA tiebreakers applied
  • Odds - pre-match and live odds from Bet365, Pinnacle, Betfair Exchange, and Kambi across 1X2, Asian handicap, BTTS, over/under, draw no bet, and corners
  • Historical data - every World Cup edition from 1930 onwards, useful for prediction models and storytelling

All of this is delivered as JSON via REST. You do not need an SDK to use it.

Quickstart: get all 104 World Cup fixtures

We will use TheStatsAPI as the example. The 2026 FIFA World Cup is identified by a competition_id (look it up via GET /football/competitions?search=world%20cup). We use {COMPETITION_ID} as a placeholder in the snippets below. Start with a free 7-day trial to get your API key, then make this single call:

curl 'https://api.thestatsapi.com/api/football/matches?competition_id={COMPETITION_ID}&season=2026&per_page=104' \
  -H 'Authorization: Bearer YOUR_API_KEY'

You will get a JSON array of 104 fixture objects. Each object has the full kickoff time in UTC, the venue, the stage, and either the two teams (group stage and confirmed knockout pairings) or a positional placeholder ("Winner Group A") for knockout matches still waiting on results.

Python

import requests

url = "https://api.thestatsapi.com/api/football/matches"
params = {"competition_id": "{COMPETITION_ID}", "season": 2026, "per_page": 104}
headers = {"Authorization": "Bearer YOUR_API_KEY"}

response = requests.get(url, params=params, headers=headers)
fixtures = response.json()["data"]

print(f"Loaded {len(fixtures)} World Cup 2026 fixtures")
for fixture in fixtures[:5]:
    print(f"{fixture['kickoff_utc']} - {fixture['home']['name']} vs {fixture['away']['name']}")

JavaScript / Node

const response = await fetch(
  'https://api.thestatsapi.com/api/football/matches?competition_id={COMPETITION_ID}&season=2026&per_page=104',
  { headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
);
const { data: fixtures } = await response.json();

console.log(`Loaded ${fixtures.length} World Cup 2026 fixtures`);
fixtures.slice(0, 5).forEach((f) => {
  console.log(`${f.kickoff_utc} - ${f.home.name} vs ${f.away.name}`);
});

Get live scores during the tournament

During the World Cup, you typically want either "all matches happening today" or "matches that are currently live". Both are filters on the same endpoint:

// Today's matches
const today = await fetch(
  'https://api.thestatsapi.com/api/football/matches?competition_id={COMPETITION_ID}&date=2026-06-11',
  { headers }
);

// Just the currently live matches
const live = await fetch(
  'https://api.thestatsapi.com/api/football/matches?competition_id={COMPETITION_ID}&status=in_progress',
  { headers }
);

Live matches include the live score, current minute (including injury time), and an ordered event timeline. Poll every 10-30 seconds for ticker apps; subscribe to webhooks if your provider supports them and you need lower latency.

Pull lineups, xG, and player stats

Once a match is in progress or finished, the player and team stats become interesting. Here is how you fetch the full match centre data:

const matchId = 'mt_010249745';

const [lineupsRes, eventsRes, statsRes, xgRes] = await Promise.all([
  fetch(`https://api.thestatsapi.com/api/football/matches/${matchId}/lineups`, { headers }),
  fetch(`https://api.thestatsapi.com/api/football/matches/${matchId}/events`, { headers }),
  fetch(`https://api.thestatsapi.com/api/football/matches/${matchId}/stats`, { headers }),
  fetch(`https://api.thestatsapi.com/api/football/matches/${matchId}/xg`, { headers }),
]);

Four parallel calls are enough to power a complete match-centre view: lineups, the event timeline, team stats (possession, shots, corners, cards), and shot-level xG.

Get live World Cup odds from Bet365 and Pinnacle

For betting analytics, arbitrage tools, or odds comparison products, fetch odds per match:

const oddsResponse = await fetch(
  `https://api.thestatsapi.com/api/football/matches/${matchId}/odds`,
  { headers }
);
const { data: odds } = await oddsResponse.json();

// odds.bookmakers[].markets[].outcomes[]
// Bet365, Pinnacle, Betfair Exchange, Kambi in one shape

You get pre-match opening prices, last-seen prices, and live in-play odds (when available) across 1X2, Asian handicap, over/under goals, both teams to score, draw no bet, and corners markets - all returned in the same JSON shape regardless of bookmaker. That uniformity matters: you do not want to write four separate parsers for an arbitrage tool.

Build a Round of 32 bracket once the group stage finishes

The fixtures endpoint pre-seeds all 32 knockout matches with positional placeholders ("Winner Group A", "Runner-up Group C", "3rd Place A/B/F"). As group-stage results come in, the API automatically replaces those placeholders with the qualified teams.

To build a live bracket UI, poll the fixtures endpoint after each group-stage match day and re-render any rows where the home or away team has changed from a placeholder to a real team object.

Cover the entire tournament with a single endpoint

The matches endpoint scales the whole tournament:

  • Group stage: filter stage=group-stage for the 72 group matches
  • Knockouts: filter stage=round-of-32 (or any other stage) to get just that round's fixtures
  • By team: filter team=brazil to get all matches involving a single nation
  • By group: filter group=A to get just Group A's six matches
  • By date: filter date=2026-06-18 for everything on a single day
  • By status: filter status=in_progress for the ticker, status=finished for archives

That single endpoint, with different filters, covers every fixtures-related use case in a World Cup app. Same for /players/stats, /standings, and /odds.

Common World Cup app patterns

A few patterns recur in World Cup apps:

  • Match-day ticker: poll /matches?status=in_progress every 10 seconds; show the live score next to each fixture
  • Group stage simulator: cache /standings and let users predict remaining matches client-side (our Group Stage Simulator tool does exactly this)
  • Fantasy World Cup: cache squads once per match-day, then fetch /players/stats after each match for fantasy point calculation
  • Live bracket: poll /matches?stage=round-of-32 after each group-stage day to update placeholder slots
  • Notifications: subscribe to webhook events for goal, red_card, match_finished

Pricing - what does World Cup data actually cost

TheStatsAPI plans start at $50/month for 100,000 requests and unlock all endpoints, including the World Cup, all 80 default competitions, and historical data. Every plan comes with a 7-day free trial; you can cancel before the trial ends without paying. For a typical World Cup app polling at 10-second intervals during live matches, the Starter plan covers the whole tournament with headroom.

If you need more than 100k/month, the Growth plan at $129/month gives you 500k requests; Scale at $379/month covers 5 million. All three plans expose the same endpoints - the only difference is request volume.

What if I want to start with a free tier

For prototyping, football-data.org includes the FIFA World Cup in its free tier with a 10 calls/minute limit. It is enough to validate an idea or build a hobby project. For a real production app during the World Cup, the rate limit and lack of live odds, xG, and detailed lineups will become constraints quickly.

Frequently Asked Questions

What is the best World Cup 2026 API?

For a production application that needs live scores, full lineups, xG, and odds in one endpoint, TheStatsAPI is the strongest choice. The 80-competition base coverage means the same integration works for your domestic leagues too. For free-tier prototyping, football-data.org is the most generous.

Is there a free FIFA World Cup API?

Yes. football-data.org includes the FIFA World Cup in its free tier (10 calls/minute). API-Football also includes it on its free plan (100 requests/day). Both are usable for prototyping but will hit rate limits during live matches.

What is the competition ID for the 2026 World Cup?

In TheStatsAPI, look up the 2026 FIFA World Cup competition_id once via GET /football/competitions?search=world%20cup — we use {COMPETITION_ID} as a placeholder throughout this post. Pair it with season=2026 to filter to the current edition. Other APIs use different identifiers — check their /competitions endpoint to find the right ID.

Does the World Cup API include live scores?

Yes. Live scores and in-play events (goals, cards, substitutions, VAR) are returned from the matches endpoint. Poll every 10-30 seconds for ticker apps. Some providers also offer webhooks for lower-latency push notifications.

Can I get historical World Cup data via API?

Yes. TheStatsAPI provides historical data going back to the inaugural 1930 World Cup. Adjust the season parameter to query a previous edition. The same endpoints work - matches, players, standings, results - so once you build for 2026 you can backfill historical content with the same code.

Does the API include World Cup odds?

Yes. Bet365, Pinnacle, Betfair Exchange, and Kambi odds are available for every World Cup fixture, covering 1X2, Asian handicap, over/under goals, BTTS, draw no bet, and corners. Opening and last-seen prices are included for closing line value workflows.

How do I build a World Cup bracket app?

Build a static UI for the 48-team group stage and 32-team knockout bracket. Pull /matches?competition_id={COMPETITION_ID}&stage=round-of-32 after each group-stage match-day and re-render any rows where the home or away team has changed from a placeholder to a real team. For a client-side prediction game, our free World Cup Bracket Maker is a working example.

Start building today

Ready to Power Your Sports App?

Start your 7-day free trial. All endpoints included on every plan.

Cancel anytime
7-day free trial
Setup in 5 minutes