App Reviews Scraper avatar

App Reviews Scraper

Pricing

from $0.30 / 1,000 results

Go to Apify Store
App Reviews Scraper

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

Juan ignacio Veltri

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

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 StoreGoogle 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 available500 per countryUnlimited, 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

FieldTypeDefaultDescription
appsarrayexample appStore URL, Apple numeric ID, Android bundle, or app name
storesselectbothboth, app_store, google_play
countriesarray["US"]Markets to read. Reviews are per country, not global
sortByselectmost_recentmost_recent or most_helpful
maxItemsinteger500Total cap for the run. 0 = no cap
maxReviewsPerAppinteger0Cap per app and market, so one big app can't eat the run
minRating / maxRatingintegerKeep only reviews within a star range
keywordsarrayOnly reviews mentioning any of these, in title or text
postedWithinDaysintegerOnly reviews newer than N days
onlyWithTextbooleanfalseDrop ratings with nothing written
onlyWithDeveloperReplybooleanfalseOnly reviews the developer answered (Google Play only)
includeSeenbooleantrueTurn off to skip reviews returned by previous runs
maxConcurrencyinteger5Parallel requests
maxRequestsPerMinuteinteger120Rate ceiling
maxRequestRetriesinteger3Retries 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 includeSeen off, and each run returns only reviews you haven't seen before.
  • Regression hunting — filter by appVersion and maxRating to see what a release broke.
  • Competitor research — pass several apps at once and compare ratings side by side.
  • Support triageonlyWithDeveloperReply shows what your team already answered, and what it hasn't.
  • Localisation — the same app across countries shows where sentiment differs by market.

Notes and limits

  • The App Store caps at 500 reviews per country. Add markets to countries to go wider. This is Apple's limit; nobody can lift it.
  • onlyWithDeveloperReply only matches Google Play, because Apple does not publish developer replies at all. Combining it with stores: "app_store" returns nothing, by construction.
  • sortBy offers 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.