# App Store Scraper (`donjuan_mime/app-store`) Actor

Scrape iOS App Store apps and reviews: ratings, review text, versions, prices, developers, and screenshots in any country. No login or API key.

- **URL**: https://apify.com/donjuan_mime/app-store.md
- **Developed by:** [Donjuan](https://apify.com/donjuan_mime) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.50 / 1,000 items

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 Scraper: iOS apps, ratings, and reviews from any country

App Store Scraper collects iOS app details and user reviews from Apple's App Store. Give it app IDs, App Store links, or search terms, and you get each app's rating, number of ratings, price, version history dates, size, developer, genres, languages, description, release notes, icon, and screenshots. Turn on reviews to also get each review's rating, headline, text, app version, date, and helpful votes.

You don't need an Apple account, an API key, or any code. The actor reads Apple's public iTunes endpoints without a browser, so runs are fast and cheap: in our tests it collected 4 apps and 2,000 reviews in 17 seconds.

### What can you do with App Store data?

- **Track your app's reputation.** Pull the newest reviews every day and catch complaints about a new release before they hit your rating.
- **Analyze competitors.** Compare ratings, prices, update frequency, and what users praise or hate in rival apps.
- **Find feature requests and bugs.** Feed review text into sentiment or topic analysis to see what users ask for.
- **Research a market.** Search a category in several countries and compare which apps lead, what they cost, and how users rate them.
- **Monitor releases.** Watch version numbers, release dates, and release notes of the apps you care about.
- **Build datasets.** Export apps and reviews to a spreadsheet or database for research or model training.

### What data does App Store Scraper extract?

| Group | Fields |
|---|---|
| App | App ID, bundle ID, URL, title, description, release notes, icon, iPhone and iPad screenshots |
| Developer | name, ID, App Store developer page, seller name, seller website |
| Ratings | average rating, number of ratings, rating and number of ratings for the current version |
| Store details | price, formatted price, currency, free flag, primary genre, genres, age rating, content advisories, languages |
| Versions | current version, first release date, current version release date, size in bytes, minimum iOS version |
| Reviews | review ID, rating, headline, text, app version, date, helpful votes, total votes, reviewer name and link |

### How to scrape the App Store

1. Open the actor and go to the **Input** tab.
2. Add app IDs (`284882215` or `com.facebook.Facebook`), App Store links, or search terms.
3. Pick a country and decide whether you want reviews.
4. Press **Start**. When the run finishes, open the **Output** tab and switch between the **Apps** and **Reviews** views, or press **Export**.

### Input

| Field | Type | Description |
|---|---|---|
| `appIds` | array of strings | Numeric App Store IDs (`284882215`, `id284882215`) or bundle IDs (`com.facebook.Facebook`). |
| `startUrls` | array | App Store app links. The country in the link wins over `country`. |
| `searchQueries` | array of strings | Search terms. The actor scrapes the apps Apple returns. |
| `maxAppsPerSearch` | integer | Apps per search query, up to 200. Default 50. |
| `country` | string | Two-letter App Store country code, such as `us`, `gb`, `de`, or `ua`. Default `us`. |
| `includeReviews` | boolean | Also scrape reviews. Default `true`. |
| `maxReviewsPerApp` | integer | Reviews per app and country, up to 500. Default 500. |
| `reviewsSort` | string | `mostRecent` or `mostHelpful`. |
| `proxyCountryCode` | string | A two-letter code to use Apify residential proxy in that country. `None` uses Apify datacenter proxy. |

#### Input example

```json
{
  "appIds": ["284882215", "com.burbn.instagram"],
  "startUrls": [
    { "url": "https://apps.apple.com/gb/app/spotify-music-and-podcasts/id324684580" }
  ],
  "searchQueries": ["habit tracker"],
  "maxAppsPerSearch": 20,
  "country": "us",
  "includeReviews": true,
  "maxReviewsPerApp": 200,
  "reviewsSort": "mostRecent",
  "proxyCountryCode": "None"
}
```

### Output

The dataset holds two kinds of items. Every item has a `type` field: `app` for an app and `review` for a review. Each review carries `appId` and `appTitle`, so you can join reviews to their app. The **Apps** and **Reviews** views in the Output tab show the columns that matter for each kind.

#### App example

Real output for Facebook in the US store. Long text is shortened.

```json
{
  "type": "app",
  "appId": "284882215",
  "bundleId": "com.facebook.Facebook",
  "url": "https://apps.apple.com/us/app/facebook/id284882215",
  "title": "Facebook",
  "developer": "Meta Platforms, Inc.",
  "developerId": "284882218",
  "developerUrl": "https://apps.apple.com/us/developer/meta-platforms-inc/id284882218",
  "seller": "Meta Platforms, Inc.",
  "sellerUrl": "http://www.facebook.com/mobile",
  "primaryGenre": "Social Networking",
  "genres": ["Social Networking"],
  "price": 0,
  "formattedPrice": "Free",
  "currency": "USD",
  "free": true,
  "score": 4.52633,
  "ratingsCount": 28802693,
  "currentVersionScore": 4.52633,
  "currentVersionRatingsCount": 28802693,
  "version": "583.0.0",
  "releaseDateISO": "2019-02-05T08:00:00.000Z",
  "currentVersionReleaseDateISO": "2026-10-14T09:58:25.000Z",
  "size": 518962176,
  "minimumOsVersion": "15.1",
  "contentRating": "12+",
  "advisories": ["Infrequent/Mild Profanity or Crude Humor"],
  "languages": ["EN", "DE", "FR", "UK"],
  "description": "Where real people propel your curiosity. Whether you're thrifting gear, showing ...",
  "releaseNotes": "Our teams have solved many crashes, fixed issues you've reported and made the ap...",
  "icon": "https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/38/04/23/.../512x512bb.jpg",
  "screenshots": ["https://is1-ssl.mzstatic.com/image/thumb/.../392x696bb.png"],
  "country": "us",
  "input": "284882215"
}
```

#### Review example

```json
{
  "type": "review",
  "reviewId": "14676309252",
  "appId": "284882215",
  "appTitle": "Facebook",
  "country": "us",
  "userName": "Rack👍🏾",
  "userUrl": "https://itunes.apple.com/us/reviews/id1474323466",
  "score": 5,
  "title": "Good",
  "text": "❤️",
  "version": "583.0.0",
  "createdAtISO": "2026-10-17T06:19:50.000Z",
  "helpfulVotes": 0,
  "totalVotes": 0,
  "input": "284882215"
}
```

#### Output fields

| Field | Description |
|---|---|
| `type` | `app` or `review`. |
| `appId`, `bundleId` | Apple's numeric ID and the developer's bundle ID. |
| `score`, `ratingsCount` | Average rating from 1 to 5 and the number of ratings in the chosen country. |
| `currentVersionScore`, `currentVersionRatingsCount` | The same for the current version. |
| `price`, `formattedPrice`, `currency`, `free` | Price in the chosen country's store. |
| `releaseDateISO`, `currentVersionReleaseDateISO` | First release and latest update, ISO 8601 in UTC. |
| `size` | Download size in bytes. |
| `languages` | Supported languages as upper-case ISO 639-1 codes. |
| `title` | The app name for apps, the review headline for reviews. |
| `text` | The review body. |
| `version` | The current version for apps, the version the reviewer used for reviews. |
| `helpfulVotes`, `totalVotes` | How many people found the review helpful, out of all who voted. |
| `input` | The app ID, link, or search term that found the item. |

### Limits

- **500 reviews per app per country.** Apple's public review feed stops at 10 pages of 50. For a popular app, the 500 newest reviews may cover only a few days. To collect more, run the same app in several countries, or run once with `mostRecent` and once with `mostHelpful`.
- **No developer replies.** Apple's public feed doesn't include the developer's responses to reviews.
- **Search returns up to 200 apps** per query, in the order Apple ranks them.
- **iOS apps only.** Mac-only apps and in-app purchases aren't covered.
- Apple throttles heavy traffic. The actor retries a failed request up to 5 times, each time from a new IP.

### How much does it cost?

You pay $0.50 per 1,000 dataset items, and an app and a review each count as one item. For example, 10 apps with 100 reviews each make 1,010 items and cost about $0.50.

### Export and integrations

The results go into an Apify dataset. From there you can:

- download them as JSON, CSV, Excel, XML, HTML, or RSS from the **Output** tab;
- send them to Google Sheets, Slack, Zapier, Make, and other tools through Apify integrations;
- schedule runs, for example every morning, to track new reviews;
- start runs and read the results from your own code through the Apify API.

```bash
curl -X POST "https://api.apify.com/v2/acts/<username>~app-store-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"appIds": ["284882215"], "maxReviewsPerApp": 100}'
```

### FAQ

#### Do I need an Apple account or API key?

No. The actor reads Apple's public iTunes lookup, search, and review feeds.

#### Can I get all reviews of an app?

Apple's public feed serves the newest 500 reviews per country. Running several countries, or both sort orders, gives you more distinct reviews.

#### Why do ratings differ between countries?

Each App Store country keeps its own ratings, reviews, and prices. Set `country`, or use a link that contains the country, to pick one.

#### Can I scrape Google Play too?

Not with this actor. It covers Apple's App Store only.

#### Is it legal to scrape the App Store?

The actor collects only public data that anyone can see without logging in. Reviews can contain personal data such as usernames, so make sure you have a legitimate reason to collect it and follow the GDPR and other laws that apply to you. If you're not sure, ask a lawyer.

### Disclaimer

This actor is provided as is, without warranty. You're responsible for how you use it and for following Apple's terms and the laws that apply to you. Apple isn't affiliated with this actor.

# Actor input Schema

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

Numeric App Store IDs (284882215 or id284882215) or bundle IDs (com.facebook.Facebook).

## `startUrls` (type: `array`):

Links to App Store app pages, for example https://apps.apple.com/gb/app/spotify-music-and-podcasts/id324684580. The country in the link wins over the Country field.

## `searchQueries` (type: `array`):

Search the App Store of the chosen country and scrape the apps it returns.

## `maxAppsPerSearch` (type: `integer`):

The maximum number of apps to take from each search query. Apple returns up to 200.

## `country` (type: `string`):

Two-letter App Store country code, such as us, gb, de, or ua. Prices, ratings, and reviews differ per country.

## `includeReviews` (type: `boolean`):

Also scrape each app's reviews, one dataset item per review.

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

The maximum number of reviews per app and country. Apple serves up to 500.

## `reviewsSort` (type: `string`):

Most recent first, or Apple's most helpful ranking.

## `proxyCountryCode` (type: `string`):

Two-letter country code (US, DE, ...) to use Apify residential proxy in that country. "None" uses Apify datacenter proxy.

## Actor input object example

```json
{
  "appIds": [
    "284882215"
  ],
  "maxAppsPerSearch": 50,
  "country": "us",
  "includeReviews": true,
  "maxReviewsPerApp": 100,
  "reviewsSort": "mostRecent",
  "proxyCountryCode": "None"
}
```

# Actor output Schema

## `items` (type: `string`):

One item per app (type "app") and one per review (type "review").

# 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": [
        "284882215"
    ],
    "maxReviewsPerApp": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("donjuan_mime/app-store").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": ["284882215"],
    "maxReviewsPerApp": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("donjuan_mime/app-store").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": [
    "284882215"
  ],
  "maxReviewsPerApp": 100
}' |
apify call donjuan_mime/app-store --silent --output-dataset

```

## MCP server setup

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

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/oRwe0DfnuBQach2cF/builds/nv2TEoxhyRAPkHT9P/openapi.json
