Hay EquiposPull public reviews for iOS and Android apps into one table with the same columns for both stores, no login and no API key.
After a release, the fastest signal on what broke is the review section. But Apple and Google show reviews in different places, with different fields, and neither gives you a simple export. If you look after an app on both platforms, or watch competitor apps, you end up reading two stores by hand.
The App Store and Google Play Reviews Scraper, published by Hay Equipos on the Apify Store, pulls public reviews from both stores in one run and returns them in one identical table. You paste app IDs or store links, choose a country and a sort order, and get ratings, review text, app versions, dates, helpful votes and, for Google Play, developer replies.
One row per review, with the same fields for both stores (illustrative values):
{
"store": "google",
"appId": "com.example.notes",
"appName": "Example Notes",
"country": "us",
"language": "en",
"reviewId": "0f3c2a10-1111-2222-3333-444455556666",
"rating": 2,
"title": null,
"text": "Sync stopped working after the last update.",
"appVersion": "4.12.0",
"reviewedAt": "2026-09-20T14:02:11.000Z",
"helpfulVotes": 7,
"developerReply": "Thanks, a fix is rolling out this week.",
"developerRepliedAt": "2026-09-21T09:30:00.000Z",
"reviewUrl": "https://play.google.com/store/apps/details?id=com.example.notes&reviewId=0f3c2a10-1111-2222-3333-444455556666"
}
As a table, a few rows might look like this:
| store | appName | rating | appVersion | reviewedAt | text |
|---|---|---|---|---|---|
| apple | Example Notes | 5 | 4.12.0 | 22 Sep 2026 | Best notes app I have used |
| apple | Example Notes | 1 | 4.12.0 | 21 Sep 2026 | Crashes on launch |
| Example Notes | 2 | 4.12.0 | 20 Sep 2026 | Sync stopped working |
Reviewer names are removed by default. A SUMMARY record in the key value store lists reviews per app and any error per app.
com.example.notes, or a Google Play link. You can mix both stores.us). Apple keeps separate reviews for each country store.en). Apple ignores this.curl:
curl -X POST \
"https://api.apify.com/v2/acts/pistachio_implementation~app-store-google-play-reviews/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"apps": ["310633997", "com.whatsapp"], "country": "us", "maxReviewsPerApp": 50, "sort": "newest"}'
Python with apify-client:
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("pistachio_implementation/app-store-google-play-reviews").call(
run_input={
"apps": [
"https://apps.apple.com/us/app/whatsapp-messenger/id310633997",
"https://play.google.com/store/apps/details?id=com.whatsapp",
],
"country": "us",
"language": "en",
"maxReviewsPerApp": 200,
"sort": "newest",
}
)
for review in client.dataset(run["defaultDatasetId"]).iterate_items():
print(review["store"], review["rating"], review["appVersion"], (review["text"] or "")[:80])
To monitor new reviews every day, save the input as a task, add a schedule, use the newest sort with a modest cap, and remove duplicates by reviewId on your side.
Pay per event: $0.0004 per review saved to your dataset, which is $0.40 per 1,000 reviews. Apps that fail or return nothing are not charged. You can set a maximum charge for a run and the actor stops when it is reached.
reviewUrl points to the app's reviews page, not to the single review.Please use the review data in line with Apple's and Google's terms, and treat any reviewer names you choose to collect as personal data.
Try it on the Apify Store: https://apify.com/pistachio_implementation/app-store-google-play-reviews