# Apple App Store Scraper - Rankings, Reviews & Apps (`haketa/app-store-scraper`) Actor

Apple App Store scraper & data API: export top-chart rankings (Top Free, Paid, Grossing, New) by category & country, scrape app reviews & ratings, full app details, metadata and ASO keyword search. iOS app market intelligence & competitor tracking — fast, no login. Pairs with a Google Play scraper.

- **URL**: https://apify.com/haketa/app-store-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** SEO tools, Business
- **Features:** Limited permissions
- **Stats:** 25 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

<h1 align="center">Apple App Store Scraper 🍏 — Rankings, Reviews, App Details & Keyword Search</h1>

<p align="center">
  <img src="https://img.shields.io/badge/Platform-Apple_App_Store-0D96F6?style=for-the-badge&logo=appstore&logoColor=white" alt="Apple App Store" />
  <img src="https://img.shields.io/badge/Modes-Rankings_%7C_Reviews_%7C_Details_%7C_Search-34C759?style=for-the-badge" alt="4 Modes" />
  <img src="https://img.shields.io/badge/Storefronts-47%2B_Countries-5856D6?style=for-the-badge" alt="47+ Countries" />
  <img src="https://img.shields.io/badge/Scale-1%2C000%2B_Records-FF9500?style=for-the-badge" alt="1,000+ Scale" />
  <img src="https://img.shields.io/badge/Export-JSON_%7C_CSV_%7C_Excel_%7C_API-007AFF?style=for-the-badge" alt="Export" />
</p>

**The Apple App Store scraper that turns [apps.apple.com](https://apps.apple.com) into clean, structured market intelligence.** Export **top-chart rankings** (Top Free, Top Paid, Top Grossing, New) for any category and country, **scrape App Store reviews and star ratings at scale**, extract **complete app details and metadata**, and run **ASO keyword discovery searches** — all from a single no-code actor with **1,000+ results pagination** and **bulk export to JSON, CSV, Excel, or API**.

> 💡 **Built for** ASO specialists, mobile growth and product teams, app-market analysts, B2B intelligence researchers, venture investors, and AI/data teams building iOS app catalogs and review-sentiment pipelines.

***

### ⚡ At a glance

| Feature | Details |
| :--- | :--- |
| **🎯 Primary Modes** | `rankings` (Top Charts), `reviews` (Customer Reviews), `appDetails` (Full Metadata), `search` (ASO Keywords) |
| **🌍 Storefront Coverage** | 47+ country storefronts (`us`, `gb`, `de`, `fr`, `jp`, `kr`, `ca`, `au`, `br`, `in`, `tr`, and more) |
| **📊 Ranking Charts** | Top Free, Top Paid, Top Grossing, New Apps, New Free, New Paid (iPhone & iPad) across 40+ categories |
| **💬 Review Depth** | Sorted by `RECENT` or `HELPFUL`, automatic multi-page & multi-storefront expansion for 1,000+ reviews |
| **🔢 Pagination & Scale** | Unlocked **1,000+ results pagination** with automatic cross-category / cross-keyword / cross-country expansion |
| **🛡️ Deduplication** | 100% deduplicated by unique `appId` or `reviewId` across charts, keywords, and storefronts |
| **⚡ Typical Speed** | ~5–15 seconds for 100 ranked apps with full details; ~20–60 seconds for 1,000+ records |
| **📤 Export Formats** | JSON, CSV, Excel (XLSX), XML, HTML Table, RSS, and live REST API |

***

### 📋 Table of contents

- [Why scrape the Apple App Store?](#-why-scrape-the-apple-app-store)
- [What this App Store scraper does](#-what-this-app-store-scraper-does)
- [Use cases](#-use-cases)
- [Input parameters](#-input-parameters)
- [Output schema & field reference](#-output-schema--field-reference)
- [Pagination & 1,000+ scale](#-pagination--1000-scale)
- [How to use](#️-how-to-use)
- [Integrations & automation](#-integrations--automation)
- [Tips for best results](#-tips-for-best-results)
- [FAQ](#-faq)
- [Related scrapers](#-related-scrapers)
- [Changelog](#-changelog)

***

### 🔎 Why scrape the Apple App Store?

The **Apple App Store** is the richest public indicator of consumer and B2B mobile software demand: millions of iOS and iPadOS apps, live **top-chart rankings** that shift daily, millions of **user reviews and star ratings**, localized pricing, developer portfolios, version histories, and release notes across 47+ regional storefronts.

Collecting this intelligence manually is slow and fragmented: web pages paginate slowly, review lists hide historical feedback behind endless scrolling, pricing and rankings vary by country storefront, and there is no native bulk export. An **Apple App Store scraper** automates the entire workflow — select a mode, press Start, and receive a clean, deduplicated dataset ready for spreadsheets, BI dashboards, CRM enrichment, or AI pipelines.

**Common reasons teams use this App Store data extractor:**

- 📈 **ASO & App Store Optimization** — monitor keyword rankings, category chart positions, title/subtitle patterns, and metadata updates across storefronts.
- 🏆 **App Market Intelligence** — build an automated feed of **top-chart rankings** by category and country without expensive enterprise subscriptions.
- 💬 **Voice-of-Customer & Review Mining** — extract thousands of user reviews to uncover bug reports after a release, churn drivers, and high-priority feature requests.
- 🥊 **Competitor Monitoring** — track rival apps' star ratings, review velocity, version cadence, pricing changes, and release notes.
- 💰 **VC, PE & M\&A Deal Sourcing** — spot breakout apps climbing the **Top Grossing** and **Top Free** charts across global markets.
- 🤖 **AI & LLM Training Datasets** — feed structured app descriptions and verified user reviews into sentiment models, RAG pipelines, and classification engines.
- 🌍 **Global Pricing & Localization Audits** — compare app pricing, currencies, and language support across 47+ country storefronts.

***

### ✨ What this App Store scraper does

This is a four-in-one **App Store data extractor** designed for both quick 100-item snapshots and deep **1,000+ results pagination**:

- ✅ 🏆 **Top-chart rankings (`rankings`)** — export **Top Free, Top Paid, Top Grossing, or New** charts for iPhone and iPad across 40+ categories and 47+ countries, each tagged with its exact `rank`, `collection`, and `rankCategory`.
- ✅ 💬 **App reviews & ratings (`reviews`)** — collect reviews per app sorted by **Most recent** (`RECENT`) or **Most helpful** (`HELPFUL`), complete with star score, headline, full review body, reviewed app version, reviewer name, profile link, and timestamp.
- ✅ 📋 **Full app details (`appDetails`)** — pull complete metadata for any list of apps: overall rating, total review count, current-version rating, **5-star rating histogram**, price, currency, developer details, genres, content advisory rating, byte size, minimum iOS version, release notes, and high-res screenshots.
- ✅ 🔎 **Keyword search (`search`)** — run ASO keyword queries for any topic, brand, or feature set and capture matching apps in rank order with full metadata.
- ✅ 🚀 **Unlocked 1,000+ scaling** — when you set `maxItems: 1000` (or higher), the actor automatically expands across categories/collections in Rankings mode, across discovery keywords in Search mode, and across country storefronts in Reviews mode so your run never hits a 100- or 200-item ceiling.
- ✅ 🔗 **Flexible app identifiers** — pass numeric **App IDs** (`389801252`), **bundle IDs** (`com.spotify.client`), or full **App Store URLs** (`https://apps.apple.com/us/app/instagram/id389801252`) — mix all three formats in one run.
- ✅ 📦 **Bulk export anywhere** — download clean data in **JSON, CSV, Excel, XML, HTML, or RSS**, or stream directly via the **Apify API**.

***

### 🎯 Use cases

| Persona | How they use this Apple App Store Scraper |
| :--- | :--- |
| 📈 **ASO & Growth Marketers** | Schedule daily runs in `search` and `rankings` modes to track keyword share-of-voice, chart movement, and seasonal category shifts across tier-1 markets (`us`, `gb`, `de`, `jp`). |
| 💬 **Product & QA Managers** | Run `reviews` mode sorted by `RECENT` after every app update to catch version-specific crash reports, UI complaints, and rating drops within hours of release. |
| 🏢 **B2B Lead Generation Teams** | Extract `developer`, `developerUrl`, and `developerWebsite` across thousands of ranked apps in `BUSINESS`, `FINANCE`, `PRODUCTIVITY`, and `SHOPPING` categories to build targeted publisher outreach lists. |
| 💰 **Venture Capital & Market Analysts** | Pull `TOP_GROSSING_IOS` and `NEW_FREE_IOS` across all categories weekly to identify fast-rising consumer subscription apps and mobile games. |
| 🌍 **International Expansion Teams** | Compare `price`, `currency`, `languages`, and localized `score` across 47 storefronts before launching in Europe, LATAM, or APAC. |
| 🤖 **Data Scientists & AI Engineers** | Harvest 1,000+ labeled 1-to-5 star reviews per vertical to fine-tune sentiment classifiers, topic-modeling pipelines, and automated customer-support agents. |

***

### 📥 Input parameters

Configure everything in the visual Apify Console form or pass JSON via the API. Every field is optional — running with default settings immediately exports the current **US Top Free** chart.

| Field | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `mode` | `string` | `"rankings"` | Task mode: `"rankings"` (Top-chart rankings), `"reviews"` (App reviews & ratings), `"appDetails"` (Full app details), or `"search"` (Keyword search). |
| `collection` | `string` | `"TOP_FREE_IOS"` | Used in `rankings` mode. Chart to export: `TOP_FREE_IOS`, `TOP_PAID_IOS`, `TOP_GROSSING_IOS`, `NEW_IOS`, `NEW_FREE_IOS`, `NEW_PAID_IOS`, `TOP_FREE_IPAD`, `TOP_PAID_IPAD`, `TOP_GROSSING_IPAD`. |
| `category` | `string` | `""` | Used in `rankings` mode. Narrow to a specific App Store category (`GAMES`, `BUSINESS`, `FINANCE`, `PRODUCTIVITY`, `HEALTH_AND_FITNESS`, `SOCIAL_NETWORKING`, etc.) or leave empty for Overall. |
| `country` | `string` | `"us"` | Two-letter App Store country storefront (`us`, `gb`, `ca`, `au`, `de`, `fr`, `jp`, `kr`, `br`, `in`, `tr`, etc. — 47 storefronts supported). |
| `searchTerms` | `array` | `["fitness tracker", "budget planner"]` | Used in `search` mode. One or more keywords, brands, or topics. Leave empty for a built-in diverse sample. |
| `appIds` | `array` | `["389801252"]` | Used in `reviews` and `appDetails` modes. Paste App Store URLs, numeric App IDs (`389801252`), or bundle IDs (`com.burbn.instagram`). |
| `maxReviewsPerApp` | `integer` | `0` | Used in `reviews` mode. Maximum reviews to pull per app (`0` = unlimited, governed by `maxItems`). Automatically expands across storefronts when >500 reviews are requested. |
| `reviewsSort` | `string` | `"RECENT"` | Used in `reviews` mode. Sort order: `"RECENT"` (Most recent) or `"HELPFUL"` (Most helpful). |
| `fullDetail` | `boolean` | `true` | In `rankings` & `search` modes, enrich every app with full metadata (rating, review count, description, size, version, release notes). Turn off for a faster lightweight list. |
| `maxItems` | `integer` | `0` (prefill `100`) | Maximum total records (apps or reviews) to return. Set `0` for unlimited or `1000`+ for deep multi-category / multi-keyword / multi-storefront extraction. |
| `maxConcurrency` | `integer` | `4` | Number of apps processed in parallel (`1`–`15`). |
| `proxyConfiguration` | `object` | `useApifyProxy: false` | Optional Apify Proxy configuration. Works out of the box on direct connections; enable proxy rotation for massive recurring runs. |

#### Input examples

**1. Top Free iPhone apps in the US (fast snapshot):**

```json
{
  "mode": "rankings",
  "collection": "TOP_FREE_IOS",
  "category": "",
  "country": "us",
  "fullDetail": true,
  "maxItems": 100
}
```

**2. Deep 1,000+ app ranking sweep across categories:**

```json
{
  "mode": "rankings",
  "collection": "TOP_GROSSING_IOS",
  "country": "us",
  "fullDetail": true,
  "maxItems": 1000
}
```

<details>
<summary><strong>3. Extract 1,000+ recent reviews across multiple apps or storefronts (click to expand)</strong></summary>

```json
{
  "mode": "reviews",
  "appIds": [
    "389801252",
    "com.spotify.client",
    "https://apps.apple.com/us/app/whatsapp-messenger/id310633997"
  ],
  "maxReviewsPerApp": 0,
  "reviewsSort": "RECENT",
  "country": "us",
  "maxItems": 1200
}
```

</details>

<details>
<summary><strong>4. ASO keyword discovery search for 500+ finance & productivity apps (click to expand)</strong></summary>

```json
{
  "mode": "search",
  "searchTerms": [
    "budget planner",
    "expense tracker",
    "invoice maker",
    "tax calculator"
  ],
  "country": "us",
  "fullDetail": true,
  "maxItems": 600
}
```

</details>

***

### 📤 Output schema & field reference

Every record is returned as a clean flat JSON object. App records (`rankings`, `appDetails`, `search`) and review records (`reviews`) carry an explicit `recordType` field so downstream pipelines can route them effortlessly.

#### Ranked app / App detail example (`recordType: "rankedApp"` or `"app"`)

```json
{
  "recordType": "rankedApp",
  "rank": 1,
  "collection": "TOP_FREE_IOS",
  "rankCategory": "overall",
  "country": "us",
  "appId": 310633997,
  "bundleId": "net.whatsapp.WhatsApp",
  "title": "WhatsApp Messenger",
  "url": "https://apps.apple.com/us/app/whatsapp-messenger/id310633997?uo=4",
  "description": "WhatsApp from Meta is a FREE messaging and video calling app...",
  "developer": "WhatsApp Inc.",
  "developerId": 310634000,
  "developerUrl": "https://apps.apple.com/us/developer/whatsapp-inc/id310634000?uo=4",
  "developerWebsite": "https://www.whatsapp.com/",
  "score": 4.71891,
  "reviews": 20325663,
  "currentVersionScore": 4.71891,
  "currentVersionReviews": 20325663,
  "histogram": { "1": 612040, "2": 215400, "3": 489120, "4": 1490100, "5": 17519003 },
  "price": 0,
  "free": true,
  "currency": "USD",
  "genre": "Social Networking",
  "genreId": 6005,
  "genres": ["Social Networking", "Utilities"],
  "genreIds": ["6005", "6002"],
  "contentRating": "12+",
  "languages": ["EN", "ES", "FR", "DE", "PT"],
  "size": "398458880",
  "requiredOsVersion": "15.0",
  "released": "2009-05-03T04:10:02Z",
  "updated": "2026-10-28T18:03:11Z",
  "version": "26.42.77",
  "releaseNotes": "Bug fixes and performance improvements.",
  "icon": "https://is1-ssl.mzstatic.com/.../512x512bb.jpg",
  "screenshots": ["https://is1-ssl.mzstatic.com/.../1.jpg"],
  "ipadScreenshots": ["https://is1-ssl.mzstatic.com/.../ipad1.jpg"],
  "supportedDevices": ["iPhone13", "iPadPro"],
  "scrapedAt": "2026-11-10T02:00:00.000Z"
}
```

#### Customer review example (`recordType: "review"`)

```json
{
  "recordType": "review",
  "appId": 310633997,
  "bundleId": null,
  "reviewId": "14735005849",
  "userName": "iOSPowerUser",
  "userUrl": "https://itunes.apple.com/us/reviews/id1986068692",
  "version": "26.42.77",
  "score": 5,
  "title": "Reliable daily messenger",
  "text": "100% excellent — works seamlessly across iPhone and CarPlay.",
  "url": "https://itunes.apple.com/us/review?id=310633997&type=Purple%20Software",
  "updated": "2026-10-31T12:55:54-07:00",
  "country": "us",
  "scrapedAt": "2026-11-10T02:00:00.000Z"
}
```

#### 📱 App & Ranking fields

| Field | Type | Coverage | Description |
| :--- | :--- | :--- | :--- |
| 🏷️ `recordType` | `string` | 🟢 High (100%) | `"rankedApp"` (rankings mode) or `"app"` (appDetails & search modes). |
| 🏆 `rank` | `integer` | 🟢 High (Rankings) | Exact chart position (`1..N`) within the category/collection chart. |
| 📊 `collection` / `rankCategory` | `string` | 🟢 High (Rankings) | Chart identifier (e.g. `TOP_FREE_IOS`) and category (`overall`, `GAMES`, etc.). |
| 🔎 `searchTerm` | `string` | 🟢 High (Search) | The keyword query that surfaced this app in `search` mode. |
| 🆔 `appId` / `bundleId` | `number` / `string` | 🟢 High (100%) | Numeric Apple track ID and reverse-DNS bundle identifier (`net.whatsapp.WhatsApp`). |
| 📱 `title` / `url` | `string` | 🟢 High (100%) | Official App Store title and canonical listing URL. |
| 📝 `description` | `string` | 🟢 High (100%) | Full App Store description text (when `fullDetail: true`). |
| 🏢 `developer` / `developerId` | `string` / `number` | 🟢 High (100%) | Publisher name and numeric Apple artist ID. |
| 🔗 `developerUrl` | `string` | 🟢 High (100%) | Link to the publisher's full App Store portfolio page. |
| 🌐 `developerWebsite` | `string` | 🟡 Conditional (~90%) | Publisher's external website URL (great for B2B lead enrichment). |
| ⭐ `score` / `reviews` | `number` / `integer` | 🟢 High (100%) | Overall average star rating (0–5) and total ratings count. |
| 📈 `currentVersionScore` / `currentVersionReviews` | `number` / `integer` | 🟢 High (~98%) | Star rating and count for the currently live version. |
| 📊 `histogram` | `object` | 🟡 Conditional (`appDetails`) | Breakdown of 1-star through 5-star rating counts (`{1, 2, 3, 4, 5}`). |
| 💵 `price` / `free` / `currency` | `number` / `boolean` / `string` | 🟢 High (100%) | Localized price, boolean free flag, and ISO currency code (`USD`, `GBP`, `EUR`, `JPY`). |
| 🗂️ `genre` / `genreId` / `genres` / `genreIds` | `string` / `array` | 🟢 High (100%) | Primary category name/ID and complete list of assigned genres. |
| 🔞 `contentRating` | `string` | 🟢 High (100%) | Age advisory rating (`4+`, `9+`, `12+`, `17+`). |
| 🌍 `languages` | `array<string>` | 🟢 High (~99%) | Supported ISO-2 language codes (`["EN", "ES", "DE"]`). |
| 📦 `size` / `requiredOsVersion` | `string` | 🟢 High (~99%) | App download size in bytes and minimum required iOS version. |
| 🗓️ `released` / `updated` / `version` | `string` | 🟢 High (100%) | Initial release timestamp, latest update timestamp, and current version string. |
| 🆕 `releaseNotes` | `string` | 🟡 Conditional (~95%) | "What's New" changelog notes for the latest version. |
| 🖼️ `icon` / `screenshots` / `ipadScreenshots` | `string` / `array` | 🟢 High / 🟡 Conditional | High-resolution app icon URL, iPhone screenshots, and iPad screenshots (~73%). |
| 📲 `supportedDevices` | `array<string>` | 🟢 High (~98%) | Compatible Apple hardware identifiers. |
| 🕒 `country` / `scrapedAt` | `string` | 🟢 High (100%) | Two-letter storefront code and ISO-8601 extraction timestamp. |

#### 💬 Customer review fields

| Field | Type | Coverage | Description |
| :--- | :--- | :--- | :--- |
| 🏷️ `recordType` | `string` | 🟢 High (100%) | Always `"review"`. |
| 🆔 `reviewId` | `string` | 🟢 High (100%) | Unique review identifier (used for automatic deduplication). |
| 📱 `appId` / `bundleId` | `number` / `string` | 🟢 High (100%) | Target app identifier matching your input list. |
| 👤 `userName` / `userUrl` | `string` | 🟢 High (100%) | Reviewer display name and public reviewer profile link. |
| ⭐ `score` | `integer` | 🟢 High (100%) | Star rating (`1` to `5`). |
| 📰 `title` / `text` | `string` | 🟢 High (100%) | Review headline and full review body text. |
| 🏷️ `version` | `string` | 🟢 High (~99%) | App version the reviewer was using when submitting feedback. |
| 🔗 `url` / `updated` | `string` | 🟢 High (100%) | Direct review link and ISO-8601 submission/update timestamp. |
| 🌍 `country` / `scrapedAt` | `string` | 🟢 High (100%) | Storefront country where the review was posted and scrape timestamp. |

***

### 🔁 Pagination & 1,000+ scale

Apple's individual storefront feeds return up to **200 apps per single chart or keyword query** and up to **500 reviews (10 pages × 50 reviews) per app per country storefront**. This actor unlocks seamless **1,000+ results pagination** across all modes:

1. **Rankings mode (`1,000+` apps):** When you set `maxItems` above 200 (or `0` for unlimited), the actor automatically steps through additional categories (`GAMES`, `BUSINESS`, `PRODUCTIVITY`, `FINANCE`, `SOCIAL_NETWORKING`, etc.) and chart collections while deduplicating by `appId`, delivering up to **2,000+ unique ranked apps** in a single run.
2. **Search mode (`1,000+` apps):** Each keyword fetches up to 200 matching apps. When your `maxItems` target exceeds what a single term provides, the actor automatically fans out across your `searchTerms` list (and built-in high-volume discovery keywords if needed) with strict `appId` deduplication.
3. **Reviews mode (`1,000+` reviews):** The actor paginates through all 10 review pages per app (`50` reviews/page). When `maxItems` or `maxReviewsPerApp` exceeds a single storefront's 500-review ceiling, it automatically expands across major English and international storefronts (`us`, `gb`, `ca`, `au`, `de`, `fr`, `es`, `it`, etc.) and deduplicates by `reviewId`.

***

### ⚙️ How to use

1. Open **Apple App Store Scraper** in the Apify Console.
2. Select your **Mode**:
   - **Top-chart rankings** → choose a `collection` (e.g., `TOP_FREE_IOS`), `category`, and `country`.
   - **App reviews & ratings** → paste one or more App IDs, bundle IDs, or URLs into `appIds`.
   - **Full app details** → paste target apps into `appIds` to get complete metadata + rating histograms.
   - **Keyword search** → enter your target keywords in `searchTerms`.
3. Set **Max results (`maxItems`)** — leave at `100` for a quick test or set `1000`+ for a deep harvest.
4. Click **Start** and export your dataset in **JSON, CSV, Excel, or via API**.

***

### 🔌 Integrations & automation

Connect this **App Store scraper** directly to your analytics and growth stack:

- **Google Sheets & Excel** — sync daily top-chart rankings or new 1-star review alerts directly to a spreadsheet.
- **Slack, Microsoft Teams & Discord** — trigger instant notifications via Make, Zapier, or n8n whenever a negative review (`score <= 2`) is posted on your app.
- **BigQuery, Snowflake & Postgres** — stream historical ranking and rating time-series into your warehouse keyed on `appId` and `scrapedAt`.
- **LangChain, LlamaIndex & OpenAI** — feed `recordType: "review"` items into an LLM pipeline to summarize weekly user feedback by app version.

***

### 💡 Tips for best results

- 🏆 **Track daily chart velocity:** Schedule a daily run on your target category (`FINANCE`, `HEALTH_AND_FITNESS`, `GAMES`) to spot apps jumping 20+ positions week over week.
- ⚡ **Speed up lightweight ranking lists:** Set `fullDetail: false` when you only need `rank`, `appId`, `bundleId`, `title`, `url`, and `developer` — runs finish in 1–2 seconds per chart.
- 💬 **Combine `RECENT` and `HELPFUL` reviews:** Run once with `reviewsSort: "RECENT"` to monitor the latest release, and once with `reviewsSort: "HELPFUL"` to capture the most upvoted long-term user feedback.
- 🔗 **Mix identifier formats freely:** You can paste `389801252`, `com.spotify.client`, and `https://apps.apple.com/us/app/whatsapp-messenger/id310633997` in the same `appIds` array.

***

### ❓ FAQ

**How many apps or reviews can I extract in a single run?**
You can extract **1,000 to 10,000+ records** in a single run. Single charts return up to 200 apps and single-country review feeds return up to 500 reviews per app, and the actor automatically expands across categories, keywords, and storefronts when you request higher `maxItems`.

**Do I need proxies or an Apple login?**
No login is ever required. The scraper works out of the box without proxies for typical runs; for very large multi-thousand-record runs you can optionally enable Apify Proxy in `proxyConfiguration`.

**Why is `histogram` only populated in `appDetails` mode?**
Apple only serves the 1-to-5 star breakdown histogram on individual app detail lookups. Use `mode: "appDetails"` when you need exact star counts per tier.

**Can I scrape localized prices and reviews for non-US markets?**
Yes — pick any of the 47 supported country storefronts in `country` (`gb`, `de`, `fr`, `jp`, `kr`, `br`, `in`, `tr`, `au`, `ca`, etc.) and all rankings, currencies, prices, and reviews will reflect that regional store.

**How do I schedule daily App Store ranking snapshots?**
In the Apify Console, open the **Schedules** tab, attach this actor with `mode: "rankings"`, and choose a daily cron (e.g., `0 8 * * *`). Combine with Google Sheets, Webhook, or BigQuery integrations to build an automated historical ranking database.

**Can I use this actor via Python or Node.js API?**
Yes — call `haketa/app-store-scraper` via the official `apify-client` in Python or Node.js, or trigger synchronous/asynchronous runs via REST API (`POST /v2/acts/haketa~app-store-scraper/runs`) and stream dataset items in JSON, CSV, or XLSX.

#### API Quickstart (Python & Node.js)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("haketa/app-store-scraper").call(run_input={
    "mode": "rankings",
    "collection": "TOP_FREE_IOS",
    "country": "us",
    "maxItems": 200
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["rank"], item["title"], item["score"], item["developer"])
```

***

### 🔗 Related scrapers

- [Google Play Scraper](https://apify.com/haketa/google-play-scraper) — the Android counterpart for Google Play rankings, reviews, app details, and keyword search.
- [Google Trends Scraper](https://apify.com/haketa/google-trends-scraper) — benchmark search interest in mobile apps, brands, and keywords over time.
- [ProductHunt Launches & Makers Scraper](https://apify.com/haketa/producthunt-launches-scraper) — daily software launches, maker contacts, votes, and reviews.
- [Bulk Metadata Extractor](https://apify.com/haketa/bulk-metadata-extractor) — enrich developer websites (`developerWebsite`) with titles, social links, and contact metadata.

***

### 📋 Changelog

| Version | Date | Updates |
| :--- | :--- | :--- |
| **v1.2** | **2026-11** | **Unlocked 1,000+ deep pagination** across all modes: automatic cross-category/collection expansion in `rankings` mode, automatic multi-storefront expansion in `reviews` mode (`maxReviewsPerApp` default `0` = unlimited), and removed the 100/200-item clamps in `search` and `rankings` modes with strict `appId`/`reviewId` deduplication. |
| **v1.1** | **2026-11** | Added `developerUrl` and `developerWebsite` enrichment, improved bundle ID + URL resolution in `appIds`, and verified 0% duplicate rate across multi-app review runs. |
| **v1.0** | **2026-05** | Initial release supporting 4 modes (`rankings`, `reviews`, `appDetails`, `search`) across 47 Apple App Store country storefronts. |

# Changelog

This Actor's version history is a separate document: https://apify.com/haketa/app-store-scraper/changelog.md

# Actor input Schema

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

Pick a task: top-chart Rankings by category & country, App reviews & ratings, full App details, or a Keyword search. Just leave everything on defaults to get the current US Top Free chart.

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

Used in Rankings mode. Choose which App Store chart to export.

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

Used in Rankings mode. Pick a category to narrow the chart, or leave on "Overall (all categories)" for the whole store.

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

Rankings, prices and reviews are localized per country. Pick the storefront you want.

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

Used in Keyword search mode. Add one or more keywords (like an app name, brand or topic) and get matching apps for each. Leave empty and we'll run a popular mixed sample.

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

Used in App reviews & App details modes. Paste one app per line — an App Store link, a numeric App ID (e.g. 389801252) or a bundle ID (e.g. com.burbn.instagram).

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

Used in App reviews mode. Maximum reviews to pull per app (0 = unlimited, governed by Max results). Apple serves up to ~500 per app per country storefront, and automatically expands across storefronts when higher limits are requested.

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

Used in App reviews mode. Order in which reviews are collected.

## `fullDetail` (type: `boolean`):

In Rankings & Keyword search modes, also fetch rating, ratings count, description, size and version for every app. On by default. Turn off for a faster, lighter list.

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

Cap on how many records (apps or reviews) to return. Use 0 for no limit.

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

Optional. The scraper works great out of the box with a direct connection. Turn on a proxy only for very large runs.

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

How many apps to process in parallel. Higher is faster but heavier.

## Actor input object example

```json
{
  "mode": "rankings",
  "collection": "TOP_FREE_IOS",
  "category": "",
  "country": "us",
  "searchTerms": [
    "fitness tracker",
    "budget planner"
  ],
  "appIds": [
    "389801252"
  ],
  "maxReviewsPerApp": 0,
  "reviewsSort": "RECENT",
  "fullDetail": true,
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "maxConcurrency": 4
}
```

# Actor output Schema

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

All records collected during the run.

## `runUrl` (type: `string`):

Open this run in the Apify Console.

# 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": [
        "fitness tracker",
        "budget planner"
    ],
    "appIds": [
        "389801252"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/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": [
        "fitness tracker",
        "budget planner",
    ],
    "appIds": ["389801252"],
    "maxItems": 100,
}

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

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

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

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "fitness tracker",
    "budget planner"
  ],
  "appIds": [
    "389801252"
  ],
  "maxItems": 100
}' |
apify call haketa/app-store-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,haketa/app-store-scraper"
        }
    }
}
```

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

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/QgAoMowAO4rCasT3g/builds/EgMrzjTc2jvPJeFit/openapi.json
