# Google Play Store Scraper — Apps, Reviews & Developer Leads (`scrapesage/google-play-scraper`) Actor

Scrape Google Play: search apps, full app details (50+ fields), top charts, developer portfolios and reviews. Pulls developer contacts (email, website, legal name/address/phone) as B2B leads, plus a monitoring mode for new apps and reviews. No browser, no login.

- **URL**: https://apify.com/scrapesage/google-play-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** Lead generation, Developer tools, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 app scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Google Play Store Scraper — Apps, Reviews & Developer Leads

Extract **everything public on the [Google Play Store](https://play.google.com/store/apps)** — full **app details** (50+ fields), **user reviews**, **top free/paid/grossing charts**, and an entire **developer's app portfolio**. Every app also yields the publisher's **contact data — developer email, website, and (for registered traders) legal name, address and phone** — so the same run that powers your app research also builds a **B2B lead list of app publishers**.

No login, no cookies, no browser — fast, reliable HTTP extraction with an optional **monitoring mode** that returns only new apps and new reviews on each run.

### Why this Google Play scraper?

Most Play Store scrapers do one narrow thing — dump reviews and race each other to the bottom on price. This actor ships the **richest dataset in the category** from a single tool, and turns app data into sales leads no other scraper surfaces.

| Data | Typical Play scrapers | This actor |
|---|---|---|
| App search by keyword | partial | ✅ |
| Full app details (installs, histogram, version, what's-new, screenshots…) | basic fields | ✅ 50+ fields |
| **Developer contact leads** (email, website) | ❌ | ✅ |
| **Trader legal details** (name, address, phone — EU DSA) | ❌ | ✅ when published |
| Top charts (free / paid / grossing) by category | sometimes | ✅ |
| Whole developer portfolio | ❌ | ✅ |
| User reviews (rating, text, version, dev reply) | ✅ | ✅ |
| Data-safety & permissions sections | ❌ | ✅ optional |
| **Monitoring mode** — only new apps / reviews | ❌ | ✅ |
| One run, five jobs (search · details · charts · developer · reviews) | ❌ | ✅ |

### Use cases

- **App-publisher lead generation** — pull a category chart or a keyword search, keep `fullDetails` on, and export a list of apps **with the developer's email and website** to feed your CRM or outreach for agencies, SDK/tooling vendors, and ASO/marketing services.
- **Review intelligence & monitoring** — track ratings and user feedback for your app and competitors; run on a schedule with monitoring mode to capture only the newest reviews for sentiment and bug-signal alerts.
- **ASO & market research** — see who ranks for a keyword or tops a category, with install ranges, ratings histograms, pricing, in-app-purchase ranges, release/update dates and what's-new notes.
- **Competitive & portfolio tracking** — scrape a rival developer's entire catalogue, or monitor a category chart to catch new entrants the moment they appear.
- **Compliance & due diligence** — capture each app's data-safety declarations, requested permissions, privacy-policy URL and trader transparency details.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **Google Play Store Scraper**, pick a **mode** (Search, App details, Top charts, Developer apps, or Reviews), fill in the matching field, and click **Start**.
3. Watch results stream into the dataset table as each record is parsed.
4. **Export** as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

Search a keyword and enrich every result with full details + developer leads:

```json
{
    "mode": "search",
    "searchTerms": ["habit tracker", "crypto wallet"],
    "maxAppsPerQuery": 50,
    "fullDetails": true,
    "includeDeveloperContacts": true,
    "country": "us",
    "language": "en"
}
````

Pull the newest reviews for specific apps, on a schedule, getting only new ones each run:

```json
{
    "mode": "reviews",
    "appIds": ["com.spotify.music", "https://play.google.com/store/apps/details?id=org.isoron.uhabits"],
    "maxReviewsPerApp": 200,
    "reviewsSort": "NEWEST",
    "monitorMode": true
}
```

- **mode** — `search`, `appDetails`, `topCharts`, `developerApps`, or `reviews`. Each mode uses the field that matches it (`searchTerms`, `appIds`, `collection`+`category`, `developerIds`, or `appIds`).
- **appIds** — package names (`com.spotify.music`) or full Google Play URLs; both are accepted.
- **fullDetails** *(default true)* — open each app's page for the complete record. Turn off for a faster, lighter listing.
- **includeDeveloperContacts** *(default true)* — include the developer email/website and trader legal details (the lead-gen payload).
- **includeDataSafety / includePermissions** *(default false)* — add the data-safety and permissions sections (one extra request per app each).
- **collection / category** — for `topCharts`: `TOP_FREE` / `TOP_PAID` / `GROSSING`, in a category or `All apps`.
- **country / language** — storefront and language (e.g. `us`/`en`, `de`/`de`, `in`/`en`).
- **monitorMode / monitorStoreName** — emit only records not seen in previous runs (see **Monitoring** below).
- **proxyConfiguration** — proxy settings (Apify proxy by default).

### Output

One dataset; every row is tagged with a `type` (`app` or `review`). Use the **Apps**, **Developer leads**, and **Reviews** views to switch the columns.

An app record (`type: "app"`, abridged — 50+ fields in total):

```json
{
    "type": "app",
    "appId": "com.spotify.music",
    "title": "Spotify: Music and Podcasts",
    "developer": "Spotify AB",
    "developerId": "Spotify+AB",
    "developerEmail": "support@spotify.com",
    "developerWebsite": "https://www.spotify.com",
    "developerLegalName": "Spotify AB",
    "developerLegalAddress": "Regeringsgatan 19, Stockholm…",
    "developerLegalPhoneNumber": "+46…",
    "score": 4.33,
    "ratings": 35758142,
    "histogram": { "1": 3710206, "2": 1085011, "3": 1333889, "4": 3061670, "5": 26567349 },
    "installs": "1,000,000,000+",
    "minInstalls": 1000000000,
    "free": true,
    "price": 0,
    "offersIAP": true,
    "IAPRange": "$0.99 - $99.99 per item",
    "genre": "Music & Audio",
    "contentRating": "Teen",
    "released": "Oct 7, 2008",
    "updated": 1781196440000,
    "version": "VARY",
    "recentChanges": "We're always making changes…",
    "screenshots": ["https://…"],
    "url": "https://play.google.com/store/apps/details?id=com.spotify.music",
    "scrapedAt": "2026-06-14T12:00:00.000Z"
}
```

A review record (`type: "review"`):

```json
{
    "type": "review",
    "appId": "org.isoron.uhabits",
    "reviewId": "f2b3…",
    "userName": "Billie Ramirez",
    "score": 5,
    "title": null,
    "text": "Best habit tracker I've used — clean and free.",
    "thumbsUp": 12,
    "version": "9.1.52",
    "date": "2026-06-13T10:49:06.000Z",
    "replyText": null,
    "replyDate": null,
    "url": "https://play.google.com/store/apps/details?id=org.isoron.uhabits&reviewId=f2b3…",
    "scrapedAt": "2026-06-14T12:00:00.000Z"
}
```

**Field-coverage notes.** Developer contact fields are present when the developer published them — `developerEmail` and `developerWebsite` are near-universal; the trader legal name/address/phone appear for developers registered as traders (common under the EU Digital Services Act) and are blank otherwise. A blank field means Google Play didn't publish that value for that record — nothing is dropped, so you always get the richest data available. Empty results (e.g. an app with no reviews) are reported as a successful run.

### Monitoring — get only new apps & reviews

Turn on **`monitorMode`** to make repeat runs incremental. The actor remembers what it has already returned (app IDs for search/charts/developer modes; review IDs for reviews mode) in a named key-value store (**`monitorStoreName`**) and emits **only records that are new since the last run**.

- Track a **category chart** or a **keyword** and get alerted only when a *new app* appears.
- Track an **app's reviews** and capture only the *newest reviews* each run — perfect for sentiment dashboards and support alerts.
- It works **alongside [Apify Schedules](https://docs.apify.com/platform/schedules)**, not against them: the schedule triggers the run on your cron; monitoring mode dedupes against earlier runs so each run yields only fresh data. Use a distinct `monitorStoreName` per tracked target so their histories stay separate.

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it on a cron to keep your data fresh.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions the moment a run finishes.

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/google-play-scraper').call({
    mode: 'topCharts',
    collection: 'TOP_FREE',
    category: 'FINANCE',
    maxAppsPerQuery: 50,
    fullDetails: true,
    includeDeveloperContacts: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} records`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new records straight into your CRM or sheet.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a run finds something new.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find the top 50 free finance apps on Google Play and list each developer's contact email" and let it run this scraper for you.

### More scrapers from scrapesage

Build a complete **app-market & lead-gen stack** — pair Play Store intelligence with ad, hiring and outreach signals:

- **[Google Ads Transparency Scraper](https://apify.com/scrapesage/google-ads-transparency-scraper)** — see exactly which ads any advertiser is running.
- **[Facebook Ad Library Scraper](https://apify.com/scrapesage/facebook-ad-library-scraper)** — competitor ad creatives on Meta & Instagram.
- **[LinkedIn Jobs Scraper](https://apify.com/scrapesage/linkedin-jobs-scraper)** — job postings as hiring-intent signals.
- **[Multi-ATS Job Scraper](https://apify.com/scrapesage/multi-ats-job-scraper)** — jobs from Greenhouse, Lever, Ashby, Workday & more.
- **[SAM.gov Scraper](https://apify.com/scrapesage/sam-gov-scraper)** — US federal contract opportunities & contacts.
- **[Bark Listing Scraper](https://apify.com/scrapesage/bark-listing-scraper)** — service-provider directory leads.
- **[Eventbrite Scraper](https://apify.com/scrapesage/eventbrite-scraper)** — events plus organizer leads with contacts.
- **[Telegram Scraper](https://apify.com/scrapesage/telegram-scraper)** — channels, messages, media & search.

### Tips

- **Lead lists:** run `search` or `topCharts` with `fullDetails` and `includeDeveloperContacts` on, then use the **Developer leads** view to export emails and websites straight to CSV.
- **Reviews at scale:** keep review concurrency modest and let each app paginate internally; for very large pulls (thousands of reviews across many apps), switch the proxy to residential.
- **Monitoring:** give each tracked target its own `monitorStoreName`, then schedule the run — you'll only ever pay for and process new records.
- **Localize:** set `country` and `language` to match the storefront you care about; rankings, pricing and the review pool all change by country.
- **Lighter, cheaper runs:** turn `fullDetails` off when you only need the basic listing fields (title, score, developer, price) and don't need contacts.

### FAQ

**Do I need a Google account or API key?** No. This actor reads the same public pages and endpoints the Play Store serves to any visitor — no login, key, or cookies.

**Where do the developer email and contact details come from?** From the app's own Google Play listing, where Google publishes the developer's contact email and website, plus trader legal details (name, address, phone) for developers registered as traders. Fields are blank only when the developer didn't publish them.

**How many reviews can I get per app?** Newest-first pagination reaches into the thousands per app; set `maxReviewsPerApp` to whatever you need. Use monitoring mode to grab only new reviews on each scheduled run.

**Can I scrape a specific country's store?** Yes — set `country` (and `language`). Charts, prices and reviews are all storefront-specific.

**Can I export to Google Sheets, CSV, or Excel?** Yes — one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**Is scraping Google Play legal?** This actor collects publicly available data only. You're responsible for using the data in compliance with applicable laws (e.g. GDPR/CCPA for personal data) and Google's terms.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

## `mode` (type: `string`):

Pick a job. `Search` discovers apps by keyword. `App details` pulls the full record (incl. developer contacts) for specific apps. `Top charts` lists the top free/paid/grossing apps in a category. `Developer apps` returns a developer's whole portfolio. `Reviews` pulls user reviews for specific apps.

## `searchTerms` (type: `array`):

Keywords to search the Play Store for, e.g. `habit tracker`, `crypto wallet`. One row per term. (Mode: Search.)

## `appIds` (type: `array`):

Package names (e.g. `com.spotify.music`) or full Google Play URLs. Used by the App details and Reviews modes.

## `collection` (type: `string`):

Which ranking to pull. (Mode: Top charts.)

## `category` (type: `string`):

Category for the top chart, or `All apps` for the overall chart. (Mode: Top charts.)

## `developerIds` (type: `array`):

Developer names (e.g. `Spotify AB`), numeric developer IDs, or developer page URLs. Returns every app in their portfolio. (Mode: Developer apps.)

## `maxAppsPerQuery` (type: `integer`):

Cap the number of apps returned per search term, chart, or developer (Google Play returns up to ~250 per listing).

## `fullDetails` (type: `boolean`):

Open each discovered app's page for the complete 50+ field record — developer contacts, ratings histogram, install range, version, what's-new, screenshots, content rating and more. Turn off for a faster, lighter listing (basic fields only). Always on for App details mode.

## `includeDeveloperContacts` (type: `boolean`):

Include the developer's public contact data — email, website, and (where the developer is a registered trader under the EU Digital Services Act) legal name, address and phone. This is the lead-gen payload. Requires full details.

## `includeDataSafety` (type: `boolean`):

Also fetch each app's Data safety section (data shared, data collected, security practices). Adds one request per app.

## `includePermissions` (type: `boolean`):

Also fetch each app's requested Android permissions. Adds one request per app.

## `maxReviewsPerApp` (type: `integer`):

How many reviews to fetch per app, newest first by default (Google Play exposes up to a few thousand per app). (Mode: Reviews.)

## `reviewsSort` (type: `string`):

Order in which reviews are pulled. (Mode: Reviews.)

## `country` (type: `string`):

Two-letter storefront country code (e.g. `us`, `gb`, `in`, `de`). Affects rankings, pricing and review pool.

## `language` (type: `string`):

Two-letter language code (e.g. `en`, `es`, `de`) for titles, descriptions and reviews.

## `monitorMode` (type: `boolean`):

Remember what was already returned and emit ONLY records not seen in previous runs (new apps for a search/chart, or new reviews for an app). Pairs with Apify Schedules to track changes over time. State is kept in the key-value store below.

## `monitorStoreName` (type: `string`):

Named key-value store that holds the 'already seen' ids for monitoring mode. Use a different name per tracked target/query to keep their histories separate.

## `maxConcurrency` (type: `integer`):

Maximum parallel requests. Lower it if you hit rate limits on very large runs.

## `proxyConfiguration` (type: `object`):

Proxy settings. Google Play has no hard anti-bot, so the default Apify proxy is plenty; switch to residential for very large or high-frequency runs.

## Actor input object example

```json
{
  "mode": "search",
  "searchTerms": [
    "habit tracker"
  ],
  "appIds": [
    "com.spotify.music"
  ],
  "collection": "TOP_FREE",
  "category": "APPLICATION",
  "maxAppsPerQuery": 50,
  "fullDetails": true,
  "includeDeveloperContacts": true,
  "includeDataSafety": false,
  "includePermissions": false,
  "maxReviewsPerApp": 200,
  "reviewsSort": "NEWEST",
  "country": "us",
  "language": "en",
  "monitorMode": false,
  "monitorStoreName": "google-play-monitor",
  "maxConcurrency": 6,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped records in the default dataset. App rows carry full metadata and developer contacts; review rows carry the user feedback.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchTerms": [
        "habit tracker"
    ],
    "appIds": [
        "com.spotify.music"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/google-play-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchTerms": ["habit tracker"],
    "appIds": ["com.spotify.music"],
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/google-play-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "habit tracker"
  ],
  "appIds": [
    "com.spotify.music"
  ]
}' |
apify call scrapesage/google-play-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapesage/google-play-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Play Store Scraper — Apps, Reviews & Developer Leads",
        "description": "Scrape Google Play: search apps, full app details (50+ fields), top charts, developer portfolios and reviews. Pulls developer contacts (email, website, legal name/address/phone) as B2B leads, plus a monitoring mode for new apps and reviews. No browser, no login.",
        "version": "0.1",
        "x-build-id": "jjyu1dLyfselWv9Ty"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapesage~google-play-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapesage-google-play-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/scrapesage~google-play-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scrapesage-google-play-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/scrapesage~google-play-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scrapesage-google-play-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "What to scrape",
                        "enum": [
                            "search",
                            "appDetails",
                            "topCharts",
                            "developerApps",
                            "reviews"
                        ],
                        "type": "string",
                        "description": "Pick a job. `Search` discovers apps by keyword. `App details` pulls the full record (incl. developer contacts) for specific apps. `Top charts` lists the top free/paid/grossing apps in a category. `Developer apps` returns a developer's whole portfolio. `Reviews` pulls user reviews for specific apps.",
                        "default": "search"
                    },
                    "searchTerms": {
                        "title": "Search terms",
                        "type": "array",
                        "description": "Keywords to search the Play Store for, e.g. `habit tracker`, `crypto wallet`. One row per term. (Mode: Search.)",
                        "items": {
                            "type": "string"
                        }
                    },
                    "appIds": {
                        "title": "App IDs or URLs",
                        "type": "array",
                        "description": "Package names (e.g. `com.spotify.music`) or full Google Play URLs. Used by the App details and Reviews modes.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "collection": {
                        "title": "Chart",
                        "enum": [
                            "TOP_FREE",
                            "TOP_PAID",
                            "GROSSING"
                        ],
                        "type": "string",
                        "description": "Which ranking to pull. (Mode: Top charts.)",
                        "default": "TOP_FREE"
                    },
                    "category": {
                        "title": "Category",
                        "enum": [
                            "ALL",
                            "APPLICATION",
                            "GAME",
                            "BUSINESS",
                            "FINANCE",
                            "PRODUCTIVITY",
                            "SOCIAL",
                            "COMMUNICATION",
                            "SHOPPING",
                            "HEALTH_AND_FITNESS",
                            "EDUCATION",
                            "ENTERTAINMENT",
                            "PHOTOGRAPHY",
                            "TOOLS",
                            "LIFESTYLE",
                            "TRAVEL_AND_LOCAL",
                            "MUSIC_AND_AUDIO",
                            "NEWS_AND_MAGAZINES",
                            "FOOD_AND_DRINK",
                            "DATING",
                            "MEDICAL",
                            "MAPS_AND_NAVIGATION",
                            "BOOKS_AND_REFERENCE",
                            "PARENTING"
                        ],
                        "type": "string",
                        "description": "Category for the top chart, or `All apps` for the overall chart. (Mode: Top charts.)",
                        "default": "APPLICATION"
                    },
                    "developerIds": {
                        "title": "Developer names / IDs",
                        "type": "array",
                        "description": "Developer names (e.g. `Spotify AB`), numeric developer IDs, or developer page URLs. Returns every app in their portfolio. (Mode: Developer apps.)",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxAppsPerQuery": {
                        "title": "Max apps per query",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Cap the number of apps returned per search term, chart, or developer (Google Play returns up to ~250 per listing).",
                        "default": 50
                    },
                    "fullDetails": {
                        "title": "Enrich every app with full details",
                        "type": "boolean",
                        "description": "Open each discovered app's page for the complete 50+ field record — developer contacts, ratings histogram, install range, version, what's-new, screenshots, content rating and more. Turn off for a faster, lighter listing (basic fields only). Always on for App details mode.",
                        "default": true
                    },
                    "includeDeveloperContacts": {
                        "title": "Include developer contact / lead fields",
                        "type": "boolean",
                        "description": "Include the developer's public contact data — email, website, and (where the developer is a registered trader under the EU Digital Services Act) legal name, address and phone. This is the lead-gen payload. Requires full details.",
                        "default": true
                    },
                    "includeDataSafety": {
                        "title": "Include data-safety section",
                        "type": "boolean",
                        "description": "Also fetch each app's Data safety section (data shared, data collected, security practices). Adds one request per app.",
                        "default": false
                    },
                    "includePermissions": {
                        "title": "Include requested permissions",
                        "type": "boolean",
                        "description": "Also fetch each app's requested Android permissions. Adds one request per app.",
                        "default": false
                    },
                    "maxReviewsPerApp": {
                        "title": "Max reviews per app",
                        "minimum": 1,
                        "type": "integer",
                        "description": "How many reviews to fetch per app, newest first by default (Google Play exposes up to a few thousand per app). (Mode: Reviews.)",
                        "default": 200
                    },
                    "reviewsSort": {
                        "title": "Sort reviews by",
                        "enum": [
                            "NEWEST",
                            "RATING",
                            "HELPFULNESS"
                        ],
                        "type": "string",
                        "description": "Order in which reviews are pulled. (Mode: Reviews.)",
                        "default": "NEWEST"
                    },
                    "country": {
                        "title": "Country",
                        "type": "string",
                        "description": "Two-letter storefront country code (e.g. `us`, `gb`, `in`, `de`). Affects rankings, pricing and review pool.",
                        "default": "us"
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Two-letter language code (e.g. `en`, `es`, `de`) for titles, descriptions and reviews.",
                        "default": "en"
                    },
                    "monitorMode": {
                        "title": "Monitoring mode — only new records",
                        "type": "boolean",
                        "description": "Remember what was already returned and emit ONLY records not seen in previous runs (new apps for a search/chart, or new reviews for an app). Pairs with Apify Schedules to track changes over time. State is kept in the key-value store below.",
                        "default": false
                    },
                    "monitorStoreName": {
                        "title": "Monitor store name",
                        "type": "string",
                        "description": "Named key-value store that holds the 'already seen' ids for monitoring mode. Use a different name per tracked target/query to keep their histories separate.",
                        "default": "google-play-monitor"
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 30,
                        "type": "integer",
                        "description": "Maximum parallel requests. Lower it if you hit rate limits on very large runs.",
                        "default": 6
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. Google Play has no hard anti-bot, so the default Apify proxy is plenty; switch to residential for very large or high-frequency runs.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
