App Store Reviews Scraper | Ratings Across All Countries avatar

App Store Reviews Scraper | Ratings Across All Countries

Pricing

from $0.60 / 1,000 reviews

Go to Apify Store
App Store Reviews Scraper | Ratings Across All Countries

App Store Reviews Scraper | Ratings Across All Countries

Collect Apple App Store reviews and ratings for any app across 150+ country storefronts. Get rating, title, body, author, date, app version, and country in clean JSON. Search by app name or paste app URLs; optional app metadata enrichment.

Pricing

from $0.60 / 1,000 reviews

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

11 hours ago

Last modified

Share

App Store Reviews Scraper

Collect Apple App Store reviews and ratings for any app, across country storefronts. Give it an app name or an App Store link and it returns a clean, one-row-per-review dataset: the star rating, review title and body, author, date, the app version reviewed, and the storefront country. Reviews are storefront-specific, so you can sweep many countries to gather the full picture for a single app.

Why this scraper

  • Reviews are the primary output: rating, title, body, author, date, app version, and country on every row.
  • Two ways in: search by app name, or paste one or more App Store app links.
  • Multi-country sweep: pass a list of storefronts, or use "all" for a broad built-in set of major markets.
  • Sort by most recent or most helpful.
  • Filter by minimum and maximum star rating.
  • Optional app-metadata enrichment: developer, average rating, rating count, genre, icon, price, and release notes attached to each review.
  • 25+ output fields, more than typical alternatives, at a predictable per-result price.
  • Incremental mode for scheduled/recurring runs: track the same search over time and get back only what's NEW or changed, not the whole dataset again.

Data you get

Sample shape, values are illustrative placeholders, not from a live review.

FieldExample
reviewId14000000000
appId389801252
appNameSample App
countryus
rating5
titleSample review title
bodyFull review text appears here.
authorReviewer Name
authorId1500000000
authorUrihttps://itunes.apple.com/us/reviews/id1500000000
reviewUrlhttps://itunes.apple.com/us/review?id=389801252&type=Purple%20Software
appVersion1.0.0
reviewDate2026-01-01T00:00:00-07:00
voteSum0
voteCount0
contentTypeApplication

With enrichment enabled, each review also carries: appSellerName, appAverageRating, appRatingCount, appAverageRatingCurrentVersion, appRatingCountCurrentVersion, appPrimaryGenre, appContentRating, appBundleId, appIconUrl, appStoreUrl, appPrice, appCurrency, appMinimumOsVersion, appCurrentVersion, appCurrentVersionReleaseDate, appReleaseNotes.

How to use

Search by app name, US storefront:

{
"mode": "search",
"queries": ["Instagram", "Spotify"],
"appsPerQuery": 1,
"countries": ["us"],
"sortBy": "mostRecent",
"maxItems": 100
}

Sweep several countries for one app via its link:

{
"mode": "url",
"urls": ["https://apps.apple.com/us/app/instagram/id389801252"],
"countries": ["us", "gb", "de", "jp"],
"maxItems": 500
}

Only high-rated reviews, with app details attached:

{
"mode": "url",
"urls": ["https://apps.apple.com/us/app/instagram/id389801252"],
"countries": ["us"],
"minRating": 4,
"fetchDetails": true,
"maxItems": 200
}

Multiple app links at once:

{
"mode": "url",
"urls": [
"https://apps.apple.com/us/app/instagram/id389801252",
"https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
],
"countries": ["us"],
"maxItems": 200
}

Input parameters

ParameterTypeDefaultDescription
modestringsearch"search" (by app name) or "url" (paste app links).
queriesarray["Instagram"]App names or keywords (search mode).
appsPerQueryinteger1Top matching apps to take per search term.
urlsarray(example)App Store app links (url mode).
countriesarray["us"]Storefront codes to collect from. Empty uses the link's storefront or us. "all" sweeps major markets.
sortBystringmostRecent"mostRecent" or "mostHelpful".
minRatinginteger(none)Keep reviews at or above this star rating.
maxRatinginteger(none)Keep reviews at or below this star rating.
fetchDetailsbooleanfalseAttach app metadata to each review.
maxItemsinteger20Total review cap. 0 means no limit.
maxPagesinteger(none)Pages per country (50 reviews per page). Leave empty to walk every review page; the storefront naturally stops paginating once it runs out.
resumeFromRunIdstring(none)Previous run ID (or dataset ID) from this actor. Reviews already collected there are skipped, so the run returns only new ones.
incrementalModebooleanfalseFor a search you run on a schedule: remember reviews already seen and return only what changed. See "Incremental mode" below.
stateKeystring(none)Name this monitoring campaign to run several tracked searches independently. Leave empty to derive it automatically from your search settings.
emitUnchangedbooleanfalseAlso return reviews with changeType = UNCHANGED. Off by default — turning this on bills every scanned review, every run.
emitExpiredbooleanfalseAlso return a row per previously-tracked review no longer found, once a run completes a full scan. Off by default.
proxyobjectApify proxyConnection settings.

Output example

Sample shape, values are illustrative placeholders.

{
"reviewId": "14000000000",
"appId": "389801252",
"appName": "Sample App",
"country": "us",
"rating": 5,
"title": "Sample review title",
"body": "Full review text appears here.",
"author": "Reviewer Name",
"authorId": "1500000000",
"authorUri": "https://itunes.apple.com/us/reviews/id1500000000",
"reviewUrl": "https://itunes.apple.com/us/review?id=389801252&type=Purple%20Software",
"appVersion": "1.0.0",
"reviewDate": "2026-01-01T00:00:00-07:00",
"voteSum": 0,
"voteCount": 0,
"contentType": "Application"
}

Incremental mode (recurring/scheduled monitoring)

If you run this actor on a schedule against the same search, turn on incrementalMode to get back only what changed since the last run instead of the whole dataset again:

{
"mode": "url",
"urls": ["https://apps.apple.com/us/app/instagram/id389801252"],
"countries": ["us"],
"maxItems": 200,
"incrementalMode": true
}

Each review gets a changeType: NEW (never seen before), UPDATED (a real field changed — see changedFields), UNCHANGED (nothing changed; suppressed from the output unless emitUnchanged is on), or REAPPEARED (was previously marked EXPIRED and is back). Set emitExpired: true to also get an EXPIRED row for a tracked review that disappeared — but only on a run that completes a full, uncapped scan (a low maxItems, a maxPages limit, resumeFromRunId, or a mid-run migration/resurrect all skip EXPIRED detection for that run rather than risk a false positive).

What counts as "changed": rating, title, body, author, review date, and the reviewed app version are real review content — a change to any of these is a real UPDATED. voteSum and voteCount are excluded: other users' helpful-votes accrue on an old review indefinitely, so treating them as a content change would mark almost every historical review UPDATED on every run. When fetchDetails is on, the attached app-metadata fields (seller, average rating, rating count, genre, price, current version, release notes, etc.) are also excluded — they describe the current state of the app, not the review, and drift independently every time the app itself updates.

State size: the saved baseline stores a per-field content fingerprint for each tracked review (never the review's actual title/body text) to stay well under the platform's key-value-store size limit even for large monitoring campaigns. Measured at 50,000 tracked reviews with realistic review-length text: ~99 bytes/review compressed (~4.9 MB total), leaving roughly 1.8x headroom before the actor's own safety guard (which refuses to save — logging a clear error — rather than exceed the platform limit; split a very large campaign across a few stateKey values if you hit it). One consequence: an EXPIRED row can only report the review's id, app, country, and timestamps — its original title/body/rating are not retained in the incremental baseline and are not reproduced on the tombstone row.

State is keyed automatically by a hash of your search settings (mode, queries/URLs, countries, sort, rating filters, and fetchDetails) — two different filter setups never share a baseline, and raising maxItems/maxPages never starts a new one. Set stateKey to name a campaign explicitly, e.g. to track several searches independently or intentionally share one baseline across otherwise-different runs.

Send results into your apps (MCP connectors)

You can optionally pipe results into the apps you already use through Model Context Protocol (MCP) connectors. Authorize a connector under Apify, Settings, API & Integrations, then select it in the input. For Notion, set a parent page URL and each review is written as a page. Other connectors receive a best-effort write.

The connector receives a condensed, human-readable summary of each review (a heading plus the key fields and body text), not the full JSON. The complete record always stays in the Apify dataset. Leave the connector field empty to skip this step; it never changes the dataset output.

Plan requirement

Runs on any Apify plan. For very large multi-country sweeps, a proxy with more exit rotation can help.