Developer tools
Chess.com Player Scraper — Profile & Ratings
One combined dataset row per Chess.com username — profile, every game-type rating, and an opt-in month of recent games — pulled from Chess.com's Published-Data API without hand-stitching three separate endpoint calls yourself.
Free Apify credit covers a first run. No credit card to try.
What this Actor scrapes
Chess.com's own Published-Data API splits one player across three or four separate endpoints — profile, per-game-type stats, and (if you want them) a whole month of games. This Actor calls all of them for you and hands back one row per username: profile fields, every rating record the player has (blitz, bullet, rapid, daily, tactics, puzzle rush, FIDE), and an optional recent-games slice, combined and normalised into one clean object.
What we handle for you
- 🛡️ We rotate real-browser fingerprints on every request so the target sees a browser, not a script.
- 🔁 We retry with exponential backoff on rate limits and server errors, honoring
Retry-After. - 🌐 We route requests through Apify Proxy and give you a one-click escalation to residential if you ever see blocks.
- 🧱 One bad or renamed username never crashes the run — it's skipped and named in the run summary.
- 🧊 Every row is Pydantic-validated: stable field names, ISO-8601 timestamps, no half-parsed JSON.
- 💰 You pay only for usernames actually processed. No data → no charge beyond the small warm-up fee.
Use cases
- Chess streamers and content creators tracking their own rating history and follower counts.
- Coaches monitoring a roster of students' rating progress across game types.
- Chess analytics and stats sites building leaderboards or rating-trend charts.
- Tournament organisers vetting player ratings and activity before seeding a bracket.
Input
Paste this into the Apify Console, or send it as the run input over the API. Proxy settings are on by default; you rarely need to touch them.
| Field | Type | Required | What it does |
|---|---|---|---|
usernames | array | yes | Chess.com usernames to look up (1-25 chars each, case-insensitive, deduplicated). One dataset row per username. |
includeGames | boolean | no | When on, also fetch the player's most recent month of games (heaviest, most egress-expensive call). Off by default to keep a plain profile+stats run cheap. |
gamesMonth | string | no | Optional YYYY-MM month to fetch games for. Only used when "Include recent games" is on. Leave empty to use the most recent month available. |
maxItems | integer | no | Stop after this many usernames. Each username processed is one billed result row. |
{
"usernames": [
"hikaru",
"magnuscarlsen",
"fabianocaruana"
],
"includeGames": false,
"maxItems": 100,
"proxyConfiguration": {
"useApifyProxy": true
}
} Output
One row per result, schema-validated before it is written. Export JSON, CSV, Excel or XML from the run, or read it over the API.
usernameplayer_idprofile_urlavatar_urlfollowerscountry_codelast_onlinejoinedstatusis_streamerverifiedleaguestreaming_platformsstats_chess_dailystats_chess960_dailystats_chess_rapid
{
"username": "hikaru",
"player_id": 15448422,
"profile_url": "https://www.chess.com/member/hikaru",
"followers": 1250000,
"country_code": "US",
"league": "Legend",
"stats_chess_blitz": {
"last_rating": 3320,
"best_rating": 3378,
"wins": 9800,
"losses": 3100,
"draws": 450
},
"games_month_fetched": null,
"recent_games": [],
"scraped_at": "2026-09-04T06:20:00Z"
} Pricing
| Event | Price | When |
|---|---|---|
| Actor start | $0.20 | Once per run, covers warm-up and proxy session setup. |
| Result emitted | $0.0020 | Per result written to the dataset. |
You pay only for results that land. Cap any run with maxTotalChargeUsd. See pricing & billing for worked examples.
Limitations
- Games fetch caps at one month per username per run — full multi-month backfill isn't in scope.
- Requests are throttled to stay courteous to a free public API, so a large
includeGamesrun takes real time. - Club, tournament, and leaderboard data are out of scope — this Actor is player-focused only.
FAQ
Do I need an API key?
What happens if a username doesn't exist?
A username I know is real still came back skipped — why?
Why is `includeGames` off by default?
Ready to run it?
Open the listing on Apify, paste the input above, and watch rows land. If it ever breaks, it is our problem before it is yours.
Related Actors