The canonical record
Data and corrections
The record
Complete results, layers that fill in
Every result is known back to 1886. The richer detail thins as the record reaches into the Victorian past — this is exactly where, layer by layer and decade by decade.
every result known, back to 1886
- 81%
- Complete goalscorer rows
- 100%
- Starting XIs
- 99%
- Attendances
Swipe for all decades →
Slice: all 6,032 matches in the database, grouped by decade. Every match carries a result row.
Intensity and the cell value are the share of each decade's matches that carry the layer. The all-time column on the right is the same share across the whole record.
The other cut
Coverage by competition type
The same layers, sliced by competition rather than by decade — league fixtures are the best-covered, the deep cup and European archive the thinnest.
- League
- Matches
- 4,863
- Scorers
- 3,924 (81%)
- Lineups
- 4,862 (100%)
- FA Cup
- Matches
- 464
- Scorers
- 380 (82%)
- Lineups
- 464 (100%)
- Europe
- Matches
- 431
- Scorers
- 363 (84%)
- Lineups
- 431 (100%)
- League Cup
- Matches
- 218
- Scorers
- 180 (83%)
- Lineups
- 217 (100%)
- Shields and Super Cups
- Matches
- 40
- Scorers
- 31 (78%)
- Lineups
- 36 (90%)
- Test Matches
- Matches
- 8
- Scorers
- 4 (50%)
- Lineups
- 8 (100%)
- World
- Matches
- 8
- Scorers
- 7 (88%)
- Lineups
- 8 (100%)
Provenance
How the record is built and corrected
Every layered fact cites a source, and corrections follow one contract. The queue below is where the faint cells above turn into work.
Sources
Grouped by upstream source where several use cases share a lineage. Expand a family to see how each use case is applied and an example on file.
High-value gaps
United scored here but the goal-by-goal row isn't complete yet.
Showing 12 of 34 — the queue prioritises recent post-war work first.
The queue prioritises recent post-war United goalscorer gaps, then opposition goals, lineups, and attendance. Older archive work can still be added whenever a citation is strong.
For researchers & developers
The same compiled record powers the site, the public API, and the flat-file exports. Start with the manifest, cite stable us: IDs when linking back to a specific match or entity, and read facet flags before treating event or lineup fields as complete totals.
Dataset downloads
Each production build exports flat files from the compiled SQLite database, so the downloadable red thread dataset matches the app and API. /dataset/manifest.json lists row counts, build metadata, and registry fields for data catalogs.
- manifest.jsonRelease metadata, row counts, and registry fields
- matches.csvFixture spine and match facts
- events.csvGoal, assist, and card event rows
- lineups.csvStarting, bench, and substitution rows
- elo_history.csvPre/post-match ratings and expectancies
- season_summaries.csvCompetition season summaries
- players.csvAll-time player totals and media references
All export files (13)
- transfers.csvTransfer ledger with fees and directions
- league_standings.csvLeague table rows by season and position
- player_media.csvPlayer portrait references and Commons licenses
- manager_media.csvManager portrait references
- og_scorer_media.csvOwn-goal scorer media references
- player_positions.csvPlaying positions from Wikidata P413
Public read-only API
JSON dumps generated at build, with permissive CORS and an attribution block on every payload. List endpoints are unfiltered snapshots. The index at /api/v1.json lists every endpoint with filter notes.
- /api/v1/metaDataset metadata and coverage counts
- /api/v1/matches.jsonMatch archive snapshot — first 50 rows
- /api/v1/matches/{id}One match with events, lineups, Elo, and sources
- /api/v1/seasons.jsonSeason summaries by competition
- /api/v1/seasons/{season}One season with every match (e.g. 1998-99)
- /api/v1/players.jsonPlayer totals snapshot
- /api/v1/players/{id}One player with per-season splits
- /api/v1/opponentsOpponent head-to-head records
Treat result rows as the stable core and read facet flags before using event, lineup, assist, card, attendance, or source-derived fields as complete historical totals.
How to cite Red Thread
The dataset is licensed CC BY-SA 4.0. Credit Red Thread with a link to https://utdred.com/data, preserve per-source attribution in reused rows, and prefer stable us: identifiers when pointing at a specific record (e.g. us:match:1999-05-26-bayern-munich-n).
Plain text
Red Thread (2026). Red Thread dataset: United history, evidenced — every match since 1886. https://utdred.com/data. Licensed CC BY-SA 4.0. Stable record IDs use the us: scheme (e.g. us:match:1999-05-26-bayern-munich-n).
BibTeX
@dataset{red-thread-manchester-united_2026,
title = {Red Thread dataset},
author = {Red Thread},
year = {2026},
url = {https://utdred.com/data},
note = {United history, evidenced — every match since 1886. Stable IDs: us:<kind>:<key>. Downloads: https://utdred.com/dataset/manifest.json},
license = {CC BY-SA 4.0},
howpublished = {\url{https://utdred.com/data}}
}AI crawlers & registries
Machine-readable site guidance lives at /llms.txt. For football data registries and research indexes, list the dataset with manifest URL https://utdred.com/dataset/manifest.json and point documentation to this page.
Also layered onto lineups: 2,478 matches with used-substitute records and 882 with a named bench.