# App Store Scraper: Apple Apps, Search & Top Charts (`tidyharvest/appstore-apps-scraper`) Actor

Search the Apple App Store by keyword in any country, look up apps by id, bundle id or URL, list a developer's apps or pull top charts: price, ratings, version, dates, size, screenshots. Inputs that time out are retried, then skipped and listed. From $0.40 per 1,000 apps.

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

## Pricing

from $0.40 / 1,000 app 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/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: Apple Apps, Search & Top Charts

Get **Apple App Store app data** as clean structured rows: **app id, bundle id, name, developer, price and currency, genres, average rating and rating count (all versions and current version), content rating, version, release and update dates, size, minimum iOS, languages, description, release notes, icon and screenshots**. Search by keyword in any country, look up apps by id, bundle id or App Store link, list every app of a developer, or pull Apple's **top free / top paid charts** with ranks.

It reads only **Apple's official public endpoints** (the iTunes Search and Lookup APIs and Apple's top-charts RSS feed), politely and one request at a time. **No browser, no proxy, no login or API key.** From **$0.40 per 1,000 apps**, no start fee.

### What you can do with it

- **App Store optimization (ASO):** see who ranks for a keyword in each country, with ratings, rating counts and update dates.
- **Competitor tracking:** watch competitors' versions, release notes, prices and ratings over time (schedule a daily run).
- **Market research:** top charts per country, a genre's leaders, or every app a publisher has shipped.
- **Lead generation for app businesses:** developer names, developer pages and seller websites of apps in your niche.
- **Data enrichment:** turn a list of bundle ids or App Store links into full metadata.

### Input

| Field | What it does |
|---|---|
| `searchTerms` | Keywords to search, one per line. Results come in Apple's own ranking order (`rank`). |
| `apps` | App ids (`1232780281`), bundle ids (`notion.id`) or App Store links. |
| `developers` | Developer ids (`1232780280`) or developer links: returns all their apps. |
| `charts`, `chartSize` | `top-free` and/or `top-paid`, top 10/25/50/100 per country. |
| `countries` | Storefront codes (`us`, `gb`, `de`, `jp`, ...). Every search, lookup and chart runs per country. Default `us`. |
| `maxResultsPerSearch` | Per term and country, 1-200. Default 50. |
| `priceFilter`, `minRating`, `minRatingCount`, `genre` | Keep only matching apps. Applied before you are charged. |
| `maxItems` | Hard cap on apps for the run (and on cost). Default 100. |

Example:

```json
{ "searchTerms": ["meditation", "sleep sounds"], "countries": ["us", "gb", "de"], "maxResultsPerSearch": 100, "minRatingCount": 100, "maxItems": 500 }
```

### Output

One item per app and country:

```json
{
  "appId": 1232780281,
  "bundleId": "notion.id",
  "name": "Notion: Notes, Tasks, AI",
  "url": "https://apps.apple.com/us/app/notion-notes-tasks-ai/id1232780281",
  "country": "us",
  "developer": "Notion Labs, Incorporated",
  "developerId": 1232780280,
  "developerUrl": "https://apps.apple.com/us/developer/notion-labs-incorporated/id1232780280",
  "seller": "Notion Labs, Incorporated",
  "sellerUrl": "https://www.notion.so",
  "price": 0.0, "formattedPrice": "Free", "currency": "USD", "isFree": true,
  "primaryGenre": "Productivity", "genres": ["Productivity", "Business"],
  "rating": 4.77525, "ratingCount": 90401,
  "ratingCurrentVersion": 4.77525, "ratingCountCurrentVersion": 90401,
  "contentRating": "4+",
  "version": "1.7.346",
  "releaseNotes": "Bug fixes and performance improvements.",
  "releaseDate": "2017-09-14T19:07:31Z",
  "currentVersionReleaseDate": "2026-10-13T04:16:20Z",
  "sizeBytes": 485872640, "sizeMB": 463.4,
  "minimumOsVersion": "18.0",
  "languages": ["AR", "DA", "NL", "EN", "FR", "DE", "JA"],
  "description": "Notion is an AI-powered all-in-one workspace ...",
  "iconUrl": "https://is1-ssl.mzstatic.com/image/thumb/.../512x512bb.jpg",
  "screenshotUrls": ["https://is1-ssl.mzstatic.com/image/thumb/.../392x696bb.jpg"],
  "ipadScreenshotUrls": [],
  "source": "search", "searchTerm": "notes", "rank": 3,
  "scrapedAt": "2026-10-15T22:00:00+00:00"
}
```

`source` is `search`, `lookup`, `developer` or `chart`. `rank` is the search position or chart place; `chart` names the chart. Also included: `supportedDevices`, `features`, `advisories`, `isGameCenterEnabled`, `appletvScreenshotUrls`, `primaryGenreId`. An app found twice in the same country (for example by two search terms) is returned and charged once.

### How to use

1. Enter search terms, apps, developers or pick a chart (or just press Start to try the default search).
2. Set countries, filters and `maxItems`.
3. Run, then download the dataset as JSON, CSV or Excel, or connect it to Sheets, Make, Zapier or your own code through the Apify API.

### Pricing

Pay per result (`app-scraped`), no start fee and no per-search fee:

| Apify plan | Price per 1,000 apps |
|---|---|
| Free | $0.80 |
| Starter (Bronze) | $0.60 |
| Scale (Silver) | $0.50 |
| Business (Gold) and above | $0.40 |

Filters and `maxItems` apply before you are charged. A run that finds nothing (unknown ids, no search hits, bad country code) fails with a clear message instead of returning an empty dataset.

### Limits

- **No reviews.** Apple has no public, keyless reviews API, so this actor returns app metadata and rating summaries, not individual reviews.
- Apple asks API users to keep to about **20 requests per minute**, so the actor spaces requests ~3 seconds apart. Searches return up to 200 apps per request and lookups up to 100 apps per request, so a typical run of a few hundred apps takes under a minute.
- Apple's search is fuzzy: a nonsense keyword can still return loosely related apps.
- Top charts come from Apple's public marketing RSS feed (top free and top paid apps, up to 100 places).
- Data belongs to Apple and the app publishers; check Apple's terms before republishing it. This is general information, not legal advice.

# Actor input Schema

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

Keywords to search the App Store for, one per line (same results as Apple's own search, in Apple's ranking order). Each term is searched in every country below.

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

Specific apps to look up, one per line: numeric app id (`1232780281`), bundle id (`notion.id`) or App Store link (`https://apps.apple.com/us/app/notion-notes-tasks-ai/id1232780281`). Looked up in every country below; the country in a link is ignored.

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

List every app of a developer, one per line: developer id (`1232780280`) or developer link (`https://apps.apple.com/us/developer/notion-labs-incorporated/id1232780280`).

## `charts` (type: `array`):

Add Apple's current top charts per country (from Apple's public RSS feed), each app with its chart rank.

## `chartSize` (type: `integer`):

How many places of each chart to fetch, 1-100.

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

2-letter storefront codes: `us`, `gb`, `de`, `fr`, `jp`, `br`, ... Prices, currency, ratings and rankings are per country. Default `us`.

## `maxResultsPerSearch` (type: `integer`):

Per search term and country, 1-200 (Apple's limit).

## `priceFilter` (type: `string`):

Keep only free or only paid apps. Applied before you are charged.

## `minRating` (type: `string`):

Keep only apps rated at least this (e.g. `4.5`). Empty = no filter. Applied before you are charged.

## `minRatingCount` (type: `integer`):

Keep only apps with at least this many ratings. 0 = no filter. Applied before you are charged.

## `genre` (type: `string`):

Keep only apps in this App Store genre (e.g. `Games`, `Productivity`, `Health & Fitness`). Empty = all.

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

Hard cap on apps for the whole run (also caps your cost). 0 = no limit.

## Actor input object example

```json
{
  "searchTerms": [
    "habit tracker"
  ],
  "chartSize": 25,
  "countries": [
    "us"
  ],
  "maxResultsPerSearch": 50,
  "priceFilter": "all",
  "maxItems": 100
}
```

# Actor output Schema

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

Apple App Store apps, one item per app and country.

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

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

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tidyharvest/appstore-apps-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/nSSuuNZNsfM2aRnZ2/builds/wj2UoTi5S6LiCQMev/openapi.json
