Chess.com Player Scraper icon

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.

FieldTypeRequiredWhat 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

EventPriceWhen
Actor start$0.20Once per run, covers warm-up and proxy session setup.
Result emitted$0.0020Per 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 includeGames run 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?
No. Chess.com's Published-Data API is public and keyless, so a run needs no credentials from you.
What happens if a username doesn't exist?
It's skipped, logged, and named in the run's status message. The run still finishes successfully — a batch of unknown usernames is a completed check, not a failure.
A username I know is real still came back skipped — why?
Two different things can produce a skip, and both are treated the same way: the username genuinely doesn't exist (renamed/deleted account), or Chess.com's own API returns a not-found response for one specific sub-endpoint on an otherwise-valid account — rare, but it happens on their side independent of anything we send. Either way we skip that one username, name it in the run's status message, and keep going — it never blocks the rest of your list.
Why is `includeGames` off by default?
Fetching a full month of games (with PGN move text) is the heaviest call this Actor makes. Leaving it off keeps a plain profile+ratings run fast and cheap; turn it on when you actually need the games.

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

Teams that run this also run