Google Play Scraper | Apps & Developer Emails avatar

Google Play Scraper | Apps & Developer Emails

Pricing

from $2.20 / 1,000 results

Go to Apify Store
Google Play Scraper | Apps & Developer Emails

Google Play Scraper | Apps & Developer Emails

Extract Google Play apps, ratings, prices, developer contacts and optional reviews across 183 market presets. Search keywords or categories, browse developers, or supply app IDs. Pay per delivered row plus a start fee.

Pricing

from $2.20 / 1,000 results

Rating

0.0

(0)

Developer

kane liu

kane liu

Maintained by Community

Actor stats

1

Bookmarked

4

Total users

1

Monthly active users

15 hours ago

Last modified

Share

Google Play Scraper

Extract public Google Play app details, developer contacts and optional reviews across 183 market presets as exportable rows.

  • Search results, category shelves, home selections and developer portfolios.
  • App IDs, ratings, installs, prices and published developer contacts.
  • Optional review rows, data-safety summaries and similar-app lists.
  • JSON, CSV and Excel exports, plus API and AI-agent access.
  • Free-plan pricing: $3.00 per 1,000 delivered rows, plus a $0.005 start event.

What does Google Play Scraper do?

Google Play Scraper collects public Android app listings from play.google.com. Use it for app-store research, competitor comparisons or refreshing known apps. You do not need a Google account.

  • Search, category and home: collect apps from a keyword or storefront shelf.
  • Developer: list apps for a numeric developer ID.
  • Detail: look up package IDs or app URLs.
  • Data safety: retrieve the developer's public declarations for an app.
  • Reviews: includeReviews is off by default. Each review is a separate row, billed at the same price as an app row.
  • Related information: includeSimilar and includeDataSafety are off by default. Their lists and summaries stay on the app row, without separate row charges.

What data can you extract from Google Play?

App rows

Each app row has rowType set to app. Availability depends on what Google Play publishes for the selected market and language.

FieldDescriptionExample
packageIdAndroid package name; identifies the appcom.spotify.music
nameApp titleSpotify
listingUrlGoogle Play app linkhttps://play.google.com/store/apps/details?id=com.spotify.music
countryStorefront country codeUS
developerPublisher nameExample Studio
developerIdNumeric publisher ID, when published5700313618786177705
developerSlugName-form publisher identifierExample Studio
ratingValueAggregate star rating4.5
ratingCountNumber of ratings1200
installsDisplayed install range, not an exact count1M+
priceListed price as text0
priceCurrencyPrice currencyUSD
isPaidWhether the listed app has a purchase pricefalse
inAppPurchasesWhether in-app purchases are indicatedtrue
contentRatingDisplayed age/content ratingEveryone
descriptionStore descriptionA sample app description.
screenshotsScreenshot URL list[]
emailsPublished support contacts[{"value":"name@example.com","type":"support"}]
phonesPublished developer phone numbers[{"value":"+1 555 0100","type":"developer"}]
address.fullPublished postal address, without inferred components123 Example Street
web.websiteDeveloper websitehttps://example.com
privacyUrlPrivacy-policy linkhttps://example.com/privacy
dataSafetyOptional developer-declared safety information{}
similarAppsOptional recommendations from other developers[]
moreByDeveloperOptional other apps by the same developer[]

Review rows

Review rows have rowType set to review and copy the parent app's packageId, name and developer. Filter by rowType before comparing app counts with review counts.

FieldDescriptionExample
rowTypeIdentifies a review rowreview
idReview identifiersample-review-id
packageIdApp the review belongs tocom.spotify.music
authorPublic review authorJane Doe
bodyReview textUseful features and clear navigation.
ratingReview's star rating4
reviewedAtReview date2026-01-15T10:00:00Z
helpfulCountHelpful votes3
versionReviewed app version, when available1.2.3
developerReplyReply text and date, when available{"body":"Thank you."}

How to scrape Google Play

  1. Open Google Play Scraper in Apify Console.
  2. Fill one target field, such as q, and choose a market.
  3. Set maxResults to 3 for a small first run.
  4. Click Start and wait for the run to finish.
  5. Download the dataset or read it through the API.

Empty {} input starts the form's example: search for flashlight in us, with at most 3 rows. Normal start and row charges still apply. With mode set to auto, filling one target field selects its mode automatically.

Fill q with one keyword or phrase. Keep c set to apps, including for game searches. Results cover the available search shelf, not the entire catalog.

Category

Fill category with a listed code such as GAME, TOOLS or WATCH_FACE. For FAMILY, optionally select an age value. Category shelves are not Top Free, Top Paid or Top Grossing charts.

Home

Set mode to home and choose a market. No target field is needed.

Developer

Fill developerId with the numeric value from a /store/apps/dev?id=... link. Name-form publisher links are not supported as inputs for this mode.

Detail

Fill packageIds or detailUrls. You can supply several apps in one run. Every app row includes available details; switching enrichDetails off does not remove them.

Data safety

Set mode to datasafety with package IDs or app links. Alternatively, use includeDataSafety with another mode. The summary records developer declarations, not an independent privacy assessment.

What to fill in

FieldWhat to enterDefault
modeauto, search, category, home, developer, detail or datasafetyauto
qOne search phraseEmpty; example uses flashlight
packageIdsArray of existing Android package IDsEmpty
detailUrlsArray of Google Play app URLsEmpty
developerIdNumeric developer IDEmpty
categoryCategory code from the formEmpty
ageFAMILY filter: AGE_RANGE1 (5 and under), AGE_RANGE2 (6–8), AGE_RANGE3 (9+)Empty
cUse apps; games is unsupportedapps
maxResultsCombined app and review rows per input, from 1 to 1,00070; form prefill 3
marketOne of 183 presets, such as us, jp or deus
hlLanguage override, such as en or deMarket preset
glTwo-letter country override, such as USMarket preset
enrichDetailsCompatibility setting; app details remain includedtrue
includeDataSafetyAttach public data-safety declarationsfalse
includeReviewsAdd separately billed review rowsfalse
includeSimilarAttach similarApps and moreByDeveloper listsfalse

Search, with automatic mode selection:

{"q": "tide chart", "market": "us", "maxResults": 3}

Category:

{"category": "FAMILY", "age": "AGE_RANGE2", "market": "us", "maxResults": 3}

Home:

{"mode": "home", "market": "jp", "maxResults": 3}

Developer:

{"developerId": "5700313618786177705", "maxResults": 3}

Detail with reviews:

{"packageIds": ["com.spotify.music"], "includeReviews": true, "maxResults": 3}

Data safety:

{"mode": "datasafety", "packageIds": ["com.spotify.music"], "maxResults": 1}

maxItems and limit are accepted as aliases for maxResults. In auto, target priority is detailUrls, packageIds, developerId, q, then category; lower-priority targets are ignored. Use one target type to avoid ambiguity.

Close field-name misspellings are corrected; other unknown fields and invalid optional filters are ignored with a note. Invalid target input stops with INVALID_INPUT: <field> — <how to fix>, before any row is charged. The start event can still apply. A bare package name in detailUrls is accepted as a package ID.

Every run writes its input interpretation to INPUT_REPORT in the default key-value store, including corrected, filled and ignored fields. Use it to check mode selection before changing your input.

Output example

This illustrative app row uses placeholder contact details; values vary by app and market.

{
"rowType": "app",
"id": "com.spotify.music",
"packageId": "com.spotify.music",
"name": "Spotify",
"country": "US",
"developer": "Example Studio",
"ratingValue": 4.5,
"installs": "1M+",
"price": "0",
"priceCurrency": "USD",
"isPaid": false,
"emails": [{"value": "name@example.com", "type": "support"}],
"phones": [{"value": "+1 555 0100", "type": "developer"}],
"web": {"website": "https://example.com"},
"listingUrl": "https://play.google.com/store/apps/details?id=com.spotify.music&hl=en&gl=US"
}

Export the dataset as JSON, CSV, Excel, XML, RSS or an HTML table. RUN_SUMMARY contains the row count and warnings; failures can also write ERROR_SUMMARY. Read rows from the dataset, not an OUTPUT record.

Why use this Google Play scraper?

  • Pay for delivered rows: failed page attempts do not create row charges; the start fee is separate.
  • Keep partial results: rows collected before a stop or timeout can be delivered, with the reason recorded in RUN_SUMMARY.
  • No invented contacts: unavailable values remain empty or absent. Developer websites are not crawled for extra contacts.
  • Several app inputs: refresh a list of package IDs or app links in one run.
  • Simple setup: you do not need to set up proxies.

How much does it cost to scrape Google Play?

Pricing is per event: a start event costs $0.005, plus a charge for each delivered app or review row. Start events are counted per GB of run memory, with a minimum of one. The default 1,024 MB run incurs one start event.

Apify planStart eventPrice per rowPrice per 1,000 rows
Free$0.005$0.0030$3.00
Starter$0.005$0.0030$3.00
Scale$0.005$0.0026$2.60
Business$0.005$0.0022$2.20
  • maxResults applies per query, category, developer, package ID or app URL. The default is 70; larger requests are collected in parts of 70, up to the input limit of 1,000.
  • App and review rows share that limit. With one app and maxResults=3, reviews can use the remaining two rows.
  • Free Apify plan users are limited to 200 rows per run and 10 runs of this Actor. Paid plans remove these free-plan caps, not the input or charge limits.
  • The whole run stops at Maximum cost per run (maxTotalChargeUsd in the API).

Example: 10 delivered app rows on the Free plan cost 10 × $0.003 + $0.005 = $0.035 at default memory. An empty shelf produces no row charge, but the start event still applies.

What happens when the run timeout is too short

If collection needs longer than the selected timeout, the run can pause with status ABORTED and this message: "Queued on the collection backend; this run will resume automatically when results are ready (about N s)."

When results are ready, the same run resumes automatically, reports "Resumed: delivering N rows.", writes to the same dataset and finishes as SUCCEEDED. Delivered rows are not delivered or charged twice. You do not need to start another run.

This automatic resume is limited to 3 attempts. Keep the default timeout of 3,600 seconds to reduce interruptions. A pause with this message is different from a manual abort or a failed run.

The synchronous endpoints run-sync and run-sync-get-dataset-items wait at most 300 seconds and can return an empty dataset while the run is paused. For longer runs, start asynchronously and read the dataset after SUCCEEDED, or use an ACTOR.RUN.SUCCEEDED webhook.

Use with AI agents and the API

Apify MCP server

In Claude, ChatGPT, Cursor, VS Code or another client supporting remote MCP servers, add:

https://mcp.apify.com?tools=lentic_clockss/google-play-scraper

Authenticate with Apify OAuth or the header Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool starts a run and returns run and dataset IDs; the agent reads rows with get-dataset-items. Clients without remote support can use npx @apify/actors-mcp-server --tools lentic_clockss/google-play-scraper with APIFY_TOKEN set.

Example prompt: "Find three Google Play apps for tide chart in the US and show their names, package IDs and ratings."

Apify API

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("lentic_clockss/google-play-scraper").call(
run_input={"q": "tide chart", "market": "us", "maxResults": 3}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row)

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('lentic_clockss/google-play-scraper').call({
q: 'tide chart', market: 'us', maxResults: 3,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

If a waiting client returns an ABORTED run, check its status message before reading the dataset; use the asynchronous flow above for automatic resume.

For HTTP, send input JSON to POST https://api.apify.com/v2/acts/lentic_clockss~google-play-scraper/runs with an Authorization: Bearer <YOUR_APIFY_TOKEN> header. Read finished rows with GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json.

Integrations

Use the Actor's Integrations tab for Google Sheets, Make, Zapier, n8n, Slack, Airtable or webhooks. Apify Schedules can run saved inputs regularly.

FAQ

The Actor collects public data, but public availability does not grant unrestricted reuse. You are responsible for Google Play's terms, applicable laws and data protection requirements. Processing personal data requires a lawful basis; do not use developer contacts for spam.

Why did my run end as ABORTED?

The automatic-resume message means the same run is waiting to resume. Do not duplicate it. A manual abort or another stop does not necessarily resume; inspect the status message and RUN_SUMMARY.

How many results can I get?

Request 1–1,000 rows per input with maxResults. Available apps, shared app/review limits, the free-plan cap and your maximum charge can reduce delivery. This is a ceiling, not a promised count.

Why are some fields empty?

Google Play may not publish that information, or a page may not provide it in the selected language. Unavailable fields can be absent entirely. leadAbsences can explain missing contacts.

Can I scrape reviews?

Yes. Turn on includeReviews; reviews can continue beyond the initially visible selection. Each review costs one row. Increase maxResults above 1 to leave room after the app row. Complete review history is not guaranteed.

Can I get similar apps?

Yes. includeSimilar adds similarApps and moreByDeveloper on the app row, not as separately billed rows. Lists can be empty when unavailable.

Why is a category empty?

Some categories or storefronts have no available shelf. A confirmed empty shelf can succeed with zero rows; an unreadable page is treated as a failure, not invented app data.

Why does the games catalog fail?

c=games is unsupported. Use c=apps for keyword search or select category=GAME or another GAME_* code.

Limitations

  • Search, home, category and developer modes cover available shelves, not exhaustive catalog enumeration.
  • Top Free, Top Paid and Top Grossing charts are not supported.
  • The 183 presets are supported input choices, not a guarantee every app is available in every country.
  • Developer mode needs a numeric ID; a developerSlug is not interchangeable.
  • Login-only data, exact install counts and unpublished contacts are unavailable.
  • Reviews, recommendations and data-safety summaries depend on source availability. Safety declarations do not verify actual app behavior.

More app store scrapers from the same publisher:

Browse all of our scrapers at apify.com/lentic_clockss.

Support

Report a problem or request a field through the Issues tab of this Actor's page. Include the run ID and the input you used.