# App Store and Google Play Scraper: Reviews, Apps, Charts

> App Store & Google Play Scraper is an Apify actor (API) by CheapAPI Labs. Apps, reviews, ratings and top charts from the App Store and Google Play in 249 countries. It costs $0.09 per 1,000 reviews on every Apify plan, billed through your Apify account with no API key. Compared with the most used Google Play reviews actor (about 2,800 users): 1,000 reviews of one app costs $0.09 on every plan here and $0.15 on Free and $0.10 on Gold there (Apify Store listing prices, checked September 2026). Apify platform usage is billed on top here. Against the most used App Store reviews actor ($0.10) the difference on Gold is only $0.01; this actor covers both stores in one run.

- Page: https://cheapapilabs.com/actors/app-store-google-play-scraper/
- Run on Apify: https://apify.com/cheapapi/app-store-google-play-scraper
- Publisher: CheapAPI Labs (Apify username cheapapi)
- Main price: $0.09 per 1,000 reviews on Free, $0.09 on Gold
- Our prices updated: 2026-10-30

## Prices per event (USD)

| Event | Free | Bronze | Silver | Gold |
|---|---:|---:|---:|---:|
| Review | $0.00009 | $0.00009 | $0.00009 | $0.00009 |
| App details | $0.003 | $0.003 | $0.003 | $0.003 |
| Search result | $0.00015 | $0.00015 | $0.00015 | $0.00015 |
| Top chart entry | $0.0001 | $0.0001 | $0.0001 | $0.0001 |
| Minimum per request (top up) | $0.0005 | $0.0005 | $0.0005 | $0.0005 |

Platinum and Diamond pay the Gold price. Apify platform usage: billed separately by Apify.

## Call it from code

```bash
curl -X POST "https://api.apify.com/v2/acts/cheapapi~app-store-google-play-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
  -d '{"mode":"reviews","apps":["https://play.google.com/store/apps/details?id=org.telegram.messenger","https://apps.apple.com/us/app/telegram-messenger/id686449807"],"keywords":["vpn"],"maxResults":100,"country":"US","language":"en"}'
```

## Example output row

```json
{
  "id": "b7b80a3cc3dd2f59",
  "store": "googlePlay",
  "storeName": "Google Play",
  "appId": "org.telegram.messenger",
  "appTitle": "Telegram",
  "appRating": 3.8,
  "appRatingsCount": 17260048,
  "appUrl": "https://play.google.com/store/apps/details?id=org.telegram.messenger&hl=en&gl=us",
  "reviewId": "592d5883-48fa-4228-814d-be853329f163",
  "position": 1,
  "rating": 5,
  "title": null,
  "text": "I downloaded this app onto my Kindle Fire to get updates and communicate more easily",
  "userName": null,
  "userImageUrl": null,
  "publishedAt": "2026-09-17T15:57:06.000Z",
  "appVersion": "12.10.1",
  "helpfulCount": 2,
  "developerReply": null,
  "developerReplyAt": null,
  "developerReplyAuthor": null,
  "sortedBy": "newest",
  "ratingFilter": null,
  "inputApp": "https://play.google.com/store/apps/details?id=org.telegram.messenger",
  "country": "US",
  "language": "en",
  "scrapedAt": "2026-09-28T09:00:00.000Z"
}
```

## Fields

The **What to get** option (`mode`) picks one of four outputs. You get one dataset row per review, app, search result or chart position.

### Reviews (`mode: "reviews"`)

| Field | Type | Example |
|---|---|---|
| `id` | string | `b7b80a3cc3dd2f59`: stable row id; the same review always gets the same id |
| `store` / `storeName` | string | `googlePlay` / `Google Play` |
| `appId` | string | `org.telegram.messenger` |
| `appTitle` | string | `Telegram` |
| `appRating` | number | `3.8` |
| `appRatingsCount` | number | `17260048` |
| `appUrl` | string | `https://play.google.com/store/apps/details?id=org.telegram.messenger&hl=en&gl=us` |
| `reviewId` | string | `592d5883-48fa-4228-814d-be853329f163` |
| `position` | number | `1` |
| `rating` | number | `5` |
| `title` | string | `‘Scrolling in view’` (App Store only) |
| `text` | string | `I downloaded this app onto my Kindle Fire…` |
| `publishedAt` | string (ISO date) | `2026-09-17T15:57:06.000Z` |
| `appVersion` | string | `12.10.1` |
| `helpfulCount` | number | `2` (Google Play) |
| `developerReply` / `developerReplyAt` / `developerReplyAuthor` | string | reply text / ISO date / `Telegram FZ-LLC` |
| `userName` / `userImageUrl` | string | `null` by default; filled only with `includeReviewerDetails: true` |
| `sortedBy` / `ratingFilter` | string / number | `newest` / `null` |
| `inputApp`, `country`, `language`, `scrapedAt` | string | the app exactly as you entered it, `US`, `en`, collection time `2026-09-28T09:00:00.000Z` |

Meaning of the less obvious fields: `position` is the review's place in the store's list for the chosen order; `appRating` / `appRatingsCount` describe the whole app (not the review); `appVersion` is the app version the reviewer used; `sortedBy` and `ratingFilter` repeat the options used for the run.

### App details (`mode: "appDetails"`)

| Field | Type | Example |
|---|---|---|
| `appId`, `title`, `subtitle`, `url`, `iconUrl` | string | `835599320`, `TikTok - Videos, Shop & LIVE`, `Watch, discover and stream!` |
| `description` | string | full store description |
| `rating`, `ratingsCount`, `reviewsCount` | number | `4.7`, `18373452` |
| `installs`, `installsCount` | string, number | `1,000,000,000+`, `2981239566` (Google Play) |
| `isFree`, `price`, `currency`, `priceText` | boolean, number, string | `true`, `0`, `USD` |
| `category`, `categories`, `tags`, `contentRating`, `languages` | string / array | `Communication`, `["13+"]` (category and tags come from Google Play; App Store listings usually have none) |
| `developer`, `developerId`, `developerUrl`, `developerWebsite`, `developerEmail`, `developerAddress` | string | `TikTok Ltd.`, `support@telegram.org` |
| `version`, `minimumOsVersion`, `size` | string | `47.0.0`, `Requires iOS 14.0 or later.`, `1 GB` |
| `releasedAt`, `updatedAt`, `updateNotes` | string | `2026-09-22T02:34:27.000Z`, release notes |
| `screenshots`, `videos` | array | image / video URLs |
| `similarApps`, `moreAppsByDeveloper` | array of `{appId, title, url}` | `[{ "appId": "1338605092", "title": "Kwai…" }]` |
| `id` | string | stable id per app, country and language |
| `store`, `storeName`, `inputApp`, `country`, `language`, `scrapedAt` | string | as in review rows |
| `extra` | object | store fields we do not map to a column yet (only present when there are any) |

`ratingsCount` counts star ratings, `reviewsCount` counts written reviews; `installs` is the public range and `installsCount` the exact number (Google Play); `contentRating` is the age rating; `minimumOsVersion` is the store's text.

### Search results and top charts (`mode: "search"` / `"charts"`)

| Field | Type | Example |
|---|---|---|
| `type` | string | `search` or `chart` |
| `keyword` / `chart` / `category` | string | `vpn` / `topFree` / `games` |
| `rank` | number | `1` |
| `appId`, `title`, `url`, `iconUrl`, `developer`, `developerUrl` | string | `632064380`, `Vinted: Pre-loved marketplace`, developer `Proton AG` (Google Play; `null` in App Store charts) |
| `rating`, `ratingsCount` | number | `4.86`, `339202` |
| `isFree`, `price`, `currency`, `priceText` | boolean, number, string | `true`, `0`, `USD` |
| `totalResults` | number | total results for the keyword (search only; `null` when the store does not report it) |
| `id` | string | stable id per app in the same keyword or chart, category, country and language: join runs on it to track rank changes |
| `store`, `storeName`, `country`, `language`, `scrapedAt` | string | `appStore`, `App Store`, `US`, `en`, collection time |

The dataset has three table views (**Reviews**, **App details**, **Search results & charts**). A `RUN_SUMMARY` record in the key value store lists how many results were saved, which inputs returned nothing and why.

## Compared with alternatives

Typical run: **1,000 reviews of one app**. Prices are per run, taken from the public Apify Store listings (event fees only). Platform usage terms differ between Actors and are not shown in this table; check each listing for how its compute is billed. For this Actor, Apify platform usage is billed separately by Apify on top of the prices shown ("+ usage"; at the default 256 MB a small run typically uses about $0.001 to $0.005, more when a standard speed run waits several minutes).

| Option | Users | Price on Free plan | Price on Gold plan | Google Play | App Store | App details, keyword ranks, top charts |
|---|---|---|---|---|---|---|
| Most used Google Play reviews Actor | ~2,800 | $0.15 | $0.10 | ✓ | ✗ | ✗ (reviews only) |
| Most used App Store reviews Actor | ~2,300 | $0.10 | $0.10 | ✗ | ✓ | ✗ (reviews only) |
| Most used general Google Play scraper | ~2,700 | $0.30 | $0.30 | ✓ | ✗ | Google Play app details and app lists; no App Store |
| Dual store reviews Actor | ~150 | $0.50 | $0.30 | ✓ | ✓ | ✗ (reviews only) |
| **This Actor** | new | **$0.09** + usage | **$0.09** + usage | ✓ | ✓ | ✓ |

Prices from public Apify Store listings, checked September 2026. Honest reading: on the Gold plan our review fee is only $0.01 below the two single store leaders ($0.09 vs $0.10), and once our platform usage is added a single store run there can cost about the same or less; the bigger differences are on the Free plan (vs. the Google Play reviews leader), against the general Google Play scraper ($0.30 per 1,000 rows on every plan), against the dual store option, and that one run covers both stores plus app details, keyword rankings and top charts. Competitor prices can change at any time; check their listing before you decide.

## Not included

| Not included | Why | Alternative |
|---|---|---|
| In app purchase lists and prices | Not part of the store data we read | App details give `price`, `isFree` and `priceText` of the app itself |
| Historical rank charts | Each run is a snapshot of today's ranks | Schedule a search or chart run daily and join rows on `id` (see Monitoring) |
| More than 500 App Store reviews per app, country and sort order | App Store limit | Run more countries or both sort orders |
| Keyword search volume / difficulty for app stores | Not available from the stores | For **web** search keywords use our [Keyword Research Tool](https://cheapapilabs.com/actors/keyword-research-tool/) |
| Web search rankings of an app's website | Different data source | [Google SERP Scraper](https://cheapapilabs.com/actors/google-serp-scraper/) and [Domain SEO Analyzer](https://cheapapilabs.com/actors/domain-seo-analyzer/) |
| Mentions of your app in AI assistants (ChatGPT, Perplexity, Gemini) | Different data source | [AI Search Visibility Tracker](https://cheapapilabs.com/actors/ai-search-visibility-tracker/) |
| YouTube reviews and comments about an app | Different platform | [YouTube Comments Scraper](https://cheapapilabs.com/actors/youtube-comments-scraper/) |
| Automatic "only new reviews since the last run" filter | Every run is priced per row returned; see the recipe below | Monitoring recipe |

## Limits

- App Store: at most 500 reviews per app, country and sort order; the star rating filter is Google Play only; App Store reviews have no helpful vote count and no developer reply field.
- Requests are collected in batches: the minimum is 50 reviews per app, 30 search results per keyword and 50 positions per chart. App Store charts have up to 100 positions, Google Play charts up to 200.
- Some fields are store specific (installs only on Google Play; subtitle and content rating only on the App Store) and are `null` or empty for the other store.
- Ranks reflect the storefront of the chosen country at the time of the run and can differ slightly from what a signed in user sees on their device.
- The standard processing speed can take several minutes for large runs.
- Not included: in app purchase lists, historical rank charts, and apps that are not available in the chosen country.

## FAQ

**Is Apify platform usage included, and is there a Free plan limit?**
Platform usage (compute) is billed separately by Apify on top of the event fees; at the default 256 MB a small run typically uses about $0.001 to $0.005, and standard speed runs (always used for App Store reviews) wait for results and can use more. On the Apify Free plan you can use up to $0.25 of this Actor's results per calendar month (Apify pays developers nothing for Free plan usage while our data costs are real). Runs that reach the allowance stop cleanly and keep everything collected so far; it resets on the 1st of the month. Any paid Apify plan has no limit.

**Why was I charged for more rows than I asked for, or for `minimum-top-up`?**
Requests are collected in batches of at least 50 reviews per app, 30 search results per keyword and 50 chart positions, so a smaller **Max results** is raised to that (the run log warns at the start; 50 reviews = $0.0045). `minimum-top-up` is charged only when a request delivers less than its minimum (see Pricing): typically an app not available in the chosen country, an app with few or no reviews (or few with your star filter), or a search or chart with few results. Only the difference is charged, in $0.0005 steps; `RUN_SUMMARY` shows `minimumTopUps`.

**Is it legal to scrape app reviews and store listings?**
The Actor collects only publicly visible store data. Reviews can contain personal data, which is why reviewer names and avatars are off by default. If you turn them on, make sure you have a lawful basis (for example under GDPR or CCPA). This is not legal advice.

**How fresh is the data, and why are App Store reviews slower?**
Every run reads the stores live at run time; `scrapedAt` shows when each row was collected. App Store reviews always use the standard processing speed and usually arrive within a few minutes; everything else runs in fast mode for small runs.

**How many reviews can I get?**
Google Play: up to 100,000 per app and run. App Store: up to 500 per app, country and sort order; for more, run other countries (each storefront has its own reviews) or both sort orders.

**Why did I get fewer results than I asked for?**
The app has fewer reviews in that country or language, the star filter removed some, the App Store 500-review cap applied, or your maximum cost per run was reached. The `RUN_SUMMARY` record tells you which.

**How do I control my budget?**
Set **Maximum cost per run**. The Actor never charges more than that, and in review mode it splits the budget fairly between your apps.

**Can I monitor new reviews or rank changes?**
Yes, see Monitoring. There is no built in "only new reviews" switch; you drop repeats on your side using the stable `id`.

**Can I mix Google Play and App Store apps in one run?**
Yes. Each app is sent to its own store automatically (force one with a `google:` or `apple:` prefix). If one app fails, the others are still delivered and the failure is listed in `RUN_SUMMARY`.

**A field or feature is missing. Where do I get support?**
Open an issue on the Actor's **Issues** tab and describe what you need.
