# Reviewbot Apple store Review Scraper (`reviewbot/apple-review-scraper`) Actor

Collect reviews from Apple App Store (iOS apps) with support for countries, ratings, and date filters. Extract rich review metadata including app version and titles. Designed for iOS developers, product teams, and market analysis.

- **URL**: https://apify.com/reviewbot/apple-review-scraper.md
- **Developed by:** [reviewbot](https://apify.com/reviewbot) (community)
- **Categories:** Developer tools, Automation, Other
- **Stats:** 39 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.10 / 1,000 reviews

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/actors/running/actors-in-store.md#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 Review Scraper

Extract reviews from iOS apps on Apple App Store.

### What This Actor Does

The Apple App Store Review Scraper is designed specifically for extracting user reviews from iOS applications published on Apple's App Store. With over 2 million apps serving billions of iOS users worldwide, the App Store contains premium user feedback that reflects the preferences and behaviors of Apple's high-value user base.

**Perfect for:**

- 🍎 **iOS Developers** - Monitor user feedback for your iPhone and iPad apps, track feature requests, and identify bugs
- 💰 **Revenue Optimization** - Analyze reviews from high-spending iOS users to understand premium features and pricing feedback
- 🎨 **UX/UI Designers** - Study user interface feedback and usability concerns specific to iOS design patterns
- 📈 **Product Strategy** - Understand iOS user expectations and preferences for feature prioritization
- 🌍 **Global Market Analysis** - Access reviews across different App Store regions to understand international user sentiment

**Why Use This Actor:**

- **iOS-Specialized**: Tailored for Apple App Store with deep understanding of iOS app ecosystem and user behavior
- **Premium User Insights**: Access feedback from iOS users who typically have higher engagement and spending power
- **Global Reach**: Extract reviews from all major App Store territories and languages
- **Reliable Performance**: 90%+ success rate with automatic fallback between iTunes API and web scraping
- **Rich Review Data**: Capture app version compatibility, user helpfulness ratings, and detailed review titles

### Quick Start

#### Using Apify Console

1. Go to [Apify Console](https://console.apify.com/actors/pgbVNHEjq7yrcQOJd)
2. Configure input parameters and run

#### Using Apify CLI

```bash
npm install -g apify-cli
apify run pgbVNHEjq7yrcQOJd --input='{"id": "310633997", "limit": 100}'
```

### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `id` | string | ✓ | iTunes numeric app ID (e.g., "310633997") |
| `limit` | number | | Maximum reviews to extract (default: 100) |
| `country` | string | | Country code: "us", "gb", "ca", "au", "de", "fr", etc. |
| `ratings` | array | | Filter by ratings: `[4,5]` for 4-5 star reviews |
| `startDate` | string | | Extract reviews after this date: "2024-01-01" |
| `endDate` | string | | Extract reviews before this date: "2024-12-31" |

### Usage Examples

#### Basic Usage

```json
{
  "id": "310633997",
  "limit": 100
}
```

#### Advanced Filtering

```json
{
  "id": "389801252",
  "limit": 200,
  "country": "us",
  "ratings": [4, 5],
  "startDate": "2024-01-01"
}
```

### Using Apify SDK

#### JavaScript Example

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

const client = new ApifyApi({
  token: 'YOUR_APIFY_TOKEN',
});

async function getiOSReviews() {
  const run = await client.actor('pgbVNHEjq7yrcQOJd').call({
    id: '310633997', // WhatsApp
    limit: 100,
    country: 'us'
  });

  const { items } = await client.dataset(run.defaultDatasetId).listItems();
  console.log(`Downloaded ${items.length} iOS reviews`);
  return items;
}

getiOSReviews();
```

#### Python Example

```python
from apify_client import ApifyClient

client = ApifyClient('YOUR_APIFY_TOKEN')

run = client.actor('pgbVNHEjq7yrcQOJd').call(run_input={
    'id': '324684580',  # Spotify
    'limit': 50,
    'country': 'us',
    'ratings': [4, 5]
})

items = client.dataset(run['defaultDatasetId']).list_items().items
for review in items:
    print(f"⭐{review['rating']} - {review['text'][:100]}...")
```

### cURL Examples

#### Run Actor

```bash
curl -X POST 'https://api.apify.com/v2/acts/pgbVNHEjq7yrcQOJd/runs' \
  -H 'Authorization: Bearer YOUR_APIFY_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
    "id": "363590051",
    "limit": 100,
    "country": "us"
  }'
```

#### Get Results

```bash
curl 'https://api.apify.com/v2/datasets/DATASET_ID/items?format=json' \
  -H 'Authorization: Bearer YOUR_APIFY_TOKEN'
```

### Output Format

```json
[
  {
    "source": "apify",
    "store": "apple",
    "appId": "310633997",
    "runId": "TejqJ2Dy84RzgAjnQ",
    "appName": "WhatsApp Messenger",
    "developer": "WhatsApp Inc.",
    "appRating": 4.69043,
    "appUrl": "https://apps.apple.com/us/app/whatsapp-messenger/id310633997?uo=4",
    "reviews": [
      {
        "reviewId": "apple-310633997-13668071134",
        "text": "Good app for communicating with prayer group.",
        "rating": 5,
        "author": "Odonah",
        "reviewedAt": "2026-01-23T15:28:46-07:00",
        "scrapedAt": "2026-01-27T14:29:20.421Z",
        "store": "apple",
        "title": "Prayer community communication is good",
        "version": "26.2.74",
        "country": "us"
      },
      {
        "reviewId": "apple-310633997-13668035250",
        "text": "I find WhatsApp to be alright. Nothing too exciting.",
        "rating": 3,
        "author": "Ghost of Halloween Past",
        "reviewedAt": "2026-01-23T15:14:19-07:00",
        "scrapedAt": "2026-01-27T14:29:20.421Z",
        "store": "apple",
        "title": "It’s alright",
        "version": "26.2.74",
        "country": "us"
      }
    ],
    "metadata": {
      "summary": {
        "totalReviews": 100,
        "averageRating": 3.56,
        "ratingDistribution": {
          "1": 25,
          "2": 8,
          "3": 6,
          "4": 8,
          "5": 53
        }
      },
      "scrapingStats": {
        "platform": "apple-store",
        "scrapingTimeMs": 4420,
        "rawReviewsCount": 100,
        "processedReviewsCount": 100,
        "validatedApp": true,
        "totalRequests": 2
      }
    }
  }
]
```

### 💳 Pricing & Cost Control

This Actor uses **Pay-Per-Event (PPE)** pricing, so you only pay for the reviews you actually receive.

#### How Pricing Works

- ✅ **First 10 reviews are FREE** on every run
- 💵 **$0.00005 per additional review**
- 📦 Charges are based on the **number of reviews returned**, not runtime

**Example:**

| Reviews Returned | Free Reviews | Paid Reviews | Total Cost |
|------------------|--------------|--------------|------------|
| 10               | 10           | 0            | $0.00      |
| 50               | 10           | 40           | $0.002     |
| 100              | 10           | 90           | $0.0045    |
| 1,000            | 10           | 990          | $0.0495    |

### Finding iTunes App IDs

#### Method 1: App Store URL

From `https://apps.apple.com/us/app/whatsapp-messenger/id310633997`, the ID is `310633997`

#### Method 2: iTunes Search API

```bash
curl "https://itunes.apple.com/search?term=whatsapp&entity=software&limit=1"
```

#### Method 3: Using Safari Developer Tools

1. Open App Store in Safari
2. Right-click → Inspect Element
3. Look for `data-adam-id` attribute

### Popular Apps for Testing

| App | iTunes ID | Category |
|-----|-----------|----------|
| WhatsApp | `310633997` | Social Networking |
| Instagram | `389801252` | Photo & Video |
| TikTok | `835599320` | Entertainment |
| Spotify | `324684580` | Music |
| Netflix | `363590051` | Entertainment |
| YouTube | `544007664` | Photo & Video |
| Facebook | `284882215` | Social Networking |
| Gmail | `422689480` | Productivity |
| Discord | `985746746` | Social Networking |
| Snapchat | `447188370` | Photo & Video |

### Regional Availability

#### Supported Countries

- **Americas**: us, ca, mx, br, ar
- **Europe**: gb, de, fr, es, it, nl, se, no
- **Asia-Pacific**: au, jp, kr, sg, hk, in
- **Others**: Check [iTunes Store territories](https://developer.apple.com/help/app-store-connect/)

#### Example: Multi-Region

```json
{
  "id": "310633997",
  "country": "jp",
  "limit": 50
}
```

### Error Handling

Common error responses:

```json
{
  "error": {
    "type": "APP_NOT_FOUND",
    "message": "App not found in Apple App Store",
    "id": "999999999"
  }
}
```

```json
{
  "error": {
    "type": "REGION_BLOCKED",
    "message": "App not available in specified country", 
    "country": "xx"
  }
}
```

### Performance Notes

- **Speed**: ~20 reviews in 4-6 seconds
- **Reliability**: 90%+ success rate (Apple has stricter anti-bot measures)
- **Pagination**: Can extract 500+ reviews across multiple pages
- **Rate Limits**: Built-in delays and retry logic to respect Apple's limits

### Support

- [Apify Documentation](https://docs.apify.com)
- [App Store Scraper Library](https://github.com/facundoolano/app-store-scraper)
- [iTunes Search API](https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/iTunesSearchAPI/)
- [Community Forum](https://community.apify.com)

# Actor input Schema

## `appId` (type: `string`):

Apple App Store app ID (numeric, e.g., 310633997 for WhatsApp)

## `limit` (type: `integer`):

Maximum number of reviews to scrape (default: 100, max: 1000)

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

Country code for App Store region (auto = smart detection)

## `startDate` (type: `string`):

Filter reviews from this date (ISO format: YYYY-MM-DD)

## `endDate` (type: `string`):

Filter reviews until this date (ISO format: YYYY-MM-DD)

## `ratings` (type: `array`):

Include only these star ratings (default: all ratings)

## `webhookUrl` (type: `string`):

Your webhook endpoint to receive review data in real-time

## `webhookApiKey` (type: `string`):

API key for webhook authentication (sent in Authorization header)

## Actor input object example

```json
{
  "appId": "310633997",
  "limit": 100,
  "country": "auto",
  "startDate": "2024-01-01",
  "endDate": "2024-12-31",
  "ratings": [
    4,
    5
  ],
  "webhookUrl": "https://your-api.com/webhooks/reviews"
}
```

# Actor output Schema

## `source` (type: `string`):

Source platform identifier

## `store` (type: `string`):

Target app store platform

## `appId` (type: `string`):

Apple App Store application identifier

## `runId` (type: `string`):

Unique identifier for this scraping run

## `actorId` (type: `string`):

Unique identifier for the Apify actor

## `appName` (type: `string`):

Name of the application

## `developer` (type: `string`):

App developer/publisher name

## `appRating` (type: `string`):

Overall app rating from the App Store

## `appUrl` (type: `string`):

Direct URL to the app in the Apple App Store

## `reviews` (type: `string`):

Array of scraped user reviews

## `metadata` (type: `string`):

Additional information about the scraping process and results

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("reviewbot/apple-review-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("reviewbot/apple-review-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 '{}' |
apify call reviewbot/apple-review-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,reviewbot/apple-review-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/63lPTmujlRC3nXO7d/builds/fmENW5GxpB86a6bzA/openapi.json
