# Google Play Apps Scraper (`fetch_cat/google-play-apps-scraper`) Actor

Scrape Google Play app search results, app IDs, ratings, installs, prices, ads, IAP, categories, screenshots, and developer metadata.

- **URL**: https://apify.com/fetch\_cat/google-play-apps-scraper.md
- **Developed by:** [Hanna Nosova](https://apify.com/fetch_cat) (community)
- **Categories:** Developer tools, E-commerce
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.06 / 1,000 result 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/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 Apps Scraper

Scrape Google Play app search results and app detail metadata for ASO, competitor research, market maps, and app intelligence workflows.

### App review-mining workflow

Use [Google Play Apps Scraper](https://apify.com/fetch_cat/google-play-apps-scraper) to discover Android app IDs, ratings, installs, categories, and developer metadata.

Then use [Google Play Reviews Scraper](https://apify.com/fetch_cat/google-play-reviews-scraper) and [Apple App Store Reviews Scraper](https://apify.com/fetch_cat/apple-app-store-reviews-scraper) to collect public review text for ASO, product feedback, support triage, and competitor analysis.

Compare outputs by app, country, rating, version, and review date to build mobile app intelligence datasets.

### What does Google Play Apps Scraper do?

Google Play Apps Scraper collects public app records from Google Play.

It can search by keyword.

It can fetch known app package IDs.

It can process direct Google Play app detail URLs.

It returns structured app intelligence in a dataset.

Use it to monitor mobile categories, compare apps, collect ratings, track installs, and enrich internal app databases.

### Who is it for?

#### ASO and growth teams

Use keyword searches such as `budget planner`, `habit tracker`, or `photo editor` to build a ranked view of competing Android apps in each target country. Export titles, developers, ratings, installs, categories, and pricing signals into your ASO worksheet, then repeat the same inputs weekly to spot ranking and rating changes.

#### App founders and product managers

Start with a product idea keyword, collect the visible app landscape, and identify which apps dominate installs, which competitors monetize with ads or in-app purchases, and which developer names appear repeatedly. Add known package IDs for your closest competitors when you need a richer side-by-side benchmark.

#### Market researchers and analysts

Create country-specific app market maps without manually copying Google Play pages. Combine broad discovery queries with direct package IDs to compare rating counts, install buckets, content ratings, categories, developer contacts, and localized descriptions across regions.

#### Agencies and consultants

Prepare client audits faster by running repeatable searches for each client niche. Save the dataset to Google Sheets, BigQuery, or your reporting stack, then use the app URL and package ID fields as stable references in decks and dashboards.

#### Data and enrichment teams

Normalize app IDs, app URLs, developer names, installs, ratings, screenshots, categories, and public contact fields into a structured dataset that can feed CRM enrichment, BI pipelines, internal catalogs, or downstream review scraping.

### Why use this scraper?

✅ Search and direct app lookup in one actor.

✅ Localized country and language settings.

✅ Ratings, installs, pricing, ads, and IAP fields.

✅ Output ready for CSV, JSON, Excel, BigQuery, and API pipelines.

✅ Built for small checks and larger app-intelligence lists.

### What data can you extract?

| Field | Description |
| --- | --- |
| query | Search keyword that produced the app |
| rank | Search result position |
| appId | Android package ID |
| title | App title |
| developer | Developer name |
| appUrl | Google Play detail URL |
| icon | App icon URL |
| rating | Average rating |
| ratingsCount | Number of ratings |
| reviewsCount | Number of reviews when available |
| installs | Public install bucket |
| minInstalls | Numeric lower install bound |
| maxInstalls | Numeric upper install estimate |
| free | Whether the app is free |
| priceText | Public price label |
| containsAds | Whether the app displays ads |
| inAppPurchases | Whether in-app purchases are offered |
| category | Main category |
| summary | Short app summary |
| description | Full description when details are enabled |
| screenshots | Screenshot URLs |
| contentRating | Content rating |
| released | Release date |
| updated | Last update timestamp |
| developerWebsite | Developer website |
| developerEmail | Developer email |
| locale | Requested language and country |
| scrapedAt | Collection timestamp |

### How much does it cost to scrape Google Play apps?

This actor uses pay-per-event pricing so cost follows the amount of data saved.

You pay a small run-start event and then a per-app result event for each app record written to the dataset. The live Apify Store pricing tab is authoritative, but the actor is designed so small validation runs remain inexpensive.

#### Pricing examples

The live Apify Store pricing tab is the source of truth. The table below uses the current configured public price of a $0.005 run-start event plus the FREE-tier result price of $0.000115 per saved app record, so paid-plan tiers can be lower.

| Example run | Typical input | Saved app records | Estimated event cost |
| --- | --- | ---: | ---: |
| Quick ASO check | 1 keyword, `maxResults: 10` | 10 | about $0.0062 |
| Small niche benchmark | 2 keywords, `maxResults: 50` total | 50 | about $0.0108 |
| Package enrichment | 25 known `appIds` | 25 | about $0.0079 |
| Larger market map | several focused searches, `maxResults: 250` total | 250 | about $0.0338 |

Notes:

- `maxResults` is the total cap for the run, not a per-keyword cap.
- If Google Play returns fewer public apps than requested, you only pay result events for records actually saved.
- Your final bill can differ if Apify changes Store pricing, plan tiers, platform credits, or taxes.

#### Free-plan estimate

Apify free-plan credits are usually enough for trial runs such as 5-25 apps, depending on the current Store pricing and your remaining monthly platform credits. For predictable first tests, keep the prefilled `maxResults` low, use one keyword, and enable details only when you need richer metadata.

#### Cost-control tips

- Start with `maxResults: 10` before scaling to larger market maps.
- Use specific keywords to reduce duplicate or irrelevant apps.
- Use direct `appIds` when you already know the competitors you want.
- Check the dataset count after each run; per-result charges match saved records.

### How to scrape Google Play search results

1. Open the actor on Apify.

2. Add one or more search queries.

3. Choose a country code such as `us`, `gb`, or `de`.

4. Choose a language code such as `en`, `de`, or `es`.

5. Set the maximum number of apps.

6. Run the actor.

7. Export the dataset.

### How to fetch direct app details

Add Android package IDs such as `com.spotify.music`.

You can also paste Google Play app detail URLs.

The actor extracts the package ID and fetches public metadata.

This is useful when you already have a list of competitor apps.

### Input options

#### queries

Search keywords to run on Google Play.

Examples: `calculator`, `fitness tracker`, `budget planner`.

#### appIds

Direct Android package IDs.

Examples: `com.spotify.music`, `com.duolingo`.

#### startUrls

Direct Google Play app detail URLs.

Example: `https://play.google.com/store/apps/details?id=com.duolingo`.

#### country

Two-letter country code for localized results and prices.

Default: `us`.

#### language

Two-letter language code for localized text.

Default: `en`.

#### maxResults

Maximum number of app records to save.

Default: `25`.

#### includeDetails

When enabled, the actor fetches richer public app metadata.

#### price

Search price filter: all, free, or paid apps.

### Example input

```json
{
  "queries": ["calculator", "fitness tracker"],
  "appIds": ["com.spotify.music"],
  "country": "us",
  "language": "en",
  "maxResults": 25,
  "includeDetails": true,
  "price": "all"
}
````

### Example output

```json
{
  "query": "calculator",
  "rank": 1,
  "inputType": "search",
  "appId": "com.sec.android.app.popupcalculator",
  "title": "Samsung Calculator",
  "developer": "Samsung Electronics Co., Ltd.",
  "appUrl": "https://play.google.com/store/apps/details?id=com.sec.android.app.popupcalculator",
  "rating": 4.46,
  "ratingsCount": 967477,
  "installs": "1,000,000,000+",
  "free": true,
  "priceText": "Free",
  "category": "Tools",
  "locale": "en_US"
}
```

### Tips for best results

Start with a small `maxResults` value.

Use specific keywords for cleaner rankings.

Use country and language settings that match your target market.

Enable details when you need installs, screenshots, and developer contacts.

Disable unnecessary broad keywords if you only need known app IDs.

### Common use cases

📱 ASO keyword monitoring.

📊 Competitor app benchmarking.

🌍 Country-specific app market research.

💸 Free versus paid app analysis.

🧩 Package ID enrichment.

🏷️ Category mapping.

📈 Install and rating trend snapshots.

### Integrations

#### Google Sheets ASO reporting

Export the dataset to Google Sheets and build tabs for keyword rank, installs, ratings, category, and monetization model. This works well for weekly ASO snapshots where stakeholders want a familiar spreadsheet.

#### BigQuery and BI dashboards

Send finished datasets to BigQuery, Snowflake, or another warehouse. Join package IDs with internal revenue, ad-spend, or review data to build mobile-market dashboards.

#### Make, Zapier, and webhooks

Use Apify webhooks to trigger a Make or Zapier scenario when a run succeeds. Common flows include: new app dataset → filter high-rating apps → append to CRM; or keyword run → notify Slack when a new competitor appears.

#### Backend enrichment jobs

Call the actor from your backend whenever a new Android package ID enters your system. Store the returned title, developer, app URL, installs, and rating fields alongside your internal app records.

#### Review-analysis pipeline

Run this actor first to discover app IDs, then pass selected package IDs to a reviews scraper for sentiment analysis, support triage, or feature-request mining.

### API usage with Node.js

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/google-play-apps-scraper').call({
  queries: ['calculator'],
  country: 'us',
  language: 'en',
  maxResults: 10,
  includeDetails: true
});
console.log(run.defaultDatasetId);
```

### API usage with Python

```python
from apify_client import ApifyClient
import os

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('fetch_cat/google-play-apps-scraper').call(run_input={
    'queries': ['calculator'],
    'country': 'us',
    'language': 'en',
    'maxResults': 10,
    'includeDetails': True,
})
print(run['defaultDatasetId'])
```

### API usage with cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/fetch_cat~google-play-apps-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"queries":["calculator"],"country":"us","language":"en","maxResults":10,"includeDetails":true}'
```

### MCP usage

Use this actor through Apify MCP from Claude Code, Claude Desktop, Cursor, VS Code, or any MCP-compatible client that supports remote HTTP servers.

MCP URL pattern:

`https://mcp.apify.com/?tools=fetch_cat/google-play-apps-scraper`

#### Claude Code setup

```bash
claude mcp add --transport http apify-google-play-apps "https://mcp.apify.com/?tools=fetch_cat/google-play-apps-scraper"
```

Then ask Claude Code to run the `fetch_cat/google-play-apps-scraper` tool with an input such as:

```json
{
  "queries": ["calculator"],
  "country": "us",
  "language": "en",
  "maxResults": 10,
  "includeDetails": true
}
```

#### Claude Desktop setup

Add the server to your Claude Desktop MCP configuration and restart Claude Desktop:

```json
{
  "mcpServers": {
    "apify-google-play-apps": {
      "url": "https://mcp.apify.com/?tools=fetch_cat/google-play-apps-scraper"
    }
  }
}
```

Make sure your Apify account is connected to MCP so the run can access your Apify token and dataset exports.

#### Cursor setup

In Cursor, open MCP settings, add a new remote HTTP server, and use the same Apify MCP URL:

```json
{
  "mcpServers": {
    "apify-google-play-apps": {
      "url": "https://mcp.apify.com/?tools=fetch_cat/google-play-apps-scraper"
    }
  }
}
```

After saving, reload Cursor and ask the agent to call `fetch_cat/google-play-apps-scraper` with the JSON input you want to run.

#### VS Code setup

In VS Code with MCP support enabled, add an HTTP MCP server named `apify-google-play-apps` and set the URL to:

`https://mcp.apify.com/?tools=fetch_cat/google-play-apps-scraper`

If you manage MCP servers through a JSON settings file, use the same `mcpServers` block shown in the Claude Desktop and Cursor examples. Restart or reload VS Code after saving so the Google Play Apps Scraper tool appears in the chat/tool picker.

#### MCP workflow prompts

Example prompt you can ask after connecting the MCP server:

- “Use Google Play Apps Scraper to find the top 10 calculator apps in the US, then summarize installs, ratings, ads, and in-app purchases.”
- “Compare `com.spotify.music` and `com.duolingo` using public Google Play metadata and return a table.”
- “Build a CSV-ready list of fitness tracker apps in Great Britain with rating, install bucket, category, and app URL.”
- “Find paid budgeting apps in Germany and identify developers with multiple apps.”

### Data quality notes

Google Play displays localized public metadata.

Some fields may be absent for certain apps or countries.

Install counts are public buckets, not exact private analytics.

Ratings and review counts can change frequently.

Use timestamps to compare snapshots over time.

### Limits

Very broad keywords can return overlapping apps.

Google Play may show different rankings by country and language.

Some apps are not available in every country.

Developer contact fields are only returned when publicly available.

### FAQ

#### What does this actor collect?

It collects public Google Play app search and detail metadata for app intelligence workflows.

### Troubleshooting

#### I got fewer results than requested. Why?

Google Play may have fewer public results for the keyword, country, price filter, or locale.

Try a broader keyword or lower the result limit.

#### Why are some fields null?

Not every public app page exposes every metadata field.

Direct app details usually provide richer data than search-only cards.

#### Can I scrape reviews with this actor?

This actor focuses on app search and app details.

Use a dedicated reviews scraper when you need individual review text.

### Legality

This actor extracts publicly available Google Play app metadata.

You are responsible for using the data lawfully.

Respect applicable terms, privacy rules, and local regulations.

Do not use scraped data for spam, harassment, or prohibited profiling.

### Related actors and scrapers

Use these related actors from the same catalog for adjacent mobile, review, and discovery workflows:

- [Google Play Reviews Scraper](https://apify.com/fetch_cat/google-play-reviews-scraper) — collect individual reviews after this actor discovers the target package IDs.
- [Apple App Store Reviews Scraper](https://apify.com/fetch_cat/apple-app-store-reviews-scraper) — compare iOS review sentiment with Android app intelligence.
- [Google Maps Reviews Scraper](https://apify.com/fetch_cat/google-maps-reviews-scraper) — analyze local-business reviews when your app research connects to physical locations.
- [TikTok Comments Scraper](https://apify.com/fetch_cat/tiktok-comments-scraper) — study social feedback around app launches, ads, and creator campaigns.
- [YouTube Search Results Scraper](https://apify.com/fetch_cat/youtube-search-results-scraper) — find videos and creators discussing competitor apps.

### Changelog

#### 0.1

Initial version with search queries, app IDs, direct URLs, locale settings, detail metadata, and pay-per-result output.

### Support

If a run fails, open the run log and dataset sample first.

Share the input, run ID, and expected app examples when asking for help.

Small reproducible inputs make support faster.

# Actor input Schema

## `queries` (type: `array`):

Google Play search terms such as app categories, brands, competitors, or keywords.

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

Optional Android package IDs to fetch directly, for example com.spotify.music.

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

Optional direct Google Play app detail URLs. Search-result URLs are not required; use search queries for discovery.

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

Two-letter Google Play country code used for localized rankings and prices.

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

Two-letter Google Play language code used for localized titles, descriptions, and rankings.

## `maxResults` (type: `integer`):

Maximum number of app records to save across all searches, IDs, and URLs.

## `includeDetails` (type: `boolean`):

Fetch full detail fields such as installs, ratings count, screenshots, content rating, release date, and developer contacts.

## `price` (type: `string`):

Filter search results by free or paid apps. Direct app IDs and URLs are always fetched.

## Actor input object example

```json
{
  "queries": [
    "calculator",
    "fitness tracker"
  ],
  "appIds": [
    "com.spotify.music"
  ],
  "startUrls": [
    {
      "url": "https://play.google.com/store/apps/details?id=com.duolingo"
    }
  ],
  "country": "us",
  "language": "en",
  "maxResults": 20,
  "includeDetails": true,
  "price": "all"
}
```

# Actor output Schema

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

No description

# 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 = {
    "queries": [
        "calculator",
        "fitness tracker"
    ],
    "appIds": [
        "com.spotify.music"
    ],
    "startUrls": [
        {
            "url": "https://play.google.com/store/apps/details?id=com.duolingo"
        }
    ],
    "country": "us",
    "language": "en",
    "maxResults": 20,
    "includeDetails": true,
    "price": "all"
};

// Run the Actor and wait for it to finish
const run = await client.actor("fetch_cat/google-play-apps-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 = {
    "queries": [
        "calculator",
        "fitness tracker",
    ],
    "appIds": ["com.spotify.music"],
    "startUrls": [{ "url": "https://play.google.com/store/apps/details?id=com.duolingo" }],
    "country": "us",
    "language": "en",
    "maxResults": 20,
    "includeDetails": True,
    "price": "all",
}

# Run the Actor and wait for it to finish
run = client.actor("fetch_cat/google-play-apps-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 '{
  "queries": [
    "calculator",
    "fitness tracker"
  ],
  "appIds": [
    "com.spotify.music"
  ],
  "startUrls": [
    {
      "url": "https://play.google.com/store/apps/details?id=com.duolingo"
    }
  ],
  "country": "us",
  "language": "en",
  "maxResults": 20,
  "includeDetails": true,
  "price": "all"
}' |
apify call fetch_cat/google-play-apps-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Play Apps Scraper",
        "description": "Scrape Google Play app search results, app IDs, ratings, installs, prices, ads, IAP, categories, screenshots, and developer metadata.",
        "version": "0.1",
        "x-build-id": "M3hU4NWVSZOdeKFgK"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/fetch_cat~google-play-apps-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-fetch_cat-google-play-apps-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/fetch_cat~google-play-apps-scraper/runs": {
            "post": {
                "operationId": "runs-sync-fetch_cat-google-play-apps-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/fetch_cat~google-play-apps-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-fetch_cat-google-play-apps-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",
                "properties": {
                    "queries": {
                        "title": "Search queries",
                        "type": "array",
                        "description": "Google Play search terms such as app categories, brands, competitors, or keywords.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "appIds": {
                        "title": "App IDs",
                        "type": "array",
                        "description": "Optional Android package IDs to fetch directly, for example com.spotify.music.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Google Play app URLs",
                        "type": "array",
                        "description": "Optional direct Google Play app detail URLs. Search-result URLs are not required; use search queries for discovery.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "country": {
                        "title": "Country code",
                        "type": "string",
                        "description": "Two-letter Google Play country code used for localized rankings and prices.",
                        "default": "us"
                    },
                    "language": {
                        "title": "Language code",
                        "type": "string",
                        "description": "Two-letter Google Play language code used for localized titles, descriptions, and rankings.",
                        "default": "en"
                    },
                    "maxResults": {
                        "title": "Maximum apps",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum number of app records to save across all searches, IDs, and URLs.",
                        "default": 25
                    },
                    "includeDetails": {
                        "title": "Include detailed app metadata",
                        "type": "boolean",
                        "description": "Fetch full detail fields such as installs, ratings count, screenshots, content rating, release date, and developer contacts.",
                        "default": true
                    },
                    "price": {
                        "title": "Search price filter",
                        "enum": [
                            "all",
                            "free",
                            "paid"
                        ],
                        "type": "string",
                        "description": "Filter search results by free or paid apps. Direct app IDs and URLs are always fetched.",
                        "default": "all"
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
