# 🔥 Apple Store Api (`bebity/apple-store-api`) Actor

🚀 Discover the "Apple Store API" by Bebity! Unlock the power of the Apple Store and unleash its vast potential with ease and efficiency! 🌟 Whether you are an app developer 🛠️, a data analyst 📊, or a marketer 🚀, this versatile tool is your ultimate companion for all your Apple Store data needs.

- **URL**: https://apify.com/bebity/apple-store-api.md
- **Developed by:** [Bebity](https://apify.com/bebity) (community)
- **Categories:** Automation, Developer tools
- **Stats:** 93 total users, 1 monthly users, 95.6% runs succeeded, 4 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.20 / 1,000 app results

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

![header](https://i.ibb.co/86B72WJ/apify-Bebity-io-5.png)

## Apple App Store Scraper — apps, charts, reviews, in-app purchases & version history

Brought to you by **[Bebity](https://bebity.io)**

**Apple App Store Scraper** turns the App Store into clean datasets: **app details, search results, top charts, developer catalogues, similar apps, ratings histograms, privacy labels, in-app purchases, version history — and user reviews with developer replies, far beyond Apple's usual 500.** Paste App Store URLs, app IDs, bundle IDs, search terms or developer names; pick what you want; get JSON, CSV or Excel. iPhone, iPad, Mac, Apple TV, Apple Watch and Vision Pro, in **115 countries**.

> ### 🚀 Version 2 — a full rebuild
>
> A ground-up rewrite of the engine, the input and the pricing. Reviews now go **past the 500-review wall** with **developer replies** and **4 sort orders**; **in-app purchases** and **version history** are new; privacy labels work again; every failure is a visible row, never a silent empty run. Priced **per result** — see the [changelog](#changelog).

***

### What does Apple App Store Scraper do?

The App Store has no public API for this data. Apple's official App Store Connect API only covers *your own* apps; the iTunes Search API returns thin rows and no reviews, charts, privacy or purchases. **This actor is the missing App Store API**: one input, four actions, three add-on boxes, two datasets.

| | What you get |
|---|---|
| 🔎 **Search apps** · *action* | Apps for a keyword, a **top chart** (free, paid, grossing, new) or a **developer** — by ID or by name |
| 📱 **App details** · *action* | The full listing: description, release notes, price, genres, size, languages, devices, screenshots, developer |
| 🧭 **Similar apps** · *action* | The App Store's "You might also like" apps, each as an app row |
| 💬 **App reviews** · *action* | Rating, title, text, date, votes, **developer reply** — up to **100,000 per app** |
| 🏪 **App Store page** · *box* | **Privacy nutrition labels**, **in-app purchases** with local prices, the **25 latest versions**, the app's **chart rank** and its ratings histogram |
| ⭐ **Ratings** · *box* | Total ratings and the **5★ → 1★ histogram** |

### Who is it for?

- **App marketers & ASO teams** — track rankings, competitors' listings, pricing and release cadence.
- **Product managers** — mine thousands of reviews and developer replies for bugs and feature requests.
- **Market researchers & analysts** — build category or country datasets from charts and search.
- **Investors & agencies** — monitor portfolios by developer, ratings trends and monetisation (in-app purchases).
- **Privacy researchers** — compare privacy labels across an entire category.
- **Developers & AI agents** — call it from the Apify API or MCP and get typed JSON back.

### How to scrape App Store data — quick start

1. Click **Try for free**.
2. Pick one **Action**: *Search apps*, *App details*, *Similar apps* or *App reviews*.
3. Fill its source — **Apps** for the last three (`https://apps.apple.com/us/app/id324684580`, `324684580` or `com.spotify.client`, one per line), **Search terms**, **Chart** or **Developers** for *Search apps* — and tick the extra info you want on each app.
4. Click **Start**. Apps land in the default dataset, reviews in the **Reviews** dataset. Export as JSON, CSV, Excel, XML or HTML, or read them from the API.

### Example input

Everything about one app — full details, privacy, in-app purchases, version history, chart rank and ratings histogram:

```json
{
  "action": "appDetails",
  "appIdsOrUrls": ["https://apps.apple.com/us/app/calm-sleep-meditation/id571800810"],
  "includeAppStorePage": true
}
```

A search and a chart in one run — Health & Fitness apps only, with their ratings histogram:

```json
{
  "action": "searchApps",
  "searchTerms": ["meditation"],
  "chart": "top-free",
  "genre": "6013",
  "includeRatings": true,
  "maxItems": 100
}
```

The 700 latest reviews of one app, developer replies included:

```json
{ "action": "appReviews", "appIdsOrUrls": ["571800810"], "maxReviewsPerApp": 700, "maxItems": 1000 }
```

### Example output

One app row from the first input (long strings and arrays shortened):

```json
{
  "id": 571800810,
  "appId": "com.calm.calmapp",
  "title": "Calm",
  "url": "https://apps.apple.com/us/app/calm/id571800810?uo=4",
  "sourceType": "direct",
  "position": 1,
  "platform": "iphone",
  "description": "Calm is the #1 app for sleep, meditation, and relaxation…",
  "genres": ["Health & Fitness", "Lifestyle"],
  "contentRating": "4+",
  "version": "7.0.7",
  "updated": "2026-09-04T13:22:28Z",
  "price": 0,
  "currency": "USD",
  "free": true,
  "developer": "Calm.com",
  "developerId": 571800813,
  "developerWebsite": "https://www.calm.com",
  "score": 4.77259,
  "reviews": 1980663,
  "ratings": { "total": 1980663, "histogram": { "1": 32757, "2": 16467, "3": 52378, "4": 165234, "5": 1713827 } },
  "privacy": [
    { "identifier": "DATA_USED_TO_TRACK_YOU", "title": "Data Used to Track You",
      "categories": [{ "identifier": "PURCHASES", "title": "Purchases" }, { "identifier": "IDENTIFIERS", "title": "Identifiers" }] }
  ],
  "inAppPurchases": [{ "name": "Calm Premium", "price": "$79.99" }, { "name": "Calm Premium", "price": "$16.99" }],
  "versionHistory": [{ "version": "7.0.7", "date": "2026-09-04T13:22:28.000Z", "releaseNotes": "Thanks for using Calm…" }],
  "chartRank": { "position": 55, "chart": "top-free", "genre": "Health & Fitness", "genreId": "6013" },
  "scrapedAt": "2026-09-13T14:17:52.188Z"
}
```

Two review rows (reviewer names anonymised):

```json
[
  {
    "id": "14540620822", "appId": 571800810, "userName": "reviewer_1", "score": 1,
    "title": "Stopped working", "text": "I have used this app for many years…",
    "updated": "2026-09-12T11:26:30Z", "voteCount": 0, "voteSum": 0, "isEdited": false,
    "developerResponse": null, "version": null, "url": null, "position": 1
  },
  {
    "id": "14531645258", "appId": 571800810, "userName": "reviewer_2", "score": 1,
    "title": "Latest update in Sept 2026 ruined the app", "text": "Latest update ruined the app…",
    "updated": "2026-09-10T03:40:30Z", "voteCount": 0, "voteSum": 0, "isEdited": false,
    "developerResponse": { "id": "66163001", "body": "Sorry about this — try deleting and reinstalling the app first…", "modified": "2026-09-11T06:37:10Z" },
    "version": null, "url": null, "position": 15
  }
]
```

### Input parameters

| Parameter | Type | Default | What it does |
|---|---|---|---|
| 🔨 `action` | select, **required** | — | `searchApps` · `appDetails` · `similarApps` · `appReviews` — one per run |
| ➕ `includeAppFullDetails` | checkbox | on | The app's full details. Always on for `appDetails`; unticked, a search or similar apps give short rows (see below) |
| ➕ `includeAppStorePage` | checkbox | off | Privacy, in-app purchases, version history, chart rank and ratings histogram, from the app's App Store page |
| ➕ `includeRatings` | checkbox | off | Ratings total and histogram only — already in the previous box when it is ticked |
| 🔗 `appIdsOrUrls` | list | — | Read by `appDetails`, `similarApps` and `appReviews`: one app per line — numeric ID, bundle ID or App Store URL |
| 👤 `developers` | list | — | Read by `searchApps`: numeric developer ID or name (`Supercell`). Alone: the developer's whole catalogue. With `searchTerms`: filters the search results |
| 🔎 `searchTerms` | list | — | Read by `searchApps`: one keyword per line; each term is its own source |
| 📊 `chart` | select | none | Read by `searchApps`: `top-free` · `top-paid` · `top-grossing` · `new` · `new-free` · `new-paid` |
| 🏷️ `genre` | select | all | Apple's official list: 27 genres and 61 sub-genres, e.g. `6014` Games, `7012` Puzzle |
| 💬 `maxReviewsPerApp` | integer | 50 | Read by `appReviews`: 1 to 100,000 |
| 💬 `reviewsSort` | select | `recent` | Read by `appReviews`: `recent` · `helpful` · `favorable` (5★ first) · `critical` (1★ first) |
| 🌍 `platform` | select | `iphone` | `iphone` · `ipad` · `mac` · `tv` · `watch` · `vision` — applies to search and charts |
| 🌍 `country` | text | `us` | Two-letter store code — catalogue, prices and currency. Empty via the API: the country of the first App Store URL |
| 🌍 `lang` | text | `en` | Metadata language when the app is localised in that store (49 codes). Reviews are never translated |
| ⚙️ `maxItems` | integer | 200 | Hard cap on rows for the whole run, apps and reviews together |

The boxes apply to every app row the action produces — found apps, targeted apps or similar apps. `appReviews` produces reviews only, so the boxes have no effect there. On a source without full rows (iPhone, Apple TV, Watch or Vision search, a chart, similar apps), ticking *ratings* or filtering by developer or genre adds the full details automatically: they are needed to read ratings and filter reliably.

### What data does it extract?

#### App rows — default dataset

| Group | Fields |
|---|---|
| Identity | `id`, `appId` (bundle ID), `title`, `url`, `icon` |
| Listing | `description`, `releaseNotes`, `version`, `released`, `updated`, `genres`, `genreIds`, `primaryGenre`, `contentRating`, `advisories`, `languages`, `size`, `requiredOsVersion`, `supportedDevices`, `features`, `screenshots`, `ipadScreenshots`, `appletvScreenshots` |
| Price | `price`, `currency`, `free`, `formattedPrice` |
| Developer | `developer`, `developerId`, `developerUrl`, `developerWebsite`, `sellerName`, `developerConfidence` (when resolved from a name) |
| Ratings | `score`, `reviews` (rating count), `currentVersionScore`, `currentVersionReviews`, `ratings { total, histogram }` |
| Enrichments | `privacy`, `inAppPurchases [{ name, price }]`, `versionHistory [{ version, date, releaseNotes }]`, `chartRank { position, chart, genre, genreId }` |
| Provenance | `sourceType` (`search` · `chart` · `developer` · `direct` · `similar`), `sourceAppId`, `searchTerm`, `position`, `platform`, `scrapedAt` |

**Short rows.** With `includeAppFullDetails` unticked, a row carries what the source itself gives: a chart gives name, icon, description, price, developer, genre and release date; an Apple TV, Watch or Vision search gives name, developer, rating, age rating and price type; an iPhone search or similar apps give the app ID and store URL only. Every field is still there — `null` when the source doesn't have it. An iPad or Mac search and a developer catalogue always give full rows.

An enrichment you did not ask for is absent from the row; one Apple does not publish is empty (`[]`, or `histogram: {}`).

#### Review rows — Reviews dataset

`id`, `appId`, `userName`, `userUrl`, `score`, `title`, `text`, `updated`, `voteCount`, `voteSum`, `isEdited`, `developerResponse { id, body, modified }`, `position`, `scrapedAt` — plus `version` and `url`, which Apple does not publish with deep reviews (`null`).

#### Failed rows

A request that fails for good becomes a row: `{ "failed": true, "reason", "inputUrl", "error", "scrapedAt" }`, with `reason` one of `not-found` · `parse-error` · `rate-limited` · `timeout` · `chart-unavailable` · `developer-unresolved` · `upstream-empty`. Both datasets have a **Failed items** view. Failed rows are never charged.

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

Pay per result — no subscription, no platform usage costs. You pay for the rows delivered, plus **$0.00005** when a run starts.

| Event | Free plan | Bronze · Silver | Gold and above | Charged for |
|---|---|---|---|---|
| `scraped-app` | **$0.20 / 1,000** | $0.20 / 1,000 | $0.20 / 1,000 | each app row — search, chart, developer catalogue, app details, similar apps |
| `app-full-details` | **+$0.30 / 1,000** | +$0.30 / 1,000 | +$0.20 / 1,000 | each app row with full details — always with *App details*, and when ratings or a filter add them automatically |
| `app-public-store-details` | **+$0.30 / 1,000** | +$0.30 / 1,000 | +$0.20 / 1,000 | each App Store page read — privacy, in-app purchases, versions, chart rank and histogram, **one charge however much it gives** |
| `app-ratings` | **+$0.20 / 1,000** | +$0.20 / 1,000 | +$0.20 / 1,000 | each ratings histogram read on its own — never when the App Store page is ticked |
| `app-review` | **$0.50 / 1,000** | $0.40 / 1,000 | $0.40 / 1,000 | each review |
| `apify-actor-start` | $0.00005 | $0.00005 | $0.00005 | once per run — Apify's start event, at the actor's fixed 1 GB |

| Run | Cost on the Free plan |
|---|---|
| 200 apps for one search term, full details | $0.10 |
| The top-free chart (100 apps), short rows | $0.02 |
| 50 apps with full details and their App Store page | $0.04 |
| 100 apps for a keyword with ratings | $0.07 |
| 5,000 critical reviews of one app | $2.50 — $2.00 from Bronze |

With the **$5 of monthly credit** on Apify's free plan, that is about **10,000 apps** with full details or **10,000 reviews**. Set a **maximum cost per run** in the run options, and `maxItems`, to cap any run. A box that brings nothing is not charged — a histogram Apple does not publish, or an App Store page that failed.

### Modes at a glance

| Action | You fill… | You get |
|---|---|---|
| `searchApps` | `searchTerms` | up to ~200 apps per term |
| `searchApps` | `chart` (+ `genre`, `platform`) | up to 100 ranked apps |
| `searchApps` | `developers` | the developer's catalogue, up to 200 apps |
| `searchApps` | `searchTerms` + `developers` | the search results from those developers only |
| `appDetails` | `appIdsOrUrls` | one row per app, full details included |
| `similarApps` | `appIdsOrUrls` | one row per similar app, linked by `sourceAppId` |
| `appReviews` | `appIdsOrUrls` | reviews only, in the Reviews dataset |

### Limitations

- **One action per run.** Reviews of the apps a search finds take two runs: the search, then `appReviews` on their IDs.
- **Short rows:** without full details, an iPhone search or similar apps give the app ID and URL only.
- **Search:** about 200 apps per term, no pagination beyond. Apple TV, Watch and Vision searches return 12 apps per term. A Mac search also returns iPad apps that run on the Mac.
- **Developers:** 200 apps per developer. **Charts:** 100 apps. iPad has no *new* charts, Mac only *top free*, Apple TV *top free/paid/grossing*, Watch and Vision none. Apple ignores `genre` on *new* charts: the actor filters them after the fact, so fewer than 100 apps can come back.
- **Reviews:** up to 100,000 per app, one store per run. Deep reviews carry no app version and no review URL. Many apps have far fewer reviews — the run stops by itself.
- **In-app purchases:** the purchases the store page lists — 10 at most — with prices as the store prints them (`5,99 €`). **Version history:** the 25 latest versions.
- **Mac apps:** Apple publishes no ratings and no similar apps for the Mac App Store — `ratings` is `null` and similar apps come back as a failed row explaining why.
- **Stores and languages:** 115 country stores and 49 language codes; any other code is refused before a single request. The *Stickers* genre returns nothing on charts.
- Ratings, privacy, purchases and versions come from the App Store web page and can lag behind an Apple redesign — reported as a `parse-error` row, never as silent empty data.

### Tips

- **One box for all the store extras.** Privacy, in-app purchases, version history, chart rank and the ratings histogram come from the same App Store page — one `app-public-store-details` per app. Tick *ratings* alone when the histogram is all you need: its page is 10× lighter.
- **Untick full details** to list a chart or collect app IDs at $0.20 per 1,000.
- **Paste URLs as they are.** The country of the first URL becomes the run's store when you leave `country` empty via the API.
- **Developer names are resolved for you**; each app row carries a `developerConfidence`. Use the numeric ID when you need certainty.
- **Target the extremes of the review history** with `critical` or `favorable` — they reach the 1★ or 5★ reviews first, however old.
- **Raise `maxItems`** for review-heavy runs: it caps apps and reviews together.
- **Schedule the actor** to track ranks, prices or new reviews over time, and connect it to Google Sheets, Slack, Make or Zapier from the Integrations tab.

### FAQ

**Is there an official App Store API?** Apple's App Store Connect API only exposes your own apps. The iTunes Search API returns basic listings without reviews, charts, privacy labels or purchases. This actor reads Apple's public App Store pages and feeds and returns them as one structured API.

**Is it legal to scrape the App Store?** The actor only collects publicly visible data. Reviews contain reviewer pseudonyms: if you store them, handle them under the privacy law that applies to you (GDPR, CCPA). This is not legal advice.

**How many reviews can I get?** Up to 100,000 per app, per country store — Apple serves the full history (over 200,000 reviews measured on Spotify). The run stops by itself when an app has no more.

**Why is `version` empty on reviews?** Apple does not publish the reviewed app version with deep review history. Every other field — including the developer's reply — is there.

**Which platforms are supported?** iPhone, iPad, Mac, Apple TV, Apple Watch and Vision Pro, through `platform`. Details, reviews and privacy labels work for any app ID, whatever its platform.

**Why did my run return fewer rows than expected?** Check the **Failed items** view of each dataset: every failure has a reason. The other usual causes are `maxItems` and Apple's own caps listed in [Limitations](#limitations).

**What happens if my input is invalid?** The run stops before sending any request and nothing is charged: the log explains in red what to fix, and the run ends as succeeded. Values the input form itself forbids are refused by Apify before the run starts.

**Can I call it from code or an AI agent?** Yes — from the Apify API, the Python and JavaScript clients, or Apify's MCP server.

**Something broke, or I need a field you don't have?** Open an issue in the **Issues** tab — we read them. For a custom build, contact us at [bebity.io](https://bebity.io).

### More from Bebity

- [Vinted Scraper](https://apify.com/bebity/vinted-premium-actor) — listings and seller profiles across 12 Vinted marketplaces
- [Booking Scraper](https://apify.com/bebity/booking-stays-scraper) — hotels, apartments, hostels, B\&Bs and villas by location, URL or property
- [Glassdoor Jobs Scraper](https://apify.com/bebity/glassdoor-jobs-scraper) — job listings from Glassdoor

### Changelog

Full history in [CHANGELOG.md](CHANGELOG.md).

#### 2.0.2 — 2026-09-15

Pay-per-event is live. App rows $0.20 / 1,000; full details and the App Store page +$0.30 / 1,000 (+$0.20 from Gold); ratings +$0.20 / 1,000; reviews $0.50 / 1,000 ($0.40 from Bronze); $0.00005 per run start.

#### 2.0.1 — 2026-09-15

An invalid input no longer fails the run: the log explains what to fix, nothing is requested or charged, and the run ends as succeeded. Memory is fixed at 1 GB.

#### 2.0.0 — 2026-09-15 · full rewrite

**Breaking — input.** One action per run: `action` is now `searchApps`, `appDetails`, `similarApps` or `appReviews`, and the extras are checkboxes — `includeAppFullDetails` (replaces `fullDetail`, on by default), `includeAppStorePage`, `includeRatings`. `appIdOrUrl` → `appIdsOrUrls`, `devIdOrUrl` → `developers`, `search` → `searchTerms` (all lists); `collection` / `category` → `chart` / `genre`; `num` → `maxItems` and `maxReviewsPerApp`. A v1 input is refused with a message that maps it to the new fields.

**Breaking — output.** App rows keep the 33 historical fields and their types (`id` and `developerId` stay numbers). Reviews moved to their own **Reviews** dataset. Failures are `failed: true` rows instead of empty runs.

**New.** Pay-per-event pricing · iPad, Mac, Apple TV, Watch and Vision · Apple TV charts · developer lookup by name · in-app purchases · version history · chart rank · reviews up to 100,000 per app with developer replies, `isEdited` and `favorable` / `critical` sorts · ratings histogram with its total · provenance fields (`sourceType`, `searchTerm`, `position`, `sourceAppId`).

**Fixed.** Privacy labels (dead since Apple removed the page token) · numeric app IDs sent as bundle IDs (0 rows) · App Store URLs never parsed · reviews capped at 50 · developer catalogues capped at 50 · rating counts truncated (`42,036,572` read as `42`).

#### 0.0.18 — 2023-07

Legacy actor: a wrapper around the `app-store-scraper` library, on a monthly subscription.

# Changelog

This Actor's version history is a separate document: https://apify.com/bebity/apple-store-api/changelog.md

# Actor input Schema

## `action` (type: `string`):

Search apps → the apps found · App details → one row per targeted app · Similar apps → the similar apps of each targeted app · App reviews → the reviews of each targeted app, into the Reviews dataset.

## `includeAppFullDetails` (type: `boolean`):

The 43 full fields: description, price, developer, average rating, screenshots, version… — one batched request for 200 apps, $0.30 / 1,000 apps ($0.20 from the Gold plan). Always included with "App details". Unticked: an iPhone search or similar apps return only the id and the URL; a chart or a TV / Watch / Vision search returns a short card. Added automatically when ratings or a developer / genre filter need it on a source without full rows (iPhone / TV / Watch / Vision search, chart, similar apps).

## `includeAppStorePage` (type: `boolean`):

Reads each app's App Store page: privacy, in-app purchases (the 10 Apple shows), version history (latest 25), chart rank and ratings histogram — one page per app, $0.30 / 1,000 apps ($0.20 from the Gold plan).

## `includeRatings` (type: `boolean`):

Total and 5★→1★ histogram — one light page per app, $0.20 / 1,000 apps, not billed when Apple publishes no histogram. Already included when the previous box is ticked.

## `appIdsOrUrls` (type: `array`):

One app per line. E.g. 324684580 · com.spotify.client · https://apps.apple.com/us/app/id6448311069

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

Numeric ID (324684583) or name (Supercell). A name is resolved automatically and the row then carries a confidence score.

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

One term per line. Each term is a source of its own: the row budget is shared fairly between the terms, the chart and the developers.

## `chart` (type: `string`):

Leave empty to skip charts.

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

Store genre. Apple's full list (27 genres, 61 sub-genres). On a top chart, Apple applies the filter; on new releases, Apple ignores it: it is applied to the chart's apps afterwards, which can then hold far fewer than 100; on a search, it is applied to the results (Apple exposes no genre filter on search). Note: Stickers returns nothing on charts.

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

Apple keeps the full review history: up to 100,000 per app. Many apps have fewer — the fetch stops by itself. The run's row cap and your budget apply too.

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

Review order: most recent, most helpful by votes, most favorable or most critical.

## `platform` (type: `string`):

Acts on search and charts. No effect on a developer's catalog: Apple does not segment it by platform.

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

Country storefront, 2-letter code (115 stores supported). Determines the catalog, prices and currency. Left empty via the API: country of the first Store URL, us otherwise. A code without an App Store storefront is rejected before any request.

## `lang` (type: `string`):

Metadata language, when the app is localized in that store. Codes accepted by Apple: ar, bg, bn, ca, cs, da, de, el, en, es, et, fi, fr, gu, he, hi, hr, hu, id, is, it, ja, kk, kn, ko, lt, lv, ml, mr, ms, nb, nl, or, pa, pl, pt, ro, ru, sk, sl, sv, ta, te, th, tr, uk, ur, vi, zh. No effect on reviews: Apple does not translate them.

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

Global run cap across all sources. Protects your budget.

## Actor input object example

```json
{
  "action": "appDetails",
  "includeAppFullDetails": true,
  "includeAppStorePage": false,
  "includeRatings": false,
  "appIdsOrUrls": [
    "324684580",
    "com.spotify.client",
    "https://apps.apple.com/us/app/id6448311069"
  ],
  "developers": [
    "324684583",
    "Supercell"
  ],
  "searchTerms": [
    "music",
    "fitness tracker"
  ],
  "chart": "",
  "genre": "",
  "maxReviewsPerApp": 50,
  "reviewsSort": "recent",
  "platform": "iphone",
  "country": "us",
  "lang": "en",
  "maxItems": 200
}
```

# Actor output Schema

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

No description

## `reviews` (type: `string`):

No description

## `failedApps` (type: `string`):

No description

## `failedReviews` (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 = {
    "action": "appDetails",
    "appIdsOrUrls": [
        "324684580"
    ],
    "country": "us",
    "lang": "en"
};

// Run the Actor and wait for it to finish
const run = await client.actor("bebity/apple-store-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 = {
    "action": "appDetails",
    "appIdsOrUrls": ["324684580"],
    "country": "us",
    "lang": "en",
}

# Run the Actor and wait for it to finish
run = client.actor("bebity/apple-store-api").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 '{
  "action": "appDetails",
  "appIdsOrUrls": [
    "324684580"
  ],
  "country": "us",
  "lang": "en"
}' |
apify call bebity/apple-store-api --silent --output-dataset

```

## MCP server setup

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

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/XErktmamiyjbwTzQ2/builds/fvrXv8th6dMfFHIKg/openapi.json
