# App Store Reviews Scraper + AI Analysis (`pappy-dev/app-store-review-intelligence`) Actor

Scrape Apple App Store reviews for any app in any country (no login) and get optional AI analyses on top: pain points, feature requests, rating trend, and a headline summary you can paste into a report.

- **URL**: https://apify.com/pappy-dev/app-store-review-intelligence.md
- **Developed by:** [pappy M＆Y](https://apify.com/pappy-dev) (community)
- **Categories:** Agents, MCP servers, Developer tools
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## App Store Reviews Scraper + AI Analysis

Scrape Apple App Store reviews for any app in any country (no login) and get optional AI analyses on top: pain points, feature requests, rating trend, and a headline summary you can paste into a report.

Most App Store scrapers hand you one country and a pile of raw rows. This one sweeps every storefront in a single run and ships the analysis you were going to build anyway.

***

### Why more countries means more data

Apple caps its public review feed at **200 reviews per app, per storefront**. That cap is per storefront — and every storefront holds a *different* set of reviews.

So the same app that tops out at 200 reviews in `us` gives you 1,667 once you sweep ten countries. Ask for `["all"]` and you get every storefront Apple serves.

| Countries requested | Reviews returned (Notion, measured on Apify) |
|---|---|
| `us` only | 200 (Apple's per-storefront cap) |
| 10 storefronts | **1,667** |

Some storefronts return nothing for a given app — the actor skips them and keeps going. Ten requested, nine returned data, in 61 seconds.

### Version regressions — the part nobody else does

Every release, someone asks *"did that update hurt us?"* This actor answers it directly:

```json
{
  "regressions": [
    { "fromVersion": "1.7.233", "toVersion": "1.7.234",
      "before": 4.1, "after": 2.625, "ratingDelta": -1.475,
      "sampleBefore": 10, "sampleAfter": 8 }
  ],
  "worstVersion": { "version": "1.7.271", "averageRating": 1.714 }
}
```

Per-version stats include a Wilson lower bound, so a version with 5 reviews doesn't outrank one with 500.

### Analyses

Each is billed **once per run**, not per review.

| Analysis | What you get |
|---|---|
| `versionRegressions` | Per-version ratings, ranked drops, worst/best release |
| `painPoints` | What ≤3-star reviewers actually complain about, scored by how much more often a term shows up in negative reviews than overall (lift), with a real example quote |
| `featureRequests` | What users ask for, extracted from reviews containing request language |
| `summary` | Headline numbers: volume, average, negative share, biggest regression |

Analysis is **deterministic** — no LLM in the loop. Same input, same output, every time. No hallucinated themes, no per-token cost passed on to you.

### Input

```json
{
  "appIds": ["1232780281"],
  "countries": ["all"],
  "sortBy": "mostRecent",
  "maxReviewsPerCountry": 200,
  "minRating": 1,
  "maxRating": 3,
  "sinceDate": "2026-01-01",
  "aiAnalysis": ["versionRegressions", "painPoints"]
}
```

`appIds` accepts numeric IDs **or** full App Store URLs. No IDs handy? Pass `searchTerm` instead and the actor resolves it.

### Output

Reviews (`type: "review"`):

| Field | |
|---|---|
| `appId` `appName` `country` | which app, which storefront |
| `rating` `title` `body` `version` | the review |
| `author` `updatedAt` `voteSum` `voteCount` `url` | metadata |

Analyses arrive as separate items with `type: "analysis"`.

### Pricing

| Event | Price |
|---|---|
| Actor start | $0.00005 |
| Per review | **$0.0002** ($0.20 per 1,000) |
| Per analysis | **$0.05** (`summary`: $0.03) |

A 5,000-review sweep with two analyses runs about **$1.10**. A single-country pull with one analysis is about **$0.09**.

### Why this one won't rot

It reads Apple's own public RSS feed — the same endpoint Apple publishes for anyone to use. No login, no headless browser, no proxy rotation, no CAPTCHA arms race. Nothing to break when a site ships a redesign.

It also means no personal data: App Store review authors are public display names, and this actor collects nothing beyond what Apple already publishes.

### Notes

- Some storefronts return zero reviews for a given app. That's normal — the actor skips them and continues.
- Google Play is deliberately **not** supported: Google's review API only covers apps you own, and scraping it is a terms violation. This actor stays on the clean side of that line.

***

Built by M＆Y.

# Actor input Schema

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

Numeric App Store IDs or full URLs. Example: 1232780281 or https://apps.apple.com/us/app/notion/id1232780281

## `searchTerm` (type: `string`):

Used only when App IDs is empty.

## `searchLimit` (type: `integer`):

When resolving apps from searchTerm, how many of the top search hits to process.

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

Two-letter country codes, or \["all"] for every one of the 155 App Store storefronts. Each storefront holds a different set of reviews, so more countries means more data for the same app.

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

Which of Apple's two public feed orderings to read.

## `maxReviewsPerCountry` (type: `integer`):

Apple caps its public feed at 200 per app per storefront.

## `minRating` (type: `integer`):

Keep only reviews with at least this many stars.

## `maxRating` (type: `integer`):

Keep only reviews with at most this many stars.

## `sinceDate` (type: `string`):

ISO date, e.g. 2026-01-01

## `aiAnalysis` (type: `array`):

Each selected analysis is charged once per run, regardless of review count.

## `throttleSeconds` (type: `integer`):

Apple rate-limits its public feed per IP. Raising this trades speed for completeness.

## Actor input object example

```json
{
  "appIds": [
    "1232780281"
  ],
  "searchLimit": 1,
  "countries": [
    "us",
    "gb",
    "ca",
    "au",
    "de",
    "fr",
    "jp"
  ],
  "sortBy": "mostRecent",
  "maxReviewsPerCountry": 200,
  "minRating": 1,
  "maxRating": 5,
  "aiAnalysis": [],
  "throttleSeconds": 1
}
```

# 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": [
        "1232780281"
    ],
    "countries": [
        "us",
        "gb",
        "ca",
        "au",
        "de",
        "fr",
        "jp"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("pappy-dev/app-store-review-intelligence").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": ["1232780281"],
    "countries": [
        "us",
        "gb",
        "ca",
        "au",
        "de",
        "fr",
        "jp",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("pappy-dev/app-store-review-intelligence").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 '{
  "appIds": [
    "1232780281"
  ],
  "countries": [
    "us",
    "gb",
    "ca",
    "au",
    "de",
    "fr",
    "jp"
  ]
}' |
apify call pappy-dev/app-store-review-intelligence --silent --output-dataset

```

## MCP server setup

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

```

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/DmeTOqMQTc2Bh7pNT/builds/PebPpjcw46uAfQQR6/openapi.json
