# Apple App Store Reviews Scraper 🍏 (no key) (`tagadanar/apple-app-store-reviews`) Actor

Scrape Apple App Store app reviews by app id, App Store URL or bundle id: rating, title, review text, author, date, app version and helpful votes as structured JSON, from any country storefront. No browser, no API key: one flat price per review with platform usage included.

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

## Pricing

from $0.11 / 1,000 review scrapeds

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/platform/actors/running/actors-in-store#pay-per-event

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

## Apple App Store Reviews Scraper: iOS App Reviews as JSON

Pull Apple App Store reviews for any iOS app into clean JSON. Give it an app id, an App Store URL or a bundle id and it returns each review with the fields you actually use: star rating, review title, text, author, date, app version and helpful votes, from whichever country storefronts you pick.

It reads Apple's own public reviews feed, so you get the same reviews the App Store shows, without driving a browser and without an API key or an Apple developer account. There is no login and no scraping of fragile page markup; the actor calls the feed directly and pages through the results.

Tracking an app that ships on both stores? The [Google Play Reviews Scraper](https://apify.com/tagadanar/google-play-reviews) returns the same core columns (rating, text, author, date, app version), so both stores land in one table with no remapping.

### What you get per review

| Field | Description |
| --- | --- |
| `rating` | Star rating, 1 to 5 |
| `title` | Review title (App Store reviews have one, unlike Google Play) |
| `text` | Review body |
| `userName`, `userUrl` | Reviewer name and public profile URL |
| `date` | When the review was posted (ISO 8601) |
| `appVersion` | App version the review was written against |
| `thumbsUp`, `voteCount` | Net helpful votes and total votes |
| `reviewId` | Apple's id for the review |
| `appId`, `appName`, `bundleId` | The app the review belongs to |
| `country` | The storefront the review came from |
| `sourceUrl`, `scrapedAt` | App Store link and the run timestamp |

### Who uses it

- **Product and mobile teams** tracking their iOS app's reviews, ratings and version feedback over time.
- **Support and CX teams** catching complaints early, per country storefront.
- **Competitor analysis** reading rival apps' reviews for feature requests and pain points.
- **Dual-store dashboards** pairing this actor with the [Google Play Reviews Scraper](https://apify.com/tagadanar/google-play-reviews) for one combined review table.

### Input examples

One app, most recent reviews first:

```json
{
  "appIds": ["324684580"],
  "sort": "mostRecent",
  "maxReviewsPerApp": 500
}
````

Several apps in one run, by URL, id or bundle id (each is scraped independently):

```json
{
  "appIds": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
    "net.whatsapp.WhatsApp",
    "544007664"
  ],
  "maxReviewsPerApp": 300
}
```

More than 500 reviews for a popular app: add storefronts. Apple serves the 500 most recent reviews per country, so five storefronts means up to 2,500.

```json
{
  "appIds": ["324684580"],
  "countries": ["us", "gb", "ca", "au", "fr"],
  "maxReviewsPerApp": 2500
}
```

### How it works

Each entry is resolved through Apple's public lookup API (so a bundle id or a pasted URL becomes the right app), then the actor pages through the customer-reviews feed of each storefront you selected, deduping by review id. It stops an app when your `maxReviewsPerApp` is reached, and stops a storefront when Apple's feed runs out. Sort by most recent or most helpful.

### Pricing

You pay per review returned. Platform usage is included in the price and the actor uses no proxy at all, so there is no subscription and no usage line on your bill.

| Event | Price |
| --- | --- |
| Review scraped | $0.15 per 1,000 |
| Actor start | $0.001 per run |

The tiny start fee covers runs that return nothing; on any normal run it is noise next to the per-review price.

### FAQ

**Do I need an API key or an Apple account?** No. The reviews feed is public; the actor reads it directly with no key and no login.

**Where do I find the app id?** It is the number after `id` in the app's App Store URL, for example `324684580` in `apps.apple.com/us/app/spotify-music-and-podcasts/id324684580`. You can also paste the whole URL, or use the bundle id if you know it.

**How many reviews can I get?** Apple's public feed serves the 500 most recent reviews per app per storefront. That is a hard ceiling on Apple's side, every tool has it. To go further, add storefronts: each country adds up to 500 more.

**Can I get reviews from a specific country?** Yes. Set `countries` to any list of two-letter storefront codes and each review record carries the storefront it came from.

**Do I get developer replies?** No. Apple does not publish developer replies in the public feed, so no scraper can return them from this source. Google Play does include them, and the [Google Play Reviews Scraper](https://apify.com/tagadanar/google-play-reviews) returns them.

**Does it return ratings without review text?** No. The feed only contains written reviews. The app's overall average rating and rating count are visible on the app's store page.

**Do you scrape Google Play too?** Yes, with the [Google Play Reviews Scraper](https://apify.com/tagadanar/google-play-reviews). Same core schema, so you can merge both stores into one table.

***

### Something missing?

If you need an extra field or app metadata (overall rating, price, category), open an issue on this Actor and describe it. I read every request and small additions usually ship within days. More review and monitoring Actors are on [my profile](https://apify.com/tagadanar).

*App Store reviews scraper, Apple app reviews, iOS app reviews, scrape App Store, app review monitoring, iTunes reviews, App Store reviews API alternative, app store optimization, ASO reviews, mobile app feedback.*

# Actor input Schema

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

Which apps to scrape. One entry per app: the numeric App Store id (e.g. <code>324684580</code>), a full App Store URL (e.g. <code>https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580</code>), or the bundle id (e.g. <code>com.spotify.client</code>). Each app is scraped independently.

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

Two-letter storefront codes to pull reviews from (e.g. <code>us</code>, <code>gb</code>, <code>fr</code>, <code>de</code>). Apple serves the 500 most recent reviews per storefront, so adding storefronts is how you collect more reviews for a popular app.

## `sort` (type: `string`):

Which reviews to pull first. Apple offers these two orders.

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

How many reviews to return per app, counted across all selected storefronts. Apple's public feed serves at most 500 reviews per app per storefront, so the practical ceiling is 500 times the number of storefronts.

## Actor input object example

```json
{
  "appIds": [
    "324684580"
  ],
  "countries": [
    "us"
  ],
  "sort": "mostRecent",
  "maxReviewsPerApp": 50
}
```

# Actor output Schema

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

One item per review in the default dataset.

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

// Run the Actor and wait for it to finish
const run = await client.actor("tagadanar/apple-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": ["324684580"],
    "countries": ["us"],
    "maxReviewsPerApp": 50,
}

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Apple App Store Reviews Scraper 🍏 (no key)",
        "description": "Scrape Apple App Store app reviews by app id, App Store URL or bundle id: rating, title, review text, author, date, app version and helpful votes as structured JSON, from any country storefront. No browser, no API key: one flat price per review with platform usage included.",
        "version": "0.1",
        "x-build-id": "CMoRmdslFmJT38ihg"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/tagadanar~apple-app-store-reviews/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-tagadanar-apple-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/tagadanar~apple-app-store-reviews/runs": {
            "post": {
                "operationId": "runs-sync-tagadanar-apple-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/tagadanar~apple-app-store-reviews/run-sync": {
            "post": {
                "operationId": "run-sync-tagadanar-apple-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",
                "required": [
                    "appIds"
                ],
                "properties": {
                    "appIds": {
                        "title": "App ids, App Store URLs or bundle ids",
                        "minItems": 1,
                        "type": "array",
                        "description": "Which apps to scrape. One entry per app: the numeric App Store id (e.g. <code>324684580</code>), a full App Store URL (e.g. <code>https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580</code>), or the bundle id (e.g. <code>com.spotify.client</code>). Each app is scraped independently.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "countries": {
                        "title": "Country storefronts",
                        "type": "array",
                        "description": "Two-letter storefront codes to pull reviews from (e.g. <code>us</code>, <code>gb</code>, <code>fr</code>, <code>de</code>). Apple serves the 500 most recent reviews per storefront, so adding storefronts is how you collect more reviews for a popular app.",
                        "default": [
                            "us"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "sort": {
                        "title": "Sort order",
                        "enum": [
                            "mostRecent",
                            "mostHelpful"
                        ],
                        "type": "string",
                        "description": "Which reviews to pull first. Apple offers these two orders.",
                        "default": "mostRecent"
                    },
                    "maxReviewsPerApp": {
                        "title": "Max reviews per app",
                        "minimum": 1,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "How many reviews to return per app, counted across all selected storefronts. Apple's public feed serves at most 500 reviews per app per storefront, so the practical ceiling is 500 times the number of storefronts.",
                        "default": 500
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
