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.
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.
| File | Records | Description |
|---|---|---|
data/people.csv |
~488K | Players and coaches with provider IDs and bio |
data/teams.csv |
~45K | Clubs with provider IDs and metadata |
data/competitions.csv |
~336 | Leagues, cups, and tournaments with provider IDs |
data/seasons.csv |
~3.8K | Season editions of competitions |
data/names.csv |
varies | Alternate names and aliases |
data/meta.json |
— | Generation timestamp and counts |
| Column | Description | Example |
|---|---|---|
reep_id |
Reep ID (canonical key) | reep_p2804f5db |
key_wikidata |
Wikidata QID (empty if not in Wikidata) | Q99760796 |
type |
player or coach |
player |
name |
Primary English name | Cole Palmer |
full_name |
Birth/legal name | Cole Jermaine Palmer |
date_of_birth |
ISO date | 2002-05-06 |
nationality |
Country | United Kingdom |
position |
Playing position | attacking midfielder |
height_cm |
Height in centimetres | 185 |
key_transfermarkt |
Transfermarkt player ID | 568177 |
key_transfermarkt_manager |
Transfermarkt manager ID (coaches only) | 50100 |
key_fbref |
FBref player ID | dc7f8a28 |
key_soccerway |
Soccerway person ID | 525801 |
key_sofascore |
Sofascore player ID | 982780 |
key_flashscore |
Flashscore player ID | palmer-cole/h8agbDt7 |
key_opta |
Opta player ID | 7cwgrmorsb42qaj5vrhp8fhzp |
key_premier_league |
Premier League player ID | 49293 |
key_11v11 |
11v11 player ID | 265554 |
key_espn |
ESPN FC player ID | — |
key_national_football_teams |
National Football Teams ID | 92970 |
key_worldfootball |
WorldFootball.net ID | cole-palmer |
key_soccerbase |
Soccerbase player ID | 125454 |
key_kicker |
Kicker player ID | cole-palmer |
key_uefa |
UEFA player ID | — |
key_lequipe |
L'Equipe player ID | — |
key_fff_fr |
FFF.fr player ID | — |
key_serie_a |
Lega Serie A player ID | — |
key_besoccer |
BeSoccer player ID | — |
key_footballdatabase_eu |
FootballDatabase.eu person ID | — |
key_eu_football_info |
EU-Football.info player ID | — |
key_hugman |
Barry Hugman's Footballers ID | — |
key_german_fa |
DFB person ID | — |
key_statmuse_pl |
StatMuse PL player ID | — |
key_sofifa |
SoFIFA / EA FC player ID | — |
key_soccerdonna |
Soccerdonna player ID (women's football) | — |
key_dongqiudi |
Dongqiudi player ID | — |
key_understat |
Understat player ID | 1234 |
key_whoscored |
WhoScored player ID | 456789 |
key_fbref_verified |
FBref ID (cross-verified via worldfootballR) | dc7f8a28 |
key_sportmonks |
SportMonks player ID | 12345 |
key_api_football |
API-Football player ID | 1100 |
key_fotmob |
FotMob player ID | 292462 |
key_opta_numeric |
Opta legacy numeric ID (same as FPL code, The Analyst sc- IDs) |
244851 |
key_thesportsdb |
TheSportsDB player ID | 34146086 |
key_skillcorner |
SkillCorner player ID | 23959 |
key_wyscout |
Wyscout player ID | 234966 |
key_impect |
Impect player ID | 52615 |
key_heimspiel |
heim:spiel player ID | 361032 |
key_capology |
Capology player slug | cole-palmer-36271 |
position_detail |
Granular position from Transfermarkt | Attacking Midfield |
| Column | Description | Example |
|---|---|---|
reep_id |
Reep ID (canonical key) | reep_t0871097b |
key_wikidata |
Wikidata QID | Q9616 |
name |
Primary English name | Arsenal F.C. |
country |
Country | United Kingdom |
founded |
Founding date | 1886-10-01 |
stadium |
Home ground | Emirates Stadium |
key_transfermarkt |
Transfermarkt team ID | 11 |
key_fbref |
FBref squad ID | 18bb7c10 |
key_soccerway |
Soccerway team ID | 660 |
key_opta |
Opta team ID | b3sy95iqnw2bv69a0gxunhiot |
key_kicker |
Kicker team ID | — |
key_flashscore |
Flashscore team ID | — |
key_sofascore |
Sofascore team ID | — |
key_soccerbase |
Soccerbase team ID | — |
key_uefa |
UEFA team ID | — |
key_footballdatabase_eu |
FootballDatabase.eu team ID | — |
key_worldfootball |
WorldFootball.net team ID | — |
key_espn |
ESPN team ID | — |
key_playmakerstats |
PlaymakerStats team ID | — |
key_clubelo |
Club Elo team ID | Arsenal |
key_sportmonks |
SportMonks team ID | 123 |
key_api_football |
API-Football team ID | 42 |
key_sofifa |
SoFIFA / EA FC team ID | 1 |
key_fotmob |
FotMob team ID | 9825 |
key_opta_numeric |
Opta legacy numeric team ID | 3 |
key_capology |
Capology team slug | arsenal |
| Column | Description | Example |
|---|---|---|
reep_id |
Reep ID (canonical key) | reep_lb3d230cb |
key_wikidata |
Wikidata QID | Q9448 |
name |
Competition name | Premier League |
country |
Country | United Kingdom |
key_transfermarkt |
Transfermarkt competition ID | GB1 |
key_fbref |
FBref competition ID | 9 |
key_opta |
Opta competition ID (UUID) | 2kwbbcootiqqgmrzs6o5inle5 |
key_opta_numeric |
Opta legacy numeric competition ID | 8 |
key_optacore |
Opta core numeric competition ID | 1 |
| Column | Description | Example |
|---|---|---|
reep_id |
Reep ID (canonical key) | reep_sa7f63ba6 |
key_wikidata |
Wikidata QID | Q124371422 |
name |
Season name | 2024–25 Premier League |
competition_reep_id |
Reep ID of parent competition | reep_lb3d230cb |
| Column | Description | Example |
|---|---|---|
key_wikidata |
Wikidata QID | Q11893 |
name |
Primary name | Cristiano Ronaldo |
alias |
Alternate name | Cristiano Ronaldo dos Santos Aveiro |
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.
| Provider | Source | Notes |
|---|---|---|
| Transfermarkt | Wikidata | Highest coverage across all entities |
| FBref | Wikidata | Strong for recent players |
| Soccerway | Wikidata | Broad international coverage |
| Sofascore | Wikidata | Modern players well covered |
| Premier League | Wikidata | PL players only |
| Opta | Verified | Alphanumeric IDs from Stats Perform's Opta F1 database (~50K players) |
| Opta numeric | Verified | Legacy Opta numeric IDs (same as FPL code, The Analyst sc- IDs) |
| Impect | Verified | DOB + name matching via Impect export |
| Wyscout | Verified | Via Impect ID mappings |
| SkillCorner | Verified | Via Impect ID mappings |
| heim:spiel | Verified | Via Impect ID mappings |
| TheSportsDB | Verified | Direct Wikidata link + DOB/name matching |
| API-Football | Verified | Via TheSportsDB + direct matching |
| ESPN | Verified | Via TheSportsDB mappings |
| FotMob | Verified | DOB + name matching |
| FBref verified | Verified | Cross-verified via worldfootballR |
| Understat | Verified | Cross-reference matching |
| WhoScored | Verified | Cross-reference matching |
| SportMonks | Verified | Cross-reference matching |
| Club Elo | Verified | Manual 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.
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"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)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-- 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';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.
| Endpoint | Description | Example |
|---|---|---|
GET /search |
Search by name (prefix matching) | /search?name=Cole Palmer&type=player |
GET /resolve |
Translate provider ID | /resolve?provider=transfermarkt&id=568177 |
GET /lookup |
Look up by Reep ID or Wikidata QID | /lookup?id=reep_p2804f5db |
GET /stats |
Database 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.
Every entity in the register has a self-minted Reep ID as its canonical identifier. The format is reep_<type_prefix><8hex>:
| Prefix | Entity type | Example |
|---|---|---|
reep_p |
Player | reep_p2804f5db (Cole Palmer) |
reep_t |
Team | reep_t0871097b (Arsenal F.C.) |
reep_c |
Coach | reep_c9103de59 (A. H. Albut) |
reep_l |
Competition | reep_lb3d230cb (Premier League) |
reep_s |
Season | reep_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.
A Python CLI for the register lives in its own repo: withqwerty/reep-cli.
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"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.
| Property | Provider |
|---|---|
| P2446 | Transfermarkt player ID |
| P2447 | Transfermarkt manager ID |
| P7223 | Transfermarkt team ID |
| P5750 | FBref player ID |
| P8642 | FBref squad ID |
| P2369 | Soccerway person ID |
| P6131 | Soccerway team ID |
| P12302 | Sofascore player ID |
| P8259 | Flashscore player ID |
| P12539 | Premier League player ID |
| P12551 | 11v11 player ID |
| P3681 | ESPN FC player ID |
| P2574 | National Football Teams ID |
| P2020 | WorldFootball.net ID |
| P2193 | Soccerbase player ID |
| P2276 | UEFA player ID |
| P7361 | UEFA team ID |
| P3665 | L'Equipe player ID |
| P9264 | FFF.fr player ID |
| P13064 | Lega Serie A player ID |
| P12577 | BeSoccer player ID |
| P3537 | FootballDatabase.eu person ID |
| P7351 | FootballDatabase.eu team ID |
| P3726 | EU-Football.info player ID |
| P12606 | Barry Hugman's Footballers ID |
| P4023 | German FA person ID |
| P12567 | StatMuse PL player ID |
| P12312 | Kicker team ID |
| P7876 | Flashscore team ID |
| P13897 | Sofascore team ID |
| P7454 | Soccerbase team ID |
| P7287 | WorldFootball.net team ID |
| P1469 | SoFIFA / EA FC player ID |
| P4381 | Soccerdonna player ID (women's football) |
| P8134 | Soccerdonna coach ID |
| P11379 | Dongqiudi player ID |
| P7280 | PlaymakerStats team ID |
| P12758 | Transfermarkt competition ID |
| P13664 | FBref competition ID |
| P8735 | Opta competition ID |
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.244851for Cole Palmer). Same as FPLcodefield, The Analystsc-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:
| Type | WorldFootball.net URL | heim:spiel ID |
|---|---|---|
| Player | /pe426937 |
426937 |
| Team | /te1672 |
1672 |
| Competition | /co91 |
91 |
| Match | /ma10988177 |
10988177 |
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:
| Format | URL | ID |
|---|---|---|
| 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.
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.
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:
| Column | Required | Description | Example |
|---|---|---|---|
provider |
Yes | Provider name | wyscout |
external_id |
Yes | The player/team ID on that provider | 12345 |
name |
Yes | Player or team name (for validation) | Cole Palmer |
date_of_birth |
Recommended | ISO date (helps us match accurately) | 2002-05-06 |
transfermarkt_id |
Recommended | Transfermarkt ID (best for accurate matching) | 568177 |
type |
Recommended | player, team, or coach |
player |
nationality |
Optional | Country (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:
- Open an issue with your CSV attached or linked
- Email getintouch@withqwerty.com if you prefer to contribute anonymously
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.
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.
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.
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.
The data is derived from Wikidata and is available under CC0 1.0.