App Store & Google Play Reviews Scraper, $0.10/1K avatar

App Store & Google Play Reviews Scraper, $0.10/1K

Pricing

$0.10 / 1,000 reviews

Go to Apify Store
App Store & Google Play Reviews Scraper, $0.10/1K

App Store & Google Play Reviews Scraper, $0.10/1K

Scrape App Store and Google Play reviews in one run with one schema. Each row has rating, title, text, date, app version, thumbs-up and developer reply, for many apps and countries. Filter by date and rating, and add an optional per-app summary with a rating histogram and top keywords.

Pricing

$0.10 / 1,000 reviews

Rating

0.0

(0)

Developer

Michael Lip

Michael Lip

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 hours ago

Last modified

Security

Limited permissions

Share

App Store & Google Play Reviews Scraper

Get App Store and Google Play reviews in one run and one table, at $0.10 per 1,000 reviews.

List your apps from either store, pick countries, and every review comes back with the same fields. That means rating, title, text, date, app version, helpful votes and the developer's reply. You don't need a login, an API key or a browser. In a run on 2026-11-05 the Actor saved 200 Spotify reviews (100 from each store) in 3.2 seconds.

People use it to watch their own app on both stores with one scheduled run, to track competitors across countries, to pull 1-star reviews with the rating filter, and to feed clean JSON into sentiment analysis, LLM pipelines and dashboards.

What you get

One row per review. Both stores use the same schema, so you can sort and filter them together.

FieldTypeWhat it holds
typestringreview, or summary for the optional per-app summary row
storestringappstore or googleplay
appIdstringApp Store numeric id or Google Play package name
appNamestring or nullApp name as the store shows it
countrystring2-letter country code the review was read from
langstring or nullGoogle Play language code the review was requested in. null on App Store rows, because Apple groups reviews by country
reviewIdstringStore review id. Duplicates are removed by store, app and this id
ratinginteger1 to 5 stars
titlestring or nullReview title (App Store only, Google Play reviews have no title)
textstring or nullReview text
authorstring or nullPublic display name, only when includeAuthor is on. Otherwise null
datestringISO 8601 date of the review
versionstring or nullApp version the review was written for (Google Play only)
thumbsUpinteger or nullHelpful votes (Google Play only)
developerReplyobject or null{ "text", "date" } of the developer's reply
urlstringLink to the review (Google Play) or to the app's reviews page (App Store)

Turn on includeSummary and you also get one free summary row per app with reviewCount, avgRating, ratingHistogram, developerReplyRate, oldestReviewDate, newestReviewDate and the top 15 topKeywords.

The dataset has three views (Overview, Developer replies, App summaries). Export them as JSON, CSV, Excel, XML or RSS. The key-value store record OUTPUT holds a run report with reviews fetched and saved, duplicates removed, and timings and errors per task.

Example output

These rows come from real runs on 2026-11-05 with Spotify on both stores. The first three are from one run (build 0.3.3). The summary row is from an earlier run (build 0.3.2), and its topKeywords list is cut to 5 of 15 entries here.

[
{
"type": "review",
"store": "appstore",
"appId": "324684580",
"appName": "Spotify: Music and Podcasts",
"country": "us",
"lang": null,
"reviewId": "14746997096",
"rating": 5,
"title": "Staggering difference in my music quality",
"text": "Spotify changed my life from being a decent music lover (vinyl, etc) to truly A level. The best of the best.",
"author": null,
"date": "2026-11-03T19:41:44.000Z",
"version": null,
"thumbsUp": null,
"developerReply": null,
"url": "https://apps.apple.com/us/app/id324684580?see-all=reviews"
},
{
"type": "review",
"store": "googleplay",
"appId": "com.spotify.music",
"appName": "Spotify: Music and Podcasts",
"country": "us",
"lang": "en",
"reviewId": "11985860-f84b-481a-94e9-cf09908f12aa",
"rating": 2,
"title": null,
"text": "to many ad and not letting us enjoy",
"author": null,
"date": "2026-11-04T13:13:25.622Z",
"version": null,
"thumbsUp": 0,
"developerReply": {
"text": "Hi. Thanks and we appreciate you flagging this with us. We hear you and we'll pass your feedback along to the Ads team.",
"date": "2026-11-04T16:19:32.288Z"
},
"url": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=11985860-f84b-481a-94e9-cf09908f12aa"
},
{
"type": "review",
"store": "googleplay",
"appId": "com.spotify.music",
"appName": "Spotify: Music and Podcasts",
"country": "us",
"lang": "en",
"reviewId": "1196be45-7791-40cd-94dc-54b50ef84401",
"rating": 5,
"title": null,
"text": "very good",
"author": null,
"date": "2026-11-04T18:44:02.222Z",
"version": "9.1.94.1929",
"thumbsUp": 0,
"developerReply": null,
"url": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=1196be45-7791-40cd-94dc-54b50ef84401"
},
{
"type": "summary",
"store": "appstore",
"appId": "324684580",
"appName": "Spotify: Music and Podcasts",
"countries": ["us"],
"reviewCount": 20,
"avgRating": 3.9,
"ratingHistogram": { "1": 3, "2": 2, "3": 2, "4": 0, "5": 13 },
"developerReplyRate": 0,
"oldestReviewDate": "2026-11-03T18:33:28.000Z",
"newestReviewDate": "2026-11-03T19:41:44.000Z",
"topKeywords": [
{ "keyword": "music", "count": 8 },
{ "keyword": "spotify", "count": 5 },
{ "keyword": "ads", "count": 3 },
{ "keyword": "better", "count": 3 },
{ "keyword": "love", "count": 3 }
]
}
]

Pricing

You pay per review saved. There is no start fee and no monthly fee.

EventPriceWhen it's charged
Review$0.0001 per review ($0.10 per 1,000)Once per review row saved to the dataset, after the rating and date filters and duplicate removal

What runs cost.

RunReviews savedCost
The prefilled first run (2 apps, US, 50 each)100$0.01
1,000 reviews of one app1,000$0.10
5 apps x 4 countries x 500 reviewsup to 10,000up to $1.00
Daily monitor, 1 app, sinceDate: "3 days", 30 runs that save about 90 reviews each (about 30 new reviews a day, each one saved in 3 runs)about 2,700about $0.27 a month

Summary rows are free. Apps that aren't found and reviews dropped by your filters or as duplicates save no review rows, so they cost nothing. A task that fails before its first page also costs nothing. If it fails later, the reviews it saved before the error are kept and charged. You can set a maximum cost per run in the run options (maxTotalChargeUsd in the API). When the budget runs out, the Actor stops saving, keeps what it already saved, and says so in the status message.

Quick start

  1. Open the Input tab. Two Spotify apps (one per store) and the US are already filled in.
  2. Click Start. The run takes a few seconds and costs about $0.01.
  3. Open the Output tab, or export the dataset as CSV or Excel.

Then replace the apps with your own. Paste store URLs, App Store ids or Google Play package names, one per line.

Use it from the API

Run the Actor and get the reviews back in one HTTP call.

curl -X POST "https://api.apify.com/v2/acts/zovo-one~app-store-google-play-reviews/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"apps": ["324684580", "com.spotify.music"],
"countries": ["us"],
"maxReviewsPerApp": 100,
"sort": "newest",
"maxRating": 2
}'

The sync endpoint waits up to 300 seconds. For bigger runs, start the run with /runs and read the dataset when it finishes.

Use it from Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("zovo-one/app-store-google-play-reviews").call(run_input={
"apps": [
"https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
"com.spotify.music",
],
"countries": ["us", "gb"],
"maxReviewsPerApp": 200,
"sinceDate": "30 days",
"includeSummary": True,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
if item["type"] == "review":
print(item["store"], item["rating"], item["text"])

Install the client with pip install apify-client.

Use it from Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('zovo-one/app-store-google-play-reviews').call({
apps: ['324684580', 'com.spotify.music'],
countries: ['us'],
maxReviewsPerApp: 100,
minRating: 1,
maxRating: 1,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`${items.length} one-star reviews`);

Install the client with npm install apify-client.

Use it from AI agents (MCP)

The Apify MCP server at mcp.apify.com exposes this Actor as a tool to Claude, Cursor, VS Code and other MCP clients. Each client adds servers in its own way. VS Code and Claude Desktop, for example, don't take the JSON below as written. For your client, open the MCP configurator, pick this Actor and copy the setup it gives you. A client that reads an mcpServers block with a url key, such as Cursor, can use this config.

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=zovo-one/app-store-google-play-reviews"
}
}
}

On first connect your browser opens so you can sign in to Apify. You can also skip OAuth and send your token as an Authorization: Bearer <APIFY_TOKEN> header. Without the tools parameter, an agent can still find the Actor with search-actors, run it with call-actor, and read the rows with get-dataset-items.

An example prompt.

Get the 200 newest 1 and 2 star reviews of Spotify from the US App Store and Google Play,
then group the complaints into themes and count them.

Input

The Console form explains every field. These are the ones you'll touch most.

FieldDefaultWhat it does
appsrequiredApp Store URL, numeric id or id324684580, Google Play URL or package name. Mix both stores
countriesURL country, else us2-letter codes, up to 50. uk is read as gb
languages["en"]Google Play languages, up to 20 (en, de, pt-br, es-419). The App Store ignores it
maxReviewsPerApp100Max reviews saved per app and country (and language on Google Play), up to 20,000
sortnewestnewest or helpful
sinceDatenone2026-10-01, an ISO timestamp with a time zone, or 7 days, 2 weeks, 3 months
minRating, maxRating1, 5Star filter
includeSummaryfalseOne free summary row per app
includeAuthorfalseAdds the reviewer's public display name
maxConcurrency3App and country tasks in parallel, 1 to 4

Limits

Per run you can ask for up to 200 apps, 50 countries and 20 languages, and at most 2,000 app x country (x language on Google Play) tasks. maxReviewsPerApp goes up to 20,000.

  • The App Store API returns 20 reviews per request and the Actor pages up to offset 20,000. In our tests that ran at about 1,000 to 3,000 reviews a minute per task, so 20,000 App Store reviews for one app and country take about 7 to 20 minutes. For a large app (Facebook, US) we paged past 10,000 reviews, about 2.5 months back. Google Play returns up to 150 reviews per request.
  • The stores can't filter by stars. With a rating filter, each task reads at most 10 × maxReviewsPerApp reviews (never more than 20,000) and drops the rest. If the rating you want is rare, a task can stop there with fewer reviews saved, and OUTPUT shows readLimitReached: true for it. In one test (3-star only, max 200) each task read 2,000 and saved 93 on Google Play and 140 on the App Store.
  • Big runs need a longer timeout. When the run timeout is near, the Actor stops reading, writes the summaries and OUTPUT, and keeps everything saved so far.
  • Each request has a 30 second timeout and up to 4 retries with backoff on HTTP 429 and 5xx. Google Play calls start at least 250 ms apart. The Actor has no proxy option.

If every task of one store fails for a reason other than "app not found", the run ends as failed with the first error in the status message, and the other store's reviews stay in the dataset. Neither store publishes star-only ratings (no text) as reviews, so they aren't included. The stores can also change their public endpoints without notice. If a run breaks, open an issue on the Issues tab.

FAQ

A second country adds few Google Play reviews

Google Play shows mostly the same reviews in every country for one language. The Actor removes duplicates, so you don't pay twice, and country is the first country where the review turned up. For more distinct Google Play reviews, add languages (["en", "de", "fr"]) instead of countries. App Store reviews are different in each country.

How do I collect only new reviews every day?

Both stores show new reviews 1 to 2 days late, so sinceDate: "1 day" usually returns nothing. Schedule a daily run with sort: "newest" and sinceDate: "3 days", then drop reviewId values you already have. Reading stops as soon as older reviews start, so the run is short. Each review can show up in up to three daily runs and is charged each time it's saved, because the Actor doesn't remember reviews between runs.

Empty version and thumbsUp on App Store rows

Apple's public review data has no app version and no helpful votes. Google Play has both.

App Store apps by name

Not yet. Use the apps.apple.com URL or the numeric id. For Google Play, use the URL or the package name (com.example.app).

Restarts and migrations

The Actor rebuilds its state from the dataset. Reviews already saved aren't saved or charged again.

The Actor reads only reviews that anyone can see on apps.apple.com and play.google.com without logging in. It doesn't log in or collect private data. Reviewer names are left out unless you turn on includeAuthor, and profile pictures and user ids are never collected. You're responsible for using the data in line with the stores' terms, copyright and data protection law such as the GDPR.

Changelog

  • 0.3. Stricter input checks, a clear "no storefront" error for App Store countries without one, a stop shortly before the run timeout that still writes summaries and OUTPUT, and read-limit flags for rating filters.
  • 0.2. No hangs after Google Play errors, store failures reported instead of empty results, restart-safe charging, and the app URL's country used when countries is empty.
  • 0.1. First release with both stores in one run, one schema, developer replies, date and rating filters, duplicate removal and summary rows.