# Apple App Store API — Apps, Reviews, Ratings & ASO (`logiover/app-store-data-api`) Actor

Unofficial Apple App Store API in one Apify actor. 10 endpoints: app details, search, reviews, top charts, similar apps, developer profiles, autocomplete, rating histograms, privacy labels, version history. Pure HTTP, sub-3s cold start, batch & parallel. For iOS devs, ASO and AI tools.

- **URL**: https://apify.com/logiover/app-store-data-api.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** Developer tools, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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

## 🍎 App Store Data API — Unofficial REST-style Scraper for Apple App Store

> **One actor. Ten endpoints. Sub-3-second cold start.** The fastest, most complete unofficial Apple App Store API on Apify — built for iOS developers, ASO platforms, market researchers, AI agents, and anyone who needs structured data from the App Store without an App Store Connect account.

Search iOS apps by keyword, pull full app details, scrape reviews, get top charts by category, find similar apps, list a developer's portfolio, mine autocomplete suggestions for ASO keyword research, get Apple Privacy Labels, fetch rating histograms, and pull version release history — all from a single Apify actor.

No headless browser. No proxy required. No App Store Connect account. Pure HTTP. Just JSON.

---

### 🎯 What you can do with this Apple App Store scraper

| You want to… | Use mode | Typical input |
|---|---|---|
| Find iOS apps matching a keyword | `search` | `"query": "meditation"` |
| Get every detail about a specific app | `app` | `"id": 324684580` or `"appId": "com.spotify.client"` |
| Pull user reviews (up to ~500 per app) | `reviews` | `"id": 324684580, "maxResults": 500` |
| See top free / paid / grossing iOS or iPad apps | `list` | `"collection": "TOP_FREE_IOS"` |
| Find competitors and similar apps | `similar` | `"id": 324684580` |
| List every app by a developer | `developer` | `"devId": 324684580` |
| Get ASO autocomplete keywords | `suggest` | `"query": "fit"` |
| Get rating histogram (1-star to 5-star breakdown) | `ratings` | `"id": 324684580` |
| Read Apple Privacy Labels | `privacy` | `"id": 324684580` |
| Pull version release history | `versionHistory` | `"id": 324684580` |

Every result is tagged with a `_mode` field so you can run multiple modes back-to-back and slice the dataset afterwards.

---

### 🚀 Why iOS developers, ASO teams, and analysts pick this actor

#### Compared with other App Store scrapers on Apify

| | Most others | **This actor** |
|---|---|---|
| Endpoints | 1–3 (reviews only, or details only) | **10 endpoints in one** |
| Cold start | 8–15 seconds (headless browser) | **~3 seconds (pure HTTP)** |
| Batch app lookups | Sequential | **5× concurrent** |
| Privacy Labels support | Rare | **Built-in `privacy` mode** |
| Rating histogram | Often missing | **Dedicated `ratings` mode** |
| Version history | Rare | **Dedicated `versionHistory` mode** |
| Output schema | Sparse / undocumented | **All fields documented with examples** |
| Dataset views | None | **4 pre-built views (Overview, Apps, Reviews, App details)** |

#### Compared with Apple's official App Store Connect API

| | Apple App Store Connect API | **This actor** |
|---|---|---|
| Access scope | Your own apps only | **Any public app on App Store** |
| Reviews API | App Store Connect account + JWT auth required | **Just call it** |
| Search / discovery | Not available | **Yes** |
| Top charts | Not available | **Yes** |
| Competitor analysis | Not possible | **Yes (search, similar, developer modes)** |
| Setup time | Hours (developer account, certificates, JWT) | **Seconds** |

---

### ⚡ Quick start — three runs in 30 seconds

#### Run 1 — Search apps by keyword

```json
{
  "mode": "search",
  "query": "meditation",
  "country": "us",
  "language": "en-us",
  "maxResults": 50
}
````

**Returns:** 50 iOS apps matching "meditation" with title, icon, developer, rating, price, screenshots, genre, and direct App Store URL.

#### Run 2 — Get full details for one app

```json
{
  "mode": "app",
  "id": 324684580,
  "country": "us",
  "language": "en-us"
}
```

Or by bundle ID:

```json
{
  "mode": "app",
  "appId": "com.spotify.client",
  "country": "us"
}
```

**Returns:** every public field — full description, all screenshots (iPhone, iPad, Apple TV variants), all-time and current-version ratings, version history, content rating, supported devices, supported languages, file size, required iOS version, developer name and website, and more.

#### Run 3 — Pull 500 newest reviews (App Store hard cap)

```json
{
  "mode": "reviews",
  "id": 324684580,
  "country": "us",
  "language": "en-us",
  "maxResults": 500,
  "reviewSort": "RECENT"
}
```

**Returns:** Up to 500 reviews (10 pages × 50 — App Store's hard limit) with user name, star rating, review title, full text, date, and app version.

***

### 📖 All 10 endpoints in depth

#### 1. `mode: "search"` — Keyword search

Find iOS apps that match a search term — same results as App Store's search box.

```json
{
  "mode": "search",
  "query": "spotify",
  "country": "us",
  "language": "en-us",
  "maxResults": 50,
  "idsOnly": false
}
```

Set `idsOnly: true` to return only numeric app IDs (much faster — useful when you'll enrich via `app` mode afterwards).

**Use cases:** keyword tracking for App Store ASO, finding competitors, niche discovery, building iOS app directories.

***

#### 2. `mode: "app"` — Full app details

Pull every public field for one app — or many apps in parallel (5× concurrency). Accepts numeric `id` or bundle `appId`, individual or batched.

```json
{
  "mode": "app",
  "ids": [324684580, 389801252, 686449807],
  "country": "us",
  "language": "en-us"
}
```

Or via bundle IDs:

```json
{
  "mode": "app",
  "appIds": ["com.spotify.client", "com.burbn.instagram"],
  "country": "us"
}
```

**Returns 45+ fields including:**

- Identity: `id`, `appId` (bundle), `title`, `description`, `url`
- Ratings: `score`, `ratings`, `currentVersionScore`, `currentVersionRatings`
- Visual assets: `icon`, `screenshots[]`, `ipadScreenshots[]`, `appletvScreenshots[]`
- Pricing: `price`, `currency`, `free`
- Version: `version`, `releaseDate`, `currentVersionReleaseDate`, `releaseNotes`, `versionHistory[]`
- Compatibility: `requiredOsVersion`, `supportedDevices[]`, `languages[]`, `features[]`, `size`
- Genre: `primaryGenre`, `primaryGenreId`, `genres[]`, `genreIds[]`
- Content: `contentRating`, `advisoryRating`
- Developer: `developer`, `developerId`, `developerUrl`, `developerWebsite`

**Use cases:** iOS app intelligence dashboards, version monitoring, competitor pricing analysis, supported-device research.

***

#### 3. `mode: "reviews"` — User reviews

Pull up to ~500 reviews per app — the App Store hard cap (10 pages × 50 reviews). The actor automatically iterates pages until it hits your `maxResults` or the cap.

```json
{
  "mode": "reviews",
  "id": 324684580,
  "country": "us",
  "language": "en-us",
  "maxResults": 500,
  "reviewSort": "RECENT"
}
```

**Sort options:** `RECENT` (default), `HELPFUL` (most helpful first).

**Use cases:** review sentiment analysis, NPS-style monitoring, support-load forecasting, competitor weakness research.

> ⚠️ **App Store limitation:** Unlike Google Play, the iOS App Store caps reviews at roughly 500 per app per country via its public RSS feed. To pull more historical reviews, run the same `reviews` mode for multiple `country` storefronts and dedupe.

***

#### 4. `mode: "list"` — Top charts

Pull top charts for any collection × category combination across iOS, iPad, and Mac App Stores.

```json
{
  "mode": "list",
  "collection": "TOP_FREE_IOS",
  "category": "GAMES_PUZZLE",
  "maxResults": 100,
  "country": "us",
  "language": "en-us"
}
```

**Collections:**

- **iPhone/iOS:** `TOP_FREE_IOS`, `TOP_PAID_IOS`, `TOP_GROSSING_IOS`, `NEW_IOS`, `NEW_FREE_IOS`, `NEW_PAID_IOS`
- **iPad:** `TOP_FREE_IPAD`, `TOP_PAID_IPAD`, `TOP_GROSSING_IPAD`
- **Mac App Store:** `TOP_MAC`, `TOP_FREE_MAC`, `TOP_PAID_MAC`, `TOP_GROSSING_MAC`

**Common category codes:** `GAMES`, `BUSINESS`, `EDUCATION`, `FINANCE`, `SOCIAL_NETWORKING`, `MUSIC`, `PHOTO_AND_VIDEO`, `PRODUCTIVITY`, `SHOPPING`, `UTILITIES`, `TRAVEL`, `HEALTH_AND_FITNESS`, `LIFESTYLE`, `ENTERTAINMENT`, `NEWS`, `NAVIGATION`, `FOOD_AND_DRINK`, `WEATHER`, `REFERENCE`, `BOOKS`, `MEDICAL`, `SPORTS`, `MAGAZINES_AND_NEWSPAPERS`.

**Game sub-categories:** `GAMES_ACTION`, `GAMES_ADVENTURE`, `GAMES_ARCADE`, `GAMES_BOARD`, `GAMES_CARD`, `GAMES_CASINO`, `GAMES_DICE`, `GAMES_EDUCATIONAL`, `GAMES_FAMILY`, `GAMES_MUSIC`, `GAMES_PUZZLE`, `GAMES_RACING`, `GAMES_ROLE_PLAYING`, `GAMES_SIMULATION`, `GAMES_SPORTS`, `GAMES_STRATEGY`, `GAMES_TRIVIA`, `GAMES_WORD`.

**Use cases:** chart-position tracking, category benchmarking, country-by-country expansion research, iPad-vs-iPhone analysis.

***

#### 5. `mode: "similar"` — Apps similar to a given app

Get the "You Might Also Like" / similar-apps list that App Store shows on every app page.

```json
{
  "mode": "similar",
  "id": 324684580,
  "country": "us",
  "language": "en-us"
}
```

**Use cases:** competitor mapping, market sizing for a niche, finding adjacent categories, ad-targeting lookalike audiences.

***

#### 6. `mode: "developer"` — All apps by a publisher

List every app a developer has published. Requires numeric `devId` (artistId).

```json
{
  "mode": "developer",
  "devId": 324684580,
  "country": "us",
  "language": "en-us"
}
```

The `devId` is the `developerId` field in any app record. You can also extract it from a developer's App Store URL: `https://apps.apple.com/us/developer/spotify-ltd/id324684580`.

**Use cases:** publisher portfolio analysis, M\&A research, agency competitive monitoring.

***

#### 7. `mode: "suggest"` — Autocomplete suggestions for ASO

Get the autocomplete suggestions App Store shows as you type — gold for ASO keyword research because they reflect actual user search behavior.

```json
{
  "mode": "suggest",
  "query": "fit",
  "country": "us",
  "language": "en-us"
}
```

**Returns:** ranked list of suggested search terms (e.g. `fitness apps`, `fitness tracker`, `fitness coach`).

**Use cases:** ASO keyword discovery, long-tail keyword mining, title and subtitle optimization, paid Apple Search Ads keyword seeding.

***

#### 8. `mode: "ratings"` — Rating histogram (iOS-exclusive)

Get the all-time rating breakdown (1-star to 5-star counts) for an app. Useful for sentiment distribution analysis.

```json
{
  "mode": "ratings",
  "id": 324684580,
  "country": "us"
}
```

**Returns:** `ratings` count plus `histogram` object like `{ "1": 240000, "2": 80000, "3": 150000, "4": 800000, "5": 12200000 }`.

> 💡 You can pass bundle `appId` instead of numeric `id` — the actor will resolve it for you.

**Use cases:** sentiment distribution research, "is this app loved or polarizing?" analysis, competitor rating comparisons.

***

#### 9. `mode: "privacy"` — Apple Privacy Labels (iOS-exclusive)

Get the "App Privacy" section that Apple requires every developer to fill in — what data the app collects, how it's used, whether it's linked to user identity, and tracking practices.

```json
{
  "mode": "privacy",
  "id": 324684580,
  "country": "us",
  "language": "en-us"
}
```

**Returns:** structured privacy data with `data[]` (categories collected and their purposes), `privacyTypes[]` (high-level groupings like "Data Used to Track You" / "Data Linked to You" / "Data Not Linked to You"), and `managePrivacyChoicesUrl`.

**Use cases:** GDPR/CCPA compliance research, vendor security reviews, consumer privacy tools, "App Tracking Transparency" research, building privacy-comparison UIs.

***

#### 10. `mode: "versionHistory"` — Version release history (iOS-exclusive)

Pull the full version-release history of an app, with release dates and release notes for every version.

```json
{
  "mode": "versionHistory",
  "id": 324684580,
  "country": "us",
  "language": "en-us"
}
```

**Returns:** an array of version records, each with `versionDisplay`, `releaseDate`, and `releaseNotes`.

**Use cases:** update-cadence analysis, "what's changed in the last 6 months?" research, competitor release-velocity benchmarking, changelog mining for product trend analysis.

***

### 💡 Real-world use cases

#### iOS ASO platforms and App Store optimization tools

- **Keyword tracking** — run `search` mode daily across your tracked keywords, compute rank changes
- **Suggest mining** — feed `suggest` mode 1,000 seed terms, harvest tens of thousands of long-tail keywords
- **Competitor monitoring** — run `app` mode on competitors weekly, alert on title / subtitle / description / screenshot changes
- **Top-chart tracking** — `list` mode by country + category for market-share dashboards
- **Update cadence** — `versionHistory` mode to see how often competitors ship updates

#### iOS app intelligence and analytics platforms

- **Bulk metadata ingestion** — `app` mode in batch (pass hundreds of `ids` or `appIds`)
- **Review streaming** — `reviews` mode scheduled hourly, dedupe by review identifier
- **Rating distribution analysis** — `ratings` mode for full histogram, not just average
- **Pricing intelligence** — `price`, `free`, `currency` fields tracked by country

#### AI agents and LLM-powered tools

- **ChatGPT / Claude plugins** — wrap this actor as a tool so users can ask "what are the top 10 fitness apps in Japan?"
- **RAG pipelines** — pull full app `description` + recent `reviews` + `versionHistory` for context-rich embeddings
- **Customer-support bots** — fetch latest reviews + version + release notes to answer "what's broken in the new version?"

#### Market research and consultancies

- **Category benchmarking** — top-100 free + grossing charts by country, joined to ratings histograms
- **Genre trend analysis** — track which categories are growing by sampling top charts over time
- **Publisher M\&A research** — `developer` mode to map a target's portfolio

#### Privacy, compliance, and security teams

- **Privacy Label audits** — `privacy` mode for vendor procurement and ATT (App Tracking Transparency) research
- **Building "privacy nutrition labels" UIs** — surface what an app collects in a user-friendly format
- **GDPR / CCPA compliance research** — bulk privacy-label extraction across procured iOS apps

#### Internal alerting and product monitoring

- **Your own app's reviews** — schedule `reviews` mode hourly, alert on sudden 1-star spikes
- **Version drift** — `app` mode + diff `currentVersionReleaseDate` between runs to detect new releases
- **Competitor releases** — `versionHistory` mode on competitor IDs daily, alert on new entries

***

### 🔌 Integration — call this actor from your stack

#### REST API (curl)

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/YOUR-USERNAME~app-store-data-api/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "mode": "search",
    "query": "meditation",
    "maxResults": 50
  }'
```

#### JavaScript / Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const { defaultDatasetId } = await client
    .actor('YOUR-USERNAME/app-store-data-api')
    .call({
        mode: 'reviews',
        id: 324684580,
        country: 'us',
        maxResults: 500,
        reviewSort: 'RECENT',
    });

const { items } = await client.dataset(defaultDatasetId).listItems();

for (const review of items) {
    console.log(`${review.score}★  ${review.userName}: ${review.text}`);
}
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("YOUR-USERNAME/app-store-data-api").call(
    run_input={
        "mode": "app",
        "ids": [324684580, 389801252],
        "country": "us",
        "language": "en-us",
    }
)

for app in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{app['title']:40s} ⭐ {app['score']:.1f}  💰 {app['price']} {app['currency']}")
```

#### No-code automation (n8n, Make, Zapier)

This actor works out-of-the-box with any tool that supports Apify's HTTP API. Trigger it on a schedule, push results to Google Sheets, Airtable, Notion, Slack, your warehouse — whatever you already use.

***

### 📊 Output format

#### Universal fields (on every item, every mode)

| Field | Type | Description |
|---|---|---|
| `_mode` | string | Which endpoint produced this item — use it to filter when you mix modes |
| `scrapedAt` | string (ISO 8601) | UTC timestamp of when this item was scraped |

#### Pre-built dataset views

Switch between these in the Apify dataset UI without any post-processing:

- **Overview** — universal columns across all modes (`_mode`, `id`, `appId`, `title`, `developer`, `score`, `price`, `url`)
- **App catalog** — best for `search`, `list`, `similar`, `developer` modes (icon, title, developer, rating, price, genre)
- **Reviews** — best for `reviews` mode (user, rating, title, text, date, version)
- **App details** — wide view for `app` mode (40+ fields including ratings, pricing, version, supported devices, content rating)

#### Export formats

The Apify dataset exposes the data as JSON, CSV, XLSX (multi-sheet workbook), HTML, RSS (great for review monitoring), and JSONLines (for streaming pipelines).

***

### ⚡ Performance benchmarks

Measured on Apify default resources, `us` locale:

| Operation | Time |
|---|---|
| Cold start (container spin-up to first result) | ~3 seconds |
| `search` — 50 results | 2–4 seconds |
| `app` — single app full details | 1–2 seconds |
| `app` — batch of 100 apps (5× concurrency) | 20–30 seconds |
| `reviews` — 500 reviews (10 pages) | 8–12 seconds |
| `list` — top 100 from a chart | 2–4 seconds |
| `similar` — full list | 2–4 seconds |
| `developer` — full portfolio | 2–4 seconds |
| `suggest` — autocomplete | <1 second |
| `ratings` | 1–2 seconds |
| `privacy` | 1–2 seconds |
| `versionHistory` | 1–2 seconds |

Non-US storefronts may be slightly slower due to localization.

***

### 🌍 Country and language support

App Store has 115+ country storefronts. Pass any combination of `country` (ISO 3166-1 alpha-2) and `language` (BCP 47 with region, e.g. `en-us`, `tr-tr`, `de-de`, `ja-jp`, `pt-br`).

> 💡 **Important:** Unlike Google Play, App Store treats `country` as a *storefront* — the same numeric app `id` can exist in multiple storefronts with different titles, descriptions, screenshots, ratings, pricing, and even availability. Always specify the country relevant to your research.

Tested heavily in: `us/en-us`, `gb/en-gb`, `de/de-de`, `fr/fr-fr`, `es/es-es`, `it/it-it`, `tr/tr-tr`, `jp/ja-jp`, `kr/ko-kr`, `br/pt-br`, `mx/es-mx`, `in/en-in`, `cn/zh-cn`.

***

### ❓ FAQ

#### Is this an official Apple API?

No — this is an unofficial scraper. It uses public iTunes Search API and public App Store endpoints, the same way the App Store web pages do. No authentication, no App Store Connect account, no JWT.

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

No. You only need an Apify account (free tier works for testing).

#### Is this legal?

This actor accesses publicly available data from `apps.apple.com` and `itunes.apple.com`. As with any scraper, use it responsibly: respect rate limits, follow Apple's terms of service, and use the data for legitimate research, analytics, or product purposes. Bulk redistribution of Apple's data or commercial resale may require additional consideration — consult your legal counsel.

#### Should I use numeric `id` or bundle `appId`?

Both work for most modes. Numeric `id` (e.g. `324684580`) is universally supported by every endpoint. Bundle `appId` (e.g. `com.spotify.client`) works for `app`, `reviews`, `similar`, `ratings`, `privacy`, and `versionHistory` — when used with `ratings` or `privacy`, the actor automatically resolves the bundle ID to the numeric ID first.

#### Why is the reviews cap only ~500?

This is an App Store limitation, not an actor limit. Apple's public review RSS feed returns up to 10 pages of ~50 reviews each. To pull more historical reviews, run the `reviews` mode for additional `country` storefronts and dedupe by review identifier.

#### How accurate is the rating data?

`score` is the floating-point all-time average rating (e.g. `4.8`). `ratings` is the total count of all-time ratings. `currentVersionScore` and `currentVersionRatings` cover only the current app version. The `ratings` mode returns a full `histogram` with exact 1-star to 5-star counts.

#### Can I scrape paid app prices and in-app purchases?

Yes — `price` returns the numeric price in the requested country's `currency`. App Store doesn't expose granular IAP prices via the public API (those are visible only on the app page itself).

#### What about app screenshots?

`app` mode returns three separate arrays: `screenshots` (iPhone), `ipadScreenshots` (iPad), and `appletvScreenshots` (Apple TV). Each is a direct CDN URL — no auth required to fetch.

#### Can I run multiple modes in one actor run?

Each actor run executes one mode. To combine modes, call the actor multiple times via the API and join the datasets on `id`. Each result includes `_mode` so you can keep everything in a single combined dataset.

#### What's the difference between Google Play Data API and this one?

This actor is the Apple App Store counterpart of the [Google Play Data API](https://apify.com/) — same architecture, same Apify Store conventions, same pricing model. Run both together for cross-platform app intelligence.

#### How do I monitor my own iOS app's reviews?

Set up a scheduled Apify task with this config:

```json
{
  "mode": "reviews",
  "id": YOUR_APP_ID,
  "country": "us",
  "reviewSort": "RECENT",
  "maxResults": 100
}
```

Schedule it hourly. Use the Apify dataset's RSS export to feed into Slack, email, or a webhook.

#### Does this support proxy rotation?

The actor uses pure HTTP and works fine from Apify's default infrastructure without proxies. For very high-volume runs, you can configure proxy settings in the Apify run options.

***

### 🛠 Built on open source

This actor is built on top of [`app-store-scraper`](https://github.com/facundoolano/app-store-scraper) — the de-facto unofficial App Store library (MIT-licensed, actively maintained, sister project of `google-play-scraper`). The actor wraps the library with:

- A unified mode-based interface so all 10 methods are accessible from one input form
- Automatic pagination for reviews (1–10 pages)
- Concurrent batch processing (5× workers) for app detail lookups
- Automatic bundleId → numeric ID resolution for `ratings` and `privacy` modes
- Retry logic with exponential backoff for transient errors
- Output normalization (consistent price / free reconciliation)
- A complete dataset schema with all fields documented
- Production logging with per-mode and per-app progress

***

### 🆘 Support

Have an issue, a feature request, or a use case you'd like supported?

- **Bug reports & feature requests:** open an Issue on this actor's page
- **Response time:** typically within 24 hours
- **Custom modifications:** available on request — contact via Apify Console

***

#### Keywords

app store scraper · app store api · unofficial app store api · apple app store scraper · ios app data api · app store reviews scraper · app store search api · app store top charts · apple privacy labels · ios app analytics · app store ratings histogram · app store version history · ios aso keyword research · app store metadata · app store autocomplete · ios app intelligence · app store competitor analysis · app store similar apps · ipad app charts · mac app store scraper

# Actor input Schema

## `mode` (type: `string`):

Which App Store endpoint to call.

• **search** — keyword search (most common)
• **app** — full details for one or more apps
• **reviews** — user reviews with pagination
• **list** — top charts (free/paid/grossing) by category
• **similar** — apps similar to a given app
• **developer** — all apps by a developer (artistId)
• **suggest** — autocomplete suggestions (great for ASO keyword research)
• **ratings** — rating histogram (1-star to 5-star breakdown)
• **privacy** — Apple Privacy Labels (data collected, tracking, etc.)
• **versionHistory** — version-release history of an app

## `id` (type: `integer`):

Numeric App Store ID — the digits after `id` in the App Store URL. E.g. for `https://apps.apple.com/us/app/spotify/id324684580`, use `324684580`. Used by **app**, **reviews**, **similar**, **ratings**, **privacy**, **versionHistory** modes.

## `ids` (type: `array`):

Array of numeric App Store IDs for batch operations. Adds to (or replaces) the single ID field above.

## `appId` (type: `string`):

Reverse-DNS bundle identifier (e.g. `com.spotify.client`). Use this instead of `id` when you have the bundle ID handy.

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

Array of bundle IDs for batch operations.

## `query` (type: `string`):

Keyword to search for in **search** mode, or partial term for **suggest** mode autocomplete.

## `devId` (type: `integer`):

Numeric artistId of the developer (e.g. `324684580` for Spotify Ltd.). Find it as `developerId` in any app result for that publisher. Used by **developer** mode.

## `collection` (type: `string`):

Which top chart to fetch in **list** mode.

**iOS:** `TOP_FREE_IOS`, `TOP_PAID_IOS`, `TOP_GROSSING_IOS`, `NEW_IOS`, `NEW_FREE_IOS`, `NEW_PAID_IOS`
**iPad:** `TOP_FREE_IPAD`, `TOP_PAID_IPAD`, `TOP_GROSSING_IPAD`
**Mac:** `TOP_MAC`, `TOP_FREE_MAC`, `TOP_PAID_MAC`, `TOP_GROSSING_MAC`

## `category` (type: `string`):

Optional category filter for **list** mode. Common codes: `GAMES`, `BUSINESS`, `EDUCATION`, `FINANCE`, `SOCIAL_NETWORKING`, `MUSIC`, `PHOTO_AND_VIDEO`, `PRODUCTIVITY`, `SHOPPING`, `UTILITIES`, `TRAVEL`, `HEALTH_AND_FITNESS`, `LIFESTYLE`, `ENTERTAINMENT`, `NEWS`, `NAVIGATION`, `FOOD_AND_DRINK`, `WEATHER`, `REFERENCE`, `BOOKS`, `MEDICAL`, `SPORTS`, `MAGAZINES_AND_NEWSPAPERS`. Game sub-categories: `GAMES_ACTION`, `GAMES_ADVENTURE`, `GAMES_ARCADE`, `GAMES_BOARD`, `GAMES_CARD`, `GAMES_CASINO`, `GAMES_DICE`, `GAMES_EDUCATIONAL`, `GAMES_FAMILY`, `GAMES_MUSIC`, `GAMES_PUZZLE`, `GAMES_RACING`, `GAMES_ROLE_PLAYING`, `GAMES_SIMULATION`, `GAMES_SPORTS`, `GAMES_STRATEGY`, `GAMES_TRIVIA`, `GAMES_WORD`.

## `device` (type: `string`):

Optional device filter for **list** mode and others. Apple App Store has separate top-chart collections per device class.

## `reviewSort` (type: `string`):

How reviews are ordered when fetched from App Store RSS feed.

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

ISO 3166-1 alpha-2 country code. Determines the App Store storefront — same app can have different pricing, availability, screenshots, and ratings per country. E.g. `us`, `gb`, `de`, `tr`, `jp`, `br`, `in`, `mx`.

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

BCP 47 language code with region, e.g. `en-us`, `tr-tr`, `de-de`, `ja-jp`, `pt-br`. Affects localized title, description, screenshots.

## `maxResults` (type: `integer`):

Maximum results to return. For **reviews** mode, this is per-app (App Store hard cap: 500). For **list / search / similar / developer** modes, this is overall (App Store hard cap: ~200).

## `idsOnly` (type: `boolean`):

For **search** mode: if enabled, returns only numeric app IDs (much faster). Useful for bulk pipelines where you'll enrich via **app** mode afterwards.

## Actor input object example

```json
{
  "mode": "search",
  "id": 324684580,
  "ids": [],
  "appId": "com.spotify.client",
  "appIds": [],
  "query": "spotify",
  "devId": 324684580,
  "collection": "TOP_FREE_IOS",
  "category": "GAMES",
  "reviewSort": "RECENT",
  "country": "us",
  "language": "en-us",
  "idsOnly": false
}
```

# Actor output Schema

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

Full results dataset. Switch between Overview, App catalog, Reviews, and App details views depending on which mode you ran.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/app-store-data-api").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("logiover/app-store-data-api").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 '{}' |
apify call logiover/app-store-data-api --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Apple App Store API — Apps, Reviews, Ratings & ASO",
        "description": "Unofficial Apple App Store API in one Apify actor. 10 endpoints: app details, search, reviews, top charts, similar apps, developer profiles, autocomplete, rating histograms, privacy labels, version history. Pure HTTP, sub-3s cold start, batch & parallel. For iOS devs, ASO and AI tools.",
        "version": "1.0",
        "x-build-id": "54mhBHLG4WyaTGdF8"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/logiover~app-store-data-api/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-logiover-app-store-data-api",
                "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/logiover~app-store-data-api/runs": {
            "post": {
                "operationId": "runs-sync-logiover-app-store-data-api",
                "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/logiover~app-store-data-api/run-sync": {
            "post": {
                "operationId": "run-sync-logiover-app-store-data-api",
                "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": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search",
                            "app",
                            "reviews",
                            "list",
                            "similar",
                            "developer",
                            "suggest",
                            "ratings",
                            "privacy",
                            "versionHistory"
                        ],
                        "type": "string",
                        "description": "Which App Store endpoint to call.\n\n• **search** — keyword search (most common)\n• **app** — full details for one or more apps\n• **reviews** — user reviews with pagination\n• **list** — top charts (free/paid/grossing) by category\n• **similar** — apps similar to a given app\n• **developer** — all apps by a developer (artistId)\n• **suggest** — autocomplete suggestions (great for ASO keyword research)\n• **ratings** — rating histogram (1-star to 5-star breakdown)\n• **privacy** — Apple Privacy Labels (data collected, tracking, etc.)\n• **versionHistory** — version-release history of an app",
                        "default": "search"
                    },
                    "id": {
                        "title": "App ID (numeric)",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Numeric App Store ID — the digits after `id` in the App Store URL. E.g. for `https://apps.apple.com/us/app/spotify/id324684580`, use `324684580`. Used by **app**, **reviews**, **similar**, **ratings**, **privacy**, **versionHistory** modes."
                    },
                    "ids": {
                        "title": "App IDs (numeric, batch)",
                        "type": "array",
                        "description": "Array of numeric App Store IDs for batch operations. Adds to (or replaces) the single ID field above.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "appId": {
                        "title": "Bundle ID (alternative to numeric ID)",
                        "type": "string",
                        "description": "Reverse-DNS bundle identifier (e.g. `com.spotify.client`). Use this instead of `id` when you have the bundle ID handy."
                    },
                    "appIds": {
                        "title": "Bundle IDs (batch)",
                        "type": "array",
                        "description": "Array of bundle IDs for batch operations.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "query": {
                        "title": "Search query / keyword",
                        "type": "string",
                        "description": "Keyword to search for in **search** mode, or partial term for **suggest** mode autocomplete."
                    },
                    "devId": {
                        "title": "Developer ID (numeric artistId)",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Numeric artistId of the developer (e.g. `324684580` for Spotify Ltd.). Find it as `developerId` in any app result for that publisher. Used by **developer** mode."
                    },
                    "collection": {
                        "title": "Top-chart collection",
                        "enum": [
                            "TOP_FREE_IOS",
                            "TOP_PAID_IOS",
                            "TOP_GROSSING_IOS",
                            "NEW_IOS",
                            "NEW_FREE_IOS",
                            "NEW_PAID_IOS",
                            "TOP_FREE_IPAD",
                            "TOP_PAID_IPAD",
                            "TOP_GROSSING_IPAD",
                            "TOP_MAC",
                            "TOP_FREE_MAC",
                            "TOP_PAID_MAC",
                            "TOP_GROSSING_MAC"
                        ],
                        "type": "string",
                        "description": "Which top chart to fetch in **list** mode.\n\n**iOS:** `TOP_FREE_IOS`, `TOP_PAID_IOS`, `TOP_GROSSING_IOS`, `NEW_IOS`, `NEW_FREE_IOS`, `NEW_PAID_IOS`\n**iPad:** `TOP_FREE_IPAD`, `TOP_PAID_IPAD`, `TOP_GROSSING_IPAD`\n**Mac:** `TOP_MAC`, `TOP_FREE_MAC`, `TOP_PAID_MAC`, `TOP_GROSSING_MAC`",
                        "default": "TOP_FREE_IOS"
                    },
                    "category": {
                        "title": "Category filter",
                        "type": "string",
                        "description": "Optional category filter for **list** mode. Common codes: `GAMES`, `BUSINESS`, `EDUCATION`, `FINANCE`, `SOCIAL_NETWORKING`, `MUSIC`, `PHOTO_AND_VIDEO`, `PRODUCTIVITY`, `SHOPPING`, `UTILITIES`, `TRAVEL`, `HEALTH_AND_FITNESS`, `LIFESTYLE`, `ENTERTAINMENT`, `NEWS`, `NAVIGATION`, `FOOD_AND_DRINK`, `WEATHER`, `REFERENCE`, `BOOKS`, `MEDICAL`, `SPORTS`, `MAGAZINES_AND_NEWSPAPERS`. Game sub-categories: `GAMES_ACTION`, `GAMES_ADVENTURE`, `GAMES_ARCADE`, `GAMES_BOARD`, `GAMES_CARD`, `GAMES_CASINO`, `GAMES_DICE`, `GAMES_EDUCATIONAL`, `GAMES_FAMILY`, `GAMES_MUSIC`, `GAMES_PUZZLE`, `GAMES_RACING`, `GAMES_ROLE_PLAYING`, `GAMES_SIMULATION`, `GAMES_SPORTS`, `GAMES_STRATEGY`, `GAMES_TRIVIA`, `GAMES_WORD`."
                    },
                    "device": {
                        "title": "Device filter",
                        "enum": [
                            "IPAD",
                            "MAC",
                            "ALL"
                        ],
                        "type": "string",
                        "description": "Optional device filter for **list** mode and others. Apple App Store has separate top-chart collections per device class."
                    },
                    "reviewSort": {
                        "title": "Review sort order",
                        "enum": [
                            "RECENT",
                            "HELPFUL"
                        ],
                        "type": "string",
                        "description": "How reviews are ordered when fetched from App Store RSS feed.",
                        "default": "RECENT"
                    },
                    "country": {
                        "title": "Country (App Store storefront)",
                        "type": "string",
                        "description": "ISO 3166-1 alpha-2 country code. Determines the App Store storefront — same app can have different pricing, availability, screenshots, and ratings per country. E.g. `us`, `gb`, `de`, `tr`, `jp`, `br`, `in`, `mx`.",
                        "default": "us"
                    },
                    "language": {
                        "title": "Language (BCP 47 with region)",
                        "type": "string",
                        "description": "BCP 47 language code with region, e.g. `en-us`, `tr-tr`, `de-de`, `ja-jp`, `pt-br`. Affects localized title, description, screenshots.",
                        "default": "en-us"
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 0,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum results to return. For **reviews** mode, this is per-app (App Store hard cap: 500). For **list / search / similar / developer** modes, this is overall (App Store hard cap: ~200)."
                    },
                    "idsOnly": {
                        "title": "Return numeric IDs only (search mode)",
                        "type": "boolean",
                        "description": "For **search** mode: if enabled, returns only numeric app IDs (much faster). Useful for bulk pipelines where you'll enrich via **app** mode afterwards.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
