App Store & Google Play Reviews Scraper + Sentiment Analysis avatar

App Store & Google Play Reviews Scraper + Sentiment Analysis

Pricing

from $0.14 / 1,000 reviews

Go to Apify Store
App Store & Google Play Reviews Scraper + Sentiment Analysis

App Store & Google Play Reviews Scraper + Sentiment Analysis

Scrape iOS App Store and Google Play reviews, then get what the reviews actually mean: sentiment per review, complaints ranked by how much they hurt, which release broke things, and a topic-by-topic comparison against competitor apps. Works in 6 languages. No login, no API key.

Pricing

from $0.14 / 1,000 reviews

Rating

0.0

(0)

Developer

Luis Segura

Luis Segura

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

App Store & Google Play Reviews — Sentiment, Topics & Competitor Comparison

Scrape iOS and Android reviews and find out what they actually mean: which complaint is costing you the most, which release broke things, and where competitors beat you — topic by topic.

No login. No API key. No cookies. No headless browser.


Why this one and not a plain review scraper

Most review scrapers hand you rows of text and stop there. Then you paste 2,000 reviews into a spreadsheet and read them yourself.

This one does the reading:

Plain scrapersThis actor
Raw reviews
Sentiment per review
Topic detection (18 categories)
Complaints ranked by impact
Which release broke things
Month-over-month trend
Head-to-head vs competitors
Non-English reviews scored correctly✅ 6 languages

What You Get

Three kinds of row in one dataset.

1. review — one per review

FieldDescription
platformios or android
appId, appName, storeUrlWhich app
countryStorefront the review came from
reviewId, userName, urlIdentity
dateYYYY-MM-DD — present on both stores in practice
rating1–5 stars
title, textThe review itself
versionApp version the review was left on
thumbsUpHelpful votes
developerReplyDeveloper's response (Google Play only)
sentimentScore−5 to +5
sentimentLabelpositive / negative / neutral / mixed
sentimentTopicse.g. ["crashes_bugs","ads"]
sentimentLangLanguage used to score it
sentimentSourcetext (measured from the words) or rating (derived from the stars)

2. app_summary — one per app

FieldDescription
storeRating, storeRatingCountLifetime store numbers
sampleAvgRating, avgSentiment, negativePctThe scraped sample
ratingDistributionReviews per star, 1–5
topComplaintsRanked by pain, not by frequency — with verbatim quotes
topPraiseWhat people love, for your store listing copy
topTopicsAll topics with mentions, %, sentiment and avg stars
byVersionPer release: reviews, stars, sentiment, % negative, top complaint
byMonthSame, month by month
worstVersionThe release that's clearly worse than your own baseline

3. comparison — one row when you pass 2+ apps

FieldDescription
appsEvery app's rating, sentiment and % negative side by side
byTopicPer topic: each app's mentions and sentiment, plus bestApp / worstApp
weaknessesVsCompetitorsTopics where you trail the best competitor, with the gap
strengthsVsCompetitorsTopics where you lead

The first app you list is treated as yours. Everything after it is a competitor.


Topics detected

crashes_bugs · performance_speed · ui_ux_design · pricing_subscription · ads · login_account · customer_support · features_missing · updates_regression · privacy_security · notifications · battery_data · content_quality · onboarding · gamification_rewards · brand_controversy · content_moderation · effectiveness_results

The last four were added after analyzing 1,000 live reviews and finding they were the biggest uncovered clusters — engagement mechanics (streaks, energy, lives), reputation events and review-bombing, audience-appropriateness, and whether the product actually delivers its promised outcome.


How to Use It

Audit your own app

{
"appleAppIds": ["https://apps.apple.com/us/app/my-app/id123456789"],
"googleAppIds": ["com.mycompany.myapp"],
"countries": ["us", "gb"],
"maxReviewsPerApp": 500
}

Find what to fix first — angry reviews only

{
"googleAppIds": ["com.mycompany.myapp"],
"minRating": 1,
"maxRating": 2,
"maxReviewsPerApp": 300
}

Read topComplaints[0] in the summary row. That's your sprint.

Beat your competitors

{
"appleAppIds": ["id111111111", "id222222222", "id333333333"],
"maxReviewsPerApp": 400,
"compareApps": true
}

weaknessesVsCompetitors tells you exactly where you lose and to whom.

Scan a category you're thinking of entering

{
"searchTerm": "habit tracker",
"searchPlatform": "both",
"maxAppsFromSearch": 4,
"maxReviewsPerApp": 200
}

Every app's top complaints in one run — that's your product gap analysis.

Go international

{
"googleAppIds": ["com.mycompany.myapp"],
"countries": ["us", "es", "br", "de", "fr", "it"],
"maxReviewsPerApp": 1200
}

Reviews are scored in their own language, so a Spanish 1-star reads as negative — not as noise.


Sample Output

An app_summary row, trimmed:

{
"type": "app_summary",
"platform": "ios",
"appName": "My App",
"storeRating": 3.1,
"storeRatingCount": 5200,
"reviewsAnalyzed": 400,
"sampleAvgRating": 2.6,
"negativePct": 60,
"worstVersion": "4.0.0",
"topComplaints": [
{
"topic": "crashes_bugs",
"mentions": 240,
"mentionPct": 60,
"avgSentiment": -4,
"avgRating": 1.1,
"negativeMentions": 236,
"painScore": 468.2,
"sampleComplaints": [
"Since the update it crashes every time I open it.",
"Crashes on launch, completely unusable now."
]
}
],
"byVersion": [
{ "version": "4.0.0", "reviews": 240, "avgRating": 1.0, "negativePct": 100, "topComplaint": "crashes_bugs" },
{ "version": "3.2.0", "reviews": 160, "avgRating": 5.0, "negativePct": 0, "topComplaint": null }
]
}

A comparison row, trimmed:

{
"type": "comparison",
"weaknessesVsCompetitors": [
{ "topic": "crashes_bugs", "gap": -5.0, "bestApp": "Rival App" },
{ "topic": "customer_support", "gap": -1.4, "bestApp": "Rival App" }
],
"strengthsVsCompetitors": [
{ "topic": "pricing_subscription", "gap": 0.9, "nextBestApp": "Rival App" }
]
}

Use Cases

  • Product managers — what to fix first, backed by counts instead of the loudest tweet
  • Release triageworstVersion tells you which build regressed, before the rating tanks
  • ASO / marketingtopPraise is your store-listing copy, in your users' own words
  • Competitive research — where rivals are beaten, and on which topic
  • Due diligence — sentiment trend of an app you're about to acquire or invest in
  • Support teams — recurring complaints, ranked, with verbatim quotes

Pricing & Cost

Pay per event. You pay for what you pull, not for compute time.

EventPrice
Actor start$0.00005
Review scraped$0.0002 ($0.20 per 1,000 reviews)
App intelligence report$0.03 per app
Competitor comparison$0.05 per run

Real examples:

What you runCost
200 reviews, 1 app$0.07
1,000 reviews, 1 app$0.23
3 apps × 500 reviews + comparison$0.44
5,000 reviews across 6 storefronts, 1 app$1.03

Set analyze: false to skip the reports and pay for raw reviews only.


Limitations — stated honestly

  • Apple caps its review feed at ~500 reviews per storefront. That's Apple's limit, not ours. Apple genuinely returns a different review set per storefront, so adding countries is the way to a bigger sample — measured on live data, four Apple storefronts gave 400 distinct reviews with zero overlap.
  • Google Play works the opposite way: it segments by language, not by storefront. Asking for es and br with the same language returns the identical review set. The actor maps each storefront to the language spoken there and skips any storefront whose language is already covered, and it deduplicates by review ID across the whole app — so you are never billed twice for the same review. Practically: listing 6 storefronts for an Android app that only has English reviews will still return one English sample, not six.
  • Apple's feed does not always include a review date. In practice it usually does — a live 800-review Apple sample came back 100% dated — but it is not contractually guaranteed. When it's missing, date is null and byMonth stays empty; byVersion still works.
  • Apple's feed has no developer replies. Google Play does, on about 16% of reviews in a live sample.
  • Not every review can be assigned a topic. Roughly 55% of reviews in a live 1,000-review sample matched at least one topic; the rest were too short to classify. A quarter of real store reviews are seven words or fewer ("Good", "I love it", "trash"), and no keyword taxonomy can extract a theme from those. Topic coverage rises steeply with length: 16% of 60+ word reviews go untagged versus 90% of 1–3 word reviews. This matters for how you read topComplaints — it ranks the complaints among reviews that said something specific, which is the useful population anyway, but it is not a census of all negative reviews.
  • Sentiment is lexicon-based, in English, Spanish, Portuguese, French, German and Italian. It handles negation ("never crashes" is praise) and clause breaks ("never crashes but the ads are awful" is a complaint).
  • Not every review can be scored from its words. Plenty of real reviews carry no scorable vocabulary at all — "Idk why i can't crate my avatar" is a furious 1-star with nothing a lexicon can grab, and reviews in unsupported languages are the same story. Those rows are scored from the star rating instead, and sentimentSource says rating so you know. Filter on sentimentSource == "text" when you want only text-measured rows. Scoring them this way rather than dropping them is deliberate: leaving them out would compute every app-level average over only the dramatically-worded reviews, which skews the whole picture toward the extremes.
  • Sarcasm is not detected. No lexicon method detects it.
  • worstVersion needs volume. Version buckets under 5 reviews are ignored on purpose, so one angry user can't flag a healthy release.

Reads only public review data that both stores publish openly — no login, no authentication bypass, no personal data beyond the public display name attached to each review. Review text belongs to its authors and to the store; use it in line with Apple's and Google's terms and with the privacy law in your jurisdiction.


Support

Found a bug or need a field that isn't here? Open an issue on the actor's Issues tab — issues get answered.