Skip to main content

chess-results

CI

Look up a chess tournament on chess-results.com and get the results back as text you can read, or as data you can work with.

For each player it collects who they played, which colour they had, whether they floated up or down, and whether they took a bye — the things you need to follow a Swiss tournament, or to work out what the next round's pairings should be.

Early days. Version 0.1.0 is a first release. It works and is tested against real tournaments, but it has only been used against a handful of events. Expect rough edges, and expect commands and options to change before 1.0. If you are relying on it for something that matters, check its answers against the tournament's own pages.

Install

pip install chess-results

Requires Python 3.10 or newer. To work on it instead:

git clone https://github.com/markjonleonard/chess-results
cd chess-results
pip install -e ".[dev]"

Finding your tournament

Every tournament on chess-results has a number, which appears in the address bar when you open the event:

https://chess-results.com/tnr1452107.aspx
                             ^^^^^^^

That number is what you pass to every command below. The examples all use 1452107, the 2026 British Championship.

Command line

Five commands. Each takes a tournament number.

chess-results standings 1452107              # who is winning
chess-results pairings 1452107               # this round's boards
chess-results colours 1452107                # colour and float history
chess-results unfinished 1452107             # games still being played
chess-results dump 1452107 -o event.json     # everything, as a data file

Add --after N to any of them to see the tournament as it stood after a particular round, rather than as it stands now. Ask for a round the tournament has not reached and you get the latest one.

colors is accepted as a synonym for colours.

--limit N prints the first N rows and then says how many it left out. It counts rows rather than lines, so --limit 10 is ten players where | head -10 is nine players and a heading. It saves no time — the fetching is done before anything is printed — and it is not offered on dump, truncated JSON being no use to anyone.

--name-width N sets how much room a player's name gets before it is clipped to an …. The default is 28, narrowed further if your terminal is too small to fit the table; anything under 8 is treated as 8. Widen it when an event has long names you want in full:

chess-results pairings 1452107 6 --name-width 40

Like --limit, it is not offered on dump — JSON has no columns to line up, and clipping a name there would corrupt data rather than tidy a table.

All the options

Every command takes these; chess-results <command> --help prints them too.

Option What it does
--after N Report the tournament as it stood after round N
--limit N Print at most N rows, then say how many were left out
--name-width N Room for a player's name before it is clipped (default 28)
--rounds N Stop after N rounds instead of discovering them all
--bye-value P What a pairing-allocated bye is worth (default 1.0)
--delay S Seconds between requests (default 1.0)
--no-cache Always refetch, ignoring the cache
--cache-ttl S How long to reuse a live round's page (default 300)
--cache-dir D Where to keep cached pages
--no-crosstable Skip the crosstable request — scores will be wrong for anyone whose bye has been dropped from its round page

--bye-value is worth knowing about if your event awards half a point for a bye: the crosstable prints every pairing-allocated bye as a full point whatever the tournament actually gives, so this is what rescores it.

standings

Rank, score, starting number, title and name.

chess-results standings 1452107 --after 6
2026 British Chess Championships: Championship — after round 6
   1    5    2  GM  Adams, Michael
   2    5    3  GM  Royal, Shreyas
   3    5    4  IM  Grieve, Harry
   4    5    6  IM  Bazakutsa, Svyatoslav
   5   4½    7  IM  Harvey, Marcus R
   6   4½    9  IM  Czopor, Maciej

Mid-round the scores are not comparable — a player whose game has finished counts this round, one still at the board does not — so the heading says how far the round has got and each line says what that player is doing. The extra column appears only while a round is live.

chess-results standings 1452107
2026 British Chess Championships: Championship — during round 9: 4 of 50 results in
   1   6½    3  GM  Royal, Shreyas               playing
   2   6½    4  IM  Grieve, Harry                playing
   …
  98    2   62  CM  Stubbs, Oliver               0F
 101    2   95      Jermy, Jaden                 not paired

A round paired but not yet started says so instead: round 9 paired, no results yet.

pairings

One round's table: board, both players with the score each carried into the round, and the result. The latest round unless you name one — pairings 1452107 6, or --after 6 if you prefer the flag the other commands take.

chess-results pairings 1452107 6
2026 British Chess Championships: Championship — round 6 pairings
  Bd  Pts   No      White                        Res    Pts   No      Black
   1   4½    6  IM  Bazakutsa, Svyatoslav        ½-½     4½    4  IM  Grieve, Harry
   2    4    1  GM  Mcshane, Luke J              1-0      4   10  IM  Waldhausen Gordon, Frederick
   …
  52    ½  105  WCM Nevska, Gerda                1                    bye
  53    3   21  IM  Golding, Alex                                     not paired

The starting numbers are joined in from the starting-rank list, because most events leave the No. columns off their pairing pages. Byes and "not paired" rows are shown as chess-results publishes them — which is to say only while the round is the current one, since they are deleted once the next round is paired. See A note on byes.

colours

What the next round's pairing turns on: the colours each player has had, whether they floated up (U) or down (D) in each round, and which colour they are due next.

chess-results colours 1452107 --after 6
2026 British Chess Championships: Championship — colour and float history after round 6
 Pts   No  Name                         Colours    Floats     Due
   5    2  Adams, Michael               WBWBWB     ------     W (mild)
   5    3  Royal, Shreyas               BWBWWB     ----U-     W (mild)
   5    4  Grieve, Harry                WBWBWB     ------     W (mild)
   5    6  Bazakutsa, Svyatoslav        WBWWBW     ----D-     B (absolute)
  4½    7  Harvey, Marcus R             BWBWBW     ------     B (mild)
   …
   4    1  Mcshane, Luke J              BWBWBW     ------     B (mild)

A player due a colour "absolutely" must get it in the next round; "mild" means it is only a preference.

unfinished

The games in the current round that have no result yet, with the scores each player brought into the round.

chess-results unfinished 1452107
round 6: 6 game(s) still unfinished
  bd2    Mcshane, Luke J (4) vs Waldhausen Gordon, Frederick (4)
  bd18   Yao, Lan (3) vs Cancedda-Dupuis, Livio (3)
  bd20   Balaji, Aaravamudhan (3) vs Fellowes, Billy (3)
  bd25   Toma, Katarzyna (2½) vs Kanyamarala, Trisha (2½)
  bd44   Terler, Bohdan (1½) vs Elgar, Tim (1½)
  bd50   Varnam, Liam D (1) vs Vaddhireddy, Sai (1)

From Python

The same information, as objects:

from chess_results import ChessResults

event = ChessResults().tournament(1452107)           # 2026 British Championship
mcshane = event.players["Mcshane, Luke J"]

mcshane.score(after=6)                              # 4.0
"".join(c.value for c in mcshane.colours(after=6))  # 'bwbwbw'
mcshane.colour_preference(after=6)                  # (Colour.BLACK, Preference.MILD)

As on the command line, after=N pins a figure to a round; leave it off and you get everything scraped so far.

Predicting the next round

The library can write your tournament out in the file format that FIDE pairing engines read, so a program like bbpPairings can work out what the next round's pairings ought to be. See examples/predict_next_round.py.

It gets most pairings right and can get all of them right, but it cannot know who has quietly withdrawn — and one player leaving changes the pairings for everyone below them. Treat a prediction as a good guess, not an announcement.

A note on byes

chess-results removes bye and "not paired" rows from a round's page as soon as the next round is published. Anything reading only those pages will miss byes taken in earlier rounds and score those players a point light. This library reads the crosstable as well and puts the missing rounds back, so the scores it reports agree with the tournament's published totals.

What it does not do

Team tournaments. chess-results reports a team competition in a different format — the round page pairs teams rather than players — and this library does not read it. Point it at one and it says so and stops, rather than reporting an empty tournament.

Most of the tournament's own metadata. It reads the name and nothing else: not the organiser, the time control, the dates, the playing schedule, or the tie-break columns of the final ranking. Everything here is built around who played whom, so that is what it collects.

Related projects

chessResults is an R package that also scrapes chess-results.com, returning a tidy tibble of tournament information, starting rank, playing schedule, round results and closing rank. If you work in R, or you want the site's tables as published — including the metadata and tie-breaks this tool skips — it is the better fit.

The difference is what happens after parsing. This library assembles the round pages into a per-player history and corrects it: it recovers byes that chess-results deletes from superseded round pages, tracks colours and floats, and can write the result as FIDE TRF(x) for a pairing engine. That is a narrower job than reproducing the site's tables, and a different one.

Being a good guest

chess-results is a free service run for the chess community. This library pauses between requests, remembers pages it has already fetched so it does not ask twice, and identifies itself. Please leave those defaults alone unless you have a reason, and do not point it at large numbers of tournaments at once.

How it works

DESIGN.md covers the internals: how the pages are parsed, how caching decides what to keep, how byes are recovered, and how the pairing predictions were tested.

Getting help

If something looks wrong, please open an issue and include the tournament number and the command you ran — that is usually enough to reproduce it. Tournaments vary more than you would expect in which columns they publish, so the most likely cause is a column layout this tool has not seen before.

Bug reports and pull requests are both welcome.

Licence

MIT — see LICENSE. That covers this code only. It says nothing about chess-results.com's data or its terms of use, which are the site's to set; check them before pointing this at anything at scale. Not affiliated with chess-results.com. Please use it gently.

Metadata

Release files for chess-results 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for chess-results 0.1.0
File Size Uploaded
chess_results-0.1.0.tar.gz 284.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for chess-results 0.1.0
File Interpreter ABI Platform
chess_results-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 327.8 kB

Release files / chess_results-0.1.0.tar.gz

Download URL chess_results-0.1.0.tar.gz
Size 284.2 kB
Tags Source
SHA-256 checksum
How to use checksums
e86751878b7dd180e2f48093a2b61fa2b7a58fc1e5d0876c186c4d65e9eb41cd
BLAKE2b-256 checksum
How to use checksums
483930effebe2d50f10b66fa9f2f23c7fd9a9f2c5eabd11e8b378e46f5949c24
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 10, 2026.

Transparency log

Release files / chess_results-0.1.0-py3-none-any.whl

Download URL chess_results-0.1.0-py3-none-any.whl
Size 43.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
52c40f95063a7414127728acf18a3593fa141928be1b5ed0333d0eceedb73024
BLAKE2b-256 checksum
How to use checksums
7948599fbb77a354598d4822151fa68cd9751ce7eb5ae363ad2f84725fe8e874
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 10, 2026.

Transparency log

Release history Release notifications | RSS feed

0.2.0

2 release files

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page