# App Store Reviews Scraper: iOS Reviews, All Countries (`swiftkit/app-reviews`) Actor

Scrape iPhone/iPad (iOS) App Store reviews from every country in one run, from Apple official public review feeds. Ratings, text, app version, votes, plus a summary by star, country and version. Only-new-reviews mode for monitoring.

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

## Pricing

from $0.10 / 1,000 review saveds

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?

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: All Countries at Once

Get iPhone and iPad app reviews from **every App Store country in one run**. Apple splits reviews
by country, so most tools only show you the US. This one collects them all (or the countries you
pick) and adds a ready-made summary.

Data comes from **Apple's official public review feeds** and the iTunes lookup API.

### Who it's for

- **Product managers and developers:** see what users complain about in each version, in each market.
- **Marketers and ASO teams:** track ratings by country after a launch or an update.
- **Competitor research:** read every complaint about a competitor's app, worldwide.
- **Support teams:** run it daily with *Only new reviews* and get just the new ones.
- **AI and NLP:** clean JSON ready for sentiment analysis or summarizing.

### Input

| Field | What it does |
|---|---|
| **Apps** | App Store link, numeric app ID, or app name (the top search result is used). |
| Countries | Two-letter codes like `us`, `gb`, `jp`, or `all` for about 150 countries. |
| Max reviews per country | Up to 500, the newest first. |
| Minimum / maximum stars | e.g. max 2 to get only complaints. |
| Only new reviews since my last run | Returns only reviews you haven't received before. You only pay for new ones. |

### Output

One row per review:

```json
{
  "appId": "570060128",
  "appName": "Duolingo: Language Lessons",
  "country": "gb",
  "reviewId": "12345678901",
  "rating": 2,
  "title": "Too many ads now",
  "text": "…",
  "appVersion": "7.142.0",
  "date": "2026-09-30T08:12:44.000Z",
  "helpfulVotes": 3,
  "totalVotes": 4,
  "url": "https://apps.apple.com/gb/app/id570060128?see-all=reviews"
}
```

Plus a `SUMMARY` record per app: average rating of the collected reviews, counts by star,
by country and by app version (with average stars per version), and the app's overall store
rating.

### Pricing

You pay **per review saved**. Apps that aren't found and reviews filtered out are free.
See the Pricing tab.

### Limits, honestly

- Apple's public feeds share up to the **500 newest reviews per country** per app. Older
  reviews aren't available this way.
- Ratings without a written review aren't included in the feeds.
- Reviewer names are left out on purpose: you get the review, not the person.
- App names are matched with Apple's search; for an exact app, paste its link or ID.

### More tools from SwiftKit

- [Website Screenshot Tool](https://apify.com/swiftkit/website-screenshots): bulk full-page and mobile screenshots, PNG/JPEG/PDF
- [Tech Stack Detector](https://apify.com/swiftkit/tech-stack): what a website is built with: CMS, analytics, ecommerce, hosting
- [Website Contact Finder](https://apify.com/swiftkit/website-contacts): company socials, phones and shared inboxes from a website
- [RSS Feed Reader](https://apify.com/swiftkit/rss-feeds): news, blogs and podcasts from any feed or website, only new items
- [App Store Scraper](https://apify.com/swiftkit/app-store): app search, details, top charts and keyword ranks from Apple’s official APIs

### Questions?

Open an issue on the Issues tab.

# Actor input Schema

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

One per line: an App Store link (https://apps.apple.com/us/app/…/id284882215), a numeric app ID, or an app name (the top search result is used).

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

Two-letter App Store country codes (us, gb, jp, de…). Use "all" for every country (about 150).

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

Apple shares up to the 500 newest reviews per country.

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

Keep reviews with at least this many stars.

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

Keep reviews with at most this many stars. Set 2 to get only complaints.

## `onlyNewReviews` (type: `boolean`):

Remember reviews already returned and output only new ones. Use with a daily schedule. You only pay for new reviews.

## `trackerName` (type: `string`):

Use different names to keep separate 'new reviews' memories.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128"
  ],
  "countries": [
    "us",
    "gb"
  ],
  "maxReviewsPerCountry": 500,
  "minRating": 1,
  "maxRating": 5,
  "onlyNewReviews": false,
  "trackerName": "default"
}
```

# Actor output Schema

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

One row per review.

## `summary` (type: `string`):

Average rating and counts by star, country and app version.

# 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/duolingo-language-lessons/id570060128"
    ],
    "countries": [
        "us",
        "gb"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("swiftkit/app-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/duolingo-language-lessons/id570060128"],
    "countries": [
        "us",
        "gb",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("swiftkit/app-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/duolingo-language-lessons/id570060128"
  ],
  "countries": [
    "us",
    "gb"
  ]
}' |
apify call swiftkit/app-reviews --silent --output-dataset

```

## MCP server setup

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