Google Play Scraper & Developer Catalog avatar

Google Play Scraper & Developer Catalog

Pricing

from $4.99 / 1,000 results

Go to Apify Store
Google Play Scraper & Developer Catalog

Google Play Scraper & Developer Catalog

Scrape Google Play apps and developer catalogs to collect app names, ratings, reviews, installs, categories, versions, developer details, and related apps. Ideal for app market research, competitor analysis, ASO, and developer discovery.

Pricing

from $4.99 / 1,000 results

Rating

0.0

(0)

Developer

API Empire

API Empire

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

9 hours ago

Last modified

Share

Google Play Scraper โ€” Extract Apps, Catalogs and Reviews

Google Play Scraper & Developer Catalog reads the public Google Play Store โ€” a publisher's entire app catalog, ranked category charts, single app records, keyword search results, related apps and user reviews โ€” all from one Actor. Every response is typed, normalized JSON: no HTML, no CSS selectors, no parsing step. Six catalog modes cover what would otherwise be six separate scrapers, and every row streams to the dataset the moment it is collected. Point it at a publisher name, a chart category, or a list of app URLs, and start pulling structured Google Play data in minutes.

What is Google Play Scraper & Developer Catalog?

Google Play Scraper & Developer Catalog is an Apify Actor that reads public Google Play Store pages and the storefront's own internal data endpoints, and returns the result as structured rows. It targets the play.google.com storefront across 86 countries and 28 listing languages. No Google account, no API key and no login are required โ€” the Actor reads the same pages any visitor sees.

  • ๐Ÿข Catalog every app a publisher lists, in listing order
  • ๐Ÿ† Read ranked category charts โ€” Top Free, Top Paid, Top Grossing, New and Trending
  • ๐Ÿ“ฆ Pull full app records for specific URLs, package ids, search hits or related apps
  • โญ Collect user reviews for one or many apps, with a resume token
  • ๐Ÿ“ค Export results as JSON, CSV, Excel, XML or RSS โ€” no proxy setup, no parsing

What data does Google Play Scraper & Developer Catalog collect?

The Actor returns four kinds of rows, selected by the catalogMode input, and every row carries a discoveryMode tag identifying which one produced it.

Data TypeKey FieldsJSON Field Names
App detailstitle, price, install count, rating, developer contacttitle, appId, installs, score, price, developer, developerEmail
Developer catalogpublisher portfolio position and sizedeveloperCatalogName, developerCatalogRank, developerCatalogSize, developerCatalogUrl
Category chartsrank, chart list, category and storefrontchartRank, chartCollectionLabel, chartCategory, chartCountry
User reviewsrating, review text, developer reply, sub-ratingsscore, text, thumbsUp, replyText, criterias

Need more Google Play data?

This is the account's only Google Play Actor, and it already merges catalog, chart, detail, search, related-app and review scraping into one run โ€” there is no separate app-details-only or reviews-only Actor to cross-sell for this platform. If you need data from a different storefront or platform, check the publisher's other Actors on the Apify Store.

Why not build this yourself?

Google Play has no public API for reading another publisher's catalog, chart rankings, search results or reviews โ€” the official Google Play Developer API only manages apps you own, and its Play Catalog API is a change-events feed restricted to apps that have opted into alternative-store distribution, not a general read API (verified against Google's own documentation, 2026-08-15). That leaves scraping as the only route to this data, and the storefront does not make it easy: category charts, the developer catalog and reviews are all served from an internal batchexecute RPC endpoint with undocumented, versioned request payloads, and the app-details page embeds its data in a deeply nested array whose index positions move between page revisions โ€” this Actor's own parser locates the review-request template by scanning for its RPC id rather than a fixed slot, because that slot has already moved once (from ds:11 to ds:10) between store releases.

Maintaining a scraper against that means re-mapping array indexes and continuation-token shapes every time Google reshuffles a page, on top of the usual IP-blocking and rate-limit handling. This Actor absorbs that maintenance; a DIY script does not.

Why do developers and teams scrape Google Play?

๐Ÿค– For AI engineers and agent builders

An agent that recommends, compares or monitors mobile apps needs structured app data it can drop straight into a tool call or a RAG index. appDetails mode returns a stable ~50-field JSON record per app โ€” title, description, install tier, rating, pricing, content rating โ€” with no HTML to strip, so it can be indexed into a vector store or passed directly into an LLM context window as retrieval grounding for an app-recommendation or competitive-intel agent.

๐Ÿ“Š For ASO and app marketing teams

Tracking where a title sits in topCharts for a category and country, week over week, is the core loop of app store optimization. Because every chart row keeps its chartRank, chartCategory and chartCountry, a team can diff two runs of the same category in different storefronts to see where a competitor is climbing before it shows up in install numbers.

๐Ÿ”ฌ For market and competitive researchers

developerCatalog mode pulls a rival publisher's entire portfolio โ€” every app, its install tier, rating and release date โ€” in one run, instead of collecting package ids by hand. Combined with minInstalls and minScore filters, a researcher can size up a publisher's real footprint (how many apps, how well rated, how recently updated) without touching a private API.

๐Ÿ› ๏ธ For developers building data products

keywordSearch and relatedApps modes turn Google Play into a queryable dataset: search terms expand into full app records, and a source app expands into everything the storefront recommends alongside it. That is the raw material for an app-discovery feature, a pricing dashboard, or a scheduled monitor that flags when a tracked app's rating or price changes.

How to scrape Google Play (step by step)

  1. Open Google Play Scraper & Developer Catalog on its Apify Store page and click Try for free (or Start, if it is already in your account).
  2. Choose the scope in ๐Ÿงญ What should this run catalog? (catalogMode) โ€” developerCatalog, topCharts, appDetails, keywordSearch, relatedApps or userReviews.
  3. Fill in only the input section that matches that scope โ€” publishers, chart lists and categories, app URLs, keywords, source apps, or review targets. Fields belonging to other scopes are ignored.
  4. Set ๐Ÿ—บ๏ธ Storefront country and ๐Ÿ—จ๏ธ Listing language, and optionally a โญ Minimum star rating, โฌ‡๏ธ Minimum installs and ๐Ÿ”ข Maximum rows for this run.
  5. Click Start, then open the Dataset tab and export the results as JSON, CSV, Excel, XML or RSS.

What to do when Google Play changes its structure

Google Play's internal endpoints and field layouts shift between store releases without notice โ€” this Actor's own parsing code already tracks two such shifts. The Actor is maintained against that drift, and the output field names and types stay stable on your end, so a downstream pipeline built against this schema keeps working without a rewrite when the storefront changes underneath it.

โฌ‡๏ธ Input

All 27 input fields are optional โ€” catalogMode decides which of the remaining fields are used. Fields ending in .appId, .country, .keywords or .urls, plus action, count and cursor, are the original scraper's field names, kept as working aliases for an existing input JSON.

ParameterRequiredTypeDescriptionExample Value
catalogModeNostring (select)What this run catalogs: developerCatalog, topCharts, appDetails, keywordSearch, relatedApps, userReviews."developerCatalog"
maxRecordsNointeger (min 0)Hard cap on rows written in total. Empty = collect everything in scope.50
developerTargetsNoarray (stringList)One publisher per line โ€” name, numeric id, page URL, or any app URL/package id. Used by developerCatalog.["Google LLC"]
maxAppsPerDeveloperNointeger (min 0)Apps taken per publisher before moving to the next. Empty = full portfolio.25
chartCollectionsNoarray (select, multi)Ranked lists to read: TOP_FREE, TOP_PAID, TOP_GROSSING, NEW_FREE, NEW_PAID, TRENDING.["TOP_FREE"]
chartCategoriesNoarray (select, multi)One or more of 54 storefront categories, e.g. APPLICATION, GAME, SOCIAL (full list in the schema dropdown).["APPLICATION"]
maxAppsPerChartNointeger (min 1, max 200)Ranked positions to read per chart, from #1 down.20
appTargetsNoarray (stringList)One app per line, URL or package id. Used by appDetails.["com.spotify.music"]
searchTermsNoarray (stringList)One keyword per line. Used by keywordSearch.["habit tracker", "budget planner"]
similarToAppsNoarray (stringList)Source apps for relatedApps, URL or package id.["com.spotify.music"]
reviewAppTargetsNoarray (stringList)Apps to read reviews for, URL or package id. Used by userReviews.["com.spotify.music"]
maxReviewsPerAppNointeger (min 0)Reviews taken per app before moving on. Empty = page through everything available.25
reviewCursorNostringResume token for the first app in reviewAppTargets, from a previous run's lastCursor.""
storefrontCountryNostring (select)One of 86 storefront country codes (us, gb, in, de, โ€ฆ). Affects rankings, prices and availability."us"
storefrontLanguageNostring (select)One of 28 language codes (en, es, de, ja, โ€ฆ). Affects titles, summaries and descriptions."en"
minScoreNonumber (min 0, max 5)Drop app rows rated below this value; unrated apps are dropped too. 0 keeps everything.4
minInstallsNointeger (min 0)Drop app rows below this install count.100000
actionNostring (select, legacy)Legacy scope selector โ€” maps to catalogMode: scrapeReviews, scrapeAppSearch, scrapeAppUrls, scrapeSimilarApps.โ€”
scrapeReviews.appIdNostring (legacy)Legacy single-app reviews target โ€” maps to reviewAppTargets.โ€”
scrapeReviews.countryNostring (select, legacy)Legacy reviews storefront โ€” maps to storefrontCountry.โ€”
scrapeAppSearch.keywordsNoarray (stringList, legacy)Legacy search keywords โ€” maps to searchTerms.โ€”
scrapeAppSearch.countryNostring (select, legacy)Legacy search storefront โ€” maps to storefrontCountry.โ€”
scrapeAppUrls.urlsNoarray (stringList, legacy)Legacy app-detail targets โ€” maps to appTargets.โ€”
scrapeSimilarApps.urlsNoarray (stringList, legacy)Legacy related-app source apps โ€” maps to similarToApps.โ€”
countNointeger (min 0, legacy)Legacy total row cap โ€” maps to maxRecords.โ€”
cursorNostring (legacy)Legacy reviews resume token โ€” maps to reviewCursor.โ€”
proxyConfigurationNoobject (proxy)Apify Proxy settings for the run. Default: {"useApifyProxy": true}.{"useApifyProxy": true}

Example input (developer catalog scope):

{
"catalogMode": "developerCatalog",
"developerTargets": ["Google LLC"],
"maxAppsPerDeveloper": 25,
"maxRecords": 50,
"storefrontCountry": "us",
"storefrontLanguage": "en",
"minScore": 0,
"minInstalls": 0,
"proxyConfiguration": { "useApifyProxy": true }
}

โš ๏ธ Common pitfall: only the input section matching your catalogMode is used โ€” developerTargets, chartCollections, appTargets, searchTerms, similarToApps and reviewAppTargets are all accepted at once, but everything outside the active scope is silently ignored. catalogMode prefills to developerCatalog with developerTargets prefilled to ["Google LLC"], so starting a run without changing anything returns Google LLC's own catalog, not an error.

โฌ†๏ธ Output

Every row is typed JSON with a stable field set per catalog mode, streamed to the dataset as it is collected. Results export as JSON, CSV, Excel, XML or RSS from the Apify Console, or over the API. The dataset also exposes five pre-built views โ€” Catalog overview, Developer catalog, Category chart rankings, App details, and Reviews โ€” each showing a relevant subset of the full row.

Scraped app record (appDetails, keywordSearch, relatedApps, topCharts, developerCatalog)

appDetails, keywordSearch, relatedApps, topCharts and developerCatalog all push the same underlying app record; only the extra context fields differ (see below). A row from appDetails (no extra fields) looks like:

{
"title": "Spotify: Music and Podcasts",
"description": "With Spotify, you can play millions of songs and podcasts for free...",
"descriptionHTML": "With Spotify, you can play millions of songs and podcasts for free...<br>...",
"summary": "Music and podcasts, all in one place",
"installs": "1,000,000,000+",
"minInstalls": 1000000000,
"maxInstalls": 1861519493,
"score": 4.339513,
"scoreText": "4.3",
"ratings": 27834912,
"reviews": 12345678,
"histogram": { "1": 1234567, "2": 456789, "3": 987654, "4": 2345678, "5": 15678901 },
"price": 0,
"free": true,
"currency": "USD",
"priceText": "Free",
"available": true,
"offersIAP": true,
"androidVersion": "6.0",
"androidVersionText": "6.0 and up",
"androidMaxVersion": "VARY",
"developer": "Spotify AB",
"developerId": "Spotify+AB",
"developerEmail": "android-support@spotify.com",
"developerWebsite": "https://www.spotify.com/",
"developerAddress": "Spotify AB, Regeringsgatan 19, 111 53 Stockholm",
"privacyPolicy": "https://www.spotify.com/us/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/icon-example",
"headerImage": "https://play-lh.googleusercontent.com/header-example",
"screenshots": ["https://play-lh.googleusercontent.com/screenshot-1"],
"video": null,
"videoImage": null,
"previewVideo": null,
"contentRating": "Teen",
"contentRatingDescription": null,
"adSupported": true,
"released": "Jul 14, 2011",
"updated": 1770000000000,
"version": "9.0.20.550",
"recentChanges": "Bug fixes and performance improvements.",
"comments": ["Great app, love the playlists", "Best music app out there"],
"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",
"discoveryMode": "appDetails",
"scrapedAt": "2026-08-15T09:41:07.123Z"
}

Every app row carries all 51 keys above (title through scrapedAt). Fields Google Play does not publish for a given app โ€” developerAddress, video, previewVideo, contentRationDescription, in-app-purchase details โ€” come back as null rather than a guessed value. updated is a Unix timestamp in milliseconds; released stays as the storefront's own date string.

Mode-specific context fields

Each catalog mode appends its own extra keys to the app record above:

discoveryModeExtra fields added
developerCatalogdeveloperQuery, developerCatalogId, developerCatalogName, developerCatalogRank, developerCatalogSize, developerCatalogUrl
topChartschartCategory, chartCollection, chartCollectionLabel, chartCountry, chartRank, chartSize
keywordSearchsearchTerm
relatedAppsrelatedToAppId
appDetails(none โ€” base record only)

Scraped review (userReviews)

{
"id": "gp:AOqpTOFexample1234567890",
"userName": "Jordan R.",
"userImage": "https://play-lh.googleusercontent.com/avatar-example",
"date": "2026-07-30T14:22:05.000Z",
"score": 5,
"scoreText": "5",
"url": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=gp:AOqpTOFexample1234567890",
"title": null,
"text": "Works great, the offline mode saved me on a long flight.",
"replyDate": "2026-08-01T09:10:00.000Z",
"replyText": "Thanks for the feedback! Glad offline mode worked well for you.",
"version": "9.0.20.550",
"thumbsUp": 42,
"criterias": [{ "criteria": 1, "rating": 5 }],
"appId": "com.spotify.music",
"discoveryMode": "userReviews",
"scrapedAt": "2026-08-15T09:41:07.123Z"
}

title is always null โ€” the reviews endpoint this Actor reads does not carry a review title field. criterias holds the platform's own numeric id for each sub-rating axis alongside its score; Google does not expose a text label for that id on this endpoint.

How does Google Play Scraper & Developer Catalog compare to other Google Play scrapers?

FeatureGoogle Play Scraper & Developer CatalogGeneric alternative
Output formatTyped JSON, five pre-built dataset viewsโœ…/โŒ varies by tool
Entity coverage6 scopes in one Actor: catalog, charts, details, search, related, reviewsโŒ usually one scope per tool
Legacy input compatibilityโœ… original field names still acceptedโŒ usually not preserved across rewrites
Multi-app bulk reviewsโœ… several apps per run with a resume tokenโŒ often one app per run
Proxy/anti-bot handlingโœ… built in, no configuration requiredโœ…/โŒ varies by tool

If you're building an AI agent or RAG pipeline, the output format row is the decision-maker โ€” parsing HTML inside an agent loop is a reliability failure mode, not a feature. Six scopes from one Actor also means one schema to integrate against instead of six.

How many results can you scrape with Google Play Scraper & Developer Catalog?

There is no hard cap in the Actor itself beyond maxRecords โ€” leave it empty and a run collects everything the selected scope returns. Two platform-shaped limits apply within that: maxAppsPerChart tops out at 200, because the storefront itself serves at most 200 ranked positions per chart list. โš ๏ธ Developer catalog pagination reads a publisher's first listing page plus up to 8 continuation batches; a portfolio deeper than that is not fully covered even with maxAppsPerDeveloper left empty. Reviews and keyword search page until the storefront stops returning fresh results, or until maxReviewsPerApp / maxRecords is hit, whichever comes first.

Integrate Google Play Scraper & Developer Catalog and automate your workflow

Google Play Scraper & Developer Catalog works with any language or tool that can send an HTTP request.

REST API integration

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("<YOUR_USERNAME>/google-play-scraper-developer-catalog").call(
run_input={
"catalogMode": "topCharts",
"chartCollections": ["TOP_FREE"],
"chartCategories": ["APPLICATION"],
"maxAppsPerChart": 20,
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["title"], item["chartRank"], item["score"])

Works in Python, Node.js, Go, Ruby, cURL.

MCP for AI agents

This Actor is reachable through Apify's own MCP server without extra setup: point an MCP-compatible client (Claude, Cursor, or any MCP client) at https://mcp.apify.com?tools=<YOUR_USERNAME>/google-play-scraper-developer-catalog to load it as a callable tool.

Automation platforms (n8n, Make, LangChain)

  • n8n โ€” the Apify node's "Run Actor" operation takes this Actor's id and the JSON input above, and passes the finished dataset to the next node.
  • Make โ€” the Apify app's "Run an Actor" module runs a scenario on a schedule (e.g. a weekly chart snapshot) and feeds the output into a Google Sheet or webhook.
  • LangChain โ€” the ApifyWrapper / ApifyActorsTool integration calls this Actor as a tool and loads the resulting dataset as documents for a retrieval chain.

Yes โ€” this Actor reads only publicly available Google Play Store pages, the same pages any visitor sees without logging in. App details, charts and developer catalogs are business and product data (listings, prices, install counts), governed by Google's Terms of Service and, in some jurisdictions, database-rights law rather than data-protection law. The userReviews scope is the exception: review rows include a reviewer's display name (userName) and avatar (userImage), which are personal data, so GDPR/CCPA and your own lawful-basis obligations apply to storing and using that scope's output. Consult legal counsel for commercial use cases involving bulk personal data.

Frequently asked questions

Does Google Play Scraper & Developer Catalog work without a Google account?

Yes. No Google account, login or API key is required for any of the six scopes โ€” the Actor reads public storefront pages and endpoints only.

How often is the scraped data updated?

Every run performs a live fetch against the Google Play Store at the time it runs. Nothing is cached or replayed from an earlier run โ€” a new run always reads current listings, charts and reviews.

What happens if an app, developer or search term returns nothing?

A deleted or delisted app returns no row and is skipped with a warning in the run log rather than an error. An unresolvable developer target, an empty chart for a category/storefront combination, or a search term with no matches also logs a warning and moves on to the next target โ€” the run does not fail, it simply produces fewer rows.

Can I scrape private or restricted Google Play content?

No. The Actor only returns what the public storefront pages already show โ€” pre-release/early-access apps and unpublished listings are not accessible, and reviews are limited to what the storefront's own reviews endpoint returns for that app.

Does the Actor need Apify Proxy configured manually?

No. proxyConfiguration defaults to {"useApifyProxy": true}, and the run starts on its default network route, escalating automatically if a request comes back unusable โ€” no manual proxy group selection is required to get a working run.

Does Google Play Scraper & Developer Catalog work for AI agent workflows and LLM pipelines?

Yes. It is callable as an HTTP endpoint by any agent framework via apify_client, or loaded directly as a tool through Apify's MCP server (https://mcp.apify.com?tools=<username>/google-play-scraper-developer-catalog). Every response is typed JSON with stable field names โ€” no HTML, no parsing step before passing results to an LLM.

How does the Actor handle Google Play's anti-bot measures?

Requests start on the run's default network route and automatically switch to an alternate one if a response comes back blocked or unusable, with built-in retry and backoff on transient failures. This happens automatically โ€” no proxy group configuration is required from the user.

Does Google Play Scraper & Developer Catalog return data in a format LLMs can use directly?

Yes. Every row is typed, normalized JSON with stable field names across runs. Pass it directly into an LLM context window, index it into a vector store, or route it through an agent tool call without an intermediate parsing step.

Can I use Google Play Scraper & Developer Catalog without managing proxies?

Yes. Network routing and retries are handled by the Actor; the only proxy-related input is proxyConfiguration, which defaults to Apify Proxy enabled and does not need to be changed for a normal run.

What happens when Google Play changes its structure or blocks the scraper?

The Actor is maintained against layout and endpoint changes on Google's side โ€” this README documents two such shifts the parser already tracks. The output schema and field names stay stable on your end regardless of what changes internally.

Your feedback

Found a bug, or a field that came back empty when it shouldn't have? We want to know. Open an issue through the Actor's page on the Apify Store (the Issues tab) or use the Contact developer action there โ€” both route directly to the team maintaining this Actor.