Compare App Store and Google Play review clients
Choose by source coverage and operational requirements, not by package name.
app-reviews fits Python applications that need one typed model, bounded paging,
and explicit partial-failure data across both stores.
Audited feature matrix
The cells below reflect public documentation and repository metadata checked on 2026-09-21. “Typed” describes the published Python interface, not the upstream store payload. “Maintained” reports observable project status rather than predicting future support.
| Capability | app-reviews |
google-play-scraper |
app-store-scraper |
app-store-web-scraper |
Apple RSS directly | App Store Connect directly | Google Play Developer API directly |
|---|---|---|---|---|---|---|---|
| Both stores | Yes | No, Play only | No, Apple only | No, Apple only | No, Apple only | No, Apple only | No, Play only |
| Maintained | Current v1 work in 2026 | Not archived; last code push Aug 2024 | Archived/read-only since Oct 2021 | Not archived; last code push Jun 2024 | Apple-operated but undocumented | Vendor-supported API | Vendor-supported API |
| Native async | Yes | No documented async API | No | No | Your HTTP client decides | Your HTTP client decides | Your HTTP client decides |
| Typed interface | Ships py.typed; dataclasses and typed errors |
Declares the Typing :: Typed classifier, but its wheel has no py.typed marker; dictionary results |
No published typing claim | Annotated AppReview API and Typing :: Typed classifier, but its wheel has no py.typed marker |
Raw JSON | Generated/manual client decides | Generated/manual client decides |
| Country behavior | Apple RSS per storefront; other review sources global | country/lang presentation parameters |
One Apple storefront per client | One Apple storefront per entry | URL selects Apple storefront | Global request; review territory may be present | Global; no reviewer country field |
| Resumable cursor exposed | Yes, opaque cursors | Yes, continuation token | No | No public cursor; lazy iterator | Numeric page in URL | links.next URL |
nextPageToken |
| Runtime dependency count | 2 (httpx, cryptography) |
0 | 1 (requests) |
1 (urllib3) |
0 beyond chosen HTTP stack | Chosen auth/HTTP stack | Chosen auth/HTTP stack |
| CLI | No | No documented CLI | No | No | Not applicable | Not applicable | Not applicable |
Sources used for this audit:
google-play-scraperrepository- archived
app-store-scraperrepository app-store-web-scraperrepository- Apple App Store Connect customer reviews
- Google Play reviews API
The Apple RSS endpoint is included because all three public Apple paths in the table ultimately depend on it. It exposes at most ten pages of roughly fifty reviews for each storefront and has no formal service contract.
Source behavior inside app-reviews
| Source | Country behavior | Ordering | History limit | Authentication |
|---|---|---|---|---|
| Apple RSS | Per storefront | Newest first | About 500 recent reviews per storefront | None |
| App Store Connect | Global request; review territory may be present | Newest first | No package-imposed time window | Apple credentials |
| Google Play web | Global review corpus | Newest first | No package-imposed time window | None |
| Google Play Developer API | Global review corpus | Not documented | Reviews created or modified in the last seven days | Google credentials |
For exact fields and caveats, read Source capabilities.
Migrating from google-play-scraper
google-play-scraper returns review dictionaries and a continuation token:
from google_play_scraper import reviews
rows, continuation_token = reviews("com.spotify.music", count=100)
app-reviews returns typed reviews plus fetch diagnostics:
from app_reviews import GooglePlayReviews
with GooglePlayReviews() as client:
result = client.fetch("com.spotify.music", limit=100, max_pages=5)
rows = result.to_dicts()
diagnostics = result.to_dict()
Field names and timestamp semantics differ. Treat this as a migration, not a
drop-in import replacement. In particular, Google Play review country is None
because neither supported Play review source reports reviewer location.
When not to use app-reviews
Do not use this package when you need Play Console CSV history, to crawl arbitrary store pages, or to run a standalone service without writing an application wrapper. Developer replies are supported on both stores through their official APIs with credentials; see Replies. Prefer a store's official API directly when you need endpoints this package does not expose. Prefer a focused single-store library when its existing schema is already the contract used by your application.