# Apple App Store Scraper: App Details, Search, All Countries (`redfoxscout/app-store-scraper`) Actor

Scrape Apple App Store apps by app ID, app link, bundle ID, keyword or developer, in one or many countries per run. Returns price, rating, ratings count, version, release notes, size, screenshots and 45+ fields. Optional star histogram, subtitle and in-app purchases. $1.00 per 1,000 apps.

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

## Pricing

from $0.75 / 1,000 apps

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

Scrape **Apple App Store app data** by **app ID, app link, bundle ID, keyword or developer**, in **one or many countries per run**. Each app has **46 fields**: **price and currency per storefront, rating and ratings count, version, release notes, release and update dates, size, minimum iOS, languages, screenshots and description**. Up to 150 apps are looked up per request. **No login, no API key.**

**Price: $1.00 per 1,000 apps.** Failed lookups and error rows are free, and the same app in the same country is charged once. Apify's free plan ($5 monthly credit) covers about 5,000 apps a month.

![App Store Scraper output table: Minecraft in ten App Store countries with local price, rating and ratings count](https://raw.githubusercontent.com/TikTop-Data/apify-store-assets/main/images/app-store-scraper-output.png)

### Questions it answers

- What does an app cost in the US, UK, Germany and Japan App Stores, and how is it rated in each?
- Which apps does the App Store show for a keyword, and in what order?
- What changed in a competitor's latest version, and when was it released?
- Which apps does a developer publish, and how are they rated?
- Which of my apps are not sold in a given country?

### Who uses this

- 📱 **App developers and ASO teams:** compare price, rating and update frequency with competitors, country by country.
- 📈 **Market researchers:** list the apps that rank for a keyword and size a category by ratings.
- 💲 **Pricing and growth teams:** see how an app prices its listing in each storefront.
- 🔎 **Analysts and AI agents:** feed a sheet, database or agent with structured App Store listings.

### Why this App Store Scraper

- 🌍 **Many countries in one run:** every app and keyword is read in each country you list, one row per app and country.
- ⚡ **Bulk lookups:** up to 150 apps share one request. In a local test, 120 apps in 5 countries (600 rows) took 12 seconds.
- 🧩 **One input for app ID, link or bundle ID:** paste 324684580, an apps.apple.com link or com.spotify.client.
- 🔍 **Keyword search and developer catalogues:** search results carry their rank, and a developer ID returns all their apps.
- ⭐ **Optional page details:** subtitle, one-to-five star counts, in-app purchases, similar apps and privacy labels.
- 💵 **One price:** $1.00 per 1,000 apps, failed lookups free.

### How to use the App Store Scraper

1. Click **Try for free** (a free Apify account is enough).
2. Enter app IDs, App Store links or bundle IDs, and/or search keywords, one per line.
3. Optional: list countries (`us`, `gb`, `de`), set a listing language, or tick **Add page details**.
4. Click **Start**, then download as JSON, CSV or Excel, or schedule the run.

### Input

| Field | Default | What it does |
|---|---|---|
| `apps` | – | App IDs, App Store links or bundle IDs, one per line. Bad entries become free error rows. |
| `searchTerms` | – | Keywords to search, one per line. A keyword returns up to about 200 apps per country. |
| `developers` | – | Developer IDs or developer links. Returns the apps they publish in each country. |
| `countries` | `us` | Two-letter App Store country codes. Every app, keyword and developer is read in each. Empty uses the country in an app link, otherwise `us`. |
| `language` | – | Listing language such as `en_us` or `de_de`. Empty gives each country's own language. |
| `includePageDetails` | `false` | Also read each app's App Store page. Slower, about 3 seconds per app. |
| `maxItems` | 50 | Apps per keyword and developer, per country (max 200). Not a limit on `apps`. |

Example (the input behind the output below):

```json
{ "apps": ["479516143"], "countries": ["us", "gb", "de", "jp", "br", "tr", "in", "mx", "au", "ca"] }
```

### Output

One row per app and country, so the run above returned 10 rows. Search rows also carry `searchRank`, the app's position in Apple's results for that keyword and country. `searchQuery` holds the app ID, bundle ID, keyword or developer ID that produced the row. A real row (Minecraft, US, shortened):

```json
{
  "appId": 479516143,
  "bundleId": "com.mojang.minecraftpe",
  "url": "https://apps.apple.com/us/app/minecraft-play-with-friends/id479516143",
  "title": "Minecraft: Play with Friends!",
  "subtitle": null,
  "developer": "Mojang",
  "developerId": 479516146,
  "developerUrl": "https://apps.apple.com/us/developer/mojang/id479516146",
  "developerWebsite": null,
  "seller": "Mojang AB",
  "price": 6.99,
  "currency": "USD",
  "priceText": "$6.99",
  "free": false,
  "rating": 4.50704,
  "ratingsCount": 843933,
  "ratingCurrentVersion": 4.50704,
  "ratingsCountCurrentVersion": 843933,
  "ratingHistogram": null,
  "primaryGenre": "Games",
  "primaryGenreId": 6014,
  "genres": [
    "Games",
    "Simulation",
    "..."
  ],
  "contentRating": "9+",
  "contentAdvisories": [
    "Infrequent/Mild Cartoon or Fantasy Violence",
    "Infrequent/Mild Contests"
  ],
  "version": "26.52",
  "releaseNotes": "Various bug fixes!",
  "releasedAt": "2011-11-17T08:00:00Z",
  "updatedAt": "2026-09-28T16:23:50Z",
  "sizeBytes": 1327799296,
  "sizeMb": 1327.8,
  "minimumOsVersion": "13.0",
  "supportedDevicesCount": 130,
  "languages": [
    "DA",
    "NL",
    "..."
  ],
  "gameCenter": false,
  "description": "Dive into an open world of building, crafting and survival. Gather resources, survive the ...",
  "icon": "https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/3b/b7/24/3bb724be-0244-933a-af48-ad2195689877/AppIcon-0-0-1x_U007emarketing-0-10-0-85-220.png/512x512bb.jpg",
  "screenshots": [
    "https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/07/47/6f/07476fcd-1ecf-18ca-e7f7-364d6c6cd5e1/pr_source.png/406x228bb.png",
    "https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/74/a6/ed/74a6ed67-e5e9-a1ae-3233-225b651d6bf0/pr_source.png/406x228bb.png",
    "..."
  ],
  "ipadScreenshots": [
    "https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/be/e0/bd/bee0bd58-7fd7-0203-2507-0b95bc2a3f51/pr_source.png/552x414bb.png",
    "https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/ee/d4/7e/eed47e11-d24f-44a7-688b-4307feba8c52/pr_source.png/552x414bb.png",
    "..."
  ],
  "inAppPurchases": null,
  "similarAppIds": null,
  "privacyLabels": null,
  "platform": "iOS",
  "foundBy": "app",
  "searchRank": null,
  "country": "US",
  "language": null,
  "searchQuery": "479516143"
}
```

- `foundBy` is `app`, `search` or `developer`.
- `rating` and `ratingsCount` cover all versions; the `...CurrentVersion` fields cover the latest version.
- `price` is a number in the storefront's own `currency`, and `priceText` is Apple's text, such as "$6.99" or "Free".
- `subtitle`, `ratingHistogram`, `inAppPurchases`, `similarAppIds` and `privacyLabels` are `null` unless you tick **Add page details**.
- A failed lookup adds one row with an `error` field and no charge.

### Example tasks

Ready-made inputs you can open, change and run:

- [Compare an iOS app's price and rating in 10 App Store countries](https://apify.com/redfoxscout/app-store-scraper/examples/app-store-price-by-country-minecraft)

### Compare storefronts in one run

List as many countries as you like. Each app comes back once per country with that storefront's own title, price, currency, rating and ratings count, so a price or rating comparison needs no joins. The run above gave:

| Country | Local price | Rating | Ratings |
|---|---|---|---|
| US | $6.99 | 4.51 | 843,933 |
| GB | £6.99 | 4.46 | 110,533 |
| DE | 6,99 € | 4.42 | 55,207 |
| JP | ¥1,300 | 3.94 | 106,709 |
| BR | R$ 9,90 | 4.39 | 61,998 |
| TR | ₺109,00 | 4.34 | 31,279 |
| IN | ₹ 40 | 4.50 | 16,524 |
| MX | $40.00 | 4.36 | 89,193 |
| AU | $10.95 | 4.41 | 88,670 |
| CA | $9.99 | 4.36 | 86,243 |

Prices are in each country's currency; convert them with your own rates. An app that Apple does not sell in a country comes back as a free error row, which shows you where it is missing.

### Page details

Tick **Add page details** to read each app's public App Store page as well. These fields are not in Apple's search data:

- 🏷️ **`subtitle`:** the line under the app name.
- 📊 **`ratingHistogram`:** how many 1, 2, 3, 4 and 5 star ratings the app has.
- 🛒 **`inAppPurchases`:** the in-app purchases Apple lists on the page (the first ten or so), with name and price as shown.
- 🧲 **`similarAppIds`:** the app IDs of "You Might Also Like".
- 🔒 **`privacyLabels`:** the data types the developer declares as used to track you, linked to you or not linked to you.

A real example (Duolingo, US, shortened):

```json
{
  "appId": 570060128,
  "title": "Duolingo: Learn Languages",
  "subtitle": "Spanish, French, Chess & Math",
  "ratingHistogram": {
    "1": 140472,
    "2": 46742,
    "3": 135631,
    "4": 559902,
    "5": 4644287
  },
  "inAppPurchases": [
    {
      "name": "Barrel of Gems (1200)",
      "price": "$4.99"
    },
    {
      "name": "Super Duolingo",
      "price": "$9.99"
    },
    "..."
  ],
  "similarAppIds": [
    1460579936,
    635966718,
    379968583,
    "..."
  ],
  "privacyLabels": {
    "tracking": [
      "PURCHASES",
      "LOCATION",
      "CONTACT_INFO",
      "..."
    ],
    "linked": [
      "PURCHASES",
      "FINANCIAL_INFO",
      "LOCATION",
      "..."
    ],
    "notLinked": [],
    "notCollected": false
  }
}
```

The page is read at about one app every 2.5 seconds. If Apple does not serve a page, those five fields stay `null` and the row is still returned.

### How much does it cost?

$1.00 per 1,000 apps.

- 100 apps: about $0.10
- 10,000 apps (for example 2,000 apps in 5 countries): about $10
- Failed lookups and error rows: free
- The same app in the same country, found twice in one run: charged once

Apify's free plan gives $5 of credit every month, enough for about 5,000 apps.

### FAQ

**Is this legal?** The Actor reads Apple's public App Store search data and the public app pages that Apple shows to any visitor. It does not log in, use cookies or accounts, or solve CAPTCHAs. The only people data is the developer name and link that Apple publishes on each listing. This is not legal advice, so check the terms and rules that apply to how you use the data.

**How many apps does a keyword return?** Up to about 200 per keyword and country, in Apple's order. Apple does not page further, and it drops some duplicates, so the count is often a little below 200. Use several narrower keywords for a longer list.

**Why does an app come back as "not found"?** The ID is wrong, the app was removed, or Apple does not sell it in that country. The failed lookup is free. Try another country code.

**Does it return reviews, downloads or revenue?** No. Apple does not publish download or revenue numbers. You get the rating summary instead. For review text and developer replies, use the App Store Reviews Scraper.

**Which fields change with the country?** Title, description, release notes, price, currency, rating and ratings count follow the storefront. Set `language` to read the listing text in one language for every country.

**What if Apple rate-limits the run?** The Actor waits and retries. If Apple keeps refusing, the remaining lookups come back as free error rows; run again later or with fewer countries.

### Related Actors

- [App Store Reviews Scraper](https://apify.com/redfoxscout/app-store-reviews-scraper): review text, ratings, dates and developer replies for any iOS app, by country.
- [Google Play Scraper](https://apify.com/redfoxscout/google-play-scraper): the same app details, search and ratings for Android apps.
- [Tech Stack Detector](https://apify.com/redfoxscout/tech-stack-detector): what a website runs on, such as the developerWebsite from this Actor.
- [Company Social Links Finder](https://apify.com/redfoxscout/company-social-links): official social profiles and contact pages from a list of company websites.

# Actor input Schema

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

App IDs, App Store links or bundle IDs, one per line, e.g. 324684580, https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580 or com.spotify.client.

## `searchTerms` (type: `array`):

Keywords to search the App Store for, one per line, e.g. habit tracker or budget app.

## `developers` (type: `array`):

Developers whose apps you want, one per line, e.g. 324684583 or https://apps.apple.com/us/developer/spotify/id324684583.

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

Two-letter App Store country codes, one per line, e.g. us, gb or de; every app and keyword is read in each. Leave empty to use the country in an app link, otherwise us.

## `language` (type: `string`):

Language of the listing text, e.g. en_us, de_de or ja_jp; leave empty to get each country's own language.

## `includePageDetails` (type: `boolean`):

Also read each app's App Store page for the subtitle, star histogram, in-app purchases, similar apps and privacy labels. Slower: about 3 seconds per app.

## `maxItems` (type: `integer`):

Stop each search after this many results.

## `maxConcurrency` (type: `integer`):

How many searches run at once.

## Actor input object example

```json
{
  "apps": [
    "324684580",
    "570060128"
  ],
  "countries": [
    "us"
  ],
  "includePageDetails": false,
  "maxItems": 50,
  "maxConcurrency": 3
}
```

# Actor output Schema

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

No description

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

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

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

```

## MCP server setup

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