{"id":48337487,"url":"https://github.com/withqwerty/reep","last_synced_at":"2026-04-05T03:04:28.367Z","repository":{"id":347622764,"uuid":"1194636826","full_name":"withqwerty/reep","owner":"withqwerty","description":"The football entity register. Maps player, team, and coach identities across Transfermarkt, FBref, UEFA, Sofascore, and 25+ data providers.","archived":false,"fork":false,"pushed_at":"2026-04-04T22:50:22.000Z","size":63179,"stargazers_count":115,"open_issues_count":4,"forks_count":6,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-05T00:40:17.213Z","etag":null,"topics":["crosswalk","fbref","football","football-analytics","football-data","hudl","identifiers","opta","soccer","soccer-analytics","soccer-data","sports-analytics","statsbomb","wikidata","wyscout"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"cc0-1.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/withqwerty.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-28T16:12:44.000Z","updated_at":"2026-04-05T00:24:51.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/withqwerty/reep","commit_stats":null,"previous_names":["withqwerty/reep"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/withqwerty/reep","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/withqwerty%2Freep","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/withqwerty%2Freep/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/withqwerty%2Freep/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/withqwerty%2Freep/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/withqwerty","download_url":"https://codeload.github.com/withqwerty/reep/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/withqwerty%2Freep/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31422901,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-05T02:22:46.605Z","status":"ssl_error","status_checked_at":"2026-04-05T02:22:33.263Z","response_time":75,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["crosswalk","fbref","football","football-analytics","football-data","hudl","identifiers","opta","soccer","soccer-analytics","soccer-data","sports-analytics","statsbomb","wikidata","wyscout"],"created_at":"2026-04-05T03:04:24.659Z","updated_at":"2026-04-05T03:04:28.362Z","avatar_url":"https://github.com/withqwerty.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Reep\n\n[![CI](https://github.com/withqwerty/reep/actions/workflows/ci.yml/badge.svg)](https://github.com/withqwerty/reep/actions/workflows/ci.yml)\n\n![Charles Reep's match notations from 1953](https://ichef.bbci.co.uk/ace/standard/624/cpsprodpb/FC93/production/_124995646_bbc1953notations.jpg)\n\nThe football entity register. Maps player, team, coach, competition, and season identities across Transfermarkt, FBref, UEFA, Sofascore, and 30+ data providers.\n\nNamed after [Charles Reep](https://en.wikipedia.org/wiki/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.\n\n## What is this?\n\nA canonical identity file for football. Every person, club, competition, and season gets a stable Reep ID (`reep_\u003ctype_prefix\u003e\u003c8hex\u003e`), 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.\n\nThe 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).\n\nPeople 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.\n\nThink of it as the football equivalent of the [Chadwick Baseball Bureau Register](https://github.com/chadwickbureau/register).\n\n## Data\n\n| File | Records | Description |\n|------|---------|-------------|\n| [`data/people.csv`](data/people.csv) | ~488K | Players and coaches with provider IDs and bio |\n| [`data/teams.csv`](data/teams.csv) | ~45K | Clubs with provider IDs and metadata |\n| [`data/competitions.csv`](data/competitions.csv) | ~336 | Leagues, cups, and tournaments with provider IDs |\n| [`data/seasons.csv`](data/seasons.csv) | ~3.8K | Season editions of competitions |\n| [`data/names.csv`](data/names.csv) | varies | Alternate names and aliases |\n| [`data/meta.json`](data/meta.json) | — | Generation timestamp and counts |\n\n### People schema\n\n| Column | Description | Example |\n|--------|-------------|---------|\n| `reep_id` | Reep ID (canonical key) | `reep_p2804f5db` |\n| `key_wikidata` | Wikidata QID (empty if not in Wikidata) | `Q99760796` |\n| `type` | `player` or `coach` | `player` |\n| `name` | Primary English name | `Cole Palmer` |\n| `full_name` | Birth/legal name | `Cole Jermaine Palmer` |\n| `date_of_birth` | ISO date | `2002-05-06` |\n| `nationality` | Country | `United Kingdom` |\n| `position` | Playing position | `attacking midfielder` |\n| `height_cm` | Height in centimetres | `185` |\n| `key_transfermarkt` | [Transfermarkt](https://www.transfermarkt.com/) player ID | `568177` |\n| `key_transfermarkt_manager` | Transfermarkt manager ID (coaches only) | `50100` |\n| `key_fbref` | [FBref](https://fbref.com/) player ID | `dc7f8a28` |\n| `key_soccerway` | [Soccerway](https://www.scorebar.com/) person ID | `525801` |\n| `key_sofascore` | [Sofascore](https://www.sofascore.com/) player ID | `982780` |\n| `key_flashscore` | [Flashscore](https://www.flashscore.com/) player ID | `palmer-cole/h8agbDt7` |\n| `key_opta` | [Opta](https://www.statsperform.com/) player ID | `7cwgrmorsb42qaj5vrhp8fhzp` |\n| `key_premier_league` | [Premier League](https://www.premierleague.com/) player ID | `49293` |\n| `key_11v11` | [11v11](https://www.11v11.com/) player ID | `265554` |\n| `key_espn` | [ESPN FC](https://www.espn.com/football/) player ID | — |\n| `key_national_football_teams` | [National Football Teams](https://www.national-football-teams.com/) ID | `92970` |\n| `key_worldfootball` | [WorldFootball.net](https://www.worldfootball.net/) ID | `cole-palmer` |\n| `key_soccerbase` | [Soccerbase](https://www.soccerbase.com/) player ID | `125454` |\n| `key_kicker` | [Kicker](https://www.kicker.de/) player ID | `cole-palmer` |\n| `key_uefa` | [UEFA](https://www.uefa.com/) player ID | — |\n| `key_lequipe` | [L'Equipe](https://www.lequipe.fr/) player ID | — |\n| `key_fff_fr` | [FFF.fr](https://www.fff.fr/) player ID | — |\n| `key_serie_a` | [Lega Serie A](https://www.legaseriea.it/) player ID | — |\n| `key_besoccer` | [BeSoccer](https://www.besoccer.com/) player ID | — |\n| `key_footballdatabase_eu` | [FootballDatabase.eu](https://www.footballdatabase.eu/) person ID | — |\n| `key_eu_football_info` | [EU-Football.info](https://eu-football.info/) player ID | — |\n| `key_hugman` | [Barry Hugman's Footballers](https://www.barryhugmansfootballers.com/) ID | — |\n| `key_german_fa` | [DFB](https://www.dfb.de/) person ID | — |\n| `key_statmuse_pl` | [StatMuse](https://www.statmuse.com/) PL player ID | — |\n| `key_sofifa` | [SoFIFA](https://sofifa.com/) / EA FC player ID | — |\n| `key_soccerdonna` | [Soccerdonna](https://www.soccerdonna.de/) player ID (women's football) | — |\n| `key_dongqiudi` | [Dongqiudi](https://www.dongqiudi.com/) player ID | — |\n| `key_understat` | [Understat](https://understat.com/) player ID | `1234` |\n| `key_whoscored` | [WhoScored](https://www.whoscored.com/) player ID | `456789` |\n| `key_fbref_verified` | FBref ID (cross-verified via worldfootballR) | `dc7f8a28` |\n| `key_sportmonks` | [SportMonks](https://www.sportmonks.com/) player ID | `12345` |\n| `key_api_football` | [API-Football](https://www.api-football.com/) player ID | `1100` |\n| `key_fotmob` | [FotMob](https://www.fotmob.com/) player ID | `292462` |\n| `key_fpl_code` | Opta Stats Centre / FPL player code (same as [The Analyst](https://theanalyst.com/) `sc-` IDs) | `244851` |\n| `key_thesportsdb` | [TheSportsDB](https://www.thesportsdb.com/) player ID | `34146086` |\n| `key_skillcorner` | [SkillCorner](https://www.skillcorner.com/) player ID | `23959` |\n| `key_wyscout` | [Wyscout](https://wyscout.com/) player ID | `234966` |\n| `key_impect` | [Impect](https://www.impect.com/) player ID | `52615` |\n| `key_heimspiel` | [heim:spiel](https://heimspiel.de/) player ID | `361032` |\n\n### Teams schema\n\n| Column | Description | Example |\n|--------|-------------|---------|\n| `reep_id` | Reep ID (canonical key) | `reep_t0871097b` |\n| `key_wikidata` | Wikidata QID | `Q9616` |\n| `name` | Primary English name | `Arsenal F.C.` |\n| `country` | Country | `United Kingdom` |\n| `founded` | Founding date | `1886-10-01` |\n| `stadium` | Home ground | `Emirates Stadium` |\n| `key_transfermarkt` | Transfermarkt team ID | `11` |\n| `key_fbref` | FBref squad ID | `18bb7c10` |\n| `key_soccerway` | Soccerway team ID | `660` |\n| `key_opta` | Opta team ID | `b3sy95iqnw2bv69a0gxunhiot` |\n| `key_kicker` | Kicker team ID | — |\n| `key_flashscore` | Flashscore team ID | — |\n| `key_sofascore` | Sofascore team ID | — |\n| `key_soccerbase` | Soccerbase team ID | — |\n| `key_uefa` | UEFA team ID | — |\n| `key_footballdatabase_eu` | FootballDatabase.eu team ID | — |\n| `key_worldfootball` | WorldFootball.net team ID | — |\n| `key_espn` | ESPN team ID | — |\n| `key_playmakerstats` | [PlaymakerStats](https://www.playmakerstats.com/) team ID | — |\n| `key_clubelo` | [Club Elo](http://clubelo.com/) team ID | `Arsenal` |\n| `key_sportmonks` | SportMonks team ID | `123` |\n| `key_api_football` | API-Football team ID | `42` |\n| `key_sofifa` | SoFIFA / EA FC team ID | `1` |\n| `key_fotmob` | FotMob team ID | `9825` |\n\n### Competitions schema\n\n| Column | Description | Example |\n|--------|-------------|---------|\n| `reep_id` | Reep ID (canonical key) | `reep_lb3d230cb` |\n| `key_wikidata` | Wikidata QID | `Q9448` |\n| `name` | Competition name | `Premier League` |\n| `country` | Country | `United Kingdom` |\n| `key_transfermarkt` | Transfermarkt competition ID | `GB1` |\n| `key_fbref` | FBref competition ID | `9` |\n| `key_opta` | Opta competition ID | `8` |\n\n### Seasons schema\n\n| Column | Description | Example |\n|--------|-------------|---------|\n| `reep_id` | Reep ID (canonical key) | `reep_sa7f63ba6` |\n| `key_wikidata` | Wikidata QID | `Q124371422` |\n| `name` | Season name | `2024–25 Premier League` |\n| `competition_reep_id` | Reep ID of parent competition | `reep_lb3d230cb` |\n\n### Names schema\n\n| Column | Description | Example |\n|--------|-------------|---------|\n| `key_wikidata` | Wikidata QID | `Q11893` |\n| `name` | Primary name | `Cristiano Ronaldo` |\n| `alias` | Alternate name | `Cristiano Ronaldo dos Santos Aveiro` |\n\n## Coverage\n\nNot every entity has every ID. Coverage depends on what the Wikidata community has mapped plus custom verified mappings. To get live coverage counts:\n\n```bash\n# Wikidata-sourced IDs (provider_ids)\npnpm exec wrangler d1 execute football-entities --remote \\\n  --command \"SELECT provider, COUNT(*) as cnt FROM provider_ids GROUP BY provider ORDER BY cnt DESC\"\n\n# Custom verified IDs\npnpm exec wrangler d1 execute football-entities --remote \\\n  --command \"SELECT provider, COUNT(*) as cnt FROM custom_ids GROUP BY provider ORDER BY cnt DESC\"\n```\n\n| Provider | Source | Notes |\n|----------|--------|-------|\n| Transfermarkt | Wikidata | Highest coverage across all entities |\n| FBref | Wikidata | Strong for recent players |\n| Soccerway | Wikidata | Broad international coverage |\n| Sofascore | Wikidata | Modern players well covered |\n| Opta | Custom | Alphanumeric IDs from Stats Perform's Opta F1 database (~50K players) |\n| Impect | Custom | DOB + name matching via Impect export |\n| Wyscout | Custom | Via Impect ID mappings |\n| SkillCorner | Custom | Via Impect ID mappings |\n| heim:spiel | Custom | Via Impect ID mappings |\n| TheSportsDB | Custom | Direct QID + DOB/name matching |\n| API-Football | Custom | Via TheSportsDB + direct matching |\n| ESPN | Custom | Via TheSportsDB mappings |\n| FotMob | Custom | DOB + name matching |\n| FBref verified | Custom | Cross-verified via worldfootballR |\n| FPL code | Custom | FPL internal player codes |\n| Understat | Custom | Verified cross-reference matching |\n| WhoScored | Custom | Verified cross-reference matching |\n| SportMonks | Custom | Verified cross-reference matching |\n| Club Elo | Custom | Manual team mapping |\n| Premier League | Wikidata | PL players only |\n\nIDs sourced from Wikidata are community-maintained. Custom IDs are verified independently — see the [Reep API](#api) for methodology details.\n\n## Usage\n\n### Python\n\n```python\nimport csv\n\n# Load people into a dict keyed by Reep ID\npeople = {}\nwith open(\"data/people.csv\") as f:\n    for row in csv.DictReader(f):\n        people[row[\"reep_id\"]] = row\n\n# Look up by Transfermarkt ID\ntm_index = {row[\"key_transfermarkt\"]: row for row in people.values() if row[\"key_transfermarkt\"]}\npalmer = tm_index[\"568177\"]\nprint(palmer[\"reep_id\"])    # \"reep_p2804f5db\"\nprint(palmer[\"key_fbref\"])  # \"dc7f8a28\"\n```\n\n### R\n\n```r\nlibrary(readr)\npeople \u003c- read_csv(\"data/people.csv\")\n\n# All Premier League-registered players\npl_players \u003c- people |\u003e filter(key_premier_league != \"\")\n\n# Cross-reference: Transfermarkt -\u003e FBref\npeople |\u003e\n  filter(key_transfermarkt == \"568177\") |\u003e\n  select(reep_id, name, key_fbref, key_sofascore)\n```\n\n### SQL (load into SQLite)\n\n```bash\nsqlite3 reep.db \u003c\u003cEOF\n.mode csv\n.import data/people.csv people\n.import data/teams.csv teams\n.import data/competitions.csv competitions\n.import data/seasons.csv seasons\n.import data/names.csv names\nEOF\n```\n\n```sql\n-- Find all IDs for a player\nSELECT * FROM people WHERE name LIKE '%Salah%';\n\n-- Reverse lookup: FBref ID -\u003e everything\nSELECT * FROM people WHERE key_fbref = 'e342ad68';\n\n-- Lookup by Reep ID\nSELECT * FROM people WHERE reep_id = 'reep_p2804f5db';\n```\n\n## API\n\nThe Reep API provides the same data as the CSVs via a convenient REST interface. All providers (Wikidata + custom verified) are available to all plans.\n\n**Get your API key on [RapidAPI](https://rapidapi.com/withqwerty-withqwerty-default/api/the-reep-register).**\n\n| Endpoint | Description | Example |\n|----------|-------------|---------|\n| `GET /search` | Search by name (prefix matching) | `/search?name=Cole Palmer\u0026type=player` |\n| `GET /resolve` | Translate provider ID | `/resolve?provider=transfermarkt\u0026id=568177` |\n| `GET /lookup` | Look up by Reep ID or Wikidata QID | `/lookup?id=reep_p2804f5db` |\n| `GET /stats` | Database statistics | `/stats` |\n\nThe `/lookup` endpoint auto-detects the ID type: Reep IDs start with `reep_`, Wikidata QIDs start with `Q`. The legacy `?qid=` parameter is still supported.\n\nAll 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.\n\n## Reep IDs\n\nEvery entity in the register has a self-minted Reep ID as its canonical identifier. The format is `reep_\u003ctype_prefix\u003e\u003c8hex\u003e`:\n\n| Prefix | Entity type | Example |\n|--------|-------------|---------|\n| `reep_p` | Player | `reep_p2804f5db` (Cole Palmer) |\n| `reep_t` | Team | `reep_t0871097b` (Arsenal F.C.) |\n| `reep_c` | Coach | `reep_c9103de59` (A. H. Albut) |\n| `reep_l` | Competition | `reep_lb3d230cb` (Premier League) |\n| `reep_s` | Season | `reep_sa7f63ba6` (2024–25 Premier League) |\n\nReep 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.\n\nThis design follows the [Chadwick Baseball Bureau Register](https://github.com/chadwickbureau/register) model: self-minted UUIDs as primary keys, with all provider IDs (including Wikidata) as cross-references.\n\n## CLI\n\n```bash\n# Search by name\npython cli/reep.py search \"Cole Palmer\"\n\n# Resolve: Transfermarkt -\u003e all IDs\npython cli/reep.py resolve transfermarkt 568177\n\n# Translate: just output the target ID (pipe-friendly)\npython cli/reep.py translate transfermarkt 568177 fbref\n# dc7f8a28\n\n# Download CSVs for offline use\npython cli/reep.py download\n\n# Search offline\npython cli/reep.py local \"Salah\"\n```\n\n## Source\n\nMost data is extracted from [Wikidata](https://www.wikidata.org/) 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.\n\nEntities not in Wikidata (e.g. lower-league players) are sourced from authoritative provider databases like Opta's F1 player database.\n\n### Wikidata properties used\n\n| Property | Provider |\n|----------|----------|\n| [P2446](https://www.wikidata.org/wiki/Property:P2446) | Transfermarkt player ID |\n| [P2447](https://www.wikidata.org/wiki/Property:P2447) | Transfermarkt manager ID |\n| [P7223](https://www.wikidata.org/wiki/Property:P7223) | Transfermarkt team ID |\n| [P5750](https://www.wikidata.org/wiki/Property:P5750) | FBref player ID |\n| [P8642](https://www.wikidata.org/wiki/Property:P8642) | FBref squad ID |\n| [P2369](https://www.wikidata.org/wiki/Property:P2369) | Soccerway person ID |\n| [P6131](https://www.wikidata.org/wiki/Property:P6131) | Soccerway team ID |\n| [P12302](https://www.wikidata.org/wiki/Property:P12302) | Sofascore player ID |\n| [P8259](https://www.wikidata.org/wiki/Property:P8259) | Flashscore player ID |\n| ~~[P8736](https://www.wikidata.org/wiki/Property:P8736)~~ | ~~Opta player ID~~ (removed — outdated numeric IDs, see note below) |\n| ~~[P8737](https://www.wikidata.org/wiki/Property:P8737)~~ | ~~Opta team ID~~ (removed — outdated numeric IDs, see note below) |\n| [P12539](https://www.wikidata.org/wiki/Property:P12539) | Premier League player ID |\n| [P12551](https://www.wikidata.org/wiki/Property:P12551) | 11v11 player ID |\n| [P3681](https://www.wikidata.org/wiki/Property:P3681) | ESPN FC player ID |\n| [P2574](https://www.wikidata.org/wiki/Property:P2574) | National Football Teams ID |\n| [P2020](https://www.wikidata.org/wiki/Property:P2020) | WorldFootball.net ID |\n| [P2193](https://www.wikidata.org/wiki/Property:P2193) | Soccerbase player ID |\n| [P2276](https://www.wikidata.org/wiki/Property:P2276) | UEFA player ID |\n| [P7361](https://www.wikidata.org/wiki/Property:P7361) | UEFA team ID |\n| [P3665](https://www.wikidata.org/wiki/Property:P3665) | L'Equipe player ID |\n| [P9264](https://www.wikidata.org/wiki/Property:P9264) | FFF.fr player ID |\n| [P13064](https://www.wikidata.org/wiki/Property:P13064) | Lega Serie A player ID |\n| [P12577](https://www.wikidata.org/wiki/Property:P12577) | BeSoccer player ID |\n| [P3537](https://www.wikidata.org/wiki/Property:P3537) | FootballDatabase.eu person ID |\n| [P7351](https://www.wikidata.org/wiki/Property:P7351) | FootballDatabase.eu team ID |\n| [P3726](https://www.wikidata.org/wiki/Property:P3726) | EU-Football.info player ID |\n| [P12606](https://www.wikidata.org/wiki/Property:P12606) | Barry Hugman's Footballers ID |\n| [P4023](https://www.wikidata.org/wiki/Property:P4023) | German FA person ID |\n| [P12567](https://www.wikidata.org/wiki/Property:P12567) | StatMuse PL player ID |\n| [P12312](https://www.wikidata.org/wiki/Property:P12312) | Kicker team ID |\n| [P7876](https://www.wikidata.org/wiki/Property:P7876) | Flashscore team ID |\n| [P13897](https://www.wikidata.org/wiki/Property:P13897) | Sofascore team ID |\n| [P7454](https://www.wikidata.org/wiki/Property:P7454) | Soccerbase team ID |\n| [P7287](https://www.wikidata.org/wiki/Property:P7287) | WorldFootball.net team ID |\n| [P1469](https://www.wikidata.org/wiki/Property:P1469) | SoFIFA / EA FC player ID |\n| [P4381](https://www.wikidata.org/wiki/Property:P4381) | Soccerdonna player ID (women's football) |\n| [P8134](https://www.wikidata.org/wiki/Property:P8134) | Soccerdonna coach ID |\n| [P11379](https://www.wikidata.org/wiki/Property:P11379) | Dongqiudi player ID |\n| [P7280](https://www.wikidata.org/wiki/Property:P7280) | PlaymakerStats team ID |\n| [P12758](https://www.wikidata.org/wiki/Property:P12758) | Transfermarkt competition ID |\n| [P13664](https://www.wikidata.org/wiki/Property:P13664) | FBref competition ID |\n| [P8735](https://www.wikidata.org/wiki/Property:P8735) | Opta competition ID |\n\n### Provider notes\n\n**Opta / Stats Perform** — Wikidata properties P8736/P8737 contain outdated numeric Opta IDs. Reep uses alphanumeric Opta IDs (e.g. `7cwgrmorsb42qaj5vrhp8fhzp`) sourced from Stats Perform's Opta F1 player database via proprietary matching. These are the IDs used in current Opta/Stats Perform data products. Separately, The Analyst (theanalyst.com, Opta's public stats site) uses numeric `sc-` codes in player URLs (e.g. `theanalyst.com/football/player/sc-244851/cole-palmer`) — these match the FPL player codes (`fpl_code`) in Reep, since the Premier League's FPL system also uses Opta data.\n\n**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:\n\n| Type | WorldFootball.net URL | heim:spiel ID |\n|------|----------------------|---------------|\n| Player | `/pe426937` | `426937` |\n| Team | `/te1672` | `1672` |\n| Competition | `/co91` | `91` |\n| Match | `/ma10988177` | `10988177` |\n\n**Soccerway / Flashscore** — Both owned by [Livesport](https://www.livesport.eu/) (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:\n\n| Format | URL | ID |\n|--------|-----|----|\n| Old (numeric) | `int.soccerway.com/players/-/45569/` | `45569` |\n| New (slug) | `soccerway.com/player/zver-mateja/p0DFdwlo/` | `p0DFdwlo` |\n\nA new Wikidata property for the new format has been proposed but not yet approved.\n\n## Updates\n\nThe register is refreshed weekly from Wikidata every Monday. Incremental updates fetch only changed entities (~1-2K/day). Monthly dump reconciliation against the full Wikidata dump catches drift (deleted entities, lost occupations, missed IDs). Each update picks up new entities, updated IDs, and corrections made by the Wikidata community. Custom provider mappings persist across all updates.\n\n## Contributing\n\n### Share ID mappings\n\nHave a dataset that maps football player or team IDs across providers? We'd love to include it. Send us a CSV with these columns:\n\n| Column | Required | Description | Example |\n|--------|----------|-------------|---------|\n| `provider` | Yes | Provider name | `wyscout` |\n| `external_id` | Yes | The player/team ID on that provider | `12345` |\n| `name` | Yes | Player or team name (for validation) | `Cole Palmer` |\n| `date_of_birth` | Recommended | ISO date (helps us match accurately) | `2002-05-06` |\n| `transfermarkt_id` | Recommended | Transfermarkt ID (best for accurate matching) | `568177` |\n| `type` | Recommended | `player`, `team`, or `coach` | `player` |\n| `nationality` | Optional | Country (helps disambiguate) | `England` |\n\nThe more columns you include, the more accurately we can match to existing entities. A Transfermarkt ID or date of birth alone is usually enough.\n\n**How to submit:**\n- [Open an issue](https://github.com/withqwerty/reep/issues/new) with your CSV attached or linked\n- Email getintouch@withqwerty.com if you prefer to contribute anonymously\n\nWe 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.\n\n### Edit Wikidata directly\n\nIf a player is missing a Transfermarkt ID or FBref ID, the ideal fix is to add it to their [Wikidata](https://www.wikidata.org/) page — the next weekly build picks it up automatically.\n\n- [How to edit Wikidata](https://www.wikidata.org/wiki/Wikidata:Introduction)\n- [Add an external identifier](https://www.wikidata.org/wiki/Help:Statements#Adding_statements)\n\nWikidata 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.\n\n### Code contributions\n\nPRs to the API, CLI, scripts, and documentation are welcome. Note that the data CSVs are regenerated weekly from Wikidata — don't PR data changes directly.\n\n### What this repo doesn't contain\n\nThis repo publishes IDs and tools, not scraping logic or raw data dumps from providers. Matching and ingestion scripts are maintained separately.\n\n## License\n\nThe data is derived from [Wikidata](https://www.wikidata.org/) and is available under [CC0 1.0](https://creativecommons.org/publicdomain/zero/1.0/).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwithqwerty%2Freep","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwithqwerty%2Freep","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwithqwerty%2Freep/lists"}