# 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
- **Stats:** 12 total users, 2 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

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

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

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

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

# README

## Apple App Store Scraper 🍏 — Rankings, Reviews & App Details

Scrape the **Apple App Store** as clean, structured JSON — **top-chart rankings by category & country, app reviews, complete app details, and keyword search.** One actor, four jobs.

Fast and reliable: built on Apple's own app data feeds, with proxy rotation and fully-paginated reviews. The perfect companion to a Google Play scraper for cross-platform app intelligence.

> 💡 **The differentiator:** most App Store actors only fetch a single app's details. This one owns **top-chart rankings** (a market-intelligence feed: any category × any country × Top Free / Paid / Grossing / New) **and** delivers reviews at scale.

***

### 📋 Table of contents

- [What does it do?](#what-does-it-do)
- [Use cases](#use-cases)
- [How to use it](#how-to-use-it-step-by-step)
- [Input parameters](#input-parameters)
- [Input examples](#input-examples)
- [Output — data fields](#output--data-fields)
- [Sample output records](#sample-output-records)
- [Categories & countries](#categories--countries)
- [Tips & best practices](#tips--best-practices)
- [Frequently asked questions](#frequently-asked-questions)
- [Changelog](#changelog)

***

### What does it do?

Pick a **mode** and get clean data:

- 🏆 **Rankings** — the Top Free / Top Paid / Top Grossing / New charts for any category and country (with rank position and full app details).
- 💬 **Reviews** — app reviews (sort by most recent / most helpful), with rating, title, text, version and date — up to ~500 per app per country.
- 📋 **App details** — complete app info: rating, ratings & reviews count, **ratings histogram**, price, developer, category, version, size, screenshots and more.
- 🔎 **Search** — apps for a keyword.

Export to **JSON, CSV, Excel, XML or HTML**, or pull from the **Apify API**. Everything is localized by **country**.

***

### Use cases

**📈 ASO & app market intelligence**

- Track **top-chart rankings** by category and country (build a Sensor Tower / data.ai alternative).
- Monitor competitors and category leaders across markets.

**💬 Review analysis & product teams**

- Pull reviews for your app and competitors' for sentiment, bugs and feature requests.

**🏢 Competitive & investment research**

- See who's climbing the charts; compare ratings and pricing across apps.

**🤖 Data & AI teams**

- Build app datasets, review-sentiment models and ranking dashboards (pair with a Google Play scraper for full cross-platform coverage).

***

### How to use it (step by step)

No coding required.

1. Click **Try for free / Start**.
2. Choose a **mode**:
   - **Rankings** → pick a **chart** (Top Free/Paid/Grossing/New), **category** and **country**.
   - **Reviews / App details** → add **App IDs** (numeric `389801252`, bundle `com.burbn.instagram`, or App Store URLs).
   - **Search** → add **search terms**.
3. Set **country** and **Max items**.
4. Click **Save & Start**, then export the results.

***

### Input parameters

| Field | Type | Description |
|------|------|-------------|
| `mode` | string | `rankings`, `reviews`, `appDetails`, or `search`. |
| `collection` | string | Rankings chart: `TOP_FREE_IOS`, `TOP_PAID_IOS`, `TOP_GROSSING_IOS`, `NEW_IOS`. |
| `category` | string | Rankings category (empty = overall), e.g. `GAMES`, `SOCIAL_NETWORKING`, `FINANCE`, `GAMES_PUZZLE`. |
| `appIds` | array | App IDs (numeric / bundle) or URLs (reviews & appDetails modes). |
| `searchTerms` | array | Keywords (search mode). |
| `maxReviewsPerApp` | integer | Reviews per app (max ~500). Default `200`. |
| `reviewsSort` | string | `RECENT` or `HELPFUL`. |
| `country` | string | Country code (`us`, `gb`, `de`, `kr`, `jp` …). |
| `fullDetail` | boolean | Fetch full app details for each ranked/found app. Default `true`. |
| `maxItems` | integer | Max records. `0` = no limit. Default `1000`. |
| `proxyConfiguration` | object | Optional. |
| `maxConcurrency` | integer | Parallel apps processed. Default `4`. |

***

### Input examples

**1) Top free apps in the US**

```json
{
  "mode": "rankings",
  "collection": "TOP_FREE_IOS",
  "country": "us",
  "maxItems": 200
}
```

**2) Top grossing games in Japan**

```json
{
  "mode": "rankings",
  "collection": "TOP_GROSSING_IOS",
  "category": "GAMES",
  "country": "jp"
}
```

**3) Reviews for an app (most recent)**

```json
{
  "mode": "reviews",
  "appIds": ["389801252", "com.spotify.client"],
  "maxReviewsPerApp": 500,
  "reviewsSort": "RECENT",
  "country": "us"
}
```

**4) App details**

```json
{
  "mode": "appDetails",
  "appIds": ["https://apps.apple.com/us/app/instagram/id389801252"]
}
```

***

### Output — data fields

**Ranked app / app** (`recordType: "rankedApp"` / `"app"`): `appId` (numeric), `bundleId`, `title`, `url`, `description`, `developer`, `developerId`, `developerWebsite`, `score`, `reviews`, `currentVersionScore`, `currentVersionReviews`, `histogram`, `price`, `free`, `currency`, `genre`, `genreId`, `genres`, `contentRating`, `languages`, `size`, `requiredOsVersion`, `released`, `updated`, `version`, `releaseNotes`, `icon`, `screenshots`, `ipadScreenshots`, `supportedDevices`. Ranked apps also have `rank`, `collection`, `rankCategory`.

**Review** (`recordType: "review"`): `appId`, `bundleId`, `reviewId`, `userName`, `userUrl`, `version`, `score`, `title`, `text`, `url`, `updated`.

***

### Sample output records

**Ranked app:**

```json
{
  "recordType": "rankedApp",
  "rank": 1,
  "collection": "TOP_FREE_IOS",
  "rankCategory": "overall",
  "country": "us",
  "appId": 389801252,
  "bundleId": "com.burbn.instagram",
  "title": "Instagram",
  "developer": "Instagram, Inc.",
  "score": 4.7,
  "reviews": 26500000,
  "price": 0,
  "free": true,
  "genre": "Photo & Video",
  "url": "https://apps.apple.com/us/app/instagram/id389801252"
}
```

**Review:**

```json
{
  "recordType": "review",
  "appId": 389801252,
  "reviewId": "1234567890",
  "userName": "appfan99",
  "score": 5,
  "title": "Love it",
  "text": "Works great after the latest update!",
  "version": "300.0",
  "updated": "2026-06-01T10:00:00Z"
}
```

***

### Categories & countries

- **Charts:** `TOP_FREE_IOS`, `TOP_PAID_IOS`, `TOP_GROSSING_IOS`, `NEW_IOS`.
- **Categories:** overall (empty) or specific ones like `GAMES`, `SOCIAL_NETWORKING`, `PHOTO_AND_VIDEO`, `FINANCE`, `HEALTH_AND_FITNESS`, `PRODUCTIVITY`, `ENTERTAINMENT`, `SHOPPING`, plus game subcategories (`GAMES_PUZZLE`, `GAMES_ACTION`, …).
- **Countries:** any App Store storefront via `country` (us, gb, de, kr, jp, br, …).

***

### Tips & best practices

- 🏆 **Rankings are recurring** — schedule a daily run per category/country to track movement.
- 🌍 **Iterate countries** to compare charts across markets.
- 💬 **Set `maxReviewsPerApp` high** for full review history (up to ~500/app/country).
- 🍏🤖 **Pair with a Google Play scraper** for complete cross-platform app intelligence.
- 💾 **Use the Apify API / integrations** to push results into Google Sheets, a database, or a webhook.

***

### Frequently asked questions

**Can I get the top-chart rankings for a category and country?**
Yes — that's the rankings mode.

**Is there a review limit?**
Apple serves up to ~500 reviews per app per country; set `maxReviewsPerApp`.

**Are prices and rankings localized?**
Yes — everything respects `country`.

**Can I use bundle IDs or URLs?**
Yes — numeric IDs, bundle IDs (`com.x`) and App Store URLs all work.

**What export formats are supported?**
JSON, CSV, Excel, XML, HTML table, RSS — plus the Apify API and integrations.

***

### Changelog

**Last updated:** 2026-07-02 — Actor verified and maintained. Data pipeline tested for quality, structure and freshness; selectors/endpoints confirmed against the live site.

**0.1.0**

- Initial release: rankings (Top Free/Paid/Grossing/New by category & country), paginated reviews, full app details, and keyword search.
- Localized by country; proxy rotation; one mode-switched actor.

# 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. Reviews to pull per app. Apple serves up to ~500 per app per country.

## `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": 200,
  "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("💾 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": [
    "fitness tracker",
    "budget planner"
  ],
  "appIds": [
    "389801252"
  ],
  "maxItems": 100
}' |
apify call haketa/app-store-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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