Google Play Data Extractor
Pricing
from $0.10 / 1,000 dataset items
Google Play Data Extractor
Get valuable info & reviews from Google Play! Access title, price, ratings, download rates, screenshots, released date, version number & developer details for any region or language. Unlimited & lightning-fast extraction. Export data in XML, JSON, CSV, Excel, or HTML formats.
Pricing
from $0.10 / 1,000 dataset items
Rating
5.0
(10)
Developer
epctex
Maintained by CommunityActor stats
27
Bookmarked
1.4K
Total users
32
Monthly active users
a day ago
Last modified
Categories
Share
Google Play Scraper
Google Play Scraper is a commercial-grade Google Play API built for teams that require dependable, structured Play Store data without maintaining scraping infrastructure in-house. Since Google Play does not provide a proper free API, the actor gives you app details, search results, developer portfolios, and reviews within a single job, on a transparent pay-per-event model — no proxies to manage, no platform costs beyond the data you collect.
This Google Play scraping solution is built around four query types that can be run independently or combined in one job: app detail lookups, keyword search, developer portfolio scraping, and review collection nested under any of the three. Because every mode accepts input in the same run, a single execution can cover a targeted app lookup, a category-defining search, and a competitor's full catalog at once.
Google Play Scraper Capabilities
The Google Play API supports the following features:
- App records — Provide an app detail URL or a bare app id and get the full Google Play record.
- Search results — Provide a search URL or just a keyword, with an optional free/paid filter.
- Developer portfolios — Provide a developer URL or id and scrape every app they publish.
- Reviews — Nest them under each app record, or write them as their own flat records.
- Any region — Read the store in any country and language, per run or per URL.
- Limit results — Control output by total items or by review pages per app.
Supported Google Play Data Sources
| Data Source | How to Target It | What It Covers |
|---|---|---|
| App details | App detail URL, or a bare app id (com.example.app) in startUrls | The full Google Play record for one app |
| Search results | Search URL in startUrls, or the search keyword field | Apps matching a keyword, with the same full record as a detail lookup |
| Developer portfolios | Developer URL or numeric developer id in startUrls | Every app published by a developer |
| Reviews | includeReviews or onlyIncludeReviews on any app, search, or developer query | Individual review objects, nested under the app or written flat |
Who Can Use This Google Play Scraper
The Google Play Scraper is applicable wherever public Play Store data carries commercial or analytical value. Typical adopters include:
App intelligence and competitive analysis teams. Track a competitor's full catalog through developer portfolio scraping, and monitor rating, install count, and version history across regions.
ASO and marketing teams. Run keyword-driven search to see which apps rank for a term, in which country and language, and how pricing and category positioning compare.
Product and UX organizations. Pull nested review threads for an app to surface recurring complaints, feature requests, and version-specific feedback, sorted by newest, rating, or helpfulness.
Market research and consumer insight teams. Search across a category-defining keyword and region to observe how an app segment is priced, described, and reviewed in the user's own language.
Academic and social science researchers. Collect reproducible Google Play datasets defined by app, developer, keyword, region, and language, with explicit item and page caps for controlled sample sizes.
AI and machine learning teams. Assemble structured app-metadata and review corpora for model training, evaluation, and benchmarking.
Investment research and financial analysis. Monitor install growth, rating trends, and developer output for public or acquisition-target companies with an app presence.
Journalists and OSINT analysts. Trace a developer's published apps, a specific app's rating history, or public sentiment in its reviews.
Migrating from the Rental Actor
This actor replaces the previous rental (monthly-subscription) Google Play Scraper. The app and review objects keep the same field names, so most integrations keep working.
What changed:
- Pricing is now pay-per-event instead of a flat monthly rental. You are charged per query and per result, so small runs cost a fraction of a subscription.
proxyhas been removed. Proxying is handled for you.endReviewsPageis nowmaxReviewPages— the old name still works, with the same meaning.onlyIncludeReviewsnow impliesincludeReviews. It writes reviews only, with no app record, whether or notincludeReviewsis set alongside it. A saved task that set it alone will get reviews where it previously got app records.search,country,lang,price,reviewsSort,maxItemsandcustomMapFunctionare new. None of them existed on the rental actor.- Category and top-chart start URLs are no longer scraped, and are reported instead.
Pricing: Transparent Event-Based Costs
Pay only for what you scrape. No subscriptions, no hidden fees.
| Event Type | Price | What's Included |
|---|---|---|
| App Detail | $0.001 per app id | Each app id you provide directly |
| Search Query | $0.003 per search | Each search request, first 30 dataset items free |
| Developer Query | $0.003 per portfolio | Each developer portfolio request, first 30 dataset items free |
| Review Query | $0.015 per app | Each app whose reviews you fetch, first 150 reviews free |
| Dataset Item | $0.0001 per item | Each record saved to output, beyond a query's included items |
Each search or developer query includes its first 30 dataset items, and each review query includes the first 150 reviews of its app — every review after that is a dataset item, whether it is written flat or nested into the app record. Unsupported start URLs carry no query charge, and their error record is included at no cost. Every allowance above applies to paid plans; on the free plan each stored record is charged $0.0001.
Cost Examples
| Scenario | Charges | Calculation | Total Cost |
|---|---|---|---|
| 1 app detail URL | 1 app detail + 1 dataset item | $0.001 + $0.0001 | $0.0011 |
| 1 search, 30 apps | 1 search query, 30 items included | $0.003 | $0.003 |
| 1 search, 250 apps | 1 search query + 220 dataset items | $0.003 + $0.022 | $0.025 |
1 app's reviews (onlyIncludeReviews, maxReviewPages: 1) | 1 review query, 150 reviews included | $0.015 | $0.015 |
1 app's reviews (onlyIncludeReviews, maxReviewPages: 3) | 1 review query + 300 dataset items | $0.015 + $0.03 | $0.045 |
Search + reviews, 30 apps (includeReviews, maxReviewPages: 1) | 1 search query + 30 review queries | $0.003 + $0.45 | ~$0.453 |
Controlling Google Play Scraping Costs
The event-based model rewards precise job design. A few principles follow directly from the rate card:
- Set
maxReviewPageswhenever you enable a review flag. Left unset, reviews page until the app runs out of them, and every review past the first 150 is a dataset item — for every app in the run. - Use
maxItemsto cap the apps you collect. It trims the result batch before any reviews are fetched, so each app you drop is a review query you do not pay for. - Choose nested vs. flat reviews by output shape, not price. Reviews cost the same whether written nested (
includeReviews) or flat (onlyIncludeReviews). - Leave the review flags off when you only need app metadata.
- Prefer the developer name over the numeric id for large portfolios. Google does not paginate the numeric developer view, so a numeric id returns only that developer's first ~10 apps.
Use maxItems and maxReviewPages to enforce hard ceilings on any run before scaling it. On the Free plan, maxItems is not user-adjustable — every demo run is capped at 10 items regardless of what you set (see Demo Mode). On paid plans, maxItems is respected up to your plan's own per-run ceiling, whichever is lower.
Demo Mode
Free-plan users can try this actor without a subscription. The limit is 5 runs per month and 10 items per run, and this cap overrides any maxItems value you provide — the Free plan does not let you scrape past 10 items per run. The API is not available on the Free plan. For unrestricted use, subscribe to a paid plan.
How to Use the Google Play Scraper
- Define your targets. Supply
startUrls,search, or both. At least one is required. - Set the region. Use
countryandlangat the run level, orgl/hlparameters on individual start URLs to mix regions in one run. - Decide on reviews. Set
includeReviewsto nest reviews under each app, oronlyIncludeReviewsto write them as flat records with no app record. - Apply sorting. Set
reviewsSorttoNEWEST,RATING, orHELPFULNESSwhen scraping reviews. - Set volume limits. Apply
maxItemsto cap total output, andmaxReviewPagesto cap review pages per app. On the Free plan these are capped regardless of the value you set — see Demo Mode. - Run a small test first. Execute a low-volume run to review the returned structure before committing to a large job.
- Scale. Increase limits once the output matches your requirements.
Input Parameters
| Field | Type | Description | Default |
|---|---|---|---|
startUrls | array | App detail, search and developer URLs, bare app ids (com.example.app) and numeric developer ids | [] |
search | string | A search keyword. Runs as its own query, and can be combined with startUrls | — |
country | string | Two-letter country code. A gl parameter on a start URL overrides it for that entry | US |
lang | string | Language of the results. An hl parameter on a start URL overrides it for that entry | en |
price | string | all / free / paid. Applies to search only | all |
includeReviews | boolean | Attach reviews to every app record under reviewsList | false |
onlyIncludeReviews | boolean | Write reviews as flat records without the app record. Implies includeReviews | false |
reviewsSort | string | NEWEST / RATING / HELPFULNESS | NEWEST |
maxReviewPages | integer | Review pages to fetch per app, each up to 150 reviews. Unset fetches every page an app has | — |
maxItems | integer | Caps the records written across every query and mode combined. Reviews nested under includeReviews are part of their app's record, not records of their own, so maxReviewPages is what bounds them. On the Free plan every run is capped at 10 items regardless of this value | 1000 |
customMapFunction | string | Reshape each record before it is written | — |
At least one of startUrls or search is required. If you provide both, both are scraped. maxItems is prefilled with 1000 in the interface and collects everything when you clear it; maxReviewPages is unset by default.
Input Examples
Scrape a single app by URL
{"startUrls": ["https://play.google.com/store/apps/details?id=com.instagram.android"]}
Search for apps by keyword
{"search": "habit tracker","country": "US","lang": "en","price": "free","maxItems": 100}
Scrape a developer's full portfolio
{"startUrls": ["https://play.google.com/store/apps/developer?id=Supercell"]}
Combine start URLs and search, with reviews
{"startUrls": ["https://play.google.com/store/apps/details?id=com.instagram.android","https://play.google.com/store/search?q=workout&c=apps","https://play.google.com/store/apps/developer?id=Supercell"],"search": "habit tracker","country": "US","lang": "en","price": "free","includeReviews": true,"reviewsSort": "NEWEST","maxReviewPages": 2,"maxItems": 50}
URL Patterns
https://play.google.com/store/apps/details?id=com.instagram.androidhttps://play.google.com/store/search?q=workout&c=appshttps://play.google.com/store/apps/developer?id=Supercellhttps://play.google.com/store/apps/dev?id=5700313618786177705com.instagram.android5700313618786177705
Tips
- You can mix app detail, search and developer URLs in
startUrls, and add asearchkeyword on top — each entry is scraped as its own query. - When you want one specific app, copy and paste its Play Store URL, or just its app id.
- Per-URL
hlandglparameters override the run-levellangandcountry, so one run can mix regions. Entries that resolve to the same query in the same region are scraped once. - A developer entry can be a name (
?id=Supercell) or a numeric id. As a bare entry without a URL, only numeric developer ids are recognised — use a developer URL to pass a name. - Prefer the developer name for large portfolios. Google does not paginate the numeric developer view, so
?id=5700313618786177705returns only that developer's first ~10 apps. The same developer requested by name —?id=Google+LLC— returns the full list.
Not Supported: Category and Top-Chart URLs
Google Play category and chart pages — /store/apps/category/..., /store/apps/top, /store/apps/collection/... — cannot be scraped. Google Play's search accepts a free-text term, not a category id, so a category page has no faithful equivalent as a query. To cover a category, use a search keyword that describes it instead.
Each such entry is written to the dataset as an error record — free on a paid plan, with neither a query charge nor a dataset-item charge — so you can see exactly which input was not used:
{"inputSource": {"queryIndex": 0,"mode": "unsupported","filters": { "country": "US", "lang": "en" },"paginationToken": null},"error": true,"code": "C003","entry": "https://play.google.com/store/apps/category/GAME_ACTION","message": "Google Play category and top-chart URLs are not supported. Use a search URL, a search keyword, an app detail URL or a developer URL instead."}
Output Examples
App
{"inputSource": {"queryIndex": 0,"mode": "detail","appId": "com.tinybuildgames.helloneighbor","filters": { "country": "US", "lang": "en" },"paginationToken": null},"title": "Hello Neighbor","appId": "com.tinybuildgames.helloneighbor","url": "https://play.google.com/store/apps/details?id=com.tinybuildgames.helloneighbor","summary": "Hello Neighbor is a stealth horror game about sneaking into your neighbor's house.","installs": "50,000,000+","minInstalls": 50000000,"score": 3.9,"scoreText": "3.9","ratings": 1051408,"reviews": 20762,"free": true,"price": 0,"priceText": "Free","currency": "USD","developer": "tinyBuild Games","developerId": "tinyBuild+Games","developerEmail": "support@tinybuild.com","developerLegalName": "TinyBuild LLC","genre": "Action","categories": [{ "name": "Action", "id": "GAME_ACTION" }],"contentRating": "Teen","version": "2.3.15","released": "Dec 6, 2018","updated": 1749574800000,"screenshots": ["https://play-lh.googleusercontent.com/..."]}
reviews is the number of reviews the app has, an integer. It is never the review objects themselves — those live in reviewsList. Search and developer results carry the same full app record as a detail lookup, not a lighter summary.
Reviews (nested, includeReviews)
{"appId": "com.instagram.android","reviews": 4550757,"reviewsList": [{"id": "474d5f41-cd43-4421-b5be-d08a9086724d","userName": "A Google user","score": 5,"text": "Love it","date": "2026-08-31T09:12:03.000Z","thumbsUp": 2,"appId": "com.instagram.android","appCountry": "US","appLanguage": "en"}]}
reviewsList holds every review of the app, bounded by maxReviewPages. maxItems does not bound it — the app and its reviews are one record, so a nested review is not an item to cap. Set maxReviewPages whenever you scrape reviews across a search or a developer portfolio, or every app in the run pages until it runs out of reviews.
The app and all of its reviews are stored as a single record, and a record holds at most 9 MB, so reviewsList stops at roughly 20,000 reviews, with a warning in the log. Use onlyIncludeReviews for apps with more reviews than that: one review per record has no such ceiling.
With onlyIncludeReviews, the app record is skipped and those same review objects are written as top-level records instead. There maxItems does bound the paging, because each review is its own record.
Input Attribution
Every record carries an inputSource object attributing it to the input that produced it:
| Field | Description |
|---|---|
queryIndex | Which resolved input produced the record, counting from 0 |
mode | detail, search, developer, review or unsupported — the path the record came from |
appId / searchQuery / developerId | Whichever apply. A record found through a search carries both the searchQuery that found it and its own appId |
filters | The country, lang, price and reviewsSort actually used for the query — absent keys were not sent |
paginationToken | The token that fetched this review page. null on the first page and on everything that is not a review |
Custom Map Function
customMapFunction receives each output object and returns whatever you want stored in its place. With includeReviews it receives the app record before reviewsList is attached, so reviews pass through untouched:
(object) => {return {appId: object.appId,title: object.title,score: object.score,installs: object.installs,};}
If your function throws, the original record is written unchanged and a warning is logged, so an error there never loses you data.
During the Run
The actor logs its progress as it works through each start URL, search, or review page. If an input entry cannot be scraped — for example a category or top-chart URL — it is written to the dataset as an error record with an explanatory code and message, at no charge, rather than silently dropped. If your input is invalid altogether, such as leaving both startUrls and search empty, the actor stops immediately with an explanation of what went wrong.
Frequently Asked Questions
What can the Google Play Scraper collect? The actor collects Google Play app details, search results, developer portfolios, and app reviews, sourced through direct URLs, bare app/developer ids, or a search keyword, in any combination in the same run.
Can I scrape app reviews? Yes. Set includeReviews: true to nest reviews under their app's reviewsList, or onlyIncludeReviews: true to write them as flat top-level records instead. Review retrieval is billed as a review query at $0.015 per app, with the first 150 reviews included.
Can I run start URLs and a keyword search in one job? Yes. search and startUrls can be supplied together in a single run. At least one of the two must be provided.
How do I scrape a developer's whole app catalog? Provide a developer URL or numeric developer id in startUrls. Prefer the developer name over the numeric id — Google does not paginate the numeric view, so it returns only the first ~10 apps.
How do I read the store in a different country or language? Set country and lang at the run level, or add gl/hl query parameters to an individual start URL to override them for just that entry.
How do I sort reviews? Set reviewsSort to NEWEST, RATING, or HELPFULNESS.
How do I cap the volume of a run? maxItems caps total records across every query and mode, and defaults to 1000. maxReviewPages caps review pages per app and is unlimited by default.
Can I customise the output? Yes. customMapFunction takes each object as an argument and returns a mapped object to store in its place. If it throws, the original record is written unchanged.
Can I scrape category or top-chart pages? No. Google Play's search only accepts a free-text term, not a category id, so category and top-chart URLs have no faithful equivalent as a query. Each such entry is written as a free error record instead — use a search keyword that describes the category.
Does a large review set cost more per app? The review query itself is a flat $0.015 per app regardless of how many reviews it has; only reviews beyond the first 150 are charged as dataset items.
Are dataset items always charged? Dataset items are $0.0001 per item stored, and on paid plans each search or developer query includes its first 30 items free, and each review query includes its first 150 reviews free. On the free plan every stored record is charged.
What happens if my input is invalid? The actor stops immediately and returns an explanation of the problem. Leaving both startUrls and search empty is one such case.
Is there a free way to test the Google Play Scraper? Yes. Demo Mode allows free-plan users to run the actor without a subscription, limited to 5 runs per month and 10 items per run.
Is API access included on the Free plan? No. The API is not available on the Free plan. A paid plan is required for API access and unrestricted use.
I'm migrating from the rental actor — what changed? See Migrating from the Rental Actor above: pricing moved to pay-per-event, proxy was removed, endReviewsPage was renamed to maxReviewPages, onlyIncludeReviews now implies includeReviews, and category/top-chart URLs are reported rather than scraped.
Support and Custom Integrations
Please visit us through epctex.com to see all available products. For custom integrations, reach out via the chat box on epctex.com. For support: business@epctex.com.