GitPedia

Reep

The football entity register. Maps player, team, and coach identities across Transfermarkt, FBref, UEFA, Sofascore, and 25+ data providers.

From withqwerty·Updated June 20, 2026·View on GitHub·

The football entity register. Maps player, team, coach, competition, and season identities across Transfermarkt, FBref, UEFA, Sofascore, and 30+ data providers. The project is written primarily in TypeScript, distributed under the Creative Commons Zero v1.0 Universal license, first published in 2026. Key topics include: crosswalk, fbref, football, football-analytics, football-data.

Latest release: v2.5.0
April 20, 2026View Changelog →

Reep

Charles Reep's match notations from 1953

The football entity register. Maps player, team, coach, competition, and season identities across Transfermarkt, FBref, UEFA, Sofascore, and 30+ data providers.

Named after Charles Reep (1904--2002), an RAF wing commander who hand-recorded every action in over 2,200 football matches starting in the 1950s. He's considered the grandfather of football analytics -- decades before expected goals or tracking data, Reep was tallying passes, shots, and sequences with pen and paper, pioneering the idea that football could be understood through data.

What is this?

A canonical identity file for football. Every person, club, competition, and season gets a stable Reep ID (reep_<type_prefix><8hex>), linked to their IDs on other platforms. If you have a Transfermarkt ID and need the FBref ID for the same player — or want to resolve an Opta competition ID to its FBref equivalent — this register gives you the answer.

The unique key is reep_id. Wikidata QIDs are available as a provider mapping where the entity exists in Wikidata, but entities can exist independently (e.g. lower-league players sourced from Opta).

People who are both players and coaches (e.g. Pep Guardiola) have separate records with distinct Reep IDs — reep_p* for the player record, reep_c* for the coach record.

Think of it as the football equivalent of the Chadwick Baseball Bureau Register.

Data

FileRecordsDescription
data/people.csv~488KPlayers and coaches with provider IDs and bio
data/teams.csv~45KClubs with provider IDs and metadata
data/competitions.csv~336Leagues, cups, and tournaments with provider IDs
data/seasons.csv~3.8KSeason editions of competitions
data/names.csvvariesAlternate names and aliases
data/meta.jsonGeneration timestamp and counts

People schema

ColumnDescriptionExample
reep_idReep ID (canonical key)reep_p2804f5db
key_wikidataWikidata QID (empty if not in Wikidata)Q99760796
typeplayer or coachplayer
namePrimary English nameCole Palmer
full_nameBirth/legal nameCole Jermaine Palmer
date_of_birthISO date2002-05-06
nationalityCountryUnited Kingdom
positionPlaying positionattacking midfielder
height_cmHeight in centimetres185
key_transfermarktTransfermarkt player ID568177
key_transfermarkt_managerTransfermarkt manager ID (coaches only)50100
key_fbrefFBref player IDdc7f8a28
key_soccerwaySoccerway person ID525801
key_sofascoreSofascore player ID982780
key_flashscoreFlashscore player IDpalmer-cole/h8agbDt7
key_optaOpta player ID7cwgrmorsb42qaj5vrhp8fhzp
key_premier_leaguePremier League player ID49293
key_11v1111v11 player ID265554
key_espnESPN FC player ID
key_national_football_teamsNational Football Teams ID92970
key_worldfootballWorldFootball.net IDcole-palmer
key_soccerbaseSoccerbase player ID125454
key_kickerKicker player IDcole-palmer
key_uefaUEFA player ID
key_lequipeL'Equipe player ID
key_fff_frFFF.fr player ID
key_serie_aLega Serie A player ID
key_besoccerBeSoccer player ID
key_footballdatabase_euFootballDatabase.eu person ID
key_eu_football_infoEU-Football.info player ID
key_hugmanBarry Hugman's Footballers ID
key_german_faDFB person ID
key_statmuse_plStatMuse PL player ID
key_sofifaSoFIFA / EA FC player ID
key_soccerdonnaSoccerdonna player ID (women's football)
key_dongqiudiDongqiudi player ID
key_understatUnderstat player ID1234
key_whoscoredWhoScored player ID456789
key_fbref_verifiedFBref ID (cross-verified via worldfootballR)dc7f8a28
key_sportmonksSportMonks player ID12345
key_api_footballAPI-Football player ID1100
key_fotmobFotMob player ID292462
key_opta_numericOpta legacy numeric ID (same as FPL code, The Analyst sc- IDs)244851
key_thesportsdbTheSportsDB player ID34146086
key_skillcornerSkillCorner player ID23959
key_wyscoutWyscout player ID234966
key_impectImpect player ID52615
key_heimspielheim:spiel player ID361032
key_capologyCapology player slugcole-palmer-36271
position_detailGranular position from TransfermarktAttacking Midfield

Teams schema

ColumnDescriptionExample
reep_idReep ID (canonical key)reep_t0871097b
key_wikidataWikidata QIDQ9616
namePrimary English nameArsenal F.C.
countryCountryUnited Kingdom
foundedFounding date1886-10-01
stadiumHome groundEmirates Stadium
key_transfermarktTransfermarkt team ID11
key_fbrefFBref squad ID18bb7c10
key_soccerwaySoccerway team ID660
key_optaOpta team IDb3sy95iqnw2bv69a0gxunhiot
key_kickerKicker team ID
key_flashscoreFlashscore team ID
key_sofascoreSofascore team ID
key_soccerbaseSoccerbase team ID
key_uefaUEFA team ID
key_footballdatabase_euFootballDatabase.eu team ID
key_worldfootballWorldFootball.net team ID
key_espnESPN team ID
key_playmakerstatsPlaymakerStats team ID
key_clubeloClub Elo team IDArsenal
key_sportmonksSportMonks team ID123
key_api_footballAPI-Football team ID42
key_sofifaSoFIFA / EA FC team ID1
key_fotmobFotMob team ID9825
key_opta_numericOpta legacy numeric team ID3
key_capologyCapology team slugarsenal

Competitions schema

ColumnDescriptionExample
reep_idReep ID (canonical key)reep_lb3d230cb
key_wikidataWikidata QIDQ9448
nameCompetition namePremier League
countryCountryUnited Kingdom
key_transfermarktTransfermarkt competition IDGB1
key_fbrefFBref competition ID9
key_optaOpta competition ID (UUID)2kwbbcootiqqgmrzs6o5inle5
key_opta_numericOpta legacy numeric competition ID8
key_optacoreOpta core numeric competition ID1

Seasons schema

ColumnDescriptionExample
reep_idReep ID (canonical key)reep_sa7f63ba6
key_wikidataWikidata QIDQ124371422
nameSeason name2024–25 Premier League
competition_reep_idReep ID of parent competitionreep_lb3d230cb

Names schema

ColumnDescriptionExample
key_wikidataWikidata QIDQ11893
namePrimary nameCristiano Ronaldo
aliasAlternate nameCristiano Ronaldo dos Santos Aveiro

Coverage

Not every entity has every ID. Coverage depends on what the Wikidata community has mapped plus independently verified mappings. Use GET /stats for live counts.

ProviderSourceNotes
TransfermarktWikidataHighest coverage across all entities
FBrefWikidataStrong for recent players
SoccerwayWikidataBroad international coverage
SofascoreWikidataModern players well covered
Premier LeagueWikidataPL players only
OptaVerifiedAlphanumeric IDs from Stats Perform's Opta F1 database (~50K players)
Opta numericVerifiedLegacy Opta numeric IDs (same as FPL code, The Analyst sc- IDs)
ImpectVerifiedDOB + name matching via Impect export
WyscoutVerifiedVia Impect ID mappings
SkillCornerVerifiedVia Impect ID mappings
heim:spielVerifiedVia Impect ID mappings
TheSportsDBVerifiedDirect Wikidata link + DOB/name matching
API-FootballVerifiedVia TheSportsDB + direct matching
ESPNVerifiedVia TheSportsDB mappings
FotMobVerifiedDOB + name matching
FBref verifiedVerifiedCross-verified via worldfootballR
UnderstatVerifiedCross-reference matching
WhoScoredVerifiedCross-reference matching
SportMonksVerifiedCross-reference matching
Club EloVerifiedManual team mapping

Wikidata IDs are community-maintained and update automatically with each refresh. Verified IDs are matched independently using DOB, name, and cross-provider bridges, then validated before inclusion.

Usage

Python

python
import csv # Load people into a dict keyed by Reep ID people = {} with open("data/people.csv") as f: for row in csv.DictReader(f): people[row["reep_id"]] = row # Look up by Transfermarkt ID tm_index = {row["key_transfermarkt"]: row for row in people.values() if row["key_transfermarkt"]} palmer = tm_index["568177"] print(palmer["reep_id"]) # "reep_p2804f5db" print(palmer["key_fbref"]) # "dc7f8a28"

R

r
library(readr) people <- read_csv("data/people.csv") # All Premier League-registered players pl_players <- people |> filter(key_premier_league != "") # Cross-reference: Transfermarkt -> FBref people |> filter(key_transfermarkt == "568177") |> select(reep_id, name, key_fbref, key_sofascore)

SQL (load into SQLite)

bash
sqlite3 reep.db <<EOF .mode csv .import data/people.csv people .import data/teams.csv teams .import data/competitions.csv competitions .import data/seasons.csv seasons .import data/names.csv names EOF
sql
-- Find all IDs for a player SELECT * FROM people WHERE name LIKE '%Salah%'; -- Reverse lookup: FBref ID -> everything SELECT * FROM people WHERE key_fbref = 'e342ad68'; -- Lookup by Reep ID SELECT * FROM people WHERE reep_id = 'reep_p2804f5db';

API

The Reep API provides the same data as the CSVs via a convenient REST interface. All providers (Wikidata + custom verified) are available to all plans.

Get your API key on RapidAPI.

EndpointDescriptionExample
GET /searchSearch by name (prefix matching)/search?name=Cole Palmer&type=player
GET /resolveTranslate provider ID/resolve?provider=transfermarkt&id=568177
GET /lookupLook up by Reep ID or Wikidata QID/lookup?id=reep_p2804f5db
GET /statsDatabase statistics/stats

The /lookup endpoint auto-detects the ID type: Reep IDs start with reep_, Wikidata QIDs start with Q. The legacy ?qid= parameter is still supported.

All endpoints that return entities accept an optional type parameter (player, team, coach, competition, season). For dual-role people, /lookup without type returns all records. Default search excludes seasons to avoid noise — use type=season to search seasons explicitly.

Reep IDs

Every entity in the register has a self-minted Reep ID as its canonical identifier. The format is reep_<type_prefix><8hex>:

PrefixEntity typeExample
reep_pPlayerreep_p2804f5db (Cole Palmer)
reep_tTeamreep_t0871097b (Arsenal F.C.)
reep_cCoachreep_c9103de59 (A. H. Albut)
reep_lCompetitionreep_lb3d230cb (Premier League)
reep_sSeasonreep_sa7f63ba6 (2024–25 Premier League)

Reep IDs are stable — they never change, even if a player's Wikidata QID is merged or deleted. Wikidata QIDs are available as a provider mapping (key_wikidata in CSVs, qid in API responses) but are not the identity backbone.

This design follows the Chadwick Baseball Bureau Register model: self-minted UUIDs as primary keys, with all provider IDs (including Wikidata) as cross-references.

CLI

A Python CLI for the register lives in its own repo: withqwerty/reep-cli.

bash
pip install git+https://github.com/withqwerty/reep-cli.git # Search by name reep search "Cole Palmer" # Resolve: Transfermarkt -> all IDs reep resolve transfermarkt 568177 # Translate: just output the target ID (pipe-friendly) reep translate transfermarkt 568177 fbref # dc7f8a28 # Download CSVs for offline use reep download # Search offline reep local "Salah"

Source

Most data is extracted from Wikidata via SPARQL. Wikidata is a free, collaborative knowledge base maintained by thousands of volunteers. The cross-provider ID mappings exist because the Wikidata community has systematically added external identifier properties for football data sources.

Entities not in Wikidata (e.g. lower-league players) are sourced from authoritative provider databases like Opta's F1 player database.

Wikidata properties used

PropertyProvider
P2446Transfermarkt player ID
P2447Transfermarkt manager ID
P7223Transfermarkt team ID
P5750FBref player ID
P8642FBref squad ID
P2369Soccerway person ID
P6131Soccerway team ID
P12302Sofascore player ID
P8259Flashscore player ID
P12539Premier League player ID
P1255111v11 player ID
P3681ESPN FC player ID
P2574National Football Teams ID
P2020WorldFootball.net ID
P2193Soccerbase player ID
P2276UEFA player ID
P7361UEFA team ID
P3665L'Equipe player ID
P9264FFF.fr player ID
P13064Lega Serie A player ID
P12577BeSoccer player ID
P3537FootballDatabase.eu person ID
P7351FootballDatabase.eu team ID
P3726EU-Football.info player ID
P12606Barry Hugman's Footballers ID
P4023German FA person ID
P12567StatMuse PL player ID
P12312Kicker team ID
P7876Flashscore team ID
P13897Sofascore team ID
P7454Soccerbase team ID
P7287WorldFootball.net team ID
P1469SoFIFA / EA FC player ID
P4381Soccerdonna player ID (women's football)
P8134Soccerdonna coach ID
P11379Dongqiudi player ID
P7280PlaymakerStats team ID
P12758Transfermarkt competition ID
P13664FBref competition ID
P8735Opta competition ID

Provider notes

Opta / Stats Perform — Three distinct ID systems exist within Stats Perform's ecosystem:

  • opta — 25-char alphanumeric UUIDs (e.g. 7cwgrmorsb42qaj5vrhp8fhzp) from the current SD API / Stats Perform F1 database. Used for players (50K), teams, competitions, and seasons. This is the canonical Opta provider.
  • opta_numeric — Legacy numeric codes (e.g. 244851 for Cole Palmer). Same as FPL code field, The Analyst sc- URL IDs, and Wikidata P8735/P8736/P8737. Players (3.8K), teams (255), competitions (73), coaches (28). Sources: FPL data, Wikidata dump, Opta Web Archive feeds.
  • optacore — A separate numeric system with different numbers (e.g. FA Cup = 93 vs opta_numeric 1). Competitions only (47). From the SD API mapping file.

WorldFootball.net / heim:spiel — WorldFootball.net (owned by heim:spiel) migrated from slug-based URLs (e.g. cole-palmer) to numeric IDs in November 2025. The old slugs still work via redirect. Wikidata P2020 contains the old slug format. The heim:spiel numeric IDs in Reep are the same as the new WorldFootball.net IDs — the URL prefix indicates entity type:

TypeWorldFootball.net URLheim:spiel ID
Player/pe426937426937
Team/te16721672
Competition/co9191
Match/ma1098817710988177

Soccerway / Flashscore — Both owned by Livesport (Czech data company), but use separate ID systems. Soccerway changed their URL/ID scheme in September 2025. Reep has 139K Soccerway IDs in the old numeric format from Wikidata P2369 (e.g. 45569). The old URLs still redirect:

FormatURLID
Old (numeric)int.soccerway.com/players/-/45569/45569
New (slug)soccerway.com/player/zver-mateja/p0DFdwlo/p0DFdwlo

A new Wikidata property for the new format has been proposed but not yet approved.

Updates

The register is refreshed periodically from Wikidata, plus monthly reconciliation against the full Wikidata dump to catch drift (deleted entities, lost occupations, missed IDs). Each refresh picks up new entities, updated IDs, and corrections made by the Wikidata community. Custom provider mappings persist across all refreshes. The data/meta.json file records when the current CSVs were generated.

Contributing

Share ID mappings

Have a dataset that maps football player or team IDs across providers? We'd love to include it. Send us a CSV with these columns:

ColumnRequiredDescriptionExample
providerYesProvider namewyscout
external_idYesThe player/team ID on that provider12345
nameYesPlayer or team name (for validation)Cole Palmer
date_of_birthRecommendedISO date (helps us match accurately)2002-05-06
transfermarkt_idRecommendedTransfermarkt ID (best for accurate matching)568177
typeRecommendedplayer, team, or coachplayer
nationalityOptionalCountry (helps disambiguate)England

The more columns you include, the more accurately we can match to existing entities. A Transfermarkt ID or date of birth alone is usually enough.

How to submit:

We validate and match all submissions before adding them. Your IDs go into our verified custom mappings and are served via the API alongside Wikidata data.

Edit Wikidata directly

If a player is missing a Transfermarkt ID or FBref ID, the ideal fix is to add it to their Wikidata page — the next refresh picks it up automatically.

Wikidata requires ~50 manual edits and a 4-day waiting period before bulk edits are possible. If you have a large dataset, send it to us (see above) and we'll handle the Wikidata submission on your behalf.

Code contributions

PRs to the Worker (src/) and documentation are welcome in this repo. CLI PRs belong in withqwerty/reep-cli. Note that the data CSVs are regenerated upstream from Wikidata + verified mappings — don't PR data changes directly.

What this repo doesn't contain

This repo publishes IDs, the API, and the published CSVs — not scraping logic or raw data dumps from providers. Matching and ingestion scripts are maintained in a separate private repo.

License

The data is derived from Wikidata and is available under CC0 1.0.

Contributors

Showing top 1 contributor by commit count.

View all contributors on GitHub →

This article is auto-generated from withqwerty/reep via the GitHub API.Last fetched: 6/22/2026