# App Store Search Scraper (`cirkit/app-store-search-scraper`) Actor

Search the Apple App Store across any storefront and get the full 40-field app record - ratings, pricing, size, version history, screenshots and publisher - plus customer reviews attached free inside the row, read with the retry logic Apple's flaky review feed actually needs.

- **URL**: https://apify.com/cirkit/app-store-search-scraper.md
- **Developed by:** [Crikit](https://apify.com/cirkit) (community)
- **Categories:** E-commerce, Business, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 1,000 app returneds

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## App Store Search Scraper

**Scrape the Apple App Store** across any storefront. This **App Store scraper** returns the full 40-field app record — ratings, pricing, file size, version and release notes, screenshots, supported devices, content rating, languages, and publisher — plus **customer reviews attached free inside the same row**, read with retry logic tuned for Apple's rate limiting.

No Apple App Store API key, no login, and no headless browser. Results land in a structured dataset you can export to JSON, CSV, Excel, or XML, or pull straight from the Apify API.

### What is App Store Search Scraper?

App Store Search Scraper is an [Apify Actor](https://apify.com/actors) that extracts app records with ratings, pricing, and reviews from [Apple App Store](https://www.apple.com/app-store/) and returns them as clean, structured records. Reviews come at no extra charge, which is unusual: most App Store Actors bill reviews as separate rows, so a review-heavy research run costs several times more elsewhere.

### What data can this App Store scraper extract?

Every run writes one row per app. The full schema carries **53 fields**; the most-used ones are below.

| Field | Type | Description |
| --- | --- | --- |
| `appId` | string | Apple's numeric identifier for the app. Stable across runs and storefronts, and the key this Actor deduplicates... |
| `bundleId` | string | Reverse-DNS bundle identifier, e.g. com.duolingo.DuolingoMobile. The key that joins an App Store row to a Google... |
| `title` | string | App name as published on the storefront searched. |
| `developer` | string | The seller Apple lists for the app. |
| `developerId` | string | Apple's numeric identifier for the developer. |
| `developerUrl` | string | App Store page listing everything this developer publishes. |
| `appStoreUrl` | string | Public App Store page for the app. |
| `description` | string | Full App Store description text. |
| `releaseNotes` | string | What's-new text for the current version. |
| `version` | string | Current version string. |
| `price` | number | Numeric price in the storefront's currency. 0 for free apps. |
| `formattedPrice` | string | Price as Apple displays it, e.g. "Free" or "$4.99". |
| `currency` | string | ISO currency code for the storefront searched. |
| `isFree` | boolean | True when price is zero. Null when Apple returned no price. |
| `averageUserRating` | number | Mean star rating across all versions, rounded to two decimals. |
| `userRatingCount` | number | How many ratings that average is built from. The number that says whether the rating means anything. |
| `averageUserRatingCurrentVersion` | number | Mean star rating for the current version only. |
| `userRatingCountCurrentVersion` | number | Ratings counted for the current version only. |
| `primaryGenre` | string | Apple's main category for the app. |
| `primaryGenreId` | string | Numeric id of the primary genre, for feeding back into the genre filter. |
| `genres` | array | Every genre Apple assigns the app. |
| `genreIds` | array | Numeric ids matching the genres above. |

See the **Output** tab in Apify Console for all 53 fields.

### How to scrape Apple App Store app listings

1. Open [App Store Search Scraper](https://apify.com/cirkit/app-store-search-scraper) and click **Try for free**.
2. Add `searchTerms` and `countries`, or pass specific `appIds`.
3. Use `chartCountries` and `chartType` to pull top charts instead of search results.
4. Filter with `genreId`, `minRating`, `freeOnly`, and `platforms`.
5. Turn on `includeReviews` and set `maxReviewsPerApp`.
6. Click **Start** and watch rows appear live in the **Output** tab.
7. Export the dataset as JSON, CSV, Excel, or XML — or fetch it from the [Apify API](https://docs.apify.com/api/v2) once the run finishes.

### App Store Search Scraper input options

| Input | Type | What it does | Default |
| --- | --- | --- | --- |
| `searchTerms` | array | Keywords to search the App Store for. Apple caps every search at 200 apps and ignores paging, so add more keywords... | `see schema` |
| `countries` | array | Two-letter country codes for the App Store storefronts to search. Each storefront has its own catalogue, pricing and... | `["us"]` |
| `platforms` | array | Which App Store catalogue to search: iphone, ipad or mac. Each is a separate catalogue, so listing more than one... | `["iphone"]` |
| `appIds` | array | Look specific apps up directly. Accepts a numeric App Store ID (570060128), a reverse-DNS bundle ID... |  |
| `chartCountries` | array | Two-letter country codes to pull Apple's official top-apps chart for. Every row from a chart carries its chartRank. |  |
| `chartType` | string | Which chart to pull. Apple publishes top-free and top-paid for apps; there is no top-grossing chart for apps. | `"top-free"` |
| `chartLimit` | integer | How many ranked apps to take from each chart. | `50` |
| `maxItems` | integer | Hard cap on how many apps this run returns, and therefore on what it costs. Duplicates and filters are applied... | `25` |
| `maxResultsPerTerm` | integer | How many apps to take from each keyword-and-storefront pair. Apple's own hard ceiling is 200 regardless of what is... | `50` |
| `genreId` | integer | Restrict results to one App Store genre, for example 6017 Education, 6015 Finance, 6013 Health & Fitness, 6002... |  |
| `searchAttribute` | string | Which field the keyword has to match. 'Developer' is much stricter than the default, which matches app names,... | `"any"` |
| `minRating` | integer | Drop apps rated below this (1-5). Applied before the max-apps cap, so you get a full page of apps that pass rather... |  |
| `freeOnly` | boolean | Keep only apps priced at zero in the storefront searched. | `false` |
| `includeReviews` | boolean | Attach customer reviews to each app row, with rating, title, body, author, app version and helpful-vote counts.... | `false` |
| `maxReviewsPerApp` | integer | How many reviews to attach when the option above is on. Apple's hard ceiling is 500 (10 pages of 50) per app and... | `50` |
| `reviewsSortBy` | string | Which review order to ask Apple for first. If that order comes back degraded, the Actor automatically tries the... | `"mostrecent"` |

Proxy is configured through the standard `proxyConfiguration` object; the defaults shipped with this Actor are already tuned for the target site.

### Example output

```json
{
  "appId": "a1b2c3d4",
  "bundleId": "a1b2c3d4",
  "title": "Example title",
  "developer": "...",
  "developerId": "a1b2c3d4",
  "developerUrl": "https://example.com/item/12345",
  "appStoreUrl": "https://example.com/item/12345",
  "description": "Example text ...",
  "releaseNotes": "...",
  "version": "...",
  "price": 129.99,
  "formattedPrice": "...",
  "currency": "USD",
  "isFree": true,
  "averageUserRating": 4.7,
  "userRatingCount": 4.7,
  "averageUserRatingCurrentVersion": 4.7,
  "userRatingCountCurrentVersion": 4.7
}
```

### How much does it cost to scrape Apple App Store?

This Actor runs on **pay per result** pricing: **$0.0009 per app record** ($0.9 per 1,000). A one-time start fee of $0.00005 applies per run.

| Results | Approximate cost |
| --- | --- |
| 1,000 | $0.90 |
| 10,000 | $9.00 |
| 100,000 | $90.00 |

You pay for rows you actually receive, so a search that returns nothing costs nothing beyond the start fee. Every Apify account includes free monthly usage credit, so you can trial App Store Search Scraper at no cost.

### What can you build with Apple App Store data?

#### Run App Store optimisation research

Rating counts and rating averages across everything ranking for a keyword show what it takes to compete for that term in a given storefront.

#### Track competitor releases and positioning

Version history and release notes reveal a competitor's shipping cadence and the features they choose to promote.

#### Mine reviews for product feedback

Because reviews are included free, pulling thousands of them across a competitive set is genuinely affordable.

#### Compare app markets across countries

The same app is priced, rated, and ranked differently by storefront — multi-country runs expose that directly.

#### Find publishers for partnership or acquisition

Developer fields let you group apps by publisher and see the full portfolio behind a single app.

### Apple App Store scraping tips and limits

- Apple rate-limits aggressively. The Actor retries with backoff, so a slower run is expected behaviour rather than a fault.
- `countries` genuinely changes results — rankings, pricing, and availability are all per storefront.
- `searchAttribute` narrows matching to a specific field, which cuts noise substantially on generic keywords.
- Reviews being free here is the reason to use this Actor for sentiment work rather than a per-review-priced alternative.

### Integrations and automation

Run App Store Search Scraper on a [schedule](https://docs.apify.com/platform/schedules) to keep a Apple App Store dataset fresh, or trigger it from your own stack through the [Apify API](https://docs.apify.com/api/v2) and the official [JavaScript](https://docs.apify.com/sdk/js) and [Python](https://docs.apify.com/sdk/python) clients. Native [integrations](https://docs.apify.com/platform/integrations) push results into Google Sheets, Slack, Airtable, Zapier, Make, GitHub, or any webhook endpoint. The Actor also works as an [MCP](https://docs.apify.com/platform/integrations/mcp) tool, so an AI agent can call it directly.

### Related scrapers

| Actor | What it does |
| --- | --- |
| [Google Play Store Scraper](https://apify.com/cirkit/google-play-store-scraper) | The same research on Google Play, with permissions and data safety. |
| [Apple Podcasts Search Scraper](https://apify.com/cirkit/apple-podcasts-search-scraper) | Apple's podcast catalog with owner contact from RSS. |
| [Google Trends Scraper](https://apify.com/cirkit/google-trends-scraper) | Search demand for the app categories you track. |
| [Steam Store Search Scraper](https://apify.com/cirkit/steam-store-search-scraper) | PC game catalog and review scores. |

### Frequently asked questions

#### Are reviews charged separately?

No. Customer reviews are attached inside the app record at no extra cost, which is what makes large-scale review research affordable with this Actor.

#### Can I scrape App Store top charts?

Yes. Set `chartCountries` and `chartType` and the Actor returns ranked chart entries with `chartRank` on each row.

#### Do I need a Apple App Store API key?

No. App Store Search Scraper reads publicly available Apple App Store pages and endpoints directly, so there is no key to obtain, no OAuth app to register, and no account to connect.

#### Can I export Apple App Store data to CSV, Excel, or Google Sheets?

Yes. Every run stores results in an Apify dataset that exports to JSON, JSONL, CSV, Excel, XML, or HTML with one click, and the Google Sheets integration writes rows straight into a spreadsheet.

#### Can I run App Store Search Scraper on a schedule?

Yes. Apify schedules run the Actor hourly, daily, weekly, or on any cron expression, and webhooks can notify your systems the moment a run finishes.

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

Scraping publicly available data is broadly lawful in the US and EU, but the answer depends on what you collect and how you use it. This Actor is built to gather public app listing and review information Apple publishes publicly in the App Store. Personal data carries extra obligations under GDPR and CCPA. Read Apify's guide on [whether web scraping is legal](https://blog.apify.com/is-web-scraping-legal/) and take your own legal advice for your use case.

### Support and feedback

Found a bug, a missing field, or a Apple App Store page shape this Actor does not handle yet? Open an issue from the **Issues** tab on the Actor page. Feature requests and custom-scraper enquiries are welcome there too.

# Actor input Schema

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

Keywords to search the App Store for. Apple caps every search at 200 apps and ignores paging, so add more keywords (and more storefronts below) rather than expecting one keyword to return thousands.

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

Two-letter country codes for the App Store storefronts to search. Each storefront has its own catalogue, pricing and ranking, so us + gb + de returns far more distinct apps than us alone. Duplicates are removed across storefronts before anything is charged.

## `platforms` (type: `array`):

Which App Store catalogue to search: iphone, ipad or mac. Each is a separate catalogue, so listing more than one widens the result set.

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

Look specific apps up directly. Accepts a numeric App Store ID (570060128), a reverse-DNS bundle ID (com.duolingo.DuolingoMobile), or a full App Store URL — whichever you happen to have.

## `chartCountries` (type: `array`):

Two-letter country codes to pull Apple's official top-apps chart for. Every row from a chart carries its chartRank.

## `chartType` (type: `string`):

Which chart to pull. Apple publishes top-free and top-paid for apps; there is no top-grossing chart for apps.

## `chartLimit` (type: `integer`):

How many ranked apps to take from each chart.

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

Hard cap on how many apps this run returns, and therefore on what it costs. Duplicates and filters are applied before this cap.

## `maxResultsPerTerm` (type: `integer`):

How many apps to take from each keyword-and-storefront pair. Apple's own hard ceiling is 200 regardless of what is asked for here.

## `genreId` (type: `integer`):

Restrict results to one App Store genre, for example 6017 Education, 6015 Finance, 6013 Health & Fitness, 6002 Utilities, 6014 Games, 6000 Business. Leave empty to search every genre.

## `searchAttribute` (type: `string`):

Which field the keyword has to match. 'Developer' is much stricter than the default, which matches app names, developers and descriptions.

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

Drop apps rated below this (1-5). Applied before the max-apps cap, so you get a full page of apps that pass rather than whatever survives. Leave empty for no rating filter.

## `freeOnly` (type: `boolean`):

Keep only apps priced at zero in the storefront searched.

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

Attach customer reviews to each app row, with rating, title, body, author, app version and helpful-vote counts. Reviews ride inside the app row, so they cost nothing extra. Apple's review feed is genuinely flaky — this Actor retries empty pages, walks past them instead of stopping, and falls back to the other sort order rather than reporting an app as having no reviews.

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

How many reviews to attach when the option above is on. Apple's hard ceiling is 500 (10 pages of 50) per app and storefront.

## `reviewsSortBy` (type: `string`):

Which review order to ask Apple for first. If that order comes back degraded, the Actor automatically tries the other one before giving up.

## `maxRunSeconds` (type: `integer`):

Stop opening new searches after this many seconds and push what has been collected. Protects a very wide search grid from running into the platform timeout and billing the full run. Leave empty for the default.

## `proxyConfiguration` (type: `object`):

Apple's endpoints are open and answer datacenter IPs, so the default proxy setting is all this Actor needs. Residential is available but buys nothing here.

## Actor input object example

```json
{
  "searchTerms": [
    "habit tracker",
    "budget planner"
  ],
  "countries": [
    "us"
  ],
  "platforms": [
    "iphone"
  ],
  "appIds": [],
  "chartCountries": [],
  "chartType": "top-free",
  "chartLimit": 50,
  "maxItems": 25,
  "maxResultsPerTerm": 50,
  "searchAttribute": "any",
  "freeOnly": false,
  "includeReviews": false,
  "maxReviewsPerApp": 50,
  "reviewsSortBy": "mostrecent",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Every app collected in this run, as JSON.

## `appsCsv` (type: `string`):

The same apps as a CSV download.

## `appsExcel` (type: `string`):

The same apps as an Excel workbook.

## `appsWithReviews` (type: `string`):

Apps alongside the reviews attached to each, including which sort order Apple actually served.

# 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 = {
    "searchTerms": [
        "habit tracker",
        "budget planner"
    ],
    "countries": [
        "us"
    ],
    "maxItems": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("cirkit/app-store-search-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 = {
    "searchTerms": [
        "habit tracker",
        "budget planner",
    ],
    "countries": ["us"],
    "maxItems": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("cirkit/app-store-search-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 '{
  "searchTerms": [
    "habit tracker",
    "budget planner"
  ],
  "countries": [
    "us"
  ],
  "maxItems": 25
}' |
apify call cirkit/app-store-search-scraper --silent --output-dataset

```

## MCP server setup

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