Skip to main content

nytimes-games

PyPI Python Test License: MIT

An unofficial Python client for the New York Times Games APIs: Wordle, Connections, Strands, Spelling Bee, Letter Boxed and the Daily, Mini, Midi and Bonus crosswords, plus your own stats and game progress.

NYT doesn't publish documentation or an API spec for these endpoints. This package wraps them in one client with typed, validated Pydantic models, so you can build archives, stats dashboards, bots or your own games without reverse engineering NYT's APIs first. An optional extra serves everything as a REST API.

Installation

pip install nytimes-games

The package installs as nytimes-games and is imported as nytgames. Python 3.10 or newer is required.

Quick start

from nytgames import NYTGamesClient

client = NYTGamesClient()

client.wordle("2025-06-12").solution
client.connections("2025-06-12").categories
client.crossword("mini")                  # today's Mini
client.crossword("daily", "1993-11-21")   # any Daily back to 1993

Your stats and game progress need your NYT session cookie:

client = NYTGamesClient(cookies="NYT-S=...")

stats = client.player_stats().stats
stats.wordle.calculatedStats.currentStreak
stats.connections.puzzles_won
stats.crossword_daily.dailyStats["monday"].avgTimeSeconds

What's available

Puzzles don't need cookies. Everything about you does.

Game Method Available from Cookies
Wordle wordle(date) 2021-06-19 No
Connections connections(date) 2023-06-12 No
Strands strands(date) 2024-03-04 No
Spelling Bee spelling_bee_puzzle(date) 2018-05-06 No
Letter Boxed letter_boxed(date) 2018-12-17 No
Crossword crossword(publish_type, date=None) Daily 1993-11-21, Mini 2014-08-21, Midi 2026-02-25, Bonus 1997 No
Crossword schedule crossword_oracle(publish_type) Current and next puzzle No
Crossword list crossword_puzzles(publish_type, date_start=..., date_end=...) Includes your progress with cookies Optional
Crossword progress crossword_game(puzzle_id, publish_type) Your saved game Yes
Wordle progress wordle_latest(puzzle_ids) Your saved games Yes
Spelling Bee progress spelling_bee_latest(puzzle_ids) Your saved games (up to 30 IDs) Yes
Stats player_stats() Every game you've played Yes

Dates are YYYY-MM-DD strings. publish_type is daily, mini, midi or bonus, and date=None returns today's puzzle. NYT usually serves the next day's puzzle a day early.

Spelling Bee extras:

from nytgames import spelling_bee_hints

puzzle = client.spelling_bee_puzzle("2026-10-03")
spelling_bee_hints(puzzle)      # Spelling Bee Forum style hints: counts, pairs, points
client.spelling_bee_puzzles()   # every puzzle on the game page (about two weeks)

Cookies

To get your NYT-S cookie, log in at nytimes.com, open your browser's developer tools, and find the NYT-S cookie for .nytimes.com (Application tab in Chrome, Storage tab in Firefox). Treat it like a password: it gives access to your NYT account.

cookies can be:

  • a Cookie header string: "NYT-S=...; nyt-a=..."
  • a dict: {"NYT-S": "..."}
  • a list of cookie objects with name and value keys, such as a JSON export from the Cookie-Editor browser extension

Errors

HTTP errors from NYT are raised as NYTGamesHTTPError, a subclass of requests.HTTPError:

Exception When
NYTGamesAuthenticationError 401 or 403, usually a missing or expired NYT-S cookie
NYTGamesNotFoundError 404, for example a date with no puzzle
NYTGamesHTTPError any other HTTP error
NYTGamesParseError an NYT page didn't contain the expected game data (a ValueError)
from nytgames import NYTGamesNotFoundError

try:
    client.wordle("1900-01-01")
except NYTGamesNotFoundError:
    print("No puzzle that day")

Models

Every method returns Pydantic models from nytgames.models. Fields NYT adds later are kept rather than rejected, so new NYT fields don't break your code. Use .model_dump() to get plain dicts, and by_alias=True to keep NYT's original keys, such as "Queen Bee" in the Spelling Bee ranks.

REST API

The optional api extra serves everything as a REST API with FastAPI, including interactive docs at /docs.

pip install "nytimes-games[api]"
uvicorn nytgames.api:app

To customize it, write your own main.py:

from nytgames.api import create_app

app = create_app(title="My NYT Games API")   # any FastAPI settings

Or mount the routes in an existing FastAPI app:

from fastapi import FastAPI
from nytgames.api import add_exception_handlers, router

app = FastAPI()
app.include_router(router, prefix="/nyt")
add_exception_handlers(app)   # NYT errors become 404s and 403s instead of 500s

By default each request is made with the cookies sent to the API:

curl -H "Cookie: NYT-S=..." http://localhost:8000/player/stats

To use your own cookies for every request instead, override the client:

from nytgames import NYTGamesClient
from nytgames.api import get_client

app.dependency_overrides[get_client] = lambda: NYTGamesClient(cookies="NYT-S=...")

Anyone who can reach that API can then see your stats and progress, so keep it private.

examples/api has a complete main.py and Dockerfile for running your own instance in a container.

Endpoints

Route NYT endpoint
GET /connections/{date} svc/connections/v2/{date}.json
GET /crosswords/daily/today svc/crosswords/v6/puzzle/daily.json
GET /crosswords/daily/{date} svc/crosswords/v6/puzzle/daily/{date}.json
GET /crosswords/mini/today svc/crosswords/v6/puzzle/mini.json
GET /crosswords/mini/{date} svc/crosswords/v6/puzzle/mini/{date}.json
GET /crosswords/midi/today svc/crosswords/v6/puzzle/midi.json
GET /crosswords/midi/{date} svc/crosswords/v6/puzzle/midi/{date}.json
GET /crosswords/bonus/{date} svc/crosswords/v6/puzzle/bonus/{date}.json
GET /crosswords/puzzles svc/crosswords/v3/puzzles.json
GET /crosswords/oracle/{publish_type} svc/crosswords/v2/oracle/{publish_type}.json
GET /crosswords/game/{game_id}?publish_type=daily svc/games/state/crossword_{publish_type}/latests
GET /letter-boxed/{date} svc/letter-boxed/v1/{date}.json
GET /player/stats svc/games/state/wordleV2/latests?puzzle_ids=0
GET /spelling-bee Scraped from puzzles/spelling-bee
GET /spelling-bee/latest svc/games/state/spelling_bee/latests
GET /spelling-bee/{date} svc/spelling-bee/v1/{date}.json
GET /spelling-bee/{date}/hints Computed from the puzzle above
GET /strands/{date} svc/strands/v2/{date}.json
GET /wordle/latest svc/games/state/wordleV2/latests
GET /wordle/{date} svc/wordle/v2/{date}.json

NYT errors are returned with NYT's status code, for example 404 for a date with no puzzle.

Contributing

NYT changes these APIs without notice, so bug reports with the failing date and error are very welcome. See CONTRIBUTING.md to set up a development environment.

License

MIT. This project is not affiliated with or endorsed by The New York Times. NYT puzzles are copyrighted by The New York Times; please respect their terms of service and don't republish puzzle content.

Metadata

Release files for nytimes-games 0.4.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 nytimes-games 0.4.0
File Size Uploaded
nytimes_games-0.4.0.tar.gz 24.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for nytimes-games 0.4.0
File Interpreter ABI Platform
nytimes_games-0.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 42.6 kB

Release files / nytimes_games-0.4.0.tar.gz

Download URL nytimes_games-0.4.0.tar.gz
Size 24.9 kB
Tags Source
SHA-256 checksum
How to use checksums
45abfe5168901a94956c16ea7eaca4c90b89018ee0fea2cd35ddd1229e12726f
BLAKE2b-256 checksum
How to use checksums
1eebe28e01243e24344083bef155991a37cbcf4f821e3d08c84a260c4f7f4d8f
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 Oct 4, 2026.

Transparency log

Release files / nytimes_games-0.4.0-py3-none-any.whl

Download URL nytimes_games-0.4.0-py3-none-any.whl
Size 17.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1f83741e7472f3f3b05ee942713bb428d9975eac8a6845cb84dca98697a79719
BLAKE2b-256 checksum
How to use checksums
64e4d23c0e72345648279637d496415284d7b66766565768ff3600406786b737
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 Oct 4, 2026.

Transparency log

Release history Release notifications | RSS feed

0.11.5

2 release files

0.11.4

2 release files

0.11.3

2 release files

0.11.2

2 release files

0.11.1

2 release files

0.11.0

2 release files

0.10.0

2 release files

0.9.7

2 release files

0.9.6

2 release files

0.9.5

2 release files

0.9.4

2 release files

0.9.3

2 release files

0.9.2

2 release files

0.9.1

2 release files

0.9.0

2 release files

0.8.4

2 release files

0.8.3

2 release files

0.8.2

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.5.0

2 release files

This release

0.4.0 This release

2 release files

0.3.2

2 release files

0.3.1

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