app-store-reviews: a drop-in replacement for app-store-scraper
app-store-scraper was archived in 2021 and no longer works for most apps. app-store-reviews keeps the same AppStore class, the same review() method and the same review dicts, so existing scripts keep working. It also has a reviews() function shaped like google-play-scraper's, for Google Play.
The reviews are collected by the CleanScrape App Store & Google Play Reviews Actor on Apify, which handles the requests, retries and Apple's flaky review feed for you.
# from app_store_scraper import AppStore # before
from app_store_reviews import AppStore # after
minecraft = AppStore(country="nz", app_name="minecraft")
minecraft.review(how_many=20)
print(minecraft.reviews[0])
Country | nz
Name | minecraft
ID | 479516143
URL | https://apps.apple.com/nz/app/minecraft/id479516143
Review count | 20
Install
pip install app-store-reviews
Then set your Apify API token. A free Apify account includes $5 of usage a month. Copy the token from Apify Console > Settings > API & Integrations.
export APIFY_TOKEN=your_token # macOS / Linux
setx APIFY_TOKEN your_token # Windows (open a new terminal afterwards)
Or pass it in code: AppStore(..., apify_token="..."). Keep the token out of shared notebooks and repositories.
App Store (same as app-store-scraper)
from datetime import datetime
from app_store_reviews import AppStore
app = AppStore(country="us", app_name="spotify", app_id=324684580) # app_id is optional
app.review(how_many=200, after=datetime(2026, 9, 1))
app.reviews # list of dicts
app.reviews_count # 200 or fewer
app.search_id() # finds the numeric ID from the name, free (no Apify run)
Each review has the keys app-store-scraper used: date (datetime, UTC), review, rating, title, userName, isEdited, and developerResponse when there is one. It also adds reviewId, appVersion, country and url. isEdited is None, because Apple's public feed doesn't say.
Limit: Apple's public review feed holds about the 500 most recent reviews per app and country. For older reviews, run other countries, where the app has its own reviews.
Podcast is not supported.
Google Play (shaped like google-play-scraper)
from app_store_reviews import Sort, reviews, reviews_all
result, _ = reviews("com.spotify.music", lang="en", country="us", sort=Sort.NEWEST, count=500, filter_score_with=1)
everything = reviews_all("com.spotify.music") # up to 10,000
Each review has google-play-scraper's keys: reviewId, userName, content, score, thumbsUpCount, reviewCreatedVersion, at, replyContent, repliedAt and appVersion. userImage is None. There is no paging token: ask for the count you need in one call.
Errors
ResponseError when no reviews could be read (the message says why), SpendingLimitError when a run hits your spending cap, and ApifyTokenError for a missing or rejected token. Set a cap per run with max_charge_usd=.
What it costs
You pay Apify for the Actor's reviews, at the current price: $0.20 per 1,000 reviews plus a start fee of about $0.01 per call at the base price. 200 reviews cost about $0.05, and 2,000 Google Play reviews about $0.41. The free monthly credit covers tens of thousands of reviews.
Testing
python -m unittest discover -s tests
The tests run offline on rows saved from the Actor, with reviewer names and texts replaced by placeholders.
About
Maintained by CleanScrape. Not affiliated with Apple, Google or the original libraries. MIT licence.
Bugs and ideas: open an issue or email contact.cleanscrape@gmail.com.
Metadata
Release files for app-store-reviews 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| app_store_reviews-0.1.0.tar.gz | 18.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| app_store_reviews-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 27.9 kB
Release files / app_store_reviews-0.1.0.tar.gz
| Download URL | app_store_reviews-0.1.0.tar.gz |
|---|---|
| Size | 18.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0c4e6b75863989704e202b8d1dda6929f6190a84d14d5cfb947c1bf717871d3b
|
|
BLAKE2b-256 checksum How to use checksums |
419b23f80a570cc69545b1d3785753526b3f2a2fa067cd6d18758c10d01c41bc
|
| 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 logRelease files / app_store_reviews-0.1.0-py3-none-any.whl
| Download URL | app_store_reviews-0.1.0-py3-none-any.whl |
|---|---|
| Size | 9.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
18c477914487d7cb390b924e97005c00f3c31eac7144d47634330dc2f9b9a6c7
|
|
BLAKE2b-256 checksum How to use checksums |
8d020d8d22a8e160883e65a108011f3399ce7810fe9fec4b86b85d94f937bc87
|
| 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