Google Play Scraper avatar

Google Play Scraper

Pricing

$19.99/month + usage

Go to Apify Store
Google Play Scraper

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

Scraper Engine

Maintained by Community

Actor stats

1

Bookmarked

139

Total users

1

Monthly active users

2 days ago

Last modified

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 CategoryPublicly VisibleRestricted (developer's Play Console only)
App title, description, screenshotsYes
Price, currency, in-app purchase rangeYes
Rating score, rating count, review countYes
Install countRange only (e.g. "10,000,000+")Exact install figure — Google does not publish it
Developer name, website, support emailYes, if published on the listingContact details the developer chose not to publish
Full user review text, score and developer repliesYesReviewer's account identity beyond the display name Google shows
Similar / "you might also like" appsYesGoogle's internal ranking signal behind the recommendation
Downloads, revenue, crash reports, install analyticsNoRestricted 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

FieldDescription
appIdPackage name / app id (e.g. com.example.app)
urlCanonical Play Store listing URL used for the run
titleApp name
summaryShort one-line pitch shown under the title
descriptionFull store description as plain text
descriptionHTMLFull store description with the original HTML markup
developerDeveloper / publisher name
developerIdDeveloper's Play Store id, read from their storefront link
developerInternalIDSame value as developerId
developerEmailPublic support email, if published
developerWebsitePublic developer website, if published
developerAddressPublic developer address, if published
privacyPolicyLink to the app's privacy policy
genrePrimary category name
genreIdPrimary category id
categoriesFull list of {name, id} category objects
contentRatingAge rating (e.g. Teen, Everyone)
contentRatingDescriptionDescriptor text behind the age rating
versionCurrent app version
recentChanges"What's new" text for the current version
releasedFirst release date, as shown on the listing
updatedLast-update timestamp, in milliseconds

📈 Ratings, installs, pricing & flags

FieldDescription
scoreAverage star rating (numeric, e.g. 4.34)
scoreTextStar rating as displayed (e.g. "4.3")
ratingsTotal number of ratings
reviewsTotal number of reviews
histogram1–5 star rating distribution, {1: n, 2: n, 3: n, 4: n, 5: n}
installsInstall count as displayed (e.g. "1,000,000,000+")
minInstallsLower numeric bound of the install range
maxInstallsUpper numeric bound of the install range
pricePrice in the storefront currency, as a number (0 when free)
priceTextPrice as displayed, or "Free"
currencyStorefront currency code
freetrue when the app has no upfront price
offersIAPtrue when the app offers in-app purchases
iapPriceRangeLocalized in-app-purchase range string as published
iapMinPriceLower bound of the IAP range, parsed to a number
iapMaxPriceUpper bound of the IAP range, parsed to a number
iapCurrencyCurrency of the IAP range
monetizationModelDerived label: free, free_with_iap, paid, paid_with_iap or ad_supported
adSupportedtrue when the listing declares ads
availableWhether the listing is currently available
preregistertrue when the app is in pre-registration
earlyAccessEnabledtrue when early access is enabled
isAvailableInPlayPasstrue when the app is part of Google Play Pass
androidVersionMinimum Android version, normalized to a number, or "VARY"
androidVersionTextMinimum Android version as displayed
androidMaxVersionMaximum supported Android version, normalized

🖼️ Media & timestamps

FieldDescription
iconApp icon image URL
headerImageStore listing header/banner image URL
screenshotsList of screenshot image URLs
videoPromo video URL, if the listing has one
videoImageThumbnail image for the promo video
previewVideoAdditional preview video URL, if present
commentsUp to 5 review snippets preloaded on the app page itself
scrapedAtISO-8601 UTC timestamp of when the record was collected

⭐ Review fields (scrapeReviews action)

FieldDescription
idReview id
appIdPackage name the review belongs to
urlDeep link to the review on the app's listing page
userNameReviewer's display name
userImageReviewer's avatar image URL
scoreStar rating left by the reviewer (1–5)
scoreTextStar rating as a string
textReview body
dateISO-8601 UTC date the review was posted
thumbsUp"Was this helpful" count
versionApp version the review references, if published
replyTextDeveloper's reply text, if any
replyDateISO-8601 UTC date of the developer reply
hasDeveloperReplytrue when a developer reply exists
criteriasPer-review sub-ratings the app collects, as [{criteria, rating}]; empty when the app doesn't use them
scrapedAtISO-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

  1. Open Google Play Scraper on the Apify Store and click Try for free.
  2. Pick an action — the only required input — from 🔎 app search, 📦 app URLs, 🧩 similar apps or ⭐ reviews.
  3. Fill in that action's own section: scrapeAppSearch.keywords, scrapeAppUrls.urls, scrapeSimilarApps.urls, or scrapeReviews.appId.
  4. Set the storefront country, the listing language, and count if you want to cap how many records the run stores.
  5. Click Start. Records stream into the dataset live, so an interrupted run still leaves usable data.
  6. 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, installs and updated to track how a competitor's rating and install band move after each release.
  • 💲 Pricing analysts use price, iapMinPrice and iapMaxPrice to benchmark in-app purchase tiers across a category before setting their own app's price.
  • 🐛 Product & QA teams use recentChanges and version alongside score to spot whether a new release caused a rating drop.
  • 💬 Sentiment researchers use text, score and hasDeveloperReply from the review record to build a topic or sentiment model of user complaints.
  • 🤖 AI engineers feed description, summary and review text into 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.

ParameterRequiredTypeDescriptionExample Value
actionYesstringDecides what is scraped. Only the matching section below is used. One of scrapeAppSearch, scrapeAppUrls, scrapeSimilarApps, scrapeReviews. Default: scrapeAppSearch."scrapeAppSearch"
scrapeAppSearch.keywordsNoarrayKeywords to search the Google Play Store for. One keyword per line — bulk supported.["photo editor", "language learning"]
scrapeAppSearch.countryNostringGoogle Play storefront the keyword search runs against. One of 86 country codes. Default: us."us"
scrapeAppUrls.urlsNoarrayOne 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.urlsNoarraySimilar / recommended apps are collected from each source app you list here. Bulk supported.["com.spotify.music"]
scrapeReviews.appIdNostringThe 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.countryNostringGoogle Play storefront the reviews are read from. One of 86 country codes. Default: us."us"
cursorNostringContinue a review collection where a previous run stopped. Copy the value stored under the lastCursor key in that run's key-value store. Default: "".""
countryNostringGoogle 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"
languageNostringLanguage of the returned listing text — title, summary, description and What's new. Applies to every action. One of 26 language codes. Default: en."en"
countNointegerUpper limit on how many records the run stores. Leave empty or 0 to collect everything available. Minimum: 0.10
proxyConfigurationNoobjectApify 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 ApifyClient
client = 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.


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.


Scraper NameWhat it extracts
Facebook Reviews ScraperReviews and ratings from Facebook Pages
Walmart Reviews ScraperProduct reviews and ratings from Walmart
Udemy Course Reviews ScraperCourse reviews and ratings from Udemy
Airbnb Review ScraperGuest 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.