App Reviews Scraper
Pricing
from $0.30 / 1,000 results
App Reviews Scraper
Scrape user reviews from the Apple App Store and Google Play in one run, with a single unified schema. Rating, title, text, author, app version, developer reply and date for any app, in any country.
Pricing
from $0.30 / 1,000 results
Rating
0.0
(0)
Developer
Juan ignacio Veltri
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
App Reviews Scraper — App Store & Google Play in one run
Scrape user reviews from the Apple App Store and Google Play with a single Actor and a single output schema. Point it at an app — by store URL, by ID, or just by name — and get every review with rating, text, author, app version, date and the developer's reply.
Every other reviews scraper on the Store covers one of the two stores. If you want to compare how your app is received on iOS versus Android, you currently run two Actors, get two different JSON shapes, and reconcile them by hand. This one returns both in the same rows.
What you get
Both stores are read through their own public endpoints — Apple's review feed and Google Play's own web API. No proxies are needed, nothing is blocked, and nothing is guessed from HTML that changes every redesign.
| App Store | Google Play | |
|---|---|---|
| Rating, text, author, date | ✅ | ✅ |
| App version reviewed | ✅ | ✅ |
| Review title | ✅ | — (Google Play has no review titles) |
| Developer reply | — (Apple does not publish it) | ✅ |
| "Helpful" votes | — | ✅ |
| Reviews available | 500 per country | Unlimited, paginated |
Fields a store does not publish come back as null. That is information — "this store doesn't
have this" — not a gap in the extraction.
Quick start
Paste an app name and go:
{"apps": ["duolingo"],"stores": "both","countries": ["US"]}
Or be precise, mixing stores and formats freely:
{"apps": ["https://apps.apple.com/us/app/instagram/id389801252","com.spotify.music","389801252","notion"],"stores": "both","countries": ["US", "GB", "BR"],"maxItems": 2000}
A reference that already names its store — a URL, an Apple ID, an Android bundle — is always honoured. Only a plain name is searched in both stores.
Find only the complaints
{"apps": ["com.instagram.android"],"maxRating": 2,"postedWithinDays": 30,"onlyWithText": true,"keywords": ["crash", "battery", "login"]}
Watch what the developer answers
{"apps": ["com.spotify.music"],"stores": "google_play","onlyWithDeveloperReply": true}
Getting more than 500 reviews from the App Store
Apple's feed stops at 500 reviews per country. That is a hard limit of the store, not of this Actor, and no scraper can go past it on a single market.
The way around it is to read several markets, which this Actor does in one run:
{"apps": ["389801252"],"stores": "app_store","countries": ["US", "GB", "CA", "AU", "DE", "FR", "ES", "BR", "MX", "JP"]}
Every review carries storeCountry, so the markets stay separable afterwards. Google Play has no
such cap and paginates until it runs out.
Input
| Field | Type | Default | Description |
|---|---|---|---|
apps | array | example app | Store URL, Apple numeric ID, Android bundle, or app name |
stores | select | both | both, app_store, google_play |
countries | array | ["US"] | Markets to read. Reviews are per country, not global |
sortBy | select | most_recent | most_recent or most_helpful |
maxItems | integer | 500 | Total cap for the run. 0 = no cap |
maxReviewsPerApp | integer | 0 | Cap per app and market, so one big app can't eat the run |
minRating / maxRating | integer | — | Keep only reviews within a star range |
keywords | array | — | Only reviews mentioning any of these, in title or text |
postedWithinDays | integer | — | Only reviews newer than N days |
onlyWithText | boolean | false | Drop ratings with nothing written |
onlyWithDeveloperReply | boolean | false | Only reviews the developer answered (Google Play only) |
includeSeen | boolean | true | Turn off to skip reviews returned by previous runs |
maxConcurrency | integer | 5 | Parallel requests |
maxRequestsPerMinute | integer | 120 | Rate ceiling |
maxRequestRetries | integer | 3 | Retries before dropping a request |
Supported markets: AR, BR, CL, CO, MX, PE, UY, PY, BO, EC, VE, CR, GT, US, CA, GB, IE, ES, PT, FR, DE, IT, NL, BE, AT, CH, PL, SE, NO, DK, FI, AU, NZ, IN, SG, JP, IL, ZA.
Output
One row per review, identical shape from both stores:
{"id": "app_store:14462223652","url": "https://apps.apple.com/us/app/id389801252?review=14462223652","source": "app-reviews","country": "US","scrapedAt": "2026-08-24T13:34:10.442Z","store": "app_store","appId": "389801252","appName": "Instagram","storeCountry": "US","rating": 1,"title": "Algorithmic abuse/manipulation","text": "Meta is now using data obtained from research through a job I applied for…","authorName": "👽🛸👾👽","authorUrl": "https://itunes.apple.com/us/reviews/id1184342001","appVersion": "443.1.0","publishedAt": "2026-08-23T11:35:50.000Z","helpfulCount": null,"developerReply": null}
The same app on Google Play, same columns:
{"id": "google_play:a2c899a2-a9f1-4921-8d2f-1d8ae09acbf7","url": "https://play.google.com/store/apps/details?id=com.instagram.android&gl=US&reviewId=a2c899a2…","store": "google_play","appId": "com.instagram.android","appName": "Instagram","storeCountry": "US","rating": 5,"title": null,"text": "Nice upload quality on Android. Hope that it will get better and better.","authorName": "Encellys","authorUrl": null,"appVersion": "443.0.0.48.82","publishedAt": "2026-08-23T13:17:51.000Z","helpfulCount": 0,"developerReply": null}
id is stable across runs and prefixed by store, so the two stores never collide and you can
deduplicate or upsert straight into your own database.
What it is good for
- ASO and release monitoring — schedule it, turn
includeSeenoff, and each run returns only reviews you haven't seen before. - Regression hunting — filter by
appVersionandmaxRatingto see what a release broke. - Competitor research — pass several apps at once and compare ratings side by side.
- Support triage —
onlyWithDeveloperReplyshows what your team already answered, and what it hasn't. - Localisation — the same app across
countriesshows where sentiment differs by market.
Notes and limits
- The App Store caps at 500 reviews per country. Add markets to
countriesto go wider. This is Apple's limit; nobody can lift it. onlyWithDeveloperReplyonly matches Google Play, because Apple does not publish developer replies at all. Combining it withstores: "app_store"returns nothing, by construction.sortByoffers the two orders both stores actually support. Apple documents more, but the others return HTTP 500, so they are not offered here rather than sold and broken.- Reviews with no date are dropped by
postedWithinDays, because claiming they are recent would misreport the filter you asked for.
Pricing
Pay per result. You are charged for reviews that actually land in your dataset — filtered out and duplicate rows cost nothing.