Skip to main content

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.ClientSession instances 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 derived percent;
  • percentage updates expose percent while page values remain None;
  • 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)

Source distribution for goodreads-async 0.1.1
File Size Uploaded
goodreads_async-0.1.1.tar.gz 14.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for goodreads-async 0.1.1
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

This release

0.1.1 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