# App Store Reviews Scraper (`clearrun/app-store-reviews`) Actor

Public App Store reviews with rating, title, text, version, date, author name and helpfulness votes for any app and storefront, plus app rating and developer. No browser; pay per review.

- **URL**: https://apify.com/clearrun/app-store-reviews.md
- **Developed by:** [Clearrun Data](https://apify.com/clearrun) (community)
- **Categories:** Business, Agents, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

## App Store Reviews Scraper

Get an app's public Apple App Store reviews as structured JSON. Give it an App Store URL, a numeric app id, or a
bundle id, and you get every review with its star rating, title, text, publication date and the reviewer's public
display name. Every record also carries the app's free metadata: name, developer, average rating and total rating
count. Works across any App Store country and needs no browser or residential proxy.

Built for app-store monitoring, competitor research, release-quality tracking and feeding review data to AI agents.
Only public review feeds are read; the only reviewer data collected is the display name shown on the review.

### What you get

```json
{
  "appId": "618783545",
  "appName": "Slack",
  "developer": "Slack Technologies, LLC",
  "country": "us",
  "reviewId": "10123456789",
  "title": "Great for team chat",
  "text": "We use this daily across three teams. Threads and search work well.",
  "rating": 5,
  "version": null,
  "date": "2026-08-14T09:21:33Z",
  "authorName": "Jordan",
  "voteSum": null,
  "voteCount": null,
  "url": "https://apps.apple.com/us/app/slack/id618783545",
  "appAverageRating": 4.6,
  "appRatingCount": 118234,
  "error": null,
  "scrapedAt": "2026-09-10T10:15:00.000Z"
}
```

| Field | Notes |
|---|---|
| `appId`, `url` | Apple's numeric track id and the app's public store URL |
| `reviewId` | Apple's review id |
| `rating` | 1–5 (number) |
| `version` | Always `null`: Apple's current reviews endpoint no longer exposes the app version a review was written against |
| `date` | ISO 8601 |
| `authorName` | Public display name shown on the review; nothing else about the reviewer is collected |
| `voteSum`, `voteCount` | Always `null`: Apple's current reviews endpoint no longer exposes "helpful" vote counts |
| `appAverageRating`, `appRatingCount` | The app's overall rating in that store, repeated on every record |

A `STATS` record in the run's key-value store holds one summary per app: reviews delivered, errors, rating
distribution and average rating of the delivered reviews. An app that cannot be found in a given country produces
one record with every review field set to `null` and an `error` string describing what went wrong; that record is
not charged. Every record, success or error, carries the same set of keys so downstream code never has to branch on
shape.

### Input

| Field | Default | Notes |
|---|---|---|
| `apps` | — | App Store URLs, numeric app ids, or bundle ids, one per line |
| `countries` | `["us"]` | 2-letter App Store codes, e.g. `us`, `gb`, `de` |
| `maxReviewsPerApp` | `200` | Cap per app, per country; hard ceiling of 500 |
| `sortBy` | `mostrecent` | Accepted for backwards compatibility; Apple's current endpoint has no sort control, so this no longer affects the order reviews come back in |
| `proxyConfiguration` | Apify automatic | Apple's reviews endpoint doesn't block data-centre IPs, so no residential proxy is needed by default |

```json
{ "apps": ["https://apps.apple.com/us/app/slack/id618783545", "com.spotify.client"], "countries": ["us", "gb"], "maxReviewsPerApp": 300, "sortBy": "mosthelpful" }
```

### Pricing

Pay per review delivered. The app metadata on each record and in `STATS` is free, duplicates within a run are never
charged, and an app that isn't found in a given country costs nothing.

#### Speed & cost

Runs in roughly 10–20 seconds per 100 reviews (Apple's reviews endpoint is paginated 20 at a time with no retry
delays needed). A 100-review run costs about $0.04 in review events plus roughly $0.01 of platform usage.

### Typical uses

- Tracking user sentiment across app releases and versions
- Competitor and category monitoring across App Store countries
- Mining low-rated reviews for bugs and support issues
- Giving an AI agent live customer feedback about an app

### Use from an AI agent

Available through the Apify MCP server: "Get the most helpful App Store reviews for Slack and summarise the
complaints."

API call:

```bash
curl -X POST "https://api.apify.com/v2/acts/clearrun~app-store-reviews/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"apps": ["https://apps.apple.com/us/app/slack/id618783545"], "maxReviewsPerApp": 100, "sortBy": "mosthelpful"}'
```

### Support

Open an issue on the Issues tab with the app, the input you used and the run ID. Issues are answered within one working day.

# Actor input Schema

## `apps` (type: `array`):

One app per line: an App Store URL (https://apps.apple.com/us/app/slack/id618783545), a numeric app id, or a bundle id.

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

2-letter App Store codes, e.g. us, gb, de.

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

Stop after this many reviews per app in each country. Apple's feed caps at 500 (10 pages of 50).

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

Kept for backwards compatibility with older inputs. Apple's current reviews endpoint has no sort parameter, so this no longer changes the order reviews are returned in.

## `proxyConfiguration` (type: `object`):

Apple's reviews endpoint does not block data-centre IPs, so the default (Apify's automatic proxy) is fine. Switch to residential only if you see blocking.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/slack/id618783545"
  ],
  "countries": [
    "us"
  ],
  "maxReviewsPerApp": 200,
  "sortBy": "mostrecent",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

One record per App Store review with the app's free metadata repeated on every record

## `stats` (type: `string`):

Per app: reviews delivered, errors, rating distribution and average rating of the delivered reviews

# 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 = {
    "apps": [
        "https://apps.apple.com/us/app/slack/id618783545"
    ],
    "countries": [
        "us"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("clearrun/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 = {
    "apps": ["https://apps.apple.com/us/app/slack/id618783545"],
    "countries": ["us"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("clearrun/app-store-reviews").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 '{
  "apps": [
    "https://apps.apple.com/us/app/slack/id618783545"
  ],
  "countries": [
    "us"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call clearrun/app-store-reviews --silent --output-dataset

```

## MCP server setup

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

```

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/j0l1GTlH62jzkQ9r3/builds/0hWBInvlYr9MHapQR/openapi.json
