matchSummary()
returns MatchSummary Scoreline, status, and team-level xG.
FBref notes: Handles shootouts, extra-time, abandoned/awarded/postponed.
FBref's schedule export is clean enough to drive scoreline headers, result cards, and bump charts. The adapter parses their scoreline strings, detects shootouts and extra time, and handles status edge cases (postponed, cancelled, abandoned, awarded) consistently.
fromFbref.matchSummary(row) MatchSummary <ShotMap />, your own React view, a server-side
report, or an analysis script.
FBref's scoreline strings look simple — "2–0", "1–1 (4–3 pens)", "2–1 (aet)" — but if you parse them yourself every time, the edge cases will bite. The adapter handles shootouts, extra time, postponed, cancelled, abandoned, and awarded matches in one place.
import { fromFbref } from "@withqwerty/campos-adapters";
const summary = fromFbref.matchSummary(scheduleRow); matchSummary()
returns MatchSummary Scoreline, status, and team-level xG.
FBref notes: Handles shootouts, extra-time, abandoned/awarded/postponed.
Supported cards plot from this adapter with no extra work. Partial cards plot, but read the scope note. Dimmed cards need a surface this provider doesn't ship.
Plot events, shots, passes, and formations directly on the pitch.
Time-series and xG-driven views from shots().
These charts are adapter-independent — they take pre-aggregated inputs.
{
"shootout": {
"score": "1–1 (4–3 pens)",
"status": "finished",
"resolvedIn": "shootout",
"shootoutWinner": "home"
},
"aet": {
"score": "2–1 (aet)",
"status": "finished",
"resolvedIn": "extra-time",
"statusLabel": "AET"
},
"postponed": {
"notes": "Match postponed",
"status": "postponed"
},
"abandoned": {
"notes": "Match abandoned",
"status": "abandoned"
},
"awarded": {
"notes": "Awarded to home side",
"status": "awarded"
}
}
Any UI that consumes a schedule — scoreline strips, league tables with xG
differentials, bump charts that need round-level results — is a good fit for
matchSummary().
FBref has per-match detail pages, but the current adapter deliberately scopes to the schedule row — that's the surface most FBref pipelines actually stabilise against. Shot-level and lineup surfaces would require scrape-backed secondary endpoints.
Most users read FBref schedules via soccerdata. The adapter takes the row shape as-is — the field names match soccerdata's output, which matches FBref's DOM.
Concrete credits for the projects that did the underlying research or laid the reference tables we read from.
Scrape-backed narrow-adapter pattern; the schemas we read for Understat and FBref schedule and shot rows.
{
"game_id": "cc5b4244",
"league": "Premier League",
"season": "2024-2025",
"date": "2024-08-17",
"home_team": "Manchester City",
"away_team": "Chelsea",
"home_xg": 2.1,
"away_xg": 1.3,
"score": "2–0",
"attendance": "54 732",
"venue": "Etihad Stadium",
"notes": null
} {
"matchId": "cc5b4244",
"competitionLabel": "Premier League",
"seasonLabel": "2024-2025",
"kickoff": "2024-08-17T00:00:00Z",
"status": "finished",
"statusLabel": "FT",
"venue": "Etihad Stadium",
"attendance": 54732,
"home": {
"teamLabel": "Manchester City",
"score": 2,
"xg": 2.1
},
"away": {
"teamLabel": "Chelsea",
"score": 0,
"xg": 1.3
}
}