games <- readr::read_csv(
"https://bcdanl.github.io/data/chesscom_games.csv.gz"
)Elite Online Chess
Chess opening explorer
Compare opening outcomes across years and time controls.
Loading the explorer…
The chess files describe blitz and bullet games played on Chess.com by selected elite players and their opponents. Each download combines the earlier teaching data and the current refresh in a common schema. Games and account-profile snapshots remain separate tables because their observations have different meanings.
Data
On-page tables preview a sample of rows. Download the files to analyze the complete datasets.
The combined game file contains 1,108,577 game records from December 8, 2009 through October 5, 2026. It brings together the 776,342 earlier teaching records and 338,327 current games, removing 6,092 unequivocal overlapping records. Usernames are lowercase, and the verified username change for Cristobal Henriquez Villagra is standardized to kurufzugun.
The earlier archive uses 60- and 180-second controls and an undocumented account selection. The current portion was refreshed from the Chess.com Published-Data API on October 6, 2026: rated standard chess in all bullet and blitz controls for the 71 original profile entries, from January 1, 2024 onward. It is a selected account sample, rather than a census of every account that has reached 3100. One requested January 2024 archive for Daniel Naroditsky was unavailable. Some accounts have no recent games.
read_csv() downloads and decompresses the .csv.gz file automatically. No ZIP extraction is needed.
players <- readr::read_csv(
"https://bcdanl.github.io/data/chesscom_profiles.csv"
)Game variables
| Variable | Meaning |
|---|---|
Record_ID |
Unique row identifier: Chess.com game ID for current games; stable legacy record number when the original export lacks a game ID |
Date, Year, Month, Day |
UTC date when the game was played |
White, Black |
Chess.com usernames |
Result |
Win, loss, or draw from White’s perspective |
WhiteElo, BlackElo |
Player ratings at game time |
ECO, ECO_name, ECO_moves |
Opening code, label, and reference opening moves when available |
Termination |
How the game ended |
TimeControl |
Base seconds, optionally followed by + and increment seconds per move |
TimeClass |
Bullet or blitz classification |
Game_URL, End_Time |
Verified public game link and Unix end timestamp; unavailable in unmatched earlier records |
ECO_URL |
Public link to the game’s opening classification |
Snapshot_Date |
Current data-refresh date; blank when the original collection date is unknown |
In_Original_Archive, In_Recent_Archive |
Whether the record appears in each source; both are true for unequivocal overlap matches |
Source_Archive |
Original teaching, recent API, or both sources |
Identity_Status |
Whether identity is verified by game URL, uniquely matched across sources, unknown in the original export, or ambiguous |
Historical_Signature_Count, Recent_Signature_Count |
Source counts for the same date, players, ratings, result, opening code, termination, and time control |
Opening names and reference moves use the historical teaching ECO lookup when available. Reference opening moves do not describe the full move sequence of each game.
Player variables
The combined profile file has 142 rows: two snapshots for each of 71 account entries. username is the standardized account key; original_username preserves the original profile-table key. snapshot_label distinguishes original_teaching_undated and 2026-10-06_api. The earlier snapshot_date is blank because its exact collection date was not recorded. The API returned current profiles for 70 entries; unavailable fields are identified by collection_status.
Common columns include name, title, followers, is_streamer, status, and date_joined. Historical country names use country_name; current API country codes use country_code. Current Chess.com ratings use bullet_rating, blitz_rating, and rapid_rating, with their corresponding best rating and rating date.
Earlier FIDE fields have explicit names such as fide_classical_rating, fide_rapid_rank, and fide_blitz_rating. fide_rating_api_reported is the current account API’s FIDE field. FIDE and Chess.com ratings belong to different systems; they are separate variables, and unavailable snapshot values are blank.
Combining records safely
The original game export has no game URL or timestamp. A matching date, players, ratings, result, opening, termination, and control can describe multiple games: even the current archive contains distinct game URLs with identical values in those columns. Consequently, an original record is removed as overlap only when that signature occurs exactly once in each archive. 21,820 ambiguous earlier rows remain in the combined CSV with Identity_Status = "ambiguous_legacy_signature"; they may be duplicate appearances or distinct games. The total is a count of records, not a guaranteed count of unique games.
For comparisons across years, choose consistent accounts and controls, inspect source coverage, and decide how to handle ambiguous records. To use one player snapshot in a join, filter snapshot_label first; joining both snapshots would duplicate game rows.
The original game archive and original profile file remain available for auditing. The combined files are the main project downloads.
Possible story directions
- Does the first-move advantage change with rating difference or time control?
- Which openings appear most often, and how do their outcomes differ?
- How have game volume and player ratings changed over time?
- Are particular termination types associated with faster time controls?
- How do audience measures such as followers vary across player titles or streamer status?
A useful first pass
Select one profile snapshot before joining on username. One person may have several accounts, and opponents may fall outside the profile sample. Define clearly whether one observation is a game record, a verified game, a player-game appearance, an account, or a person; that choice changes every count and chart.
