App Store & Google Play Reviews Scraper avatar

App Store & Google Play Reviews Scraper

Pricing

from $1.50 / 1,000 app checks

Go to Apify Store
App Store & Google Play Reviews Scraper

App Store & Google Play Reviews Scraper

Scrape and monitor App Store and Google Play reviews, ratings and 1-5 star histograms for any apps and countries. Only-new-reviews mode.

Pricing

from $1.50 / 1,000 app checks

Rating

0.0

(0)

Developer

Lighthouse Data

Lighthouse Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Get App Store and Google Play reviews, ratings and 1–5★ rating histograms for any list of apps and countries, in one run and one clean table. Turn on monitor mode and schedule it to get only the reviews that are new since the last run, plus how each app's rating changed. No login, no API keys, no browser.

What does App Store & Google Play Reviews Scraper do?

  • Both stores, one schema. Mix App Store IDs or URLs with Google Play package names or URLs in the same input. Every review has the same fields whichever store it came from: rating, title, text, appVersion, reviewedAt, developerReplyText, and more.
  • Deep App Store history. Goes well past the 500-reviews-per-country limit of Apple's RSS feed. Tested at 600+ per country in our smoke tests, with thousands available for popular apps.
  • Rating snapshot for every app and country. You get the average rating, rating count, the full 1★–5★ histogram, version, price, installs (Google Play), top-chart position (App Store) and changes since the last run.
  • Rating trend. Each snapshot compares the reviews delivered in this run with the app's overall rating: newReviewsCount, newReviewsAverageRating and ratingDelta. In monitor mode that means "are this week's new reviews better or worse than the app's average?"
  • Monitor mode. The Actor remembers which reviews it already returned and saves only new ones on each run. You pay only for new reviews.
  • Multi-country and multi-language. For example, us, gb, de and jp on the App Store, and English, German and Japanese reviews on Google Play.
  • Filters. Sort by newest or most relevant, only reviews since a date (e.g. 7 days), only certain star ratings (e.g. 1–2★ for alerts), and ratings-only mode.
  • Privacy controls. Keep reviewer nicknames as the store shows them, hash them, or omit them. Account IDs and profile photos are never collected.

Why use it?

  • Both stores, one schema. App Store and Google Play reviews land in one table with the same fields, ready to chart, filter or feed to an LLM.
  • Built for scheduled monitoring. Re-downloading the same 500 reviews every day wastes money and forces you to deduplicate. Monitor mode returns only what's new, with rating deltas, so a daily run of a quiet app costs about half a cent.
  • Reliable. It uses the stores' own public JSON endpoints, with automatic retries and rate-limit backoff. If a store keeps rate-limiting a run that has no proxy, the affected apps switch to the Apify datacenter proxy for their remaining pages. If Apple's web endpoint is unavailable, it falls back to Apple's RSS feed. Apps that can't be found are reported, not silently skipped.
  • Easy to recover. Every run reports how complete it was, and saves a ready-to-run FAILED_INPUT with just the apps and countries that failed.
  • Predictable price. You pay a small fee per app checked and per review saved, and you can cap the total cost of any run.

Use cases

  • ASO agencies and consultants: track clients' and competitors' ratings, rating mix and review volume across countries every week.
  • Product teams: after each release, get every new 1–2★ review with the app version it mentions, to spot regressions fast.
  • Customer-experience and support teams: send a daily feed of new reviews to Slack, a helpdesk or a spreadsheet via Apify integrations, and see which ones already have a developer reply.
  • Market research and AI pipelines: build normalized review datasets across apps and stores for sentiment analysis, topic modelling or LLM summarization.

How to use it

  1. Click Try for free.
  2. In Apps, paste App Store and/or Google Play links, IDs or package names, for example https://apps.apple.com/us/app/slack/id618783545 and com.Slack.
  3. Choose Countries (and Languages for Google Play), and how many reviews per app you want.
  4. Click Start. Download the results as JSON, CSV or Excel, or read them through the API. The Reviews and App snapshots tabs show the two record types.

Example input:

{
"apps": ["https://apps.apple.com/us/app/slack/id618783545", "com.Slack"],
"countries": ["us", "gb"],
"languages": ["en"],
"maxReviewsPerApp": 200,
"sinceDate": "30 days",
"mode": "scrape"
}

Schedule it: new reviews every day (monitor mode)

  1. Set Mode to Monitor: only new reviews since the last run. Give the Monitor state store name a name that is unique to this monitor, for example acme-apps.
  2. Save the input as a task and add a schedule, for example daily at 07:00 (0 7 * * *).
  3. Optional: connect an integration (Slack, email, Google Sheets, Zapier, Make or a webhook) to receive each run's new reviews.
{
"apps": ["618783545", "com.Slack", "com.microsoft.teams"],
"countries": ["us", "gb", "de"],
"languages": ["en", "de"],
"mode": "monitor",
"maxReviewsPerApp": 500,
"ratings": ["1", "2"],
"monitorStateStore": "acme-apps"
}
  • The first monitor run saves the latest reviews as a baseline.
  • Every later run saves only reviews it has not returned before, plus one snapshot per app and country with newReviews, ratingChange, ratingCountChange and previousSnapshotAt.
  • The snapshot's newReviewsAverageRating is the average of the new reviews only, and ratingDelta compares it with the app's overall rating. A ratingDelta of -1.2 means the new reviews are 1.2 stars worse than the app's average: an early warning before the overall rating moves.
  • Rating history: collect the App snapshots view across runs, or set Include reviews to off for a ratings-only tracker.

Use it from AI agents, MCP and the API

  • The Actor works well as a tool for AI agents through the Apify MCP server: every input and output field is described in the schema.
  • Call it synchronously from code with POST https://api.apify.com/v2/acts/<username>~app-reviews-monitor/run-sync-get-dataset-items, using the input above as the JSON body.
  • To get one record type, filter on recordType (review or appSnapshot).

Input

FieldTypeDescriptionExample
appsarray of stringsRequired. App Store IDs/URLs and Google Play package names/URLs, mixed freely. The store is detected automatically["618783545", "com.Slack"]
countriesarray of stringsTwo-letter store countries. Every app is checked in each one. Default ["us"]["us", "gb", "de"]
languagesarray of stringsGoogle Play review languages (each Google Play app is checked per country × language). Ignored by the App Store. Default ["en"]["en", "es"]
maxReviewsPerAppintegerMax reviews per app × country (× language). 0 = no limit. Default 100500
sinceDatestringOnly reviews posted on or after this date. Absolute or relative"2026-09-01", "7 days"
modescrape | monitormonitor saves only reviews that are new since the last run. Default scrape"monitor"
includeReviewsbooleanOff = rating snapshots only. Default truefalse
sortBynewest | mostRelevantReview order. Monitor mode needs newest. Default newest"mostRelevant"
ratingsarray of "1"–"5"Only these star ratings. Empty = all["1", "2"]
reviewerNameskeep | hash | omitHow to output reviewer nicknames. Default keep"hash"
monitorStateStorestringNamed key-value store that holds monitor state. Use one per monitor. Default app-reviews-monitor-state"acme-apps"
proxyConfigurationobjectOptional Apify proxy. Usually not needed{ "useApifyProxy": true }

Output

See real output: 42 records from a real run (JSON). This is the default apps (Slack on both stores), 20 reviews each, reviewer names omitted, run on 2026-10-06 with build 1.0.12.

The dataset holds two record types, told apart by recordType. Each has its own view in the Console.

Review (recordType: "review"):

{
"recordType": "review",
"store": "appStore",
"appId": "618783545",
"appName": "Slack",
"country": "us",
"language": null,
"reviewId": "14601776949",
"rating": 3,
"title": "Slack tries to do everything and in the end does nothing well",
"text": "Too many options, too many ways to organize things, it gets confusing and easy to lose new messages once they are read.",
"reviewerName": "Reviewer nickname",
"appVersion": "26.09.40",
"reviewedAt": "2026-09-28T02:09:48.000Z",
"isEdited": false,
"helpfulCount": 0,
"voteCount": 0,
"developerReplyText": null,
"developerRepliedAt": null,
"isComplete": true,
"url": "https://apps.apple.com/us/app/id618783545?see-all=reviews",
"scrapedAt": "2026-09-29T21:11:31.941Z"
}

App snapshot (recordType: "appSnapshot"), one per app × country (× language). This one is from a scheduled monitor-mode run:

{
"recordType": "appSnapshot",
"status": "ok",
"errorMessage": null,
"store": "googlePlay",
"appId": "com.Slack",
"appName": "Slack",
"country": "us",
"language": "en",
"developer": "SLACK TECHNOLOGIES L.L.C.",
"genre": "Business",
"price": 0,
"currency": "USD",
"version": "26.09.41.0",
"appUpdatedAt": "2026-09-28T22:01:20.000Z",
"rating": 4.64539,
"ratingCount": 218972,
"reviewCount": 7803,
"stars1Count": 10162,
"stars2Count": 2913,
"stars3Count": 5111,
"stars4Count": 17741,
"stars5Count": 183018,
"installs": "50,000,000+",
"minInstalls": 50000000,
"chartPosition": null,
"chartName": null,
"iconUrl": "https://play-lh.googleusercontent.com/C9w-zv2PzpS-Rr9L8PUveRfv36lfYiB2kPKiEy45ucveIYMCoUW1nKQls5VxXSJyUsNxC_s7nFqpIAbqlLbSKA",
"reviewsCollected": 3,
"newReviews": 3,
"previousRating": 4.6465545,
"ratingChange": -0.00116,
"previousRatingCount": 218972,
"ratingCountChange": 0,
"previousSnapshotAt": "2026-09-29T21:36:49.486Z",
"newReviewsCount": 3,
"newReviewsAverageRating": 3.67,
"ratingDelta": -0.98,
"isComplete": true,
"url": "https://play.google.com/store/apps/details?id=com.Slack&hl=en&gl=us",
"scrapedAt": "2026-09-29T21:37:40.112Z"
}

Field notes:

  • All dates are ISO-8601 UTC. A missing value is null, never an empty string.
  • status is ok, notFound (the app doesn't exist, isn't sold in that country, or was removed) or error (with errorMessage).
  • Some fields exist only on one store:
    • title, isEdited and voteCount: App Store only.
    • reviewCount, installs and minInstalls: Google Play only.
    • chartPosition: App Store only, when the app is charted.
  • On the App Store, appVersion is available for roughly the 500 most recent reviews per country.
  • Every record has isComplete. It is false when the record's core value could not be read: a snapshot whose app data could not be fetched (status notFound or error without app data), or a review without a valid star rating. A review with stars but no text is a normal, complete review.
  • newReviewsCount, newReviewsAverageRating and ratingDelta cover the reviews delivered in this run (monitor mode: the new ones). With a star-rating filter they cover the filtered reviews only. They are null when reviews are turned off; the average and delta are null when no review was delivered.

Run summary and rerun input

The key-value store holds a SUMMARY record with the counts of apps checked, not found and failed, reviews saved, and a completeness object. The unit is one app in one country (and one language on Google Play):

{ "unit": "apps", "requested": 6, "delivered": 5, "incomplete": 0, "failed": 1, "ratio": 0.83 }
  • delivered: app data and every requested review were collected.
  • incomplete: the app data could not be fetched (a store error after all retries), or its reviews stopped part-way (a store error, or the maximum cost per run).
  • failed: the app was not found, or it was not checked because the maximum cost per run was reached.

When anything is incomplete or failed, the run also saves FAILED_INPUT: your original input with every setting kept and apps, countries (and Google Play languages) reduced to the ones that need another try. Paste it as the input of a new run to retry just those. When different apps failed in different countries, the rerun covers all combinations of those apps and countries. In monitor mode, the rerun uses the same state store, so nothing is repeated. A run with some failures still succeeds; the status message says how many apps were complete.

Pricing

This Actor uses pay-per-event pricing. You pay only for what you get:

EventPriceWhen
Actor start$0.003Once per run
App check$0.002Per app × country (× language) checked: details, rating, 1–5★ histogram and changes since last run. Not charged if the app is not found or its data could not be fetched
Review$0.0001Per review saved ($0.10 per 1,000). In monitor mode only new reviews are saved and charged. Not charged if it has no valid star rating

What counts as complete. You pay only for complete records:

  • An app check is complete when the app's data (rating, rating count, details) was fetched. A snapshot with status: "notFound", or an error snapshot without app data, has isComplete: false and is free. If the reviews stop part-way after the app data was fetched, the app check is still charged (you get the rating snapshot), the reviews saved so far are charged, and the app goes into FAILED_INPUT so you can fetch the rest.
  • A review is complete when it has a 1–5 star rating; a rating without text is a real review. A review with no valid star rating is saved with isComplete: false and is free.

Higher Apify subscription plans get lower per-event prices, shown on the Pricing tab.

Cost examples:

  • Default input (Slack on both stores, us, 20 reviews each): $0.003 + 2 × $0.002 + 40 × $0.0001 = $0.011.
  • Bulk pull: 5 apps × 1 country × 1,000 reviews = $0.003 + $0.01 + $0.50 = $0.51.
  • Daily monitor of 10 app listings with about 10 new reviews each per day:
    • Per run: $0.003 + $0.02 + $0.01 = $0.033.
    • Per month: about $1.00.

To cap the cost of a run, set Maximum cost per run in the run options. The Actor stops cleanly at that limit and tells you what it skipped.

New to Apify? The free plan's monthly credit covers thousands of reviews.

Ready-made tasks

One-click examples with the input already filled in. Open one, adjust it and run:

Use it from an AI agent (MCP)

AI agents can run this Actor through Apify's MCP server. Add this server to Claude, Cursor, VS Code or any MCP client:

{
"mcpServers": {
"apify": { "url": "https://mcp.apify.com?tools=cylindrical_lighthouse/app-reviews-monitor" }
}
}

You sign in to Apify in the browser on first use, or you can send the header Authorization: Bearer <APIFY_TOKEN>. VS Code's mcp.json names the top-level key servers instead of mcpServers. With the Apify CLI you can also run apify mcp install cursor (other clients are supported). Then just ask, for example: "Summarise this week's 1- and 2-star reviews of Slack on the App Store and Google Play".

Integrations

  • Make, Zapier and n8n: use the Apify app or node, choose Run an Actor and pick cylindrical_lighthouse/app-reviews-monitor, then send the dataset to Google Sheets, Airtable, Slack or a database.
  • Google Drive and webhooks: in the Actor's Integrations tab, upload each run's results to a Drive folder or call your own URL when a run finishes.
  • Schedules: in Apify Console, go to Schedules, then Create new, and pick this Actor or one of its saved tasks to follow app reviews and ratings automatically.
  • API: POST https://api.apify.com/v2/acts/cylindrical_lighthouse~app-reviews-monitor/run-sync-get-dataset-items?token=<APIFY_TOKEN> runs it and returns the results in one call.

From the same publisher:

FAQ

Is it legal to scrape app reviews? This Actor extracts only publicly available data: reviews and app details that anyone can see in the stores without logging in. It does not extract private user data. Your results may still contain personal data, which is protected by GDPR and other regulations. Do not scrape personal data unless you have a legitimate reason. If you are unsure, consult your lawyers. You can read the basics of ethical web scraping in Is web scraping legal?

What personal data does it collect? Only the reviewer's public nickname as the store displays it, and you can set Reviewer names to hash or omit. It never collects reviewer account IDs, profile photos, profile links or emails. Monitor state stores only review IDs and dates.

How many reviews can I get?

  • Google Play: as many as the store lists for that language (tens of thousands for popular apps).
  • App Store: each country's reviews separately, well beyond the 500 per country of Apple's RSS feed.
  • Big pulls: add more countries to get more App Store reviews.

Why do Google Play results depend on language, and App Store results on country? Google Play groups written reviews by language. Apple keeps a separate review list for each country's store. The input follows how each store works.

What happens if an app ID is wrong, or the app isn't available in a country?

  • You get an appSnapshot with status: "notFound" and an explanation, and it is not charged.
  • The run still succeeds for the other apps.
  • If no app can be found, the run fails with a clear message so you notice.

Does monitor mode ever miss or repeat reviews?

  • Each run re-checks the last 24 hours and remembers up to 10,000 review IDs per app and country, so reviews that the store publishes late are still caught and nothing is repeated.
  • If more than maxReviewsPerApp new reviews arrive between two runs, only the newest ones are returned. Raise the limit or run more often.

Can I run several monitors? Yes. Give each one its own Monitor state store name.

Limitations

  • App Store:
    • appVersion, helpfulCount and voteCount come from Apple's RSS feed, which covers only about the 500 most recent reviews per country. Older reviews have these as null.
    • The Most relevant sort has no app version.
    • Apple doesn't expose review languages, so language is null for App Store records.
  • Google Play:
    • Reviews have no title.
    • The review date is the date of the latest edit.
    • Country has little effect on which reviews are returned; language decides that.
  • Large pulls: App Store reviews come 20 per request, and the Actor backs off automatically when Apple rate-limits (honouring Retry-After, otherwise exponential backoff of up to 30 s, with at most 3 minutes of waiting per app). If the run has no proxy and the rate limit persists, the affected app switches to the Apify datacenter proxy; if that still fails, the app is reported as incomplete and goes into FAILED_INPUT. A pull of 1,000 App Store reviews plus 1,000 Google Play reviews took 12 s in our tests; very large pulls (tens of thousands per country) take proportionally longer.
  • Not supported: search by keyword, top charts, and in-app purchase details.
  • Undocumented endpoints: the stores can change their internal endpoints at any time. We run automated daily checks and fix breakages quickly.

Changelog

See ./CHANGELOG.md for all changes.

Support

Found a bug or need a feature? Open an issue on the Issues tab. We respond within 48 hours. For custom solutions, such as more stores, alerts or dashboards, contact us through the same tab.

Did this Actor save you time? A short review on the Store helps other people find it and tells us what to improve. If something didn't work, please open an issue first, so we can fix it for you.