# Google Play Apps Scraper (`automation-lab/google-play-app-catalog-details`) Actor

Collect Google Play category charts and app details with package IDs, publishers, descriptions, ratings, installs, monetization, versions, and listing URLs.

- **URL**: https://apify.com/automation-lab/google-play-app-catalog-details.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.48 / 1,000 item extracteds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 Apps Scraper

Collect public Google Play apps from category charts or supplied package IDs and listing URLs.
The Actor returns one consistent app record with package identity, title, publisher, description,
rating signals, install range, monetization labels, category, version, release dates, media, and the
localized listing URL.

Use it to create repeatable app-market snapshots without managing a browser, Google account, or
private API key.

### What does this Google Play scraper collect?

The Actor supports two complementary routes:

1. Browse a Google Play category chart such as top free Health & Fitness apps.
2. Fetch current details for known Android package IDs or public app-detail URLs.

Both routes produce the same typed dataset rows. This makes category discovery and later detail
refreshes easy to combine in one data pipeline.

The Actor does not collect reviews, permissions, or private Play Console data.

### Who is it for?

- App-market analysts tracking category composition and publisher activity.
- ASO teams comparing ratings, installs, versions, and monetization labels.
- Product teams maintaining a watchlist of Android competitors.
- Investors and researchers building recurring app-market datasets.
- Data engineers feeding Google Play metadata into a warehouse or dashboard.

### Why use this Actor?

- **Catalog plus details:** discover category apps and refresh known packages with one schema.
- **Localized results:** choose a country and language for availability, prices, text, and charts.
- **Stable identity:** every row includes the Android package ID and canonical listing URL.
- **Automation-ready:** schedule runs and export JSON, CSV, Excel, XML, or RSS from Apify datasets.
- **Bounded output:** one global `maxItems` limit controls the size and price of every run.
- **Fail-closed behavior:** malformed URLs, package IDs, and locales are rejected instead of
  producing misleading empty data.

### Supported Google Play category charts

Choose one or more categories and one collection:

- `TOP_FREE` — top free apps.
- `TOP_PAID` — top paid apps.
- `GROSSING` — top-grossing apps.

Supported category IDs include `BUSINESS`, `EDUCATION`, `FINANCE`, `GAME`,
`HEALTH_AND_FITNESS`, `MUSIC_AND_AUDIO`, `PHOTOGRAPHY`, `PRODUCTIVITY`, `SHOPPING`,
`SOCIAL`, `SPORTS`, `TOOLS`, `TRAVEL_AND_LOCAL`, and the other values listed in the input UI.

A public category URL can also carry the collection, for example:

```text
https://play.google.com/store/apps/category/HEALTH_AND_FITNESS/collection/topselling_free
```

### Extracted app fields

| Group | Fields |
| --- | --- |
| Identity | `appId`, `title`, `appUrl` |
| Publisher | `developer`, `developerId`, `developerEmail`, `developerWebsite` |
| Listing text | `summary`, `description`, `recentChanges` |
| Rating signals | `score`, `ratings`, `reviews` |
| Adoption | `installs`, `minInstalls`, `maxInstalls` |
| Monetization | `price`, `priceText`, `currency`, `free`, `offersInAppPurchases`, `containsAds` |
| Classification | `genre`, `genreId`, `contentRating` |
| Release | `released`, `updatedAt`, `version` |
| Media | `iconUrl`, `headerImageUrl`, `screenshots` |
| Provenance | `sourceType`, `sourceCategory`, `sourceCollection`, `country`, `language`, `scrapedAt` |

Fields can be `null` when Google Play does not expose a value for a listing or locale.

### How to scrape Google Play apps

1. Open the Actor input page.
2. Add package IDs, app-detail URLs, categories, or category URLs.
3. Select the chart used by category inputs.
4. Set a two-letter country and language.
5. Choose `maxItems` to cap the total number of unique apps.
6. Click **Start**.
7. Open the **Dataset** tab to preview or export the records.

For a first run, use `HEALTH_AND_FITNESS`, `TOP_FREE`, `us`, `en`, and `maxItems: 10`.

### Input parameters

| Parameter | Type | Default | Meaning |
| --- | --- | --- | --- |
| `startUrls` | array | empty | Google Play app-detail or app-category URLs |
| `appIds` | string array | empty | Android package IDs such as `com.spotify.music` |
| `categories` | string array | empty | Google Play category IDs to browse |
| `collection` | string | `TOP_FREE` | `TOP_FREE`, `TOP_PAID`, or `GROSSING` |
| `country` | string | `us` | Two-letter storefront country code |
| `language` | string | `en` | Two-letter listing language code |
| `maxItems` | integer | `50` | Global output limit from 1 to 500 |

At least one app, URL, or category must be supplied.
Duplicate packages found through multiple inputs are emitted once.

### Example input

```json
{
  "categories": ["PRODUCTIVITY", "BUSINESS"],
  "collection": "GROSSING",
  "country": "us",
  "language": "en",
  "maxItems": 20
}
```

To refresh a known watchlist instead:

```json
{
  "appIds": [
    "com.spotify.music",
    "com.google.android.apps.fitness"
  ],
  "country": "us",
  "language": "en",
  "maxItems": 2
}
```

### Example output

A real run produces rows shaped like this:

```json
{
  "appId": "com.google.android.apps.fitness",
  "title": "Google Fit: Activity Tracking",
  "developer": "Google LLC",
  "score": 3.9,
  "ratings": 620000,
  "installs": "100,000,000+",
  "price": 0,
  "priceText": "Free",
  "currency": "USD",
  "free": true,
  "offersInAppPurchases": false,
  "containsAds": false,
  "genre": "Health & Fitness",
  "genreId": "HEALTH_AND_FITNESS",
  "version": "Varies with device",
  "updatedAt": "2026-08-01T12:00:00.000Z",
  "appUrl": "https://play.google.com/store/apps/details?id=com.google.android.apps.fitness&hl=en&gl=US",
  "sourceType": "app",
  "sourceCategory": null,
  "sourceCollection": null,
  "country": "us",
  "language": "en",
  "scrapedAt": "2026-08-30T12:00:00.000Z"
}
```

Live values change as publishers update their listings.

### How much does it cost to collect Google Play app metadata?

Pay-per-event pricing has a **$0.005 Actor start** and one `item` event for each app record saved.
The `item` event is the primary value event.

| Plan | Price per app |
| --- | ---: |
| Free | $0.000920 |
| Bronze | $0.000800 |
| Silver | $0.000624 |
| Gold | $0.000480 |
| Platinum | $0.000320 |
| Diamond | $0.000224 |

At Bronze pricing, a run costs approximately:

- 1 app: $0.0058 including the start.
- 10 apps: $0.013 including the start.
- 100 apps: $0.085 including the start.

Failed, duplicate, or rejected records do not produce an `item` event.
Your Apify plan and applicable platform rules determine the tier used.

### Monitoring and change-detection workflow

Schedule the same input daily or weekly to create timestamped snapshots.
Use `appId` as the stable join key, then compare fields such as:

- `score`, `ratings`, and `reviews` for rating movement.
- `minInstalls` and `maxInstalls` for adoption changes.
- `price`, `free`, `offersInAppPurchases`, and `containsAds` for monetization changes.
- `version`, `updatedAt`, and `recentChanges` for release monitoring.
- `developer` and listing text for publisher or positioning changes.

The Actor returns snapshots. It does not itself send alerts or calculate historical diffs.

### Integrations and exports

Use Apify integrations to send dataset rows to:

- Google Sheets for analyst review.
- Make or Zapier for downstream automation.
- Webhooks for run-completion processing.
- BigQuery, Snowflake, or another warehouse through your ETL process.
- A BI dashboard for app-category and publisher reporting.

Dataset API parameters can select fields, unwind arrays, and choose JSON, CSV, Excel, XML, or RSS.

### Run with the Apify API

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~google-play-app-catalog-details/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"categories":["HEALTH_AND_FITNESS"],"collection":"TOP_FREE","country":"us","language":"en","maxItems":10}'
```

#### JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/google-play-app-catalog-details').call({
    appIds: ['com.spotify.music', 'com.google.android.apps.fitness'],
    country: 'us',
    language: 'en',
    maxItems: 2,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/google-play-app-catalog-details').call(run_input={
    'categories': ['PRODUCTIVITY', 'BUSINESS'],
    'collection': 'GROSSING',
    'country': 'us',
    'language': 'en',
    'maxItems': 20,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use with MCP and AI assistants

Add this Actor to Claude Code through the Apify MCP server:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/google-play-app-catalog-details"
```

#### Claude Desktop setup

Add this server to Claude Desktop's MCP configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/google-play-app-catalog-details"
    }
  }
}
```

#### Cursor setup

In Cursor, open **Settings → Tools & MCP → New MCP Server** and use the same HTTP URL shown above.

#### VS Code setup

In VS Code with MCP support, add an HTTP server named `apify` using the same Actor-specific MCP URL.

Example prompts:

- “Collect the top 25 free Finance apps from the US Google Play store.”
- “Refresh details for these Android package IDs and return rating and version changes.”
- “Create a current snapshot of top-grossing Productivity and Business apps.”

### Reliability, limits, and troubleshooting

Google Play is a public but undocumented source and can change its response format.
The Actor validates package identities and emits a failure when all requested routes fail.

Operational limits:

- `maxItems` is capped at 500 per run.
- Category composition and order vary by country and time.
- Some fields are absent for some apps or locales and therefore return `null`.
- The Actor does not use a residential proxy, browser, account, or automatic paid fallback.
- Removed, unavailable, or region-restricted apps may not produce a row.

If a category returns fewer records than expected, try a different country or collection and check
whether Google Play currently exposes that category there.

### Responsible use and legality

This Actor collects public Google Play listing metadata.
Use it in accordance with applicable laws, Google Play terms, and Apify's terms.
Do not use the output to harass publishers, misrepresent apps, or make automated decisions that
require additional verification.

Public developer contact details may still be personal data in some jurisdictions.
Only retain and process fields needed for a legitimate purpose.
You are responsible for your input, schedule, storage, and downstream use.

### FAQ

#### Does it need a Google account or API key?

No. It reads public Google Play app and category data. An Apify account is needed to run the Actor.

#### Can it scrape reviews?

No. This Actor returns app catalog and detail rows only. Use the related Google Play Store Scraper
when review collection is part of the job.

#### Why is a field null?

Google Play does not expose every field for every app, country, or language. Null values preserve
the stable schema without inventing data.

#### Why did my run fail with “invalid app ID”?

Package IDs must look like Android identifiers, for example `com.spotify.music`. For URLs, provide
an HTTPS app-detail or category URL on `play.google.com`.

#### Can I compare changes automatically?

Schedule repeated runs and compare datasets by `appId`. The Actor creates snapshots but does not
calculate diffs or send alerts itself.

### Related automation-lab Actors

- [Google Play Store Scraper](https://apify.com/automation-lab/google-play-scraper) — app search,
  details, and reviews when you need a broader workflow.
- [AppBrain Google Play Rankings Scraper](https://apify.com/automation-lab/appbrain-google-play-rankings-scraper)
  — AppBrain ranking views for complementary market-position tracking.
- [Google Play Data Safety Scraper](https://apify.com/automation-lab/google-play-data-safety-scraper)
  — public privacy and data-safety declarations for supplied apps.

# Actor input Schema

## `startUrls` (type: `array`):

Public Google Play app-detail or app-category URLs. Category collection URLs such as topselling\_free are also supported.

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

Android package identifiers to fetch, such as com.google.android.apps.fitness.

## `categories` (type: `array`):

Category charts to collect. Results use the selected collection and locale.

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

Chart to use for categories supplied without a collection URL.

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

Two-letter country code controlling app availability, ranking, prices, and localization.

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

Two-letter language code for titles, descriptions, and other localized fields.

## `maxItems` (type: `integer`):

Maximum number of unique app records across all supplied apps and categories.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://play.google.com/store/apps/details?id=com.google.android.apps.fitness"
    },
    {
      "url": "https://play.google.com/store/apps/category/HEALTH_AND_FITNESS/collection/topselling_free"
    }
  ],
  "appIds": [
    "com.google.android.apps.fitness"
  ],
  "categories": [
    "HEALTH_AND_FITNESS"
  ],
  "collection": "TOP_FREE",
  "country": "us",
  "language": "en",
  "maxItems": 10
}
```

# Actor output Schema

## `overview` (type: `string`):

Default dataset containing package identity, publisher, rating, monetization, category, and release metadata.

# 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 = {
    "startUrls": [
        {
            "url": "https://play.google.com/store/apps/details?id=com.google.android.apps.fitness"
        },
        {
            "url": "https://play.google.com/store/apps/category/HEALTH_AND_FITNESS/collection/topselling_free"
        }
    ],
    "appIds": [
        "com.google.android.apps.fitness"
    ],
    "categories": [
        "HEALTH_AND_FITNESS"
    ],
    "collection": "TOP_FREE",
    "country": "us",
    "language": "en",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/google-play-app-catalog-details").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 = {
    "startUrls": [
        { "url": "https://play.google.com/store/apps/details?id=com.google.android.apps.fitness" },
        { "url": "https://play.google.com/store/apps/category/HEALTH_AND_FITNESS/collection/topselling_free" },
    ],
    "appIds": ["com.google.android.apps.fitness"],
    "categories": ["HEALTH_AND_FITNESS"],
    "collection": "TOP_FREE",
    "country": "us",
    "language": "en",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/google-play-app-catalog-details").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://play.google.com/store/apps/details?id=com.google.android.apps.fitness"
    },
    {
      "url": "https://play.google.com/store/apps/category/HEALTH_AND_FITNESS/collection/topselling_free"
    }
  ],
  "appIds": [
    "com.google.android.apps.fitness"
  ],
  "categories": [
    "HEALTH_AND_FITNESS"
  ],
  "collection": "TOP_FREE",
  "country": "us",
  "language": "en",
  "maxItems": 10
}' |
apify call automation-lab/google-play-app-catalog-details --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/google-play-app-catalog-details"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/5OkPygEYpC1lw3Fqu/builds/W34yYf2ebvm899Ljm/openapi.json
