# Apple App Store Reviews Scraper (`cblu/app-store-reviews-scraper`) Actor

Extract customer reviews for any iOS/macOS app from the Apple App Store. Pay per review.

- **URL**: https://apify.com/cblu/app-store-reviews-scraper.md
- **Developed by:** [Steven Carleton](https://apify.com/cblu) (community)
- **Categories:** E-commerce, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 app reviews

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Reviews Scraper — iOS & macOS Reviews API

Extract **customer reviews for any iOS or macOS app** from the Apple App Store in seconds. Get star ratings, review titles, full review text, author names, app versions, helpfulness votes, and timestamps — as clean, structured JSON, CSV, or Excel. Works for **every App Store country storefront** (US, UK, Germany, Japan, and 170+ more).

No Apple account, no API keys, no browser automation — this Actor reads Apple's official public review feeds, which makes it **fast, cheap, and extremely reliable**.

### What data do you get?

Each result is one review:

| Field | Example |
|---|---|
| `appId` / `appName` / `appDeveloper` | `310633997` / WhatsApp Messenger / WhatsApp Inc. |
| `appAverageRating` / `appTotalRatings` | `4.7` / `13,204,551` |
| `rating` | `1`–`5` stars |
| `title` | "Great app, but…" |
| `text` | Full review body |
| `userName` | Reviewer's public name |
| `appVersion` | Version reviewed, e.g. `24.11.79` |
| `updatedAt` | ISO 8601 timestamp |
| `voteSum` / `voteCount` | Helpfulness votes |
| `country` | Storefront, e.g. `us` |
| `reviewId` / `reviewUrl` | Unique ID + link |

### Use cases

- **Competitor & market research** — monitor what users praise or complain about in competing apps.
- **Product feedback mining** — feed reviews into ChatGPT/Claude or your BI stack to cluster complaints, feature requests, and bug reports.
- **Reputation monitoring** — schedule daily runs and alert on new 1-star reviews of your own app.
- **ASO (App Store Optimization)** — track how rating mix and review sentiment shift after each release.
- **Data for AI agents** — call this Actor from an LLM agent or via API to pull fresh review data on demand.

### How to use it

1. Paste one or more **app IDs** (`310633997`) or **App Store URLs** (`https://apps.apple.com/us/app/whatsapp-messenger/id310633997`).
2. Pick the **country storefront** and sorting (most recent / most helpful).
3. Set **max reviews per app** (up to 500 — that is the maximum Apple's public feed exposes per app per storefront).
4. Run. Download results as JSON, CSV, Excel, or consume them via the Apify API.

#### Input example

```json
{
    "appIds": ["310633997", "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"],
    "country": "us",
    "sortBy": "mostrecent",
    "maxReviewsPerApp": 200
}
````

### Pricing

Pay per result: **you are only charged for reviews actually extracted** — no charge for apps that return nothing.

> Suggested store pricing (set in the Apify Console → Publication → Monetization):
>
> - `review` event: **$0.0005 per review** ($0.50 per 1,000 reviews)
>
> Rationale: the current category leader advertises $0.10/1K with a minimal feature set; poorly rated competitors (1.2★ and 2.7★ with hundreds of users) charge more for less reliable output. $0.50/1K positions this Actor as premium-but-cheap; adjust downward to $0.20/1K if conversion is slow. Scraping 1,000 reviews costs the customer $0.50 and completes in under a minute.

### FAQ

**How many reviews can I get per app?** Apple's public feed exposes the ~500 most recent (or most helpful) reviews per app per storefront. To collect more over time, schedule the Actor daily and deduplicate by `reviewId`. To get more at once, run the same app across multiple country storefronts.

**Does it work for macOS apps?** Yes — any app with an `apps.apple.com` listing and public reviews.

**Is this legal?** The Actor only reads Apple's publicly available review feeds (no login, no personal data beyond what reviewers publish publicly). Review the data-protection guidance in your jurisdiction before redistributing extracted content.

**Something broke?** Open an issue on the Actor's Issues tab — reliability reports are handled with priority.

# Actor input Schema

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

One or more apps to scrape. Accepts numeric app IDs (e.g. <code>310633997</code>) or full App Store URLs (e.g. <code>https://apps.apple.com/us/app/whatsapp-messenger/id310633997</code>).

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

Two-letter country code of the App Store storefront to read reviews from (e.g. <code>us</code>, <code>gb</code>, <code>de</code>, <code>jp</code>). Reviews differ per storefront.

## `sortBy` (type: `string`):

Order in which Apple returns reviews.

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

Maximum number of reviews to extract per app. Apple's public feed exposes up to 500 reviews per app per storefront (10 pages of 50). You are only charged for reviews actually returned.

## `includeAppMetadata` (type: `boolean`):

When enabled, each review row also carries the app's name, developer, overall average rating, and total ratings count (one extra metadata request per app; not charged).

## Actor input object example

```json
{
  "appIds": [
    "310633997"
  ],
  "country": "us",
  "sortBy": "mostrecent",
  "maxReviewsPerApp": 100,
  "includeAppMetadata": true
}
```

# 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 = {
    "appIds": [
        "310633997"
    ],
    "country": "us",
    "maxReviewsPerApp": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("cblu/app-store-reviews-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 = {
    "appIds": ["310633997"],
    "country": "us",
    "maxReviewsPerApp": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("cblu/app-store-reviews-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 '{
  "appIds": [
    "310633997"
  ],
  "country": "us",
  "maxReviewsPerApp": 100
}' |
apify call cblu/app-store-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Apple App Store Reviews Scraper",
        "description": "Extract customer reviews for any iOS/macOS app from the Apple App Store. Pay per review.",
        "version": "0.1",
        "x-build-id": "mWvesJoU5zDyAPcpw"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/cblu~app-store-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-cblu-app-store-reviews-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/cblu~app-store-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-cblu-app-store-reviews-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/cblu~app-store-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-cblu-app-store-reviews-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": [
                    "appIds"
                ],
                "properties": {
                    "appIds": {
                        "title": "Apps (IDs or App Store URLs)",
                        "minItems": 1,
                        "uniqueItems": true,
                        "type": "array",
                        "description": "One or more apps to scrape. Accepts numeric app IDs (e.g. <code>310633997</code>) or full App Store URLs (e.g. <code>https://apps.apple.com/us/app/whatsapp-messenger/id310633997</code>).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "country": {
                        "title": "Country storefront",
                        "pattern": "^[a-zA-Z]{2}$",
                        "type": "string",
                        "description": "Two-letter country code of the App Store storefront to read reviews from (e.g. <code>us</code>, <code>gb</code>, <code>de</code>, <code>jp</code>). Reviews differ per storefront.",
                        "default": "us"
                    },
                    "sortBy": {
                        "title": "Sort reviews by",
                        "enum": [
                            "mostrecent",
                            "mosthelpful"
                        ],
                        "type": "string",
                        "description": "Order in which Apple returns reviews.",
                        "default": "mostrecent"
                    },
                    "maxReviewsPerApp": {
                        "title": "Max reviews per app",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum number of reviews to extract per app. Apple's public feed exposes up to 500 reviews per app per storefront (10 pages of 50). You are only charged for reviews actually returned.",
                        "default": 100
                    },
                    "includeAppMetadata": {
                        "title": "Enrich reviews with app metadata",
                        "type": "boolean",
                        "description": "When enabled, each review row also carries the app's name, developer, overall average rating, and total ratings count (one extra metadata request per app; not charged).",
                        "default": 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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
