Chess.com API: List recent games
Lists a Chess.com player's completed public games for a month, newest first, with results, ratings, opening and game links.
Unofficial. Not affiliated with or endorsed by Chess.com.
Inputs
Values from the run on Oct 23, 2026, shown under Output.
- Month optional
month Month of games in YYYY-MM, for example 2026-09. Defaults to the current UTC month.
2026-09
- Username, required
username Chess.com username, for example MagnusCarlsen.
MagnusCarlsen
- Max Results optional
max_results Maximum number of games, for example 50. Defaults to 50.
3
Whole number from 1 to 500. Default
50.- Time Control optional
time_control Game speed, for example blitz. Defaults to all.
blitz
One of
all,rapid,blitz,bullet,daily. Defaultall.
Input as JSON
{ "month": "2026-09", "username": "MagnusCarlsen", "max_results": 3, "time_control": "blitz"}Output
{ "games": [ { "pgn": "[Event \"Live Chess\"]\n[Site \"Chess.com\"]\n[Date \"2026.09.30\"]\n[Round \"-\"]\n[White \"MagnusCarlsen\"]\n[Black \"jcibarra\"]\n[Result \"1-0\"]\n[CurrentPosition \"8/5pk1/p3p1N1/5q2/5r2/6Q1/P4RPK/4R3 b - - 2 39\"]\n[Timezone \"UTC\"]\n[ECO \"B40\"]\n[ECOUrl \"https://www.chess.com/openings/Sicilian-Defense-French-Variation\"…" , "color": "white", "rated": "yes", "result": "win", "end_time": "2026-09-30T17:32:17+00:00", "game_link": "https://www.chess.com/game/live/185102910785" , "how_it_ended": "resignation", "opening_name": "Sicilian Defense French Variation", "time_control": "5 min", "player_rating": 3379, "opponent_rating": 3124, "opponent_username": "jcibarra", "final_position_fen": "8/5pk1/p3p1N1/5q2/5r2/6Q1/P4RPK/4R3 b - - 2 39" }, { "pgn": "[Event \"Live Chess\"]\n[Site \"Chess.com\"]\n[Date \"2026.09.30\"]\n[Round \"-\"]\n[White \"jcibarra\"]\n[Black \"MagnusCarlsen\"]\n[Result \"0-1\"]\n[CurrentPosition \"4r3/3Rb3/p4k2/1p5p/1P2K3/r7/P3R3/8 w - - 0 43\"]\n[Timezone \"UTC\"]\n[ECO \"B33\"]\n[ECOUrl \"https://www.chess.com/openings/Sicilian-Defense-Open-Pelikan-and-S…" , "color": "black", "rated": "yes", "result": "win", "end_time": "2026-09-30T17:23:58+00:00", "game_link": "https://www.chess.com/game/live/185102311045" , "how_it_ended": "resignation", "opening_name": "Sicilian Defense Open Pelikan and Sveshnikov Variations", "time_control": "5 min", "player_rating": 3376, "opponent_rating": 3127, "opponent_username": "jcibarra", "final_position_fen": "4r3/3Rb3/p4k2/1p5p/1P2K3/r7/P3R3/8 w - - 0 43" }, { "pgn": "[Event \"Live Chess\"]\n[Site \"Chess.com\"]\n[Date \"2026.09.30\"]\n[Round \"-\"]\n[White \"MagnusCarlsen\"]\n[Black \"MentalistMate\"]\n[Result \"1-0\"]\n[Tournament \"https://www.chess.com/tournament/live/chess-club-showdown-31104532\"]\n[CurrentPosition \"8/8/2Q5/pPk2p2/P1p5/2P2NP1/4rPK1/3q4 b - - 6 55\"]\n[Timezone \"UTC\"…" , "color": "white", "rated": "yes", "result": "win", "end_time": "2026-09-30T16:55:41+00:00", "game_link": "https://www.chess.com/game/live/184613271140" , "how_it_ended": "checkmate", "opening_name": "Caro Kann Defense Exchange Rubinstein Variation", "time_control": "5 min", "player_rating": 3373, "opponent_rating": 2578, "opponent_username": "MentalistMate", "final_position_fen": "8/8/2Q5/pPk2p2/P1p5/2P2NP1/4rPK1/3q4 b - - 6 55" } ]}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"chess.com/list_recent_games","input":{"month":"2026-09","username":"MagnusCarlsen","max_results":3,"time_control":"blitz"}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "chess.com/list_recent_games" , "input": { "month": "2026-09", "username": "MagnusCarlsen", "max_results": 3, "time_control": "blitz" }})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "chess.com/list_recent_games" , "input": { "month": "2026-09", "username": "MagnusCarlsen", "max_results": 3, "time_control": "blitz" } }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run chess.com/list_recent_games# with {"month":"2026-09","username":"MagnusCarlsen","max_results":3,"time_control":"blitz"}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "type": "object", "required": [ "username" ], "properties": { "month": { "type": "string", "description": "Month of games in YYYY-MM, for example 2026-09. Defaults to the current UTC month." }, "username": { "type": "string", "minLength": 1, "description": "Chess.com username, for example MagnusCarlsen." }, "max_results": { "type": "integer", "default": 50, "maximum": 500, "minimum": 1, "description": "Maximum number of games, for example 50. Defaults to 50." }, "time_control": { "enum": [ "all", "rapid", "blitz", "bullet", "daily" ], "type": "string", "default": "all", "description": "Game speed, for example blitz. Defaults to all." } }, "additionalProperties": false}Output schema
{ "type": "object", "required": [ "games" ], "properties": { "games": { "type": "array", "items": { "type": "object", "required": [ "end_time", "color", "player_rating", "opponent_username", "opponent_rating", "result", "how_it_ended", "time_control", "rated", "opening_name", "game_link", "pgn", "final_position_fen" ], "properties": { "pgn": { "type": [ "string", "null" ] }, "color": { "enum": [ "white", "black" ], "type": "string" }, "rated": { "enum": [ "yes", "no" ], "type": "string" }, "result": { "enum": [ "win", "loss", "draw" ], "type": "string" }, "end_time": { "type": "string", "format": "date-time", "description": "Date and time the game ended in UTC." }, "game_link": { "type": "string" }, "how_it_ended": { "type": [ "string", "null" ] }, "opening_name": { "type": [ "string", "null" ] }, "time_control": { "type": "string" }, "player_rating": { "type": [ "integer", "null" ] }, "opponent_rating": { "type": [ "integer", "null" ] }, "opponent_username": { "type": "string" }, "final_position_fen": { "type": [ "string", "null" ] } }, "additionalProperties": false } } }, "additionalProperties": false}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
chess.com/list_recent_games- Returns
- games with end time, color, ratings, opponent, result, how it ended, time control, opening, game link, PGN and final position
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method chess.com/list_recent_games with the inputs above.
Ask your agent
- Show me the completed public games for the player hikaru in March 2026, newest first, with results and opening names.
- I want a list of blitz games played by MagnusCarlsen last month, including ratings and game links.
- Pull up to 20 rapid games from user nakamura_fan for 2025-11 with the opponent names and how each game ended.
- Can you get the bullet games for the username chessqueen42 in 2026-01, along with the PGN for each one?
- List my daily correspondence games for September 2026 on chess.com under the account kasparov_jr, sorted newest first.
See more
All Chess.com methodsLists up to 50 top Chess.com players for a time control, in rank order, with ratings, game records and profile links. Puzzles rankings use puzzle scores.
chess.com/list_top_playersGets a Chess.com player's public profile, ratings and game records, best puzzle rating and Puzzle Rush best score from a username or member profile link.
chess.com/get_player_statsLists ranked Roblox experiences from a current Charts list. Each game includes players online, approval percentage, creator, icon and game link.
roblox.com/list_top_gamesLists an account's latest public Bluesky posts, newest first. Replies and reposts are left out unless requested; a repost's time is when the account reposted it.
bsky.app/list_recent_postsGets UEFA club competition matches in a date range, with kick-off times in a chosen time zone, scores, stages and venues. You can limit the list to one club.
uefa.com/get_competition_matchesLists MLB games and scores for a date or up to seven days, optionally for one team. Start times are shown in the requested time zone.
mlb.com/get_scoresLists the latest public articles by a Medium writer or publication (by username, publication name or Medium link), with dates, reading times, claps, member-only labels and tags.
medium.com/list_author_articlesLists the most-watched live Kick streams right now, optionally in one category and language, sorted by current viewers.
kick.com/list_live_streams