# App Store Reviews Scraper — Apple iOS Reviews by Country (`northbell/app-store-reviews-scraper`) Actor

Scrape Apple App Store reviews for any iOS app: star rating, title, full text, app version, date and helpful votes, by country (latest 500 per app and country), plus the app's current rating and count — and only reviews new since your last run. No login.

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

## Pricing

from $0.08 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## App Store Reviews Scraper

Read what iPhone and iPad users are saying about **any App Store app** — yours or a competitor's. Paste the App Store URL (or the numeric app ID), pick the countries, and get every recent review as clean JSON: **star rating, title, full text, app version, date and helpful votes**, plus one row per app with its **current average rating and rating count**.

Schedule it with **Only reviews new since the last run** on, and each morning you get just the reviews that arrived since yesterday — in a sheet, Slack or your own database.

### What you get

| Field | What it is |
|---|---|
| `appName`, `appId`, `country` | the app and the App Store country the review comes from |
| `rating` | 1–5 stars |
| `title`, `text` | the review as written |
| `appVersion` | the app version the reviewer was using — so you can tie complaints to a release |
| `reviewedAt` | when the review was posted |
| `helpfulVotes`, `totalVotes` | how many people marked it helpful, out of all votes |
| `isNewSinceLastRun` | `true` when this review was not returned on the previous run (`null` on the first run) |

Plus one free `type: "app"` row per app and country: `averageRating`, `ratingCount`, rating for the current version, `version`, `currentVersionReleasedAt`, `genre`, `price`, `appUrl`.

Reviewer names are **not** collected.

### Use it for

- **Release monitoring** — filter to 1–2 stars and watch what people say after each version ships
- **Competitor research** — read what users love and hate about rival apps, country by country
- **Feedback pipelines** — feed new reviews into a sheet, Slack, a support tool or an LLM for tagging

### Input

```json
{ "apps": ["https://apps.apple.com/us/app/instagram/id389801252"], "countries": ["us", "gb"], "maxReviewsPerApp": 100, "maxRating": 2 }
```

Apple publishes the **latest 500 reviews per app and country** (most recent or most helpful). This Actor reads exactly that — no login, no API key — so run it on a schedule to build a longer history.

To search the App Store or get app details for many apps, use the [App Store Scraper](https://apify.com/northbell/app-store-scraper).

### Pricing

**$0.10 per 1,000 reviews**, plus $0.01 per run. App rows and error rows are free. The $0.01 run-start fee is the one charge every run pays, even one that returns nothing.

### For AI agents

`{"apps": ["389801252"], "countries": ["us"], "maxReviewsPerApp": 50}` returns the 50 latest US reviews plus the app row. Rows have `type`: `review`, `app` or `error`.

# Actor input Schema

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

App Store URLs or numeric app IDs (the number after "id" in the URL). One per line; many apps in one run cost one start fee.

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

Two-letter App Store country codes, e.g. "us", "gb", "jp", "de". Each app is read in each country (reviews differ per country). Empty = "us".

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

Apple returns at most the latest 500 reviews per app and country in either order.

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

Caps what you pay for. Apple exposes up to 500 per app and country.

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

Set 1 and Highest = 2 to read only complaints.

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

Keep only reviews rated at or below this many stars. Use 2 together with the lowest rating 1 to collect just the complaints; 5 keeps everything.

## `onlyNew` (type: `boolean`):

From the second run on, return only reviews this Actor has not returned before for that app and country. Schedule it for a daily review feed.

## `includeAppDetails` (type: `boolean`):

Free row: current average rating, rating count, version, release date, genre and price.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/instagram/id389801252",
    "284882215"
  ],
  "countries": [
    "us"
  ],
  "sortBy": "mostrecent",
  "maxReviewsPerApp": 100,
  "minRating": 1,
  "maxRating": 5,
  "onlyNew": false,
  "includeAppDetails": true
}
```

# Actor output Schema

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

Star rating, title, text, version and date of each review.

## `apps` (type: `string`):

Current rating and rating count per app and country.

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

// Run the Actor and wait for it to finish
const run = await client.actor("northbell/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 = {
    "apps": [
        "https://apps.apple.com/us/app/instagram/id389801252",
        "284882215",
    ],
    "countries": ["us"],
    "maxReviewsPerApp": 100,
}

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,northbell/app-store-reviews-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/bpHjqI4sPG2WfLHMF/builds/wMQLWyM1p7OnHLQJT/openapi.json
