# Google Play Scraper – App Details & Reviews (`sfoln/google-play-scraper`)

Google Play app data by package name or URL: title, developer, installs, rating and histogram, price, version, update date, genre, content rating, screenshots, plus user reviews with rating, text, app version and developer replies. $1 per 1,000 apps, $0.10 per 1,000 reviews.

- Family: App stores
- Categories: Ecommerce, Developer tools, Automation
- Availability: on request (private on Apify). Email contact@sfoln.com with subject "Access request: Google Play Scraper – App Details & Reviews (sfoln/google-play-scraper)" before calling; calls fail until it is public.
- JSON: https://www.sfoln.com/actors/google-play-scraper.json
- MCP: https://mcp.apify.com?tools=sfoln/google-play-scraper
- REST (sync): POST https://api.apify.com/v2/actors/sfoln~google-play-scraper/run-sync-get-dataset-items
- REST (async): POST https://api.apify.com/v2/actors/sfoln~google-play-scraper/runs

Get Google Play app data as clean JSON by package name or Play Store URL: title, developer and contact, installs, rating and rating histogram, price, version, update date, genre, content rating, screenshots and release notes, plus user reviews with star rating, text, date, app version, thumbs-up count and the developer's reply. For app-market research, ASO, competitor and review monitoring, and AI agents. $1 per 1,000 apps, $0.10 per 1,000 reviews, no start fee; unknown apps and errors are free.

## Price per delivered record

| Event | Price | Per 1,000 | Charged for |
| --- | --- | --- | --- |
| Google Play app (`app`) | $0.001 | $1 / 1,000 | One app record: the details of a Google Play app in the chosen country and language. |
| Google Play review (`review`) | $0.0001 | $0.10 / 1,000 | One user review row (rating, text, date, app version, thumbs-up count, developer reply). |

Pay-per-event, USD, billed by Apify; no platform usage charge. Only records with status `ok` are charged. Cap a run with `maxTotalChargeUsd`. Apify free plan: up to 10 per run.

## Run

```bash
curl -X POST "https://api.apify.com/v2/actors/sfoln~google-play-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"apps":["com.whatsapp"]}'
```

MCP client configuration:

```json
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/google-play-scraper"
    }
  }
}
```

Example prompt: Get the Google Play rating, installs and latest version of com.whatsapp, and its 50 newest reviews.

## Input

List apps by package name or Google Play URL, then choose app details or reviews. Each app is one item with its own record.

| Field | Type | Default | Meaning |
| --- | --- | --- | --- |
| `mode` | string | `"apps"` | Mode: apps: one record per app with its details (optionally with reviews). reviews: the app's user reviews. One of `"apps"`, `"reviews"`. |
| `apps` (required) | array | — | Apps: Package names (com.whatsapp) or Google Play URLs (https://play.google.com/store/apps/details?id=com.whatsapp), one per line. Accounts on the Apify free plan can process up to 10 apps per run. |
| `country` | string | `"us"` | Country: Two-letter country code of the store (us, gb, de, in…): prices, currency and availability follow it. |
| `language` | string | `"en"` | Language: Language of texts and reviews (en, de, es, pt-BR…). |
| `includeReviews` | boolean | `false` | Include reviews (apps mode): In the apps mode, also return each app's reviews (up to Max reviews per app, charged per review). |
| `maxReviewsPerApp` | integer | `100` | Max reviews per app: Reviews returned per app (1–10,000). |
| `reviewSort` | string | `"newest"` | Review order: newest first, most relevant first, or by rating. One of `"newest"`, `"relevant"`, `"rating"`. |
| `reviewRating` | integer | `0` | Only reviews with this rating: 1–5: only reviews with that many stars. 0: all reviews. |
| `maxItems` | integer | `1000` | Max apps: Safety cap on apps processed in this run; the rest is reported as dropped. |
| `concurrency` | integer | — | Concurrency: Apps processed in parallel (1–10). Default: 3 for app details, 2 for reviews. Google Play's pace limit applies to the whole run either way. |
| `includeRaw` | boolean | `false` | Include raw upstream response: Attach Google Play's unmodified data arrays to each record under raw (larger output). |

Example input:

```json
{
  "apps": [
    "com.whatsapp"
  ]
}
```

## Output

One record per input item with `status` (`ok` is charged; `not_found`, `error`, `skipped_*` are free) and `charged`. The run stores an `OUTPUT` summary record.

| Field | Type | Meaning |
| --- | --- | --- |
| `input` | string | object | Input: The input item this record belongs to (the app, keyword, chart, account or post, with its country or mode). |
| `status` | string | Status: ok \| not_found \| error \| skipped_invalid \| skipped_budget \| skipped_free_plan \| skipped_unmetered |
| `charged` | boolean | Charged: Whether this record incurred a pay-per-event charge. |
| `chargedEvent` | string | Charged event: Pay-per-event event charged for this record (present only when charged). |
| `chargedCount` | integer | Events charged: Events actually charged when the charge came back short of the requested count (present only then; a warning explains it). |
| `source` | string | Source: Upstream data source. |
| `fetchedAt` | string | Fetched at: ISO timestamp. |
| `error` | object | Error: { code, message, provider?, status? } when status is not ok. Codes set by the runtime: budget_exhausted, free_plan_limit, unmetered, aborted, charge_failed, record_too_large, invalid_record, dataset_push_failed; upstream codes: auth, insufficient_credits, rate_limit, timeout, network, server, client, invalid_response, not_found. |
| `warnings` | array | Warnings: Notes about this record, e.g. a charge that came back short. |
| `raw` | array | object | Raw: Google Play's unmodified data: the app's details block or the review array (only with includeRaw). |
| `recordType` | string | Record type: app, review, or summary (one per app in the reviews mode: what was delivered and why it stopped). |
| `position` | integer | Position: Order of this row among the rows of its input (1-based). |
| `appId` | string | null | Package name: The app's package name, e.g. com.whatsapp. |
| `url` | string | null | URL: Google Play link of the app (review rows: of the review). |
| `country` | string | Country: Store country the data was fetched for. |
| `language` | string | Language: Language the texts and reviews were fetched in. |
| `title` | string | null | Title: App name. |
| `summary` | string | null | Short description: The one-line summary shown under the title. |
| `description` | string | null | Description: Full description as plain text. |
| `developer` | string | null | Developer: Developer name. |
| `developerId` | string | null | Developer ID: Google Play developer ID (numeric or name). |
| `developerUrl` | string | null | Developer page: Google Play page of the developer. |
| `developerEmail` | string | null | Developer email: Support email the developer lists. |
| `developerWebsite` | string | null | Developer website: Website the developer lists. |
| `developerAddress` | string | null | Developer address: Postal address the developer lists, when shown. |
| `privacyPolicyUrl` | string | null | Privacy policy: URL of the app's privacy policy. |
| `genre` | string | null | Genre: Main category, e.g. Communication, Arcade. |
| `genreId` | string | null | Genre ID: Category ID, e.g. COMMUNICATION, GAME_ARCADE. |
| `categories` | array | Tags: Further categories and tags Google Play shows. |
| `iconUrl` | string | null | Icon: App icon URL. |
| `headerImageUrl` | string | null | Feature graphic: Header (feature graphic) image URL. |
| `screenshotUrls` | array | Screenshots: Screenshot URLs. |
| `videoUrl` | string | null | Video: Promo video URL, when there is one. |
| `installs` | string | null | Installs: Install bracket as shown, e.g. 5,000,000,000+. |
| `minInstalls` | number | null | Min installs: Lower bound of the install bracket. |
| `maxInstalls` | number | null | Installs (estimate): Google Play's finer install count behind the bracket. |
| `rating` | number | null | Rating: App rows: average rating (1–5). Review rows: the review's stars (1–5). |
| `ratingCount` | number | null | Ratings: Number of ratings. |
| `reviewCount` | number | null | Reviews: Number of written reviews. |
| `histogram` | object | null | Rating histogram: Ratings per star: { 1: n, 2: n, 3: n, 4: n, 5: n }. |
| `price` | number | null | Price: Price in the store currency (0 = free). |
| `currency` | string | null | Currency: ISO currency code of the price. |
| `priceText` | string | null | Price text: Price as shown, e.g. $6.99 (empty for free apps). |
| `originalPrice` | number | null | Original price: Price before a running discount. |
| `isFree` | boolean | null | Free: True when the price is 0. |
| `offersInAppPurchases` | boolean | In-app purchases: True when the app sells in-app items. |
| `inAppPurchaseRange` | string | null | In-app price range: In-app purchase price range as shown, e.g. $0.99 - $49.99 per item. |
| `containsAds` | boolean | Contains ads: True when Google Play marks the app as containing ads. |
| `contentRating` | string | null | Content rating: Age rating, e.g. Everyone, Teen. |
| `contentRatingDescription` | string | null | Rating reasons: Content descriptors, e.g. Fantasy Violence. |
| `releasedText` | string | null | Released (as shown): First release date as Google Play shows it in the chosen language. |
| `releaseDate` | string | null | Released: First release date (YYYY-MM-DD) when the page is in English. |
| `updatedAt` | string | null | Updated: ISO timestamp of the last update. |
| `version` | string | null | Version: Current version (null when it varies with the device). |
| `minAndroidVersion` | string | null | Min Android: Minimum Android version. |
| `recentChanges` | string | null | What's new: Release notes of the current version. |
| `reviewsDelivered` | integer | Reviews delivered: Apps mode with includeReviews: review rows delivered for this app. |
| `reviewsStopReason` | string | Reviews stop reason: Apps mode with includeReviews: why the reviews stopped (limit, end, free_plan, budget, error…). |
| `reviewId` | string | Review ID: Google Play review ID. |
| `text` | string | null | Review text: Body of the review. |
| `authorName` | string | null | Reviewer: Reviewer's public name. |
| `authorImageUrl` | string | null | Reviewer avatar: Reviewer's avatar URL. |
| `createdAt` | string | null | Review date: ISO timestamp of the review. |
| `thumbsUpCount` | integer | Helpful votes: Users who found the review helpful. |
| `appVersion` | string | null | App version: App version the review was written for. |
| `replyText` | string | null | Developer reply: The developer's reply, when there is one. |
| `repliedAt` | string | null | Replied at: ISO timestamp of the developer's reply. |
| `criteria` | array | Criteria: Aspect ratings some apps ask for: { criterion, rating }. |
| `sort` | string | Review order: newest, relevant or rating. |
| `ratingFilter` | integer | Rating filter: Summary rows: the star rating reviews were limited to. |
| `resultsDelivered` | integer | Rows delivered: Summary rows: reviews delivered (and charged) for this app. |
| `stopReason` | string | Stop reason: Summary rows: limit, end, free_plan, budget, aborted, deadline, empty_pages, max_pages or error. |

Example record:

```json
{
  "input": {
    "mode": "apps",
    "app": "com.mojang.minecraftpe"
  },
  "recordType": "app",
  "appId": "com.mojang.minecraftpe",
  "url": "https://play.google.com/store/apps/details?id=com.mojang.minecraftpe",
  "country": "us",
  "language": "en",
  "title": "Minecraft: Dream it, Build it!",
  "summary": "Millions of crafters have smashed billions of blocks! Now you can join the fun!",
  "description": "Dive into an open world of building, crafting, and survival…",
  "developer": "Mojang",
  "developerId": "4772240228547998649",
  "developerUrl": "https://play.google.com/store/apps/dev?id=4772240228547998649",
  "developerEmail": "help@minecraft.net",
  "developerWebsite": "http://help.mojang.com",
  "developerAddress": null,
  "privacyPolicyUrl": "http://go.microsoft.com/fwlink/?LinkId=521839",
  "genre": "Arcade",
  "genreId": "GAME_ARCADE",
  "categories": [
    "Simulation",
    "Casual"
  ],
  "iconUrl": "https://play-lh.googleusercontent.com/tI4StRSPVhpGJH5R013naszLUawOjao1ya8FvyaNO7XY",
  "headerImageUrl": "https://play-lh.googleusercontent.com/S_Z7YSNVWWd3BNh3AwV0iVv0hNqJ8zvn",
  "screenshotUrls": [
    "https://play-lh.googleusercontent.com/ywPBuExmYGLE6oL7QENmI7wOxMPOU"
  ],
  "videoUrl": "https://play.google.com/video/lava/web/player/yt:movie:BLtLrFNRE-E?autoplay=1&embed=play",
  "installs": "50,000,000+",
  "minInstalls": 50000000,
  "maxInstalls": 99063691,
  "rating": 4.30527,
  "ratingCount": 5860068,
  "reviewCount": 635107,
  "histogram": {
    "1": 625087,
    "2": 178226,
    "3": 270413,
    "4": 495298,
    "5": 4291033
  },
  "price": 6.99,
  "currency": "USD",
  "priceText": "$6.99",
  "originalPrice": null,
  "isFree": false,
  "offersInAppPurchases": true,
  "inAppPurchaseRange": "$0.99 - $49.99 per item",
  "containsAds": false,
  "contentRating": "Everyone 10+",
  "contentRatingDescription": "Fantasy Violence",
  "releasedText": "Aug 15, 2011",
  "releaseDate": "2011-08-15",
  "updatedAt": "2026-09-25T17:26:28.000Z",
  "version": "1.26.52.3",
  "minAndroidVersion": "8.0",
  "recentChanges": "What's new in 26.52: Various bug fixes!",
  "status": "ok",
  "charged": true,
  "chargedEvent": "app",
  "source": "googleplay",
  "fetchedAt": "2026-10-14T22:20:00.000Z"
}
```

## FAQ

**What do I put in apps?**

The app's package name (com.whatsapp) or its Google Play URL (https://play.google.com/store/apps/details?id=com.whatsapp). An unknown package, or an app not available in the chosen country, comes back as not_found and is not charged.

**How many reviews can I get per app?**

Up to 10,000 per app and run (200 per request), newest first, most relevant first, or by rating, optionally only one star rating. Reviews are those Google Play shows for the chosen language and country.

**Does it need a browser or a proxy?**

No. It reads the public Google Play pages and the reviews endpoint they use, so runs are fast and cheap.


## Related

- [App Store Scraper – App Details & Top Charts](https://www.sfoln.com/actors/app-store-scraper.md) (`sfoln/app-store-scraper`)
- [Website Contact Details Scraper](https://www.sfoln.com/actors/company-contacts-finder.md) (`sfoln/company-contacts-finder`)
- [URL Metadata & Open Graph Extractor](https://www.sfoln.com/actors/url-metadata.md) (`sfoln/url-metadata`)
- [Brand Monitoring – X, Reddit, News & Bluesky](https://www.sfoln.com/actors/brand-mentions-monitor.md) (`sfoln/brand-mentions-monitor`)

Publisher: SFOLN LLC, contact@sfoln.com. Catalogue: https://www.sfoln.com/catalog.json. Agent guide: https://www.sfoln.com/agents.md.
