py-goodreads
py-goodreads is an unofficial, fully asynchronous Python client for public
Goodreads reading data. It uses Goodreads' public RSS feeds rather than the
retired developer API and does not require credentials, cookies, or an API key.
Status
The initial 0.1.0 release supports:
- numeric user IDs and ordinary Goodreads profile URLs;
- any public shelf exposed by
review/list_rss; - currently-reading books and book metadata;
- page-based and percentage-based progress from public user updates;
- selection of the most recently active current book;
- injected
aiohttp.ClientSessioninstances for efficient connection reuse; - Python 3.11 through 3.14 with complete type information.
Authentication, private web scraping, and write operations are intentionally out of scope for the first release.
Installation
The PyPI distribution name is goodreads-async; the import package is
pygoodreads.
python -m pip install goodreads-async
Usage
import asyncio
from aiohttp import ClientSession
from pygoodreads import GoodreadsClient
async def main() -> None:
async with ClientSession() as session:
client = GoodreadsClient(session)
snapshot = await client.async_get_reading_snapshot(
"https://www.goodreads.com/user/show/12345678-reader"
)
print(snapshot.profile.name)
for reading in snapshot.currently_reading:
print(reading.book.title, reading.progress)
asyncio.run(main())
Read another shelf with async_get_shelf:
read_shelf = await client.async_get_shelf("12345678", "read")
want_to_read = await client.async_get_shelf("12345678", "to-read")
Goodreads currently limits feed history, so a returned shelf should not be treated as an authoritative lifetime count for large shelves.
Data model
GoodreadsSnapshot.currently_reading is always a tuple because Goodreads users
can have more than one current book. Each GoodreadsReading combines the shelf
record with the latest matching public progress event. active_reading is the
book with the newest progress or shelf activity, which is useful for dashboards
that have room for a single book.
Progress preserves source values:
- page updates expose
current_page,total_pages, and a derivedpercent; - percentage updates expose
percentwhile page values remainNone; - books without a public progress update have
progress=None.
Development
python -m pip install --editable '.[test]'
ruff format --check .
ruff check .
mypy
pytest --cov=pygoodreads --cov-report=term-missing
python -m build
twine check dist/*
See CONTRIBUTING.md for contribution guidance and SECURITY.md for responsible disclosure.
License
Copyright © 2026 Daniel Wilson (@Danw33)
Licensed under the Apache License, Version 2.0. See LICENSE and NOTICE.
Goodreads and Amazon are trademarks of their respective owners
Release files for goodreads-async 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| goodreads_async-0.1.1.tar.gz | 14.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| goodreads_async-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 28.7 kB
Release files / goodreads_async-0.1.1.tar.gz
| Download URL | goodreads_async-0.1.1.tar.gz |
|---|---|
| Size | 14.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1b5573e6ca689c2342d4165ec54362e5303583c9b1be05761f99f8b0ef7750e9
|
|
BLAKE2b-256 checksum How to use checksums |
dc3ce93fc55c371351fbcfe2cbf28411a679ee178fe0b7887ab4498b9d7a88fd
|
| 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 Sep 17, 2026.
Transparency logRelease files / goodreads_async-0.1.1-py3-none-any.whl
| Download URL | goodreads_async-0.1.1-py3-none-any.whl |
|---|---|
| Size | 13.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e8279b552edfaa65dad4de0ff2971ab3c691a36c4ffa41ed6a5e0ebe6024ee02
|
|
BLAKE2b-256 checksum How to use checksums |
0c9defaaddbb4f651707727879dec77b1daded036509fecbc0507461b493a42f
|
| 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 Sep 17, 2026.
Transparency log