Google Play Scraper
Pricing
$19.99/month + usage
Google Play Scraper
Extract complete Google Play app data, including descriptions, ratings, reviews, installs, screenshots, versions, and developer info. Ideal for market research, competitor analysis, ASO, and dataset creation. Fast, reliable, and perfect for automated app intelligence.
Pricing
$19.99/month + usage
Rating
5.0
(3)
Developer
Scraper Engine
Maintained by CommunityActor stats
1
Bookmarked
139
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Google Play Scraper — Ratings, Reviews, Installs and Pricing
Google Play Scraper extracts app listing data, keyword search results, similar-app recommendations and full user reviews from the Google Play Store and returns them as structured JSON — no HTML parsing required. Every run returns real fields such as score, installs, price, iapPriceRange and, for reviews, text, thumbsUp and hasDeveloperReply. Point it at a keyword, an app URL or package name, and pull typed records straight into your pipeline, spreadsheet or AI agent.
📱 What is Google Play Scraper?
Google Play Scraper is an Apify Actor that reads Android app listing pages, keyword search results, similar-app recommendations and user reviews directly from the public Google Play Store and returns them as structured JSON. One Actor covers four actions — app search, app URLs, similar apps and reviews — so a single tool handles both app metadata and review collection. No Google account, Play Console login or API key is required: every request targets a page or endpoint anyone can open in a browser. It's built for ASO teams, market researchers, pricing analysts, developers and AI engineers wiring Android app data into their own pipelines.
🔓 What Google Play app data is publicly available to scrape?
Everything on a public app listing page, a public search results page and the public reviews list is readable without a Google account. Google Play does not put a login wall in front of app metadata, pricing or reviews — the gate that exists is the developer's own Play Console, which controls what the developer chooses to publish.
| Data Category | Publicly Visible | Restricted (developer's Play Console only) |
|---|---|---|
| App title, description, screenshots | Yes | — |
| Price, currency, in-app purchase range | Yes | — |
| Rating score, rating count, review count | Yes | — |
| Install count | Range only (e.g. "10,000,000+") | Exact install figure — Google does not publish it |
| Developer name, website, support email | Yes, if published on the listing | Contact details the developer chose not to publish |
| Full user review text, score and developer replies | Yes | Reviewer's account identity beyond the display name Google shows |
| Similar / "you might also like" apps | Yes | Google's internal ranking signal behind the recommendation |
| Downloads, revenue, crash reports, install analytics | No | Restricted to the app's own developer account in Play Console |
Google Play Scraper only returns publicly visible data — what any visitor sees on play.google.com. Nothing behind a login wall.
📊 What data can I extract with Google Play Scraper?
Google Play Scraper returns two record types depending on the action you run: an app record (56 fields) for app search, app URLs and similar apps, and a review record (16 fields) for the reviews action.
🏷️ App identity & listing details
| Field | Description |
|---|---|
appId | Package name / app id (e.g. com.example.app) |
url | Canonical Play Store listing URL used for the run |
title | App name |
summary | Short one-line pitch shown under the title |
description | Full store description as plain text |
descriptionHTML | Full store description with the original HTML markup |
developer | Developer / publisher name |
developerId | Developer's Play Store id, read from their storefront link |
developerInternalID | Same value as developerId |
developerEmail | Public support email, if published |
developerWebsite | Public developer website, if published |
developerAddress | Public developer address, if published |
privacyPolicy | Link to the app's privacy policy |
genre | Primary category name |
genreId | Primary category id |
categories | Full list of {name, id} category objects |
contentRating | Age rating (e.g. Teen, Everyone) |
contentRatingDescription | Descriptor text behind the age rating |
version | Current app version |
recentChanges | "What's new" text for the current version |
released | First release date, as shown on the listing |
updated | Last-update timestamp, in milliseconds |
📈 Ratings, installs, pricing & flags
| Field | Description |
|---|---|
score | Average star rating (numeric, e.g. 4.34) |
scoreText | Star rating as displayed (e.g. "4.3") |
ratings | Total number of ratings |
reviews | Total number of reviews |
histogram | 1–5 star rating distribution, {1: n, 2: n, 3: n, 4: n, 5: n} |
installs | Install count as displayed (e.g. "1,000,000,000+") |
minInstalls | Lower numeric bound of the install range |
maxInstalls | Upper numeric bound of the install range |
price | Price in the storefront currency, as a number (0 when free) |
priceText | Price as displayed, or "Free" |
currency | Storefront currency code |
free | true when the app has no upfront price |
offersIAP | true when the app offers in-app purchases |
iapPriceRange | Localized in-app-purchase range string as published |
iapMinPrice | Lower bound of the IAP range, parsed to a number |
iapMaxPrice | Upper bound of the IAP range, parsed to a number |
iapCurrency | Currency of the IAP range |
monetizationModel | Derived label: free, free_with_iap, paid, paid_with_iap or ad_supported |
adSupported | true when the listing declares ads |
available | Whether the listing is currently available |
preregister | true when the app is in pre-registration |
earlyAccessEnabled | true when early access is enabled |
isAvailableInPlayPass | true when the app is part of Google Play Pass |
androidVersion | Minimum Android version, normalized to a number, or "VARY" |
androidVersionText | Minimum Android version as displayed |
androidMaxVersion | Maximum supported Android version, normalized |
🖼️ Media & timestamps
| Field | Description |
|---|---|
icon | App icon image URL |
headerImage | Store listing header/banner image URL |
screenshots | List of screenshot image URLs |
video | Promo video URL, if the listing has one |
videoImage | Thumbnail image for the promo video |
previewVideo | Additional preview video URL, if present |
comments | Up to 5 review snippets preloaded on the app page itself |
scrapedAt | ISO-8601 UTC timestamp of when the record was collected |
⭐ Review fields (scrapeReviews action)
| Field | Description |
|---|---|
id | Review id |
appId | Package name the review belongs to |
url | Deep link to the review on the app's listing page |
userName | Reviewer's display name |
userImage | Reviewer's avatar image URL |
score | Star rating left by the reviewer (1–5) |
scoreText | Star rating as a string |
text | Review body |
date | ISO-8601 UTC date the review was posted |
thumbsUp | "Was this helpful" count |
version | App version the review references, if published |
replyText | Developer's reply text, if any |
replyDate | ISO-8601 UTC date of the developer reply |
hasDeveloperReply | true when a developer reply exists |
criterias | Per-review sub-ratings the app collects, as [{criteria, rating}]; empty when the app doesn't use them |
scrapedAt | ISO-8601 UTC timestamp of when the record was collected |
🤖 Add-on: Need additional review data?
Google Play Scraper covers Android app metadata and Play Store reviews in one Actor. If your pipeline also tracks review sentiment across other storefronts, the Scraper Engine account publishes review-focused Actors for other platforms — Facebook Reviews Scraper, Walmart Reviews Scraper, Udemy Course Reviews Scraper and Airbnb Review Scraper — so you can build a single cross-platform review dataset with a consistent workflow.
🛠️ Why not build this yourself?
There is no official public API for reading arbitrary Google Play listings, search results or reviews. The Google Play Developer API only exposes data for apps you own in your own Play Console account — it has no endpoint to look up another developer's app, run a keyword search, or pull another app's reviews (confirmed against Google's own reviews REST resource docs, checked 2026-08-15: https://developers.google.com/android-publisher/api-ref/rest/v3/reviews).
Building this yourself means reverse-engineering two undocumented surfaces and keeping both working as Google changes them. App and search data live in numbered JSON slots (ds:4, ds:5, …) embedded in the page's AF_initDataCallback script blocks — and those slot numbers move between page revisions, with a stale index failing silently (empty result, no error). Reviews are read from Google Play's internal batchexecute RPC endpoint, which needs a live session id, a build label read fresh from the page, and a request template whose continuation-token slot has also moved in past revisions. On top of that you need proxy rotation and retry handling to stay reachable at any volume. Google Play Scraper locates both by shape and stable identifiers rather than fixed slots, so it keeps returning the same field names when Google reshuffles its page internals.
🚀 How to use Google Play Scraper
- Open Google Play Scraper on the Apify Store and click Try for free.
- Pick an action — the only required input — from 🔎 app search, 📦 app URLs, 🧩 similar apps or ⭐ reviews.
- Fill in that action's own section:
scrapeAppSearch.keywords,scrapeAppUrls.urls,scrapeSimilarApps.urls, orscrapeReviews.appId. - Set the storefront
country, the listinglanguage, andcountif you want to cap how many records the run stores. - Click Start. Records stream into the dataset live, so an interrupted run still leaves usable data.
- Download results as JSON, CSV, Excel or the other formats Apify's dataset export supports.
Scaling to bulk app extraction
Three of the four actions take a native array input — scrapeAppSearch.keywords, scrapeAppUrls.urls and scrapeSimilarApps.urls all accept multiple values, one per line. scrapeReviews.appId is a text field, but entering several package names or URLs on separate lines works the same way — the Actor splits them internally. count behaves differently per action: for search, app URLs and similar apps it is a single shared cap across the whole run; for reviews with more than one app id, it is split evenly across the listed apps so every app gets covered instead of the first one consuming the whole budget.
💼 What can you do with Google Play app data?
- 🎯 ASO managers use
score,ratings,installsandupdatedto track how a competitor's rating and install band move after each release. - 💲 Pricing analysts use
price,iapMinPriceandiapMaxPriceto benchmark in-app purchase tiers across a category before setting their own app's price. - 🐛 Product & QA teams use
recentChangesandversionalongsidescoreto spot whether a new release caused a rating drop. - 💬 Sentiment researchers use
text,scoreandhasDeveloperReplyfrom the review record to build a topic or sentiment model of user complaints. - 🤖 AI engineers feed
description,summaryand reviewtextinto a RAG pipeline so a support agent can answer "what do users complain about" from real review text instead of a static FAQ.
🛡️ How does Google Play Scraper handle rate limits and blocking?
Requests start over a direct connection with no proxy. If a response comes back with a blocking-type status — 401, 403, 407, 408, 429 or any 5xx — the Actor escalates to the configured Apify Proxy, and if that also gets blocked, to a residential proxy scoped to the storefront country. Once on the top route, a failing request gets up to 3 retries with exponential backoff before it's given up on. Requests are spaced out with a randomized delay between each app fetch, search term and review page. If a single app or review page still can't be read after retries, the Actor logs a warning, skips that one record, and continues with the rest of the run instead of failing the whole job — so a handful of blocked apps never costs you the rest of the batch. The Actor does not solve CAPTCHAs.
⬇️ Input
Only action is required. Fill in the section that matches the action you picked — the others are ignored.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
action | Yes | string | Decides what is scraped. Only the matching section below is used. One of scrapeAppSearch, scrapeAppUrls, scrapeSimilarApps, scrapeReviews. Default: scrapeAppSearch. | "scrapeAppSearch" |
scrapeAppSearch.keywords | No | array | Keywords to search the Google Play Store for. One keyword per line — bulk supported. | ["photo editor", "language learning"] |
scrapeAppSearch.country | No | string | Google Play storefront the keyword search runs against. One of 86 country codes. Default: us. | "us" |
scrapeAppUrls.urls | No | array | One or more Google Play app URLs or raw package names (e.g. com.example.app). Bulk supported. | ["https://play.google.com/store/apps/details?id=com.spotify.music"] |
scrapeSimilarApps.urls | No | array | Similar / recommended apps are collected from each source app you list here. Bulk supported. | ["com.spotify.music"] |
scrapeReviews.appId | No | string | The Google Play package name (the ?id= value in the app URL), e.g. com.example.app. A full app URL works too. Enter several on separate lines to collect reviews for more than one app in a single run. | "com.spotify.music" |
scrapeReviews.country | No | string | Google Play storefront the reviews are read from. One of 86 country codes. Default: us. | "us" |
cursor | No | string | Continue a review collection where a previous run stopped. Copy the value stored under the lastCursor key in that run's key-value store. Default: "". | "" |
country | No | string | Google Play storefront used by the Scrape app URLs and Scrape similar apps actions. Prices, availability and ratings are storefront-specific. One of 86 country codes. Default: us. | "us" |
language | No | string | Language of the returned listing text — title, summary, description and What's new. Applies to every action. One of 26 language codes. Default: en. | "en" |
count | No | integer | Upper limit on how many records the run stores. Leave empty or 0 to collect everything available. Minimum: 0. | 10 |
proxyConfiguration | No | object | Apify Proxy settings used by the Actor's network routes. Default: {"useApifyProxy": true}. | {"useApifyProxy": true} |
Example input
Search for apps by keyword:
{"action": "scrapeAppSearch","scrapeAppSearch.keywords": ["photo editor", "language learning", "budget tracker"],"scrapeAppSearch.country": "us","language": "en","count": 10,"proxyConfiguration": { "useApifyProxy": true }}
Reviews for two apps, from the German storefront:
{"action": "scrapeReviews","scrapeReviews.appId": "com.spotify.music\ncom.duolingo","scrapeReviews.country": "de","language": "de","cursor": "","count": 200,"proxyConfiguration": { "useApifyProxy": true }}
⬆️ Output
Google Play Scraper returns typed, normalized JSON — the same field names every run, whichever action produced them. Export results as JSON, CSV, Excel or the other formats Apify's dataset export supports. Every stored record is one billable row_result event; a record that fails to fetch or parse is skipped and never reaches the dataset, so it is never charged.
Example output — app record (scrapeAppSearch / scrapeAppUrls / scrapeSimilarApps)
{"title": "Spotify: Music and Podcasts","description": "Play music, podcasts and audiobooks. Discover new songs and playlists.","descriptionHTML": "Play music, podcasts and audiobooks.<br>Discover new songs and playlists.","summary": "Music, podcasts, audiobooks","installs": "1,000,000,000+","minInstalls": 1000000000,"maxInstalls": 1173908276,"score": 4.34,"scoreText": "4.3","ratings": 36069382,"reviews": 1063254,"histogram": { "1": 1806912, "2": 923416, "3": 2244108, "4": 5391104, "5": 25703842 },"price": 0,"free": true,"currency": "USD","priceText": "Free","available": true,"offersIAP": true,"iapPriceRange": "$6.99 - $203.88 per item","iapMinPrice": 6.99,"iapMaxPrice": 203.88,"iapCurrency": "USD","monetizationModel": "free_with_iap","androidVersion": "6.0","androidVersionText": "6.0 and up","androidMaxVersion": "VARY","developer": "Spotify AB","developerId": "Spotify+AB","developerEmail": "support@spotify.com","developerWebsite": "https://www.spotify.com","developerAddress": "Spotify AB, Regeringsgatan 19, 111 53 Stockholm, Sweden","privacyPolicy": "https://www.spotify.com/legal/privacy-policy/","developerInternalID": "Spotify+AB","genre": "Music & Audio","genreId": "MUSIC_AND_AUDIO","categories": [{ "name": "Music & Audio", "id": "MUSIC_AND_AUDIO" }],"icon": "https://play-lh.googleusercontent.com/example-icon","headerImage": "https://play-lh.googleusercontent.com/example-header","screenshots": ["https://play-lh.googleusercontent.com/example-shot-1"],"video": null,"videoImage": null,"previewVideo": null,"contentRating": "Teen","contentRatingDescription": "Sexual Innuendo, Simulated Gambling","adSupported": true,"released": "Oct 6, 2010","updated": 1786060800000,"version": "9.0.100.216","recentChanges": "Bug fixes and performance improvements.","comments": ["Great app, love the playlists.", "Ads got too frequent lately."],"preregister": false,"earlyAccessEnabled": false,"isAvailableInPlayPass": false,"appId": "com.spotify.music","url": "https://play.google.com/store/apps/details?id=com.spotify.music&hl=en&gl=us","scrapedAt": "2026-08-15T09:12:41Z"}
Example output — review record (scrapeReviews)
{"id": "4a6c4136-d56a-4a57-9305-230b888b5db6","appId": "com.spotify.music","userName": "Deagan Bailey","userImage": "https://play-lh.googleusercontent.com/example-avatar","date": "2026-07-29T11:04:52.317Z","score": 2,"scoreText": "2","url": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=4a6c4136-d56a-4a57-9305-230b888b5db6","text": "Personally, I don't understand why you have to shuffle before you can pick a specific song.","replyDate": null,"replyText": null,"hasDeveloperReply": false,"version": "9.0.98.418","thumbsUp": 49,"criterias": [],"scrapedAt": "2026-08-15T09:14:03Z"}
⚙️ How does it work?
Google Play Scraper fetches Google Play's own public HTML pages and the same internal endpoints the play.google.com web app itself uses — no login is involved anywhere in the flow. Requests are routed through the escalating network route described above, so a run keeps working even when a route gets blocked mid-way. App and search data are parsed out of the JSON blobs Google embeds in each page, located by shape and stable identifiers rather than by a fixed slot number, so the field names stay the same even when Google reshuffles its internal page structure between releases. Reviews are read through Google Play's own batchexecute RPC, using a session id and request template pulled fresh from each app's page rather than hardcoded. Only what's visible on a public listing, search or reviews page is ever returned, and the output schema stays fixed regardless of how Google Play's front end changes.
🔌 Integrations
Google Play Scraper runs on the Apify platform, so it works with anything that can call the Apify API or run an Apify client.
Calling Google Play Scraper programmatically
from apify_client import ApifyClientclient = ApifyClient("<APIFY_API_TOKEN>")run = client.actor("<ACTOR_ID>").call(run_input={"action": "scrapeAppUrls","scrapeAppUrls.urls": ["https://play.google.com/store/apps/details?id=com.spotify.music"],"country": "us","language": "en","count": 10,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
Works in Go, Ruby, Node.js, cURL — any language that can make an HTTP request.
No-code tools (n8n, Make, Zapier)
In n8n, add an HTTP Request node pointed at the Actor's run-sync-get-dataset-items endpoint with your input as the JSON body. In Make, an HTTP module calling the same endpoint drops results straight into any downstream scenario. In Zapier, a Webhooks step can trigger a run and pull the finished dataset the same way — no custom code needed in any of the three.
⚖️ Is it legal to scrape Google Play app data?
Scraping publicly accessible app listing data is generally lawful — app titles, prices, ratings and installs are business and product data, not personal data, and Google Play Scraper only ever returns what any visitor to play.google.com can already see, without a login. This data sits under Google's Terms of Service and ordinary database-rights framing rather than a personal-data regime like GDPR. The one exception is the reviews action: userName and userImage on a review record are tied to a reviewer's display identity, so if you store or process review data at scale, treat it as personal data under GDPR/CCPA and have a lawful basis for keeping it. Consult legal counsel if your use case involves bulk storage of personal data.
❓ Frequently asked questions
What Google Play app fields does Google Play Scraper return?
The top fields are title, score, installs, price and developer, alongside 51 more app fields covering categories, media, monetization and Android compatibility — see the full field tables above.
Does Google Play Scraper require a Google account or login?
No. Every request targets a public Google Play page or endpoint. There is no OAuth flow, no Play Console account and no Google API key anywhere in the code path.
How many apps or reviews can I extract in one run?
As many as count allows — leave it empty or set it to 0 to keep collecting until Google Play stops returning new results. For a multi-keyword search or a multi-app review run, see the bulk-scaling note above for how the cap is shared.
What happens if an app is removed, region-locked, or the reviews page is empty?
If the app page or reviews page can't be read after retries, the Actor logs a warning and skips that one app or review page — it does not fail the whole run. A keyword search that returns zero results, or a reviews run that reaches the end of the review list, simply stops adding new records for that item.
Can I scrape multiple Google Play apps or keywords at once?
Yes. scrapeAppSearch.keywords, scrapeAppUrls.urls and scrapeSimilarApps.urls all accept a list, one value per line. scrapeReviews.appId accepts several package names or URLs on separate lines too.
Can I filter or sort reviews by rating or date?
No — the input schema has no sort or rating-filter parameter. Reviews come back in the order Google Play serves them; country and language change the storefront and text language, and cursor resumes pagination, but there is no built-in filter.
Does Google Play Scraper work with Claude, ChatGPT, and other AI agent tools?
Yes, as an HTTP endpoint. Any agent framework that can call the Apify API — including a Claude tool call or a ChatGPT function call — can start a run and read back the dataset.
Does Google Play Scraper return data in a format LLMs can use directly?
Yes. Typed, normalized JSON with consistent field names across runs. No HTML parsing or selectors needed — pass records directly to an LLM, index them into a vector store, or feed them to an agent tool.
What happens when Google Play changes its page layout or blocking?
The Actor's parser locates app, search and review data by shape and stable identifiers rather than by a fixed page-internal slot number, specifically so layout and internal-slot changes don't silently break the field mapping. Output field names stay the same across such changes.
Can I use Google Play Scraper without managing proxies or browser infrastructure?
Yes. The Actor handles its own network routing — starting direct and escalating to Apify Proxy and then a residential proxy when it hits a blocking response — so you don't configure or run any proxy or browser infrastructure yourself.
Which Google Play fields work best for AI training data and RAG indexing?
For RAG, index description, summary, recentChanges and review text — the high-information text fields. For structured training data, score, installs, price, monetizationModel and contentRating are typed and consistent across every app record.
🔗 Related scrapers
| Scraper Name | What it extracts |
|---|---|
| Facebook Reviews Scraper | Reviews and ratings from Facebook Pages |
| Walmart Reviews Scraper | Product reviews and ratings from Walmart |
| Udemy Course Reviews Scraper | Course reviews and ratings from Udemy |
| Airbnb Review Scraper | Guest reviews and ratings from Airbnb listings |
💬 Your feedback
Found a bug or missing a field? Let us know through the Actor's Issues tab in Apify Console — reports there go straight to maintenance, and it's how we keep the field schema stable across Google Play's own layout changes.