📱 iOS & Android App Review Scraper
Pricing
from $10.00 / 1,000 results
📱 iOS & Android App Review Scraper
Extract user reviews from both the App Store and Google Play into one dataset. Analyze recurring complaints, flag rating drift, and generate ASO summaries.
App Review Intelligence API | App Store + Google Play Summary
Scrape user reviews from both the Apple App Store and Google Play simultaneously to extract critical product feedback and mobile search visibility data. Instead of running separate workflows for iOS and Android, this app review scraper unifies both storefronts into a single executive summary row. It is designed for App Store Optimization (ASO) specialists, product managers, and growth marketers who need to schedule recurring state checks on their mobile applications. Extract highly structured data directly from the stores to track overall sentiment, analyze recurring complaint themes, and catch sudden rating drift before it impacts your organic rankings.
The web crawler bypasses the manual work of stitching two massive datasets together. Every time you run the scraper, you get a clean, actionable summary that clusters user feedback into distinct themes and provides immediate recommended actions based on real user comments. You can easily schedule daily or weekly scrapes to monitor your app's performance over time, keeping a close eye on competitor updates or new feature rollouts. The extracted details include cross-platform rating averages, flagged negative reviews, theme clusters, and direct platform warnings. Stop wasting time manually browsing store pages and instantly gather the vital user feedback you need to improve your mobile visibility.
Store Quickstart
- Start with
store-input.example.jsonfor the lowest-friction first run. - Check
sample-output.example.jsonfor the current starter proof and the exact summary row shape buyers see first. - Check
live-proof.example.jsonfor the latest live canary + contract capture on the public actor surface. - Then use
store-input.templates.jsonas the familiar Wave 1 ladder:Quickstart Baseline (Cross-Platform Summary)— smallest useful dataset run for one productRecurring Baseline (Scheduled Summary Checks)— same summary workflow tuned for repeat monitoringWebhook Routed Summary (Cross-Platform Alerts)— send the same payload into Slack, Zapier, or an internal monitor once dataset output already fitsApp Store Only Baseline/Google Play Only Baseline— actor-specific fallback lanes when only one storefront matters right now
What first success looks like
A good first run gives you:
meta.executiveSummary— one buyer-ready brief with status, cadence, reviewed platforms, and the top complaint themes.results[]— one shareable product row with rating drift, recurring complaints, praise themes, and recommended actions.reviewCoverage,warnings, andsourceFailures— explicit honesty about shallow Google Play review depth or any missing storefront signal.
Key Features
- 📱 Cross-platform baseline — Merge Apple App Store and Google Play public signals into one product row
- 🧠 Theme clustering — Group recurring complaint and praise themes into stable buckets
- 🚨 Rating drift detection — Flag sudden softness between long-term store ratings and current public review samples
- ⚠️ Honest source handling — Preserve warnings and per-platform failures instead of hiding degraded coverage
- 📡 Dataset or webhook delivery — Feed dashboards, Slack alerts, CRM tasks, or internal monitors
Use Cases
| Who | Why |
|---|---|
| Product teams | Track recurring complaint clusters after releases without stitching two stores together manually |
| ASO teams | Compare rating softness, review themes, and storefront changes across iOS and Android |
| Support / QA | Turn public review pain points into triage queues or webhook alerts |
| Market researchers | Build consistent competitor baselines from both major app stores |
Input
| Field | Type | Default | Description |
|---|---|---|---|
| productName | string | prefilled | Optional label for the monitored product. If empty, the actor uses the best store title it finds. |
| country | string | "us" | Default ISO country code for both stores. App Store lookups and review feeds use lowercase values like us, gb, jp. |
| language | string | "en_US" | Google Play language code for the public page request, for example en_US. |
| appleApp | object | prefilled | Optional App Store target. Provide {"appId":"570060128"} or {"url":"https://apps.apple.com/us/app/id570060128"}. |
| googlePlayApp | object | prefilled | Optional Google Play target. Provide {"appId":"com.duolingo"} or a full play.google.com URL. |
| reviewLimitPerPlatform | integer | 20 | Maximum reviews to analyze per platform. Google Play usually exposes about 20 public review cards without deeper paginat |
| lookbackDays | integer | 180 | Prefer reviews inside this window. If a source has no matches inside the window, the actor falls back to the public samp |
| minThemeMentions | integer | 2 | Minimum complaint mentions before a theme is treated as a real cluster instead of one-off noise. |
Input Example
{"productName": "Duolingo","country": "us","language": "en_US","appleApp": {"appId": "570060128","country": "us"},"googlePlayApp": {"appId": "com.duolingo","country": "us","language": "en_US"},"reviewLimitPerPlatform": 20,"lookbackDays": 180,"minThemeMentions": 2,"delivery": "dataset","dryRun": false}
Output
| Field | Type | Description |
|---|---|---|
meta | object | |
results | array | |
results[].productKey | string | |
results[].productName | string | |
results[].storesCovered | array | |
results[].status | string | |
results[].summary | string | |
results[].recommendedCadence | string | |
results[].reviewsAnalyzed | number | |
results[].reviewCoverage | object | |
results[].ratingDrift | object | |
results[].recommendedActions | array | |
results[].topThemes | array | |
results[].praiseThemes | array | |
results[].recurringComplaints | array | |
results[].platforms | object |
Output Example
{"meta": {"generatedAt": "2026-04-04T09:30:00.000Z","warnings": ["Google Play public HTML exposed 4 review cards in the fixture sample; deeper pagination is intentionally disabled to keep maintenance low."],"sourceFailures": [],"totals": {"products": 1,"platformsRequested": 2,"platformsSucceeded": 2,"platformsFailed": 0,"reviewsAnalyzed": 7,"recurringComplaints": 2,"complaintThemes": 4},"executiveSummary": {"overallStatus": "urgent","brief": "Duolingo is showing a softer public review sample than its long-term store ratings, with monetization and stability complaints persisting across platforms.","recommendedCadence": "daily","reviewedPlatforms": 2,"totalReviewsAnalyzed": 7,"recurringComplaintCount": 2,"topComplaintThemes": [{"id": "monetization","label": "Pricing, ads & paywall","complaintMentions": 2,"platforms": ["appStore","googlePlay"]},{"id": "stability","label": "Crashes, freezes & lost progress","complaintMentions": 2,"platforms": ["appStore","googlePlay"
Proof buyers can inspect
| Buyer question | Proof asset | What it proves |
|---|---|---|
| "Will the first run already be usable in a product or growth review?" | store-input.example.json + sample-output.example.json | The quickstart returns one summary-first row with executive summary, rating drift, theme clusters, and recommended actions. |
| "Is the public actor still working live on Apify?" | live-proof.example.json | The latest canary + contract capture passed on the public actor surface. |
| "What is the safest way to expand without changing the output shape?" | store-input.templates.json | The quickstart, recurring, webhook, and single-store fallback templates keep the same summary-first lane while widening scope. |
API Usage
Run this actor programmatically using the Apify API. Replace YOUR_API_TOKEN with your token from Apify Console → Settings → Integrations.
cURL
curl -X POST "https://api.apify.com/v2/acts/taroyamada~app-review-cross-platform-intelligence/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{ "productName": "Duolingo", "country": "us", "language": "en_US", "appleApp": { "appId": "570060128", "country": "us" }, "googlePlayApp": { "appId": "com.duolingo", "country": "us", "language": "en_US" }, "reviewLimitPerPlatform": 20, "lookbackDays": 180, "minThemeMentions": 2, "delivery": "dataset", "dryRun": false }'
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("taroyamada/app-review-cross-platform-intelligence").call(run_input={"productName": "Duolingo","country": "us","language": "en_US","appleApp": {"appId": "570060128","country": "us"},"googlePlayApp": {"appId": "com.duolingo","country": "us","language": "en_US"},"reviewLimitPerPlatform": 20,"lookbackDays": 180,"minThemeMentions": 2,"delivery": "dataset","dryRun": false})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
JavaScript / Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('taroyamada/app-review-cross-platform-intelligence').call({"productName": "Duolingo","country": "us","language": "en_US","appleApp": {"appId": "570060128","country": "us"},"googlePlayApp": {"appId": "com.duolingo","country": "us","language": "en_US"},"reviewLimitPerPlatform": 20,"lookbackDays": 180,"minThemeMentions": 2,"delivery": "dataset","dryRun": false});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Tips & Limitations
- Run weekly for trend tracking; daily for competitive launch monitoring.
- Use webhook delivery to push insights into your BI tools or marketing Slack.
- Archive results in Apify Dataset for your own historical trend analysis.
- Combine with
ai-visibility-monitor-actorfor AI-era brand surface coverage. - Start with a small watchlist, iterate on keyword precision before scaling.
FAQ
What platforms are covered?
This actor covers public Apple App Store and Google Play storefront signals only. If you want single-store runs, use the dedicated sibling actors.
Can I run only one platform?
Yes. Provide only appleApp or only googlePlayApp and the actor still returns a valid single-platform summary row.
How complete are the review samples?
They are intentionally public-surface only. Apple can expose more review rows through RSS than Google Play, while Google Play may fall back to aggregate-only coverage.
Can I send the summary somewhere else?
Yes. Keep delivery: "dataset" for inspection or switch to delivery: "webhook" to push the same summary payload into Slack, Zapier, n8n, or your own endpoint.
Related Actors
Use this actor first when you need one buyer-ready summary across iOS and Android. Add the adjacent actor only when you need the deeper layer below:
- Apple App Store Intelligence API — Add after the cross-platform baseline when the iOS team needs deeper App Store review coverage, pricing checks, or storefront-specific QA.
- Google Play Intelligence API — Add when Android launches, geo tests, or Play-only warning handling need a dedicated package / country / language watchlist.
- Shopify Store Intelligence API | Catalog & Merch Signals — Add when the same brand also sells through Shopify and you want to connect app complaints with catalog, merchandising, or launch-page changes.
- Shopify App Store Review Intelligence — Add when the company also sells software to Shopify merchants and you want to compare consumer app complaints with merchant onboarding, billing, or support complaints.
- Domain Security Audit API | SSL Expiry, DMARC & Security Headers — Add when review pain points may stem from login, billing, or checkout trust issues on the brand's owned domains.
Pricing & Cost Control
Apify Store pricing is usage-based. This actor keeps start friction low and charges the buyer-ready app summary row:
apify-actor-start: $0.00005apify-default-dataset-item: $0.015 per app summary row
The current implementation emits one dataset row per monitored app. Raw review-row pricing is reserved for a future explicit PPE event if raw review export is added.
- Start with the
Quickstart Baselineon 1 product in dataset mode while you validate summary quality. - Keep
reviewLimitPerPlatformmodest for theRecurring Baseline; raise it only when deeper complaint analysis changes decisions. - Use the single-store variants when only one storefront matters, then move to
Webhook Routed Summaryonce the downstream route is stable. - Use
dryRun: truebefore scheduled runs or webhook delivery.
⭐ Was this helpful?
If this actor saved you time, please leave a ★ rating on Apify Store. It takes 10 seconds, helps other developers discover it, and keeps updates free.
Bug report or feature request? Open an issue on the Issues tab of this actor.