Google Play App Search, Lookup & Reviews Scraper
Search Google Play by keyword or look up apps directly by package ID, with ratings, installs, pricing, developer contact details, and optional user reviews across dozens of countries and languages.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | What to scrape. |
searchQuery | string | optional | Keyword to search for in mode=search, for example `photo editor` or `calculator`. |
appIds | array | optional | Package names or Google Play URLs. Used by details, reviews, similar, permissions, and dataSafety modes. |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | What to scrape. |
searchQuery | string | optional | Keyword to search for in mode=search, for example `photo editor` or `calculator`. |
appIds | array | optional | Package names or Google Play URLs. Used by details, reviews, similar, permissions, and dataSafety modes. |
packageNames | array | optional | Android package names such as `com.whatsapp`. Play URLs are also accepted. |
startUrls | array | optional | Full Google Play app URLs, for example `https://play.google.com/store/apps/details?id=com.whatsapp`. |
developerId | string | optional | Numeric Google Play developer ID or a developer page URL, used in mode=developer. |
developerName | string | optional | Display name shown on Google Play, for example `Google LLC`, used in mode=developer. |
country | string | optional | Storefront for search results, pricing, and availability. Reviews are selected by Language, not Country. |
language | string | optional | Language for app pages and the review bucket. Google Play uses this language, not Country, to choose reviews. |
maxItems | integer | optional | Hard cap on dataset rows. Search returns at most 250 apps per query. For similar mode one seed app is one row. |
maxReviewsPerApp | integer | optional | Reviews to collect for each app. Google Play returns at most 4,500 reviews per page; the actor paginates up to this cap. |
reviewSort | string | optional | Order used when fetching reviews. |
includeDetails | boolean | optional | Fetch the full app page for search and developer results, and include app metadata in permissions/dataSafety output. Adds one request per app. |
includePermissions | boolean | optional | Add the app's permission list to app records. Works in search, details, developer, and similar modes. |
includeDataSafety | boolean | optional | Add shared data, collected data, security practices, and the privacy policy URL to app records. |
proxyConfiguration | object | optional | Optional. The actor works without a proxy; use one only if Google Play blocks your runs. |
Download the published input schema
View complete JSON
{
"description": "Choose what to collect from Google Play: search results, app details, reviews, developer catalogs, similar apps, permissions, or data safety.",
"properties": {
"appIds": {
"default": [],
"description": "Package names or Google Play URLs. Used by details, reviews, similar, permissions, and dataSafety modes.",
"editor": "stringList",
"prefill": [],
"title": "App IDs",
"type": "array"
},
"country": {
"default": "us",
"description": "Storefront for search results, pricing, and availability. Reviews are selected by Language, not Country.",
"editor": "select",
"enum": [
"us",
"gb",
"ca",
"au",
"in",
"de",
"fr",
"es",
"it",
"jp",
"kr",
"br",
"mx",
"nl",
"be",
"at",
"ch",
"se",
"no",
"dk",
"fi",
"pl",
"pt",
"cz",
"ro",
"hu",
"gr",
"tr",
"ru",
"ua",
"za",
"eg",
"ng",
"ke",
"id",
"th",
"vn",
"ph",
"my",
"sg",
"tw",
"hk",
"nz",
"ar",
"cl",
"co",
"pe",
"il",
"ae",
"sa"
],
"enumTitles": [
"United States",
"United Kingdom",
"Canada",
"Australia",
"India",
"Germany",
"France",
"Spain",
"Italy",
"Japan",
"South Korea",
"Brazil",
"Mexico",
"Netherlands",
"Belgium",
"Austria",
"Switzerland",
"Sweden",
"Norway",
"Denmark",
"Finland",
"Poland",
"Portugal",
"Czech Republic",
"Romania",
"Hungary",
"Greece",
"Turkey",
"Russia",
"Ukraine",
"South Africa",
"Egypt",
"Nigeria",
"Kenya",
"Indonesia",
"Thailand",
"Vietnam",
"Philippines",
"Malaysia",
"Singapore",
"Taiwan",
"Hong Kong",
"New Zealand",
"Argentina",
"Chile",
"Colombia",
"Peru",
"Israel",
"United Arab Emirates",
"Saudi Arabia"
],
"prefill": "us",
"title": "Country",
"type": "string"
},
"developerId": {
"description": "Numeric Google Play developer ID or a developer page URL, used in mode=developer.",
"editor": "textfield",
"title": "Developer ID",
"type": "string"
},
"developerName": {
"description": "Display name shown on Google Play, for example `Google LLC`, used in mode=developer.",
"editor": "textfield",
"title": "Developer name",
"type": "string"
},
"includeDataSafety": {
"default": false,
"description": "Add shared data, collected data, security practices, and the privacy policy URL to app records.",
"prefill": false,
"title": "Include data safety",
"type": "boolean"
},
"includeDetails": {
"default": false,
"description": "Fetch the full app page for search and developer results, and include app metadata in permissions/dataSafety output. Adds one request per app.",
"prefill": false,
"title": "Include full app details",
"type": "boolean"
},
"includePermissions": {
"default": false,
"description": "Add the app's permission list to app records. Works in search, details, developer, and similar modes.",
"prefill": false,
"title": "Include permissions",
"type": "boolean"
},
"language": {
"default": "en",
"description": "Language for app pages and the review bucket. Google Play uses this language, not Country, to choose reviews.",
"editor": "select",
"enum": [
"en",
"es",
"fr",
"de",
"it",
"pt",
"ja",
"ko",
"zh",
"ru",
"ar",
"hi",
"th",
"vi",
"id",
"tr",
"pl",
"nl",
"sv",
"da",
"no",
"fi",
"cs",
"ro",
"hu",
"el",
"he",
"uk",
"ms",
"tl"
],
"enumTitles": [
"English",
"Spanish",
"French",
"German",
"Italian",
"Portuguese",
"Japanese",
"Korean",
"Chinese",
"Russian",
"Arabic",
"Hindi",
"Thai",
"Vietnamese",
"Indonesian",
"Turkish",
"Polish",
"Dutch",
"Swedish",
"Danish",
"Norwegian",
"Finnish",
"Czech",
"Romanian",
"Hungarian",
"Greek",
"Hebrew",
"Ukrainian",
"Malay",
"Filipino"
],
"prefill": "en",
"title": "Language",
"type": "string"
},
"maxItems": {
"default": 100,
"description": "Hard cap on dataset rows. Search returns at most 250 apps per query. For similar mode one seed app is one row.",
"maximum": 10000,
"minimum": 1,
"prefill": 3,
"title": "Max items",
"type": "integer"
},
"maxReviewsPerApp": {
"default": 100,
"description": "Reviews to collect for each app. Google Play returns at most 4,500 reviews per page; the actor paginates up to this cap.",
"maximum": 50000,
"minimum": 1,
"prefill": 100,
"title": "Max reviews per app",
"type": "integer"
},
"mode": {
"default": "search",
"description": "What to scrape.",
"editor": "select",
"enum": [
"search",
"details",
"reviews",
"developer",
"similar",
"permissions",
"dataSafety"
],
"enumTitles": [
"Search apps by keyword",
"App details by package name or URL",
"Reviews for apps",
"Developer catalog",
"Similar apps",
"App permissions",
"Data safety labels"
],
"prefill": "search",
"title": "Mode",
"type": "string"
},
"packageNames": {
"default": [],
"description": "Android package names such as `com.whatsapp`. Play URLs are also accepted.",
"editor": "stringList",
"prefill": [],
"title": "Package names",
"type": "array"
},
"proxyConfiguration": {
"description": "Optional. The actor works without a proxy; use one only if Google Play blocks your runs.",
"editor": "proxy",
"title": "Proxy configuration",
"type": "object"
},
"reviewSort": {
"default": "newest",
"description": "Order used when fetching reviews.",
"editor": "select",
"enum": [
"newest",
"rating",
"helpfulness"
],
"enumTitles": [
"Newest first",
"Rating",
"Most helpful"
],
"prefill": "newest",
"title": "Review sort",
"type": "string"
},
"searchQuery": {
"default": "calculator",
"description": "Keyword to search for in mode=search, for example `photo editor` or `calculator`.",
"editor": "textfield",
"prefill": "calculator",
"title": "Search query",
"type": "string"
},
"startUrls": {
"default": [],
"description": "Full Google Play app URLs, for example `https://play.google.com/store/apps/details?id=com.whatsapp`.",
"editor": "stringList",
"prefill": [],
"title": "Google Play app URLs",
"type": "array"
}
},
"required": [
"mode"
],
"schemaVersion": 1,
"title": "Google Play Store Scraper Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
items | string | optional | Dataset containing app, review, permission, data safety, and similar-app records. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "Google Play apps, reviews, permissions, data safety labels, developer catalogs, and similar apps.",
"properties": {
"items": {
"description": "Dataset containing app, review, permission, data safety, and similar-app records.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "Google Play records",
"type": "string"
}
},
"title": "Google Play App Intelligence Output",
"type": "object"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"fields": {
"properties": {
"IAPRange": {
"description": "Displayed in-app purchase range.",
"type": "string"
},
"adSupported": {
"description": "Whether the app contains ads.",
"type": "boolean"
},
"androidVersion": {
"description": "Minimum Android version when published.",
"type": "string"
},
"appId": {
"description": "Backward-compatible alias of packageName.",
"type": "string"
},
"appTitle": {
"description": "App name for a review record.",
"type": "string"
},
"appVersion": {
"description": "App version the review was written for.",
"type": "string"
},
"author": {
"description": "Reviewer name.",
"type": "string"
},
"available": {
"description": "Whether the app is listed in the selected storefront.",
"type": "boolean"
},
"categories": {
"description": "Categories as objects with name and id.",
"items": {
"type": "object"
},
"type": "array"
},
"containsAds": {
"description": "Whether the app is marked as containing ads.",
"type": "boolean"
},
"content": {
"description": "Backward-compatible alias of text.",
"type": "string"
},
"contentRating": {
"description": "Content rating, for example Everyone or Teen.",
"type": "string"
},
"country": {
"description": "Storefront used for the request.",
"type": "string"
},
"criterias": {
"description": "Per-criterion ratings when Google Play provides them.",
"items": {
"type": "object"
},
"type": "array"
},
"currency": {
"description": "ISO currency code.",
"type": "string"
},
"dataSafety": {
"description": "Shared data, collected data, security practices, and privacy policy URL.",
"type": "object"
},
"date": {
"description": "Review date in ISO 8601 format.",
"type": "string"
},
"description": {
"description": "Full app description as plain text.",
"type": "string"
},
"descriptionHTML": {
"description": "Full app description with Google Play HTML markup.",
"type": "string"
},
"developer": {
"description": "Developer display name.",
"type": "string"
},
"developerAddress": {
"description": "Developer contact address.",
"type": "string"
},
"developerEmail": {
"description": "Developer contact email.",
"type": "string"
},
"developerId": {
"description": "Google Play developer ID.",
"type": "string"
},
"developerInput": {
"description": "Developer ID or display name used for the run.",
"type": "string"
},
"developerLegalAddress": {
"description": "Legal developer address.",
"type": "string"
},
"developerLegalEmail": {
"description": "Legal developer email.",
"type": "string"
},
"developerLegalName": {
"description": "Legal developer name.",
"type": "string"
},
"developerLegalPhone": {
"description": "Legal developer phone number.",
"type": "string"
},
"developerReply": {
"description": "Developer reply text and date when present.",
"type": "object"
},
"developerUrl": {
"description": "Developer catalog URL.",
"type": "string"
},
"developerWebsite": {
"description": "Developer website.",
"type": "string"
},
"free": {
"description": "Whether the app is free.",
"type": "boolean"
},
"genre": {
"description": "Primary genre name.",
"type": "string"
},
"genreId": {
"description": "Primary genre ID.",
"type": "string"
},
"headerImage": {
"description": "Header image URL.",
"type": "string"
},
"helpfulCount": {
"description": "Number of helpful votes.",
"type": "integer"
},
"histogram": {
"description": "Rating distribution from 1 star to 5 stars.",
"items": {
"type": "integer"
},
"type": "array"
},
"icon": {
"description": "App icon URL.",
"type": "string"
},
"id": {
"description": "Stable identifier. For app records this is the Android package name; for reviews it is the review ID.",
"type": "string"
},
"installs": {
"description": "Displayed install count, for example 1,000,000,000+.",
"type": "string"
},
"isExactMatch": {
"description": "Whether the record is Google Play's exact-match card.",
"type": "boolean"
},
"language": {
"description": "Language used for the request.",
"type": "string"
},
"lastUpdated": {
"description": "Backward-compatible alias of updated.",
"type": "string"
},
"maxInstalls": {
"description": "Upper bound of the install estimate.",
"type": "integer"
},
"minInstalls": {
"description": "Lower bound of the install estimate.",
"type": "integer"
},
"name": {
"description": "App name.",
"type": "string"
},
"offersIAP": {
"description": "Whether the app offers in-app purchases.",
"type": "boolean"
},
"packageName": {
"description": "Android package name, for example com.whatsapp.",
"type": "string"
},
"permissionGroups": {
"description": "Permissions grouped the way Google Play presents them.",
"items": {
"type": "object"
},
"type": "array"
},
"permissions": {
"description": "Flat permission list with permission, group, and type.",
"items": {
"type": "object"
},
"type": "array"
},
"price": {
"description": "App price in the selected storefront currency. Zero means free.",
"type": "number"
},
"priceText": {
"description": "Localized price text.",
"type": "string"
},
"privacyPolicy": {
"description": "Privacy policy URL.",
"type": "string"
},
"rank": {
"description": "One-based position in search or developer results.",
"type": "integer"
},
"rating": {
"description": "Average rating from 0 to 5.",
"type": "number"
},
"ratingCount": {
"description": "Total number of ratings.",
"type": "integer"
},
"ratings": {
"description": "Backward-compatible alias of ratingCount.",
"type": "integer"
},
"realInstalls": {
"description": "Google Play install estimate.",
"type": "integer"
},
"recentChanges": {
"description": "Latest changelog.",
"type": "string"
},
"recordType": {
"description": "app, review, permissions, dataSafety, or similar.",
"type": "string"
},
"released": {
"description": "Original release date as displayed by Google Play.",
"type": "string"
},
"repliedAt": {
"description": "Backward-compatible developer reply date.",
"type": "string"
},
"replyContent": {
"description": "Backward-compatible developer reply text.",
"type": "string"
},
"reviewCount": {
"description": "Total number of written reviews.",
"type": "integer"
},
"reviewId": {
"description": "Review ID (backward-compatible alias of id).",
"type": "string"
},
"reviewUrl": {
"description": "Permalink to the review.",
"type": "string"
},
"reviews": {
"description": "Nested reviews when reviews are requested alongside app records.",
"items": {
"type": "object"
},
"type": "array"
},
"score": {
"description": "Backward-compatible alias of rating.",
"type": "number"
},
"scoreText": {
"description": "Rating as displayed by Google Play.",
"type": "string"
},
"scrapedAt": {
"description": "ISO 8601 collection timestamp.",
"type": "string"
},
"screenshots": {
"description": "Screenshot URLs.",
"items": {
"type": "string"
},
"type": "array"
},
"searchQuery": {
"description": "Search query that produced the record.",
"type": "string"
},
"similarApps": {
"description": "Apps related to the seed app.",
"items": {
"type": "object"
},
"type": "array"
},
"size": {
"description": "Download size when Google Play exposes it.",
"type": "string"
},
"sort": {
"description": "Review sort order.",
"type": "string"
},
"sourceUrl": {
"description": "URL the record was collected from.",
"type": "string"
},
"storeCountry": {
"description": "Storefront used for a review request.",
"type": "string"
},
"summary": {
"description": "Short app summary.",
"type": "string"
},
"text": {
"description": "Review text.",
"type": "string"
},
"thumbsUpCount": {
"description": "Backward-compatible alias of helpfulCount.",
"type": "integer"
},
"title": {
"description": "Backward-compatible alias of name.",
"type": "string"
},
"updated": {
"description": "Last update date.",
"type": "string"
},
"url": {
"description": "Google Play app URL.",
"type": "string"
},
"userImage": {
"description": "Reviewer avatar URL.",
"type": "string"
},
"userName": {
"description": "Reviewer name (backward-compatible alias of author).",
"type": "string"
},
"version": {
"description": "Latest app version when Google Play publishes it.",
"type": "string"
},
"video": {
"description": "Promo video URL.",
"type": "string"
}
},
"type": "object"
},
"title": "Google Play Store records",
"views": {
"overview": {
"display": {
"component": "table",
"properties": {
"currency": {
"format": "text",
"label": "Currency"
},
"developer": {
"format": "text",
"label": "Developer"
},
"genre": {
"format": "text",
"label": "Genre"
},
"installs": {
"format": "text",
"label": "Installs"
},
"name": {
"format": "text",
"label": "App"
},
"packageName": {
"format": "text",
"label": "Package"
},
"price": {
"format": "number",
"label": "Price"
},
"rating": {
"format": "number",
"label": "Rating"
},
"ratingCount": {
"format": "number",
"label": "Ratings"
},
"updated": {
"format": "text",
"label": "Updated"
},
"url": {
"format": "text",
"label": "URL"
}
}
},
"title": "Apps",
"transformation": {
"fields": [
"packageName",
"name",
"developer",
"rating",
"ratingCount",
"installs",
"price",
"currency",
"genre",
"updated",
"url"
]
}
},
"reviews": {
"display": {
"component": "table",
"properties": {
"appId": {
"format": "text",
"label": "App ID"
},
"appTitle": {
"format": "text",
"label": "App"
},
"author": {
"format": "text",
"label": "Author"
},
"date": {
"format": "text",
"label": "Date"
},
"helpfulCount": {
"format": "number",
"label": "Helpful"
},
"rating": {
"format": "number",
"label": "Rating"
},
"reviewId": {
"format": "text",
"label": "Review ID"
},
"text": {
"format": "text",
"label": "Review"
}
}
},
"title": "Reviews",
"transformation": {
"fields": [
"reviewId",
"appId",
"appTitle",
"author",
"rating",
"text",
"date",
"helpfulCount"
]
}
},
"similar": {
"display": {
"component": "table",
"properties": {
"name": {
"format": "text",
"label": "Seed app"
},
"packageName": {
"format": "text",
"label": "Seed package"
},
"similarApps": {
"format": "text",
"label": "Similar apps"
}
}
},
"title": "Similar apps",
"transformation": {
"fields": [
"packageName",
"name",
"similarApps"
]
}
},
"trust": {
"display": {
"component": "table",
"properties": {
"dataSafety": {
"format": "text",
"label": "Data safety"
},
"name": {
"format": "text",
"label": "App"
},
"packageName": {
"format": "text",
"label": "Package"
},
"permissions": {
"format": "text",
"label": "Permissions"
}
}
},
"title": "Permissions and data safety",
"transformation": {
"fields": [
"packageName",
"name",
"permissions",
"dataSafety"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
Google Play App Intelligence Scraper - Details, Reviews & Safety Labels
Collect public Google Play data in one run: keyword search results, full app records, long review histories, developer catalogs, similar apps, permission lists, and data safety labels. Everything is read from public Play pages and RPC endpoints, so no Google account, cookie, or API key is needed.
Modes
| Mode | What it returns |
|---|---|
search |
Apps matching a keyword, with search rank and an exact-match marker. Add full details, permissions, data safety, or reviews with the toggles. |
details |
One full app record per package name or Play URL. |
reviews |
One flat record per review, with author, rating, text, date, helpful votes, app version, and developer replies. |
developer |
The app catalog for a numeric developer ID or a display name. |
similar |
One record per seed app, with a similarApps array of related apps. |
permissions |
One record per app with grouped and flat permission lists. |
dataSafety |
One record per app with shared data, collected data, security practices, and the privacy policy URL. |
What you can collect
App records
- Identity:
id,packageName,name,developer,developerId,developerUrl,url,sourceUrl - Ratings:
rating,ratingCount,scoreText,reviewCount,histogram - Reach and pricing:
installs,minInstalls,maxInstalls,price,currency,priceText,free,offersIAP,IAPRange - Store metadata:
genre,genreId,categories,contentRating,version,updated,released,androidVersion,recentChanges,sizewhen Google publishes it - Creative and copy:
description,descriptionHTML,summary,icon,headerImage,screenshots,video - Developer contact:
developerEmail,developerWebsite,developerAddress,developerLegalName,developerLegalEmail,developerLegalAddress,developerLegalPhone,privacyPolicy - Search context:
searchQuery,rank,isExactMatch - Optional trust data:
permissions,permissionGroups,dataSafety - Optional related data:
similarApps, nestedreviews - Run metadata:
recordType,language,country,scrapedAt
Review records
id,reviewId,appId,appTitleauthor,userName,userImagerating,score,text,content,datehelpfulCount,thumbsUpCountversion,appVersion,criteriasdeveloperReplywith reply text and date;replyContentandrepliedAtare kept for existing integrationsreviewUrl,language,storeCountry,sort,recordType,scrapedAt
Permission records
permissions is a flat list of {permission, group, type} objects. permissionGroups keeps Google Play's grouping. Permission names are localised by language.
Data safety records
dataSafety contains sharedData, collectedData, securityPractices, and privacyPolicyUrl. Each shared or collected entry has type, data, optional, and purpose when Google provides them.
Input
| Field | Default | Notes |
|---|---|---|
mode |
search |
One of the seven modes above. |
searchQuery |
calculator |
Keyword for search mode. |
appIds |
– | Package names or Play URLs. |
packageNames |
– | Package names or Play URLs for details, reviews, similar, permissions, or data safety. |
startUrls |
– | Full Play app URLs; the id parameter is extracted. |
developerId |
– | Numeric developer ID or developer page URL. |
developerName |
– | Display name such as Google LLC. |
country |
us |
Storefront for search results, pricing, and availability. |
language |
en |
Language for app pages and the review bucket. Google Play selects reviews by language, not country. |
maxItems |
100 |
Hard row cap, 1–10,000. Search returns at most 250 apps per query. In similar mode one seed app is one row. |
maxReviewsPerApp |
100 |
Review cap per app, 1–50,000. Requests use up to 4,500 reviews per page. |
reviewSort |
newest |
newest, rating, or helpfulness. |
includeDetails |
false |
Fetch the full app page for search and developer results, and include app metadata in permissions/dataSafety output. |
includePermissions |
false |
Add permissions to app records in search, details, developer, and similar modes. |
includeDataSafety |
false |
Add data safety labels to app records. |
proxyConfiguration |
– | Optional. The actor works without a proxy. |
Use at least one of searchQuery, appIds, packageNames, startUrls, or a developer field, depending on the mode.
Examples
Search with full details and permissions:
{
"mode": "search",
"searchQuery": "photo editor",
"country": "us",
"language": "en",
"maxItems": 10,
"includeDetails": true,
"includePermissions": true
}
Deep reviews for two apps:
{
"mode": "reviews",
"packageNames": ["com.whatsapp", "com.instagram.android"],
"language": "en",
"maxReviewsPerApp": 5000,
"reviewSort": "newest",
"maxItems": 10000
}
Developer catalog:
{
"mode": "developer",
"developerName": "Google LLC",
"country": "us",
"language": "en",
"maxItems": 200
}
Data safety labels:
{
"mode": "dataSafety",
"packageNames": ["com.whatsapp", "com.spotify.music"],
"language": "en",
"includeDetails": true
}
Output behaviour
- Records are omit-empty at every depth. A field Google Play does not publish for an app is left out, never set to
null,"",0, or[]. - Existing field names from earlier versions (
appId,title,score,ratings,lastUpdated,reviewId,content,thumbsUpCount,replyContent,repliedAt,appVersion) are still emitted beside the newer names so saved integrations keep working. - Old input keys are mapped in code:
searchTermstosearchQuery,maxResultstomaxItems,reviewCounttomaxReviewsPerApp, andincludeReviewsto nested reviews on app records. - A run that produces zero records fails with a clear status message instead of returning an empty dataset. If some apps fail and others succeed, the dataset is kept and the run ends with a warning summary.
RUN_SUMMARYin the key-value store records counts, caps, warnings, errors, and whether any request was blocked.
Limits and honest caps
- Search: most keywords return 15–50 apps. A minority expose a continuation token; the actor follows it up to 250 apps per query. To collect more, run several queries.
- Reviews: Google Play serves up to 4,500 reviews per page.
maxReviewsPerAppis capped at 50,000 and pagination stops when Google runs out of tokens or returns no new review IDs. - Similar apps: up to 150 related apps per seed. Similarity is broad; "similar" means related, not necessarily a direct competitor.
- Version history: Google Play no longer exposes a version-history page or working RPC. Only the latest
version,updated, andrecentChangesare returned, and they are absent when Google does not publish them. - App size: Google Play's web pages do not expose a download size for most apps.
sizeis emitted only when the source includes it. - Developer catalogs: pagination follows the continuation token. A very large publisher can still have more apps than the selected
maxItems. - Permissions and data safety: these are separate Play endpoints. If one app has no declaration, the record still includes its identity and omits the empty section with a warning.
FAQ
Do I need a Google account, cookie, or API key? No. All seven modes use public Play pages and RPCs that work without authentication.
Does country change reviews? No. country controls the storefront, pricing, search result set, and availability. Reviews are selected by language; this is why the actor keeps the two inputs separate.
Why is a package missing from a search run? Google Play's search covers a limited result set per keyword, and some terms return fewer than 20 apps. Try a broader keyword or add the package directly in packageNames.
What happens when Google blocks a request? The actor retries with bounded exponential backoff. If every request is blocked, the run fails loudly with a blocked-request message. A proxy can be supplied, but it is never required.
Can I mix apps and search in one run? Use details or search with includeDetails, or run separate tasks. Keeping modes separate makes row counts and output shapes predictable.
Is this affiliated with Google? No. This is an independent third-party actor that reads public Google Play pages.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build yabCXYoj5lcWqvbGd. Documentation is regenerated from the default published build; private drafts are not included.