# Apple App Store Scraper — Apps, Reviews & Charts (`scrapesage/app-store-scraper`) Actor

Scrape the Apple App Store: search apps, full app details, top free/paid/grossing charts, whole developer portfolios and user reviews. Rich metadata (ratings, versions, sizes, screenshots) plus a monitoring mode for new apps and reviews. No login, no key, no browser.

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

## Pricing

from $5.00 / 1,000 app scrapeds

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

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

## What's an Apify Actor?

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

## How to integrate an Actor?

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

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

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

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

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

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

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

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

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

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

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


# README

## Apple App Store Scraper — Apps, Reviews & Charts

Extract **everything public on the [Apple App Store](https://www.apple.com/app-store/)** — full **app details** (ratings, pricing, versions, sizes, release notes, screenshots), **user reviews**, **top free/paid/grossing charts** by category, and an entire **developer's app portfolio**. Built straight on Apple's own iTunes/App Store endpoints for clean, fast, structured data.

No login, no API key, no browser — and an optional **monitoring mode** that returns only new apps and new reviews on each run.

### Why this App Store scraper?

Most App Store scrapers do one narrow thing. This actor rolls **five jobs into one tool** and ships the **richest dataset in the category** — the complete app record, not just a handful of visible fields.

| Data | Typical App Store scrapers | This actor |
|---|---|---|
| App search by keyword | partial | ✅ |
| Full app details (rating, # ratings, version, size, min iOS, release notes…) | basic fields | ✅ 40+ fields |
| Developer name, website & developer page | ❌ | ✅ |
| Top charts (free / paid / grossing) by category | sometimes | ✅ |
| Whole developer portfolio | ❌ | ✅ |
| User reviews (rating, title, text, version, helpful votes) | ✅ | ✅ |
| Bundle ID ⇄ App ID ⇄ URL — all accepted | ❌ | ✅ |
| **Monitoring mode** — only new apps / reviews | ❌ | ✅ |
| One run, five jobs (search · details · charts · developer · reviews) | ❌ | ✅ |

### Use cases

- **ASO & market research** — see who ranks for a keyword or tops a category, with ratings, rating counts, pricing, version cadence and release notes; compare your app to its rivals.
- **Review intelligence & monitoring** — track ratings and user feedback for your app and competitors; run on a schedule with monitoring mode to capture only the newest reviews for sentiment, bug signals and support alerts.
- **Competitive & portfolio tracking** — scrape a rival developer's entire catalogue, or watch a category chart to catch new entrants the moment they appear.
- **App discovery & aggregation** — power dashboards, newsletters and datasets with structured app metadata across countries and categories.
- **Due diligence** — capture each app's price, content rating, advisories, supported devices, languages, size and update history.

### How to use

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

### Input

Search a keyword across the US storefront:

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

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

```json
{
    "mode": "reviews",
    "appIds": ["324684580", "com.spotify.client", "https://apps.apple.com/us/app/id389801252"],
    "maxReviewsPerApp": 200,
    "reviewsSort": "mostrecent",
    "monitorMode": true
}
```

- **mode** — `search`, `appDetails`, `topCharts`, `developerApps`, or `reviews`. Each mode uses the field that matches it (`searchTerms`, `appIds`, `collection`+`genre`, `developerIds`, or `appIds`).
- **appIds** — numeric App Store IDs (`324684580`), bundle IDs (`com.spotify.client`) or full App Store URLs; all three are accepted.
- **collection / genre** — for `topCharts`: `TOP_FREE` / `TOP_PAID` / `TOP_GROSSING`, in a category or `All apps`.
- **developerIds** — numeric developer (artist) IDs or App Store developer URLs (e.g. `…/developer/spotify/id324684583`).
- **fullDetails** *(default true)* — for charts, enrich each ranked app with its full record. Search and Developer modes already return full records.
- **country / language** — storefront (`us`, `gb`, `de`, `jp`…) and an optional Apple language tag (`en_us`).
- **monitorMode / monitorStoreName** — emit only records not seen in previous runs (see **Monitoring** below).
- **proxyConfiguration** — proxy settings (Apify proxy by default).

### Output

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

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

```json
{
    "type": "app",
    "appId": 324684580,
    "bundleId": "com.spotify.client",
    "title": "Spotify: Music and Podcasts",
    "artistName": "Spotify",
    "developer": {
        "name": "Spotify",
        "website": "https://www.spotify.com/",
        "artistId": 324684583,
        "artistViewUrl": "https://apps.apple.com/us/developer/spotify/id324684583"
    },
    "averageUserRating": 4.78,
    "userRatingCount": 40406484,
    "formattedPrice": "Free",
    "primaryGenreName": "Music",
    "genreList": ["Music", "Entertainment"],
    "version": "9.1.50",
    "releaseNotes": "We're always making changes…",
    "fileSizeBytes": "287000000",
    "minimumOsVersion": "16.1",
    "contentAdvisoryRating": "12+",
    "releaseDate": "2011-07-14T…",
    "currentVersionReleaseDate": "2026-06-11T…",
    "screenshotUrls": ["https://…"],
    "trackViewUrl": "https://apps.apple.com/us/app/id324684580",

    "isFree": true,
    "priceValue": 0,
    "fileSizeMB": 274.3,
    "daysSinceUpdated": 3,
    "ageYears": 14.9,
    "recentlyUpdated": true,
    "screenshotCount": 8,
    "languageCount": 61,
    "isUniversal": true,
    "scrapedAt": "2026-06-14T12:00:00.000Z"
}
```

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

```json
{
    "type": "review",
    "appId": "324684580",
    "reviewId": "12387654321",
    "userName": "Omar M.",
    "score": 5,
    "title": "Best music app",
    "text": "Spotify is my go-to for music and podcasts…",
    "appVersion": "9.1.50",
    "voteSum": 3,
    "voteCount": 3,
    "updated": "2026-06-13T10:49:06.000Z",
    "scrapedAt": "2026-06-14T12:00:00.000Z"
}
```

**Coverage notes.** App data comes from Apple's own iTunes endpoints, so the core fields (title, developer, rating, price, version, category) are near-universal; optional fields (release notes, screenshots, advisories) appear when Apple publishes them. Apple's public review feed exposes roughly the **latest ~500 reviews per app** (50 per page, up to 10 pages) — use monitoring mode on a schedule to accumulate more over time. Apple does **not** publish developer email addresses, so the developer block carries name, website and developer-page URL only. Empty results (e.g. an app with no reviews) are reported as a successful run.

### Monitoring — get only new apps & reviews

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

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

### Automate & schedule

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

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

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

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

const run = await client.actor('scrapesage/app-store-scraper').call({
    mode: 'topCharts',
    collection: 'TOP_FREE',
    genre: '6015',
    maxAppsPerQuery: 50,
    country: 'us',
});

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

### Integrate with any app

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

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

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find the top 25 free finance apps on the App Store and summarise their ratings" and let it run this scraper for you.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

Build a complete **app-market & competitive-intel stack** — pair App Store data with the Play Store, ads, hiring and outreach signals:

- **[Google Play Scraper](https://apify.com/scrapesage/google-play-scraper)** — the Android side of the same app: search, app details, top charts, developer portfolios, reviews **and developer-contact leads**. Run both for full cross-platform coverage.
- **[Product Hunt Scraper](https://apify.com/scrapesage/product-hunt-scraper)** — new product launches, makers & maker leads.
- **[Google Ads Transparency Scraper](https://apify.com/scrapesage/google-ads-transparency-scraper)** — see exactly which ads any advertiser is running.
- **[Facebook Ad Library Scraper](https://apify.com/scrapesage/facebook-ad-library-scraper)** — competitor ad creatives on Meta & Instagram.
- **[LinkedIn Jobs Scraper](https://apify.com/scrapesage/linkedin-jobs-scraper)** — job postings as hiring-intent signals.
- **[Multi-ATS Job Scraper](https://apify.com/scrapesage/multi-ats-job-scraper)** — jobs from Greenhouse, Lever, Ashby, Workday & more.
- **[SAM.gov Scraper](https://apify.com/scrapesage/sam-gov-scraper)** — US federal contract opportunities & contacts.
- **[Eventbrite Scraper](https://apify.com/scrapesage/eventbrite-scraper)** — events plus organizer leads with contacts.
- **[Telegram Scraper](https://apify.com/scrapesage/telegram-scraper)** — channels, messages, media & search.
- **[Airbnb Scraper](https://apify.com/scrapesage/airbnb-scraper)** — listings, prices, availability & market monitor.

### Tips

- **Charts:** pick a `collection` (free/paid/grossing) and a `genre`, set `country`, and keep `fullDetails` on for the complete per-app record; turn it off for a faster, lighter ranked list.
- **Reviews at scale:** Apple caps the public feed at ~500 newest reviews per app — schedule the run with monitoring mode to keep accumulating new reviews over days and weeks.
- **Monitoring:** give each tracked target its own `monitorStoreName`, then schedule the run — you'll only ever process new records.
- **Localize:** set `country` (and optionally `language`) to match the storefront you care about; rankings, pricing and the review pool all change by country.
- **Flexible IDs:** mix numeric App Store IDs, bundle IDs and App Store URLs freely in `appIds` — the actor resolves them all.

### FAQ

**Do I need an Apple account or API key?** No. This actor reads Apple's public iTunes/App Store endpoints — no login, key, or cookies.

**How many reviews can I get per app?** Apple's public review feed exposes roughly the latest 500 per app (50 per page, up to 10 pages). Use monitoring mode on a schedule to keep capturing new reviews over time.

**Does it include developer email addresses?** No — Apple doesn't publish developer emails on the App Store. The developer block carries the developer's name, website and developer-page URL.

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

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

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

### Need help?

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

# Actor input Schema

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

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

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

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

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

Numeric App Store IDs (e.g. `324684580`), bundle IDs (e.g. `com.spotify.client`), or full App Store URLs. Used by the App details and Reviews modes.

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

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

## `genre` (type: `string`):

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

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

Numeric developer (artist) IDs, e.g. `324684583`, or App Store developer URLs like `https://apps.apple.com/us/developer/spotify/id324684583`. Returns every app in their portfolio. (Mode: Developer apps.)

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

Cap the number of apps returned per search term, chart, or developer (Apple returns up to 200).

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

For Top charts, open each ranked app for the complete record (full description, ratings, version, size, release notes, screenshots…). Search and Developer modes already return full records. Turn off for a faster, lighter chart listing.

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

How many reviews to fetch per app, newest first by default. Apple's public review feed exposes roughly the latest 500 per app (50 per page, 10 pages). (Mode: Reviews.)

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

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

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

Two-letter App Store storefront code (e.g. `us`, `gb`, `de`, `jp`). Affects rankings, pricing, availability and the review pool.

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

Optional Apple language tag for app metadata, e.g. `en_us`, `de_de`, `fr_fr`. Leave blank to use the storefront default.

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

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

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

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

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

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

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

Proxy settings. Apple's public endpoints have no hard anti-bot, so the default Apify proxy is plenty; switch to residential for very large or high-frequency runs.

## Actor input object example

```json
{
  "mode": "search",
  "searchTerms": [
    "habit tracker"
  ],
  "appIds": [
    "324684580"
  ],
  "collection": "TOP_FREE",
  "genre": "ALL",
  "maxAppsPerQuery": 50,
  "fullDetails": true,
  "maxReviewsPerApp": 100,
  "reviewsSort": "mostrecent",
  "country": "us",
  "language": "",
  "monitorMode": false,
  "monitorStoreName": "app-store-monitor",
  "maxConcurrency": 6,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

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

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "searchTerms": [
        "habit tracker"
    ],
    "appIds": [
        "324684580"
    ]
};

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

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

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

```

## Python example

```python
from apify_client import ApifyClient

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

# Prepare the Actor input
run_input = {
    "searchTerms": ["habit tracker"],
    "appIds": ["324684580"],
}

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

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

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

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "habit tracker"
  ],
  "appIds": [
    "324684580"
  ]
}' |
apify call scrapesage/app-store-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Apple App Store Scraper — Apps, Reviews & Charts",
        "description": "Scrape the Apple App Store: search apps, full app details, top free/paid/grossing charts, whole developer portfolios and user reviews. Rich metadata (ratings, versions, sizes, screenshots) plus a monitoring mode for new apps and reviews. No login, no key, no browser.",
        "version": "0.1",
        "x-build-id": "WhMEg2fzj1v38SqEe"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapesage~app-store-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapesage-app-store-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/scrapesage~app-store-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scrapesage-app-store-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/scrapesage~app-store-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scrapesage-app-store-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "What to scrape",
                        "enum": [
                            "search",
                            "appDetails",
                            "topCharts",
                            "developerApps",
                            "reviews"
                        ],
                        "type": "string",
                        "description": "Pick a job. Search finds apps by keyword. App details pulls the full record for specific apps. Top charts lists the top free/paid/grossing apps in a category. Developer apps returns a developer's whole portfolio. Reviews pulls user reviews for specific apps.",
                        "default": "search"
                    },
                    "searchTerms": {
                        "title": "Search terms",
                        "type": "array",
                        "description": "Keywords to search the App Store for, e.g. `habit tracker`, `crypto wallet`. One row per term. (Mode: Search.)",
                        "items": {
                            "type": "string"
                        }
                    },
                    "appIds": {
                        "title": "App IDs / bundle IDs / URLs",
                        "type": "array",
                        "description": "Numeric App Store IDs (e.g. `324684580`), bundle IDs (e.g. `com.spotify.client`), or full App Store URLs. Used by the App details and Reviews modes.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "collection": {
                        "title": "Chart",
                        "enum": [
                            "TOP_FREE",
                            "TOP_PAID",
                            "TOP_GROSSING"
                        ],
                        "type": "string",
                        "description": "Which ranking to pull. (Mode: Top charts.)",
                        "default": "TOP_FREE"
                    },
                    "genre": {
                        "title": "Category",
                        "enum": [
                            "ALL",
                            "6014",
                            "6000",
                            "6015",
                            "6007",
                            "6005",
                            "6008",
                            "6002",
                            "6012",
                            "6013",
                            "6017",
                            "6016",
                            "6003",
                            "6011",
                            "6018",
                            "6023",
                            "6024",
                            "6020",
                            "6010",
                            "6009",
                            "6004",
                            "6006",
                            "6001"
                        ],
                        "type": "string",
                        "description": "Category for the top chart, or `All apps` for the overall chart. (Mode: Top charts.)",
                        "default": "ALL"
                    },
                    "developerIds": {
                        "title": "Developer (artist) IDs / URLs",
                        "type": "array",
                        "description": "Numeric developer (artist) IDs, e.g. `324684583`, or App Store developer URLs like `https://apps.apple.com/us/developer/spotify/id324684583`. Returns every app in their portfolio. (Mode: Developer apps.)",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxAppsPerQuery": {
                        "title": "Max apps per query",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Cap the number of apps returned per search term, chart, or developer (Apple returns up to 200).",
                        "default": 50
                    },
                    "fullDetails": {
                        "title": "Enrich chart apps with full details",
                        "type": "boolean",
                        "description": "For Top charts, open each ranked app for the complete record (full description, ratings, version, size, release notes, screenshots…). Search and Developer modes already return full records. Turn off for a faster, lighter chart listing.",
                        "default": true
                    },
                    "maxReviewsPerApp": {
                        "title": "Max reviews per app",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "How many reviews to fetch per app, newest first by default. Apple's public review feed exposes roughly the latest 500 per app (50 per page, 10 pages). (Mode: Reviews.)",
                        "default": 100
                    },
                    "reviewsSort": {
                        "title": "Sort reviews by",
                        "enum": [
                            "mostrecent",
                            "mosthelpful"
                        ],
                        "type": "string",
                        "description": "Order in which reviews are pulled. (Mode: Reviews.)",
                        "default": "mostrecent"
                    },
                    "country": {
                        "title": "Country",
                        "type": "string",
                        "description": "Two-letter App Store storefront code (e.g. `us`, `gb`, `de`, `jp`). Affects rankings, pricing, availability and the review pool.",
                        "default": "us"
                    },
                    "language": {
                        "title": "Language (optional)",
                        "type": "string",
                        "description": "Optional Apple language tag for app metadata, e.g. `en_us`, `de_de`, `fr_fr`. Leave blank to use the storefront default.",
                        "default": ""
                    },
                    "monitorMode": {
                        "title": "Monitoring mode — only new records",
                        "type": "boolean",
                        "description": "Remember what was already returned and emit ONLY records not seen in previous runs (new apps for a search/chart, or new reviews for an app). Pairs with Apify Schedules to track changes over time.",
                        "default": false
                    },
                    "monitorStoreName": {
                        "title": "Monitor store name",
                        "type": "string",
                        "description": "Named key-value store that holds the 'already seen' ids for monitoring mode. Use a different name per tracked target/query to keep their histories separate.",
                        "default": "app-store-monitor"
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 30,
                        "type": "integer",
                        "description": "Maximum parallel requests. Lower it if you hit rate limits on very large runs.",
                        "default": 6
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. Apple's public endpoints have no hard anti-bot, so the default Apify proxy is plenty; switch to residential for very large or high-frequency runs.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
