# App Store Reviews Scraper — Apple iOS App Reviews (`bikram07/app-store-reviews`) Actor

Scrape Apple App Store customer reviews for any iOS app via Apple's official public RSS feed — no auth, no key. Returns rating, title, text, author, version & date. Zero-config: pass an App Store ID or URL. For ASO, sentiment & competitor review monitoring.

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

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

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

## App Store Reviews Scraper — Apple iOS App Reviews

Scrape **Apple App Store customer reviews** for any iOS app, straight from Apple's **official public RSS feed**. Pass an App Store ID (or a full App Store URL) and get back a clean, structured dataset of the most-recent reviews — rating, title, body text, author, app version, and date — ready to export as JSON, CSV, or Excel, send to a webhook, or query from an AI agent over MCP.

No login, no API key, no headless browser, no scraping of the App Store website — it reads Apple's public customer-reviews RSS JSON endpoint. Run it with **zero configuration** and it returns recent US reviews for a prefilled app.

### What it does

For each app + storefront you request, the Actor calls Apple's customer-reviews feed:

````

https://itunes.apple.com/{country}/rss/customerreviews/page={n}/id={appId}/sortby=mostrecent/json

````

It paginates from page 1 onward (Apple caps the feed at ~10 pages / ~500 most-recent reviews per app per country), normalizes every review into one schema, deduplicates on review ID, sorts newest-first, and writes the result to your dataset. App name is enriched best-effort from Apple's iTunes Lookup API so each row tells you which app it belongs to.

### Why monitor App Store reviews

App marketers, product managers, and founders live and die by their reviews:

- **App Store Optimization (ASO)** — review velocity, average rating, and keyword themes influence ranking and conversion. Track them over time.
- **Bug & crash signals** — a spike of 1-star reviews after a release is the fastest early warning you have. Catch "app keeps crashing" before it tanks your rating.
- **Feature requests** — your most-engaged users tell you exactly what to build next, in their own words.
- **Sentiment analysis** — feed review text into your own model or LLM to quantify how users feel release-over-release.
- **Competitor intelligence** — monitor a rival's reviews to see what their users love, hate, and beg for, then position around it.

### Input

Every field is optional. **Empty input `{}` returns recent US reviews for the prefilled app (Facebook).**

| Field | Type | Default | Description |
|---|---|---|---|
| `appIds` | array of strings | `["284882215"]` | Apps to scrape. Each item is a raw numeric App Store ID **or** a full App Store URL. |
| `countries` | array of strings | `["us"]` | Storefronts to pull from, as 2-letter lowercase country codes. Reviews differ per storefront. |
| `maxReviewsPerApp` | integer | `100` | Max most-recent reviews per app, per country (Apple caps at ~500). |

`appIds` accepts both forms — raw IDs and URLs — and the Actor extracts the numeric ID automatically:

```json
{ "appIds": ["284882215"] }
````

```json
{ "appIds": ["https://apps.apple.com/us/app/facebook/id284882215"] }
```

**Zero-config (recent US reviews for the prefilled app):**

```json
{}
```

**Two apps, US + UK + Germany, 200 reviews each:**

```json
{
    "appIds": ["389801252", "https://apps.apple.com/us/app/tiktok/id835599320"],
    "countries": ["us", "gb", "de"],
    "maxReviewsPerApp": 200
}
```

### Output schema

One item per review. Missing fields are `null` — never fabricated.

| Field | Type | Description |
|---|---|---|
| `reviewId` | string | Apple's unique ID for the review. |
| `appId` | string | Numeric App Store ID of the app. |
| `appName` | string | Resolved app name (from iTunes Lookup), or `null`. |
| `country` | string | 2-letter storefront code the review came from. |
| `rating` | integer | Star rating, 1–5. |
| `title` | string | Review headline. |
| `content` | string | Full review body text. |
| `author` | string | Reviewer's App Store nickname. |
| `appVersion` | string | App version the review was left on. |
| `updated` | string | ISO timestamp of the review. |
| `reviewUrl` | string | Link to the review / app listing, when derivable, else `null`. |

**Sample item:**

```json
{
    "reviewId": "14194582446",
    "appId": "284882215",
    "appName": "Facebook",
    "country": "us",
    "rating": 2,
    "title": "Horrible feed",
    "content": "The feed keeps resetting and showing me ads I already hid...",
    "author": "Ohioan419",
    "appVersion": "566.0.0",
    "updated": "2026-06-17T12:01:11-07:00",
    "reviewUrl": "https://itunes.apple.com/us/review?id=284882215&type=Purple%20Software"
}
```

### Data source

| Source | Endpoint | Auth |
|---|---|---|
| Apple customer reviews | `https://itunes.apple.com/{country}/rss/customerreviews/page={n}/id={appId}/sortby=mostrecent/json` | None |
| Apple iTunes Lookup (app name) | `https://itunes.apple.com/lookup?id={appId}&country={country}` | None |

Both are official Apple public endpoints. No API key, no scraping, no login.

### Use cases

- **Competitor monitoring** — schedule daily runs against a rival app's ID and diff new reviews to track sentiment and feature complaints.
- **Review-response workflows** — pull new reviews each morning and pipe them via webhook to Slack or a helpdesk so support can reply fast.
- **Sentiment datasets** — collect reviews per app across storefronts and feed the text into a sentiment/topic model or LLM.
- **Release health checks** — after an update, filter by `appVersion` to read what users say about that build.
- **AI agents (MCP)** — let an agent answer "what are users saying about our app this week?" by calling this Actor live.

```bash
curl -X POST "https://api.apify.com/v2/acts/bikram07~app-store-reviews/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"appIds":["284882215"],"countries":["us"],"maxReviewsPerApp":100}'
```

### What it is NOT

- **Not all-time review history.** Apple's public RSS feed exposes only the **~500 most-recent reviews per app per country**. This Actor returns what Apple publishes there — it cannot retrieve years of historical reviews.
- **iOS / App Store only.** It does **not** cover Google Play, the Mac App Store ratings page, or any non-Apple store. For Android reviews you need a different source.
- **Not ratings-summary data.** It returns individual review records, not aggregate star histograms or total rating counts.
- **Not real-time to the second.** Freshness depends on Apple's feed cadence; brand-new reviews can take a short while to appear in the RSS.
- **Not affiliated with Apple.** Independent tool built on Apple's public RSS and Lookup APIs. "App Store" and "iOS" are trademarks of Apple Inc.

***

Built on Apple's official [customer-reviews RSS feed](https://itunes.apple.com/us/rss/customerreviews/page=1/id=284882215/sortby=mostrecent/json) and [iTunes Lookup API](https://itunes.apple.com/lookup?id=284882215). Not affiliated with or endorsed by Apple Inc.

**Related searches:** App Store reviews scraper · Apple app reviews API · iOS app review monitoring · ASO review tracking · app sentiment analysis · competitor app reviews · App Store RSS feed · customer reviews scraper · app review dataset · iOS review monitor

# Actor input Schema

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

One or more Apple App Store apps to scrape reviews for. Accepts either a raw numeric App Store ID (e.g. <b>284882215</b>) or a full App Store URL (e.g. <b>https://apps.apple.com/us/app/facebook/id284882215</b>). Defaults to Facebook so a run works out of the box.

## `countries` (type: `array`):

App Store storefronts to pull reviews from, as 2-letter lowercase country codes (e.g. <b>us</b>, <b>gb</b>, <b>de</b>, <b>in</b>). Reviews differ per storefront. Defaults to the US store.

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

Maximum number of most-recent reviews to fetch per app, per storefront. Apple's public RSS feed caps at roughly 500 most-recent reviews per app per country. Default 100.

## Actor input object example

```json
{
  "appIds": [
    "284882215"
  ],
  "countries": [
    "us"
  ],
  "maxReviewsPerApp": 100
}
```

# 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": [
        "284882215"
    ],
    "countries": [
        "us"
    ],
    "maxReviewsPerApp": 100
};

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

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "App Store Reviews Scraper — Apple iOS App Reviews",
        "description": "Scrape Apple App Store customer reviews for any iOS app via Apple's official public RSS feed — no auth, no key. Returns rating, title, text, author, version & date. Zero-config: pass an App Store ID or URL. For ASO, sentiment & competitor review monitoring.",
        "version": "0.1",
        "x-build-id": "urgP1pHfEgnAdS31I"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/bikram07~app-store-reviews/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-bikram07-app-store-reviews",
                "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/bikram07~app-store-reviews/runs": {
            "post": {
                "operationId": "runs-sync-bikram07-app-store-reviews",
                "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/bikram07~app-store-reviews/run-sync": {
            "post": {
                "operationId": "run-sync-bikram07-app-store-reviews",
                "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",
                "properties": {
                    "appIds": {
                        "title": "App Store IDs or URLs",
                        "type": "array",
                        "description": "One or more Apple App Store apps to scrape reviews for. Accepts either a raw numeric App Store ID (e.g. <b>284882215</b>) or a full App Store URL (e.g. <b>https://apps.apple.com/us/app/facebook/id284882215</b>). Defaults to Facebook so a run works out of the box.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "284882215"
                        ]
                    },
                    "countries": {
                        "title": "Storefront countries",
                        "type": "array",
                        "description": "App Store storefronts to pull reviews from, as 2-letter lowercase country codes (e.g. <b>us</b>, <b>gb</b>, <b>de</b>, <b>in</b>). Reviews differ per storefront. Defaults to the US store.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "us"
                        ]
                    },
                    "maxReviewsPerApp": {
                        "title": "Max reviews per app (per country)",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum number of most-recent reviews to fetch per app, per storefront. Apple's public RSS feed caps at roughly 500 most-recent reviews per app per country. Default 100.",
                        "default": 100
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
