# Apple App Store | Scrape App Store Search Results & Keywords (`johnvc/apple-app-store-search`) Actor

Scrape Apple App Store search results for any keyword. Extract app titles, ratings, developer info, price, screenshots, genres, version, and bundle ID across 155+ country stores. Built for ASO research, app discovery, competitor tracking, and AI agent workflows. Pay only for the apps you receive.

- **URL**: https://apify.com/johnvc/apple-app-store-search.md
- **Developed by:** [John](https://apify.com/johnvc) (community)
- **Categories:** SEO tools, Developer tools, E-commerce
- **Stats:** 5 total users, 4 monthly users, 100.0% runs succeeded, 4 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.01 / 1,000 results

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

## Apple App Store Search Scraper

> **The fastest way to scrape Apple App Store search results for ASO research, app discovery, and AI agents.**

Search any keyword in the App Store and get back rich, structured app data: titles, ratings, developer info, prices, screenshots, genres, versions, and bundle IDs. Works across 50+ country stores and 40+ languages. Built for App Store Optimization (ASO), competitor tracking, market research, and AI agent workflows.

This actor is fully **MCP (Model Context Protocol) ready**, with one click setup for Claude Code, Claude Cowork, and Claude.ai Chat.

---

### AI Agent and MCP Integration

The fastest path to use this actor is through the Apify MCP server. Once connected, Claude (or any MCP-compatible AI agent) can discover and invoke this actor directly from a natural language prompt. No glue code, no client SDK, no manual REST calls.

The Apify MCP server hosts three discovery tools (`search-actors`, `fetch-actor-details`, `add-actor`) that let agents find and register this actor on the fly. Pick the setup that matches your Claude surface.

#### Option 1: Claude Code (terminal CLI)

The single-command setup. Open your terminal and run:

```bash
claude mcp add apify -- npx -y @apify/actors-mcp-server
````

Then add your Apify API token (one time):

```bash
claude mcp add apify -e APIFY_TOKEN=your_apify_token_here -- npx -y @apify/actors-mcp-server
```

Get your token at https://console.apify.com/account/integrations.

Prefer to edit config by hand? Open `~/.claude.json` and add:

```json
{
  "mcpServers": {
    "apify": {
      "command": "npx",
      "args": ["-y", "@apify/actors-mcp-server"],
      "env": { "APIFY_TOKEN": "your_apify_token_here" }
    }
  }
}
```

Restart Claude Code, then try a prompt like:

> *Find the top 50 meditation apps in the US App Store with their ratings and prices.*

Claude will discover this actor via `search-actors`, register it as a tool, and run it.

#### Option 2: Claude Cowork (web)

Claude Cowork uses the hosted Apify MCP endpoint over HTTP. No local install required.

1. Open Cowork.
2. Go to **Settings** > **Connectors** > **Add custom connector**.
3. Fill in:
   - **Name:** `Apify`
   - **Remote MCP URL:** `https://mcp.apify.com`
   - **Authentication:** Bearer token (paste your Apify API token).
4. Save and enable the connector.

Once connected, the Apify tools appear in the tool drawer. Try a prompt:

> *Use Apify to scrape Apple App Store search results for "budget tracker" in the UK store and tell me which apps have the most ratings.*

Cowork supports dynamic tool discovery, so once Claude finds this actor in a session, it stays registered as a named tool for the rest of the conversation. Subsequent prompts reuse it without re-discovery.

#### Option 3: Claude.ai Chat (Connectors)

Same hosted MCP endpoint, configured through the standard Claude.ai UI.

1. Open https://claude.ai.
2. Click your profile, then **Settings** > **Connectors** > **Add custom connector**.
3. Fill in:
   - **Name:** `Apify`
   - **Remote MCP URL:** `https://mcp.apify.com`
   - **Authentication:** Bearer token (your Apify API token).
4. Save. Toggle the connector on at the start of any chat where you want App Store data.

Then prompt as normal:

> *Search the App Store for "language learning" apps using Apify. Show me ratings and developers.*

#### Option 4: ChatGPT, n8n, Zapier, custom GPTs (direct REST)

Skip MCP entirely with a single REST call. Useful for custom GPTs, Zapier flows, n8n pipelines, or any HTTP client.

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/YOUR_USERNAME~apple-app-store-search/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"term": "meditation", "country": "us", "num": 50}'
```

For ChatGPT custom GPT Actions, import the [Apify OpenAPI spec](https://docs.apify.com/api/v2) as a custom action. Once added, ChatGPT can call this actor as a function from any custom GPT.

[Full Apify MCP documentation](https://docs.apify.com/platform/integrations/mcp)

***

### The Apple App Store API Family

This actor is the **search** link in a three-API family, all keyed on the same `app_id`:

| API | Purpose | Input | Output |
| --- | ------- | ----- | ------ |
| **Apple App Store Search API (this actor)** | Find apps by keyword. | Search term + country | Many apps (search results). |
| Apple App Store Product API | Get full details for one app: description, version history, screenshots, IAPs, privacy cards, sample reviews. | One or more App Store IDs + country | One full product record per ID. |
| Apple App Store Reviews API (coming soon) | Get paginated reviews for one app. | App Store ID + country + sort | Many reviews per app. |

```
Search API ──► app_id ──► Product API ──► full product details
                     └──► Reviews API ──► paginated reviews
```

Agents typically chain them: search here for candidates, pick the IDs they care about, then fan out to the Product API and the Reviews API. Each API is pay-per-record across the family, so you only pay for what you actually fetch.

***

### What You Can Extract

| Field | Description |
| ----- | ----------- |
| App title | Official name shown on the App Store |
| App ID and bundle ID | Stable identifiers for cross-referencing |
| Developer info | Name, developer ID, and link to the developer page |
| Ratings | Average rating (0 to 5) and total rating count |
| Price | Type (Free, Paid, Free Trial), amount, currency, and symbol |
| Description and release notes | Full app description and latest version notes |
| Screenshots | URLs and sizes for iPhone, iPad, Mac, and other device classes |
| Logos | Multiple resolutions (60x60, 100x100, 512x512) |
| Genres | Primary and secondary App Store categories with IDs |
| Version info | Current version, release date, and latest version release date |
| Compatibility | Minimum OS version, supported devices, and supported languages |
| Age rating and advisories | Content rating plus any content warnings |
| Search context | The originating query, country store, language, and ranking position |

Every dataset item is one app, flat and ready for analysis. Each row also carries the search query and country code, so multi-keyword runs stay self-contained.

***

### Use Cases

- **App Store Optimization (ASO):** Track keyword rankings, monitor competitor apps, and benchmark category leaders.
- **App discovery and market research:** Identify trending apps in any country store or category.
- **Competitor tracking:** Watch a rival developer's portfolio, version history, and ratings over time.
- **Pricing and price-tier analysis:** Compare paid vs free vs freemium distribution in a category.
- **AI agent context:** Feed real App Store data into LLM prompts for grounded answers about iOS apps.
- **Trend monitoring:** Detect new entrants and rapid risers in specific genres.
- **Multi-country comparison:** Run the same query across US, UK, JP, DE, and BR to compare regional app catalogs.

***

### Input Parameters

| Parameter | Type | Required | Default | Description |
| --------- | ---- | -------- | ------- | ----------- |
| `term` | string | yes | (none) | Search query, e.g. `coffee`, `fitness tracker`, `meditation`. |
| `country` | string | no | `us` | Two-letter country code (ISO 3166-1 alpha-2, lowercase). 50+ stores supported. |
| `lang` | string | no | `en-us` | Language code in `xx-yy` form (e.g. `en-us`, `fr-fr`, `ja-jp`). |
| `num` | integer | no | `10` | Apps per page, 1 to 200. Default 10 keeps first runs cheap; raise to scan more apps per page. |
| `device` | string | no | `desktop` | Device class to emulate: `desktop`, `tablet`, or `mobile`. |
| `disallow_explicit` | boolean | no | `false` | Set true to filter out apps flagged as explicit. |
| `property` | string | no | `""` | `""` for app-name search (default) or `developer` to search developer names. |
| `category_id` | integer | no | (none) | Filter by App Store category ID. Examples: 6014 Games, 6017 Education, 6005 Social Networking, 6013 Health and Fitness. |
| `max_pages` | integer | no | `1` | Maximum pages to fetch. Set to 0 for unlimited. |
| `output_file` | string | no | auto | Optional local JSON filename. Useful for local testing only. |

***

### Example Inputs

#### Basic search

```json
{
  "term": "coffee",
  "max_pages": 1
}
```

#### Localized search (UK store, English)

```json
{
  "term": "budget tracker",
  "country": "gb",
  "lang": "en-gb",
  "num": 50,
  "max_pages": 1
}
```

#### Filtered by category (Games only, family safe)

```json
{
  "term": "puzzle",
  "country": "us",
  "category_id": 6014,
  "disallow_explicit": true,
  "num": 100,
  "max_pages": 2
}
```

#### Developer portfolio search

```json
{
  "term": "King",
  "property": "developer",
  "country": "us",
  "max_pages": 1
}
```

#### International store (Japan)

```json
{
  "term": "manga",
  "country": "jp",
  "lang": "ja-jp",
  "num": 100,
  "max_pages": 1
}
```

***

### Example Output

Each dataset item is one app:

```json
{
  "position": 1,
  "app_id": 1429637763,
  "title": "Calm",
  "bundle_id": "com.calm.app",
  "developer_name": "Calm.com, Inc.",
  "developer_id": 469307675,
  "developer_link": "https://apps.apple.com/us/developer/calm-com-inc/id469307675",
  "version": "8.21",
  "age_rating": "4+",
  "release_date": "2015-08-27T07:00:00Z",
  "latest_version_release_date": "2026-04-30T10:14:21Z",
  "price_type": "Free",
  "price_amount": null,
  "price_currency": "USD",
  "price_symbol": "$",
  "rating_average": 4.8,
  "rating_count": 1814237,
  "genres": [
    {"name": "Health & Fitness", "id": 6013, "primary": true},
    {"name": "Lifestyle", "id": 6012, "primary": false}
  ],
  "size_in_bytes": 312456789,
  "minimum_os_version": "15.0",
  "description_text": "Calm is the #1 app for sleep, meditation, and relaxation...",
  "release_notes": "We update Calm every two weeks with new content and improvements.",
  "screenshots": [
    {"link": "https://...screen1.png", "size": "1284x2778", "device": "iphone"},
    {"link": "https://...screen2.png", "size": "1284x2778", "device": "iphone"},
    {"link": "https://...ipad1.png", "size": "2048x2732", "device": "ipad"}
  ],
  "logos": [
    {"size": "60x60", "link": "https://...60x60.png"},
    {"size": "512x512", "link": "https://...512x512.png"}
  ],
  "supported_languages": ["en-US", "es-MX", "fr-FR", "de-DE", "ja-JP", "ko-KR"],
  "supported_devices": ["iPhone5s-iPhone5s", "iPadAir-iPadAir", "..."],
  "features": ["iosUniversal"],
  "advisories": [],
  "link": "https://apps.apple.com/us/app/calm/id1429637763",
  "game_center_enabled": false,
  "search_term": "meditation",
  "search_country": "us",
  "search_lang": "en-us",
  "search_page": 1,
  "search_position_global": 1,
  "search_timestamp": "2026-05-11T10:30:00"
}
```

***

### Pricing

Transparent pay-per-event pricing. You only pay for what you get.

| Event | Cost | When charged |
| ----- | ---- | ------------ |
| `setup` | `$0.02` | Once at the start of each run. |
| `result` | `$0.0015` | Per app returned in the dataset. |

#### Cost estimates

| Use case | Apps returned | Approx. cost |
| -------- | ------------- | ------------ |
| Quick keyword check (1 page, 10 apps) | 10 | `$0.035` |
| Standard keyword scan (1 page, 200 apps) | 200 | `$0.32` |
| Deep keyword crawl (5 pages, 200 each) | 1,000 | `$1.52` |
| Bulk ASO sweep (50 keywords, 200 apps each) | 10,000 | `$15.02` (one run per keyword) |

No monthly subscription. No hidden fees. Stop the run at any time and pay only for what was already returned.

***

### How to Get Started

1. **Create an Apify account** at https://apify.com if you do not have one.
2. **Open the actor page** in the Apify store and click **Try for free**.
3. **Set the input** (only `term` is required) and click **Start**.
4. **Watch the run live** in the Apify console, then download results as JSON, CSV, Excel, or RSS once it finishes.
5. Optional: connect via MCP (see top of this README) to call the actor directly from Claude or any AI agent.

***

### FAQ

**Q: Why am I getting 0 apps?**
A: Check that the `term` is spelled correctly and matches keywords actual users would type. Try removing filters like `category_id` or `disallow_explicit`. If `country` is unusual, also confirm that store has apps matching the query.

**Q: How many apps does one page return?**
A: Up to 200. Set `num` to control this. The actor charges per app actually returned, not per page, so picking a high `num` is the most efficient way to scan a keyword.

**Q: Can I get full app details or reviews with this actor?**
A: Not directly. This actor focuses on search and discovery. For full per-app details (description, version history, screenshots, in-app purchases, privacy cards, sample reviews) use the companion **Apple App Store Product API**. For paginated reviews, use the dedicated **Apple App Store Reviews API** (coming soon). All three actors share the same App Store `app_id`, so you can chain them: search this actor for candidates, then fan out to the Product API and Reviews API for the IDs you care about.

**Q: Can I search by developer name instead of app name?**
A: Yes. Set `property` to `developer` and put the developer name in `term`.

**Q: Which country stores are supported?**
A: 50+ stores including US, UK, CA, AU, DE, FR, JP, KR, BR, MX, IN, and more. See the `country` parameter dropdown for the full list.

**Q: Does this work with AI agents and MCP?**
A: Yes. Setup instructions for Claude Code, Claude Cowork, and Claude.ai Chat are at the top of this README.

***

Last Updated: 2026.05.11

# Actor input Schema

## `term` (type: `string`):

Search query for the App Store (e.g. 'coffee', 'fitness tracker', 'meditation'). Required.

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

Two-letter country code (ISO 3166-1 alpha-2, lowercase) selecting which App Store region to search. Defaults to 'us'.

## `lang` (type: `string`):

Language code in the form 'xx-yy' (e.g. 'en-us', 'fr-fr', 'ja-jp'). Defaults to 'en-us'.

## `num` (type: `integer`):

Number of app results to request per page. Range 1 to 200. Default 10 keeps the first run cheap. Raise it to scan more apps per page (each app returned is charged separately).

## `device` (type: `string`):

Browser device class to emulate when requesting search results. Defaults to 'desktop'.

## `disallow_explicit` (type: `boolean`):

Set true to exclude apps flagged as explicit. Default false.

## `property` (type: `string`):

Scope the search. Leave empty (default) to search app names. Use 'developer' to search developer names instead.

## `category_id` (type: `integer`):

Filter results by App Store category (genre) ID. Examples: 6014 Games, 6017 Education, 6005 Social Networking, 6007 Productivity, 6013 Health & Fitness. Leave blank for no category filter.

## `max_pages` (type: `integer`):

Maximum number of pages to fetch. Set to 0 for unlimited (fetch all available pages). Default 1. Each page returns up to 'num' apps.

## `output_file` (type: `string`):

Optional filename to save a local JSON copy of the raw search results. Used for local testing only. Auto-generated if blank.

## Actor input object example

```json
{
  "term": "coffee",
  "country": "us",
  "lang": "en-us",
  "num": 10,
  "device": "desktop",
  "disallow_explicit": false,
  "property": "",
  "max_pages": 1
}
```

# Actor output Schema

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

Complete list of apps returned by the search. Each dataset item contains app metadata: title, developer, ratings, price, screenshots, version, bundle ID, supported devices, plus the originating search query and country.

# 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 = {
    "term": "coffee"
};

// Run the Actor and wait for it to finish
const run = await client.actor("johnvc/apple-app-store-search").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 = { "term": "coffee" }

# Run the Actor and wait for it to finish
run = client.actor("johnvc/apple-app-store-search").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 '{
  "term": "coffee"
}' |
apify call johnvc/apple-app-store-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=johnvc/apple-app-store-search",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Apple App Store | Scrape App Store Search Results & Keywords",
        "description": "Scrape Apple App Store search results for any keyword. Extract app titles, ratings, developer info, price, screenshots, genres, version, and bundle ID across 155+ country stores. Built for ASO research, app discovery, competitor tracking, and AI agent workflows. Pay only for the apps you receive.",
        "version": "0.1",
        "x-build-id": "vhmjK69IK7A0fZOyY"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/johnvc~apple-app-store-search/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-johnvc-apple-app-store-search",
                "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/johnvc~apple-app-store-search/runs": {
            "post": {
                "operationId": "runs-sync-johnvc-apple-app-store-search",
                "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/johnvc~apple-app-store-search/run-sync": {
            "post": {
                "operationId": "run-sync-johnvc-apple-app-store-search",
                "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": [
                    "term"
                ],
                "properties": {
                    "term": {
                        "title": "Search Term",
                        "minLength": 1,
                        "type": "string",
                        "description": "Search query for the App Store (e.g. 'coffee', 'fitness tracker', 'meditation'). Required."
                    },
                    "country": {
                        "title": "Country Store",
                        "enum": [
                            "us",
                            "gb",
                            "ca",
                            "au",
                            "nz",
                            "ie",
                            "in",
                            "sg",
                            "ph",
                            "my",
                            "de",
                            "fr",
                            "es",
                            "it",
                            "nl",
                            "be",
                            "at",
                            "ch",
                            "se",
                            "no",
                            "dk",
                            "fi",
                            "pt",
                            "pl",
                            "cz",
                            "gr",
                            "hu",
                            "ro",
                            "tr",
                            "ru",
                            "ua",
                            "il",
                            "ae",
                            "sa",
                            "eg",
                            "za",
                            "ng",
                            "ke",
                            "jp",
                            "kr",
                            "cn",
                            "tw",
                            "hk",
                            "th",
                            "id",
                            "vn",
                            "br",
                            "mx",
                            "ar",
                            "cl",
                            "co",
                            "pe"
                        ],
                        "type": "string",
                        "description": "Two-letter country code (ISO 3166-1 alpha-2, lowercase) selecting which App Store region to search. Defaults to 'us'.",
                        "default": "us"
                    },
                    "lang": {
                        "title": "Language",
                        "enum": [
                            "en-us",
                            "en-gb",
                            "en-au",
                            "en-ca",
                            "en-ie",
                            "en-nz",
                            "en-in",
                            "en-sg",
                            "fr-fr",
                            "fr-ca",
                            "fr-ch",
                            "fr-be",
                            "de-de",
                            "de-at",
                            "de-ch",
                            "es-es",
                            "es-mx",
                            "es-ar",
                            "es-cl",
                            "es-co",
                            "it-it",
                            "pt-pt",
                            "pt-br",
                            "nl-nl",
                            "nl-be",
                            "ja-jp",
                            "ko-kr",
                            "zh-cn",
                            "zh-tw",
                            "zh-hk",
                            "ru-ru",
                            "uk-ua",
                            "pl-pl",
                            "tr-tr",
                            "ar-sa",
                            "he-il",
                            "sv-se",
                            "no-no",
                            "da-dk",
                            "fi-fi",
                            "el-gr",
                            "th-th",
                            "vi-vn",
                            "id-id",
                            "ms-my"
                        ],
                        "type": "string",
                        "description": "Language code in the form 'xx-yy' (e.g. 'en-us', 'fr-fr', 'ja-jp'). Defaults to 'en-us'.",
                        "default": "en-us"
                    },
                    "num": {
                        "title": "Results Per Page",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Number of app results to request per page. Range 1 to 200. Default 10 keeps the first run cheap. Raise it to scan more apps per page (each app returned is charged separately).",
                        "default": 10
                    },
                    "device": {
                        "title": "Device Class",
                        "enum": [
                            "desktop",
                            "tablet",
                            "mobile"
                        ],
                        "type": "string",
                        "description": "Browser device class to emulate when requesting search results. Defaults to 'desktop'.",
                        "default": "desktop"
                    },
                    "disallow_explicit": {
                        "title": "Filter Explicit Apps",
                        "type": "boolean",
                        "description": "Set true to exclude apps flagged as explicit. Default false.",
                        "default": false
                    },
                    "property": {
                        "title": "Search Scope",
                        "enum": [
                            "",
                            "developer"
                        ],
                        "type": "string",
                        "description": "Scope the search. Leave empty (default) to search app names. Use 'developer' to search developer names instead.",
                        "default": ""
                    },
                    "category_id": {
                        "title": "Category ID",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Filter results by App Store category (genre) ID. Examples: 6014 Games, 6017 Education, 6005 Social Networking, 6007 Productivity, 6013 Health & Fitness. Leave blank for no category filter."
                    },
                    "max_pages": {
                        "title": "Maximum Pages",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum number of pages to fetch. Set to 0 for unlimited (fetch all available pages). Default 1. Each page returns up to 'num' apps.",
                        "default": 1
                    },
                    "output_file": {
                        "title": "Local Output File",
                        "type": "string",
                        "description": "Optional filename to save a local JSON copy of the raw search results. Used for local testing only. Auto-generated if blank."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
