# App Store API — iOS App Details, Search, Charts & Reviews (`highbrow_fame/app-store-api`) Actor

App Store app details (price, rating, version, screenshots), keyword search, top charts by country and customer reviews, from Apple's public endpoints. No key. Unofficial App Store API.

- **URL**: https://apify.com/highbrow_fame/app-store-api.md
- **Developed by:** [yestrue](https://apify.com/highbrow_fame) (community)
- **Categories:** Developer tools, E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.80 / 1,000 apps

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 API — iOS App Details, Search, Charts & Reviews

Everything the App Store shows about an iOS app as one clean JSON record: name, developer, price and currency, average rating and rating count (all versions and current version), version and release dates, release notes, description, genres, age rating, download size, minimum iOS, languages, icon and screenshots. Look up apps by id, bundle id or link, search by keyword, read the top-free and top-paid charts of any country — and, when you want them, the customer reviews with rating, title, text, version and date. Built on Apple's public, key-less lookup, search and RSS endpoints.

**Try it in 1 minute:**

1. Press **Start** — the prefilled input looks up two apps in the US store: Facebook (by id) and Instagram (by link).
2. Seconds later the **Output** tab shows both records with price, rating, version, size, genres, icon and screenshots.
3. Download JSON, CSV or Excel, or add **Search queries**, pick a **Top chart**, change the **Country** and switch **Include reviews** on.

Price: **$0.80 per 1,000 apps** (one app = one record, with its reviews included when you ask for them). Ids that do not exist, queries without matches and invalid inputs are free.

**Use it to:**

- Track competitors' apps on a schedule: version, release notes, rating and rating count, price changes, size — per country.
- Build a keyword-ranking report: which apps rank for "photo editor" in the US, DE and JP stores, with position and ratings.
- Pull the top-free and top-paid charts of a country every day for market research or a newsletter.
- Mine reviews for a product team or an AI summariser: the 500 newest or most helpful reviews per app and storefront, without reviewer names.
- Enrich a list of bundle ids or App Store links from your CRM or spreadsheet with structured app data.

### How it works

1. **Apps**: ids, `id123` forms, bundle ids and apps.apple.com links are parsed and deduplicated; numeric ids are looked up in batches of 100 with Apple's lookup endpoint (`itunes.apple.com/lookup`), bundle ids one by one. A link with its own storefront (`/de/app/…`) is looked up in that storefront.
2. **Search queries** go to Apple's search endpoint (`itunes.apple.com/search?entity=software`) with up to **Max results** apps per query (max 200), each with its `position`.
3. **Top charts** come from Apple's marketing feed (`rss.marketingtools.apple.com/api/v2/<country>/apps/top-free|top-paid/…`), which lists ids and names; the details are then fetched with one batched lookup, keeping the chart `position`. The public feed offers top-free and top-paid only — there is no public top-grossing feed.
4. **Reviews** (optional) come from Apple's public customer-reviews RSS feed, 50 per page, up to 10 pages (500 reviews) per app and storefront, newest or most helpful first. Reviewer names are not collected; phone numbers and e-mail addresses are removed from review text, descriptions and release notes.

Requests go directly to Apple (no proxy, unless a connection drops); Apple's per-IP rate limit on lookup and search (HTTP 403/429) is waited out and retried.

### Input

| Field | What it does |
|---|---|
| `appIds` | Apps to look up: numeric id, `id123`, bundle id or apps.apple.com link, one per line. |
| `queries` | Keywords to search, one per line. |
| `charts` | `top-free` and/or `top-paid` for the country. |
| `country` | Two-letter storefront (default `us`). |
| `maxResults` | Apps per query (up to 200) or chart (up to 100); default 25. |
| `includeReviews` | Add customer reviews to every app (default off). |
| `maxReviews` | Reviews per app, up to 500 (default 50). |
| `sortBy` | `mostrecent` (default) or `mosthelpful`. |
| `maxConcurrency` | Parallel requests (default 3 — Apple rate-limits per IP). |
| `proxyConfiguration` | Used only to retry after a network error; the first try is direct. |

### Output

One record per app:

| Field | What it is |
|---|---|
| `appId`, `bundleId`, `name`, `url` | Identity and store page |
| `developer`, `developerId`, `developerUrl`, `sellerName`, `sellerUrl` | The business behind the app |
| `price`, `currency`, `formattedPrice`, `isFree` | Price in the storefront currency |
| `rating`, `ratingCount`, `ratingCurrentVersion`, `ratingCountCurrentVersion` | Average rating (0-5) and number of ratings, all versions and current version |
| `version`, `releaseDate`, `currentVersionReleaseDate`, `releaseNotes` | Versions and dates (ISO 8601) |
| `description`, `genres[]`, `primaryGenre`, `genreIds[]`, `contentRating` | What it is and for whom |
| `size`, `minimumOsVersion`, `languages[]`, `supportedDevicesCount` | Technical facts (`size` in bytes) |
| `icon`, `screenshots[]`, `ipadScreenshots[]` | Images |
| `country`, `source`, `position` | Storefront, where the record came from (`lookup`, `search`, `chart`) and its 1-based position in a query or chart |
| `reviews[]`, `reviewsError` | `{ id, rating, title, text, version, publishedAt, voteCount, voteSum }` with Include reviews on; `reviewsError` says when the list stopped early |
| `input`, `status`, `error`, `scrapedAt` | What you gave, `OK` / `NOT_FOUND` / `NO_RESULTS` / `INVALID_INPUT` / `FAILED`, the reason, and when |

#### Example

```json
{
  "input": "https://apps.apple.com/us/app/instagram/id389801252",
  "source": "lookup",
  "appId": "389801252",
  "bundleId": "com.burbn.instagram",
  "name": "Instagram",
  "developer": "Instagram, Inc.",
  "developerId": "389801255",
  "developerUrl": "https://apps.apple.com/us/developer/instagram-inc/id389801255?uo=4",
  "url": "https://apps.apple.com/us/app/instagram/id389801252?uo=4",
  "price": 0,
  "currency": "USD",
  "formattedPrice": "Free",
  "isFree": true,
  "rating": 4.72,
  "ratingCount": 28401220,
  "ratingCurrentVersion": 4.72,
  "ratingCountCurrentVersion": 28401220,
  "version": "399.0",
  "releaseDate": "2010-10-06T07:00:00.000Z",
  "currentVersionReleaseDate": "2026-10-13T16:03:11.000Z",
  "releaseNotes": "Bug fixes and performance improvements.",
  "description": "Little moments lead to big friendships. Share yours on Instagram.",
  "genres": ["Photo & Video", "Social Networking"],
  "primaryGenre": "Photo & Video",
  "genreIds": ["6008", "6005"],
  "contentRating": "12+",
  "size": 348713984,
  "minimumOsVersion": "15.1",
  "languages": ["EN", "DE", "ES", "FR", "JA"],
  "icon": "https://is1-ssl.mzstatic.com/image/thumb/Purple/v4/11/22/33/icon/512x512bb.jpg",
  "screenshots": ["https://is1-ssl.mzstatic.com/image/thumb/PurpleSource/v4/aa/bb/cc/shot1/392x696bb.png"],
  "ipadScreenshots": [],
  "supportedDevicesCount": 5,
  "sellerName": "Instagram, Inc.",
  "sellerUrl": "https://help.instagram.com/",
  "country": "us",
  "position": null,
  "reviews": [
    { "id": "12900000001", "rating": 5, "title": "Love the new update", "text": "Works great, reels load faster now.", "version": "399.0", "publishedAt": "2026-10-18T16:12:44.000Z", "voteCount": 4, "voteSum": 3 }
  ],
  "reviewsError": null,
  "status": "OK",
  "error": null,
  "scrapedAt": "2026-10-19T12:00:00.000Z"
}
```

### FAQ

**Is this an official API?** No, it's an unofficial API built on public pages — Apple's public lookup, search and RSS endpoints, which need no key. The data is what the App Store itself shows; this Actor only shapes it into stable JSON records.

**Why is an app NOT_FOUND?** It is not sold in that storefront, it was removed, or the id is wrong. Try the storefront the app is actually published in (`country`), or give the apps.apple.com link with its country code.

**How many reviews can I get?** Apple's public feed exposes at most 10 pages of 50 reviews per app and storefront — 500 newest or 500 most helpful. For more, run the same app with both orders or in several countries. Reviewer names are deliberately not collected.

**Can I get the top-grossing chart?** Not from this Actor: Apple's public marketing feed offers top-free and top-paid only. The charts are per country and are refreshed by Apple roughly daily.

**What about rate limits?** Apple limits its lookup and search endpoints to roughly 20 calls a minute per IP. Lookups are batched 100 ids per call, and a 403/429 answer is waited out and retried, so a run of a few thousand apps simply takes a few minutes longer.

**Like it?** A short review on the Store page helps other people find this Actor. Something missing or broken? Tell us on the Issues tab — we read every one.

### Related Actors

- [Google Play Scraper](https://apify.com/highbrow_fame/google-play-apps-reviews) — apps, search and reviews
- [Website Tech Stack Detector](https://apify.com/highbrow_fame/website-tech-stack) — CMS, frameworks and analytics of any site
- [Google News API](https://apify.com/highbrow_fame/google-news-api) — headlines by keyword and topic
- [YouTube Channel API](https://apify.com/highbrow_fame/youtube-channel-api) — channel stats and the latest videos
- [News Search API](https://apify.com/highbrow_fame/news-search-api) — news by keyword with date range and full text

# Actor input Schema

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

Apps to look up, one per line: a numeric id (284882215), id389801252, a bundle id (com.burbn.instagram) or an apps.apple.com link. A link with a storefront (/de/app/…) is looked up in that storefront.

## `queries` (type: `array`):

Keywords to search the App Store for, one per line (e.g. "photo editor"). Up to Max results apps per query, with their position.

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

Top charts to read for the country, with each app's details and chart position. Apple's public feed has top-free and top-paid (there is no public top-grossing feed).

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

Two-letter storefront code: us, gb, de, fr, jp, br … Prices, availability, charts and reviews are per storefront.

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

Apps per search query (up to 200) and per chart (up to 100).

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

Add the app's customer reviews from Apple's public reviews feed: rating, title, text, version, date, votes. Reviewer names are not collected.

## `maxReviews` (type: `integer`):

Apple's feed gives 50 reviews per page and at most 10 pages, so up to 500 per app and storefront.

## `sortBy` (type: `string`):

Most recent first, or most helpful first.

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

Apple rate-limits its lookup and search API per IP (about 20 calls a minute); 3 is safe. Rate limits are waited out and retried.

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

Used only to try again after a network error: Apple's endpoints answer directly, so the first try of every request goes out without a proxy.

## Actor input object example

```json
{
  "appIds": [
    "284882215",
    "https://apps.apple.com/us/app/instagram/id389801252"
  ],
  "queries": [],
  "charts": [],
  "country": "us",
  "maxResults": 25,
  "includeReviews": false,
  "maxReviews": 50,
  "sortBy": "mostrecent",
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Every result as a JSON record, with a status for each input.

## `resultsCsv` (type: `string`):

The same records as CSV, for a spreadsheet.

# 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 = {
    "appIds": [
        "284882215",
        "https://apps.apple.com/us/app/instagram/id389801252"
    ],
    "queries": [],
    "charts": [],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("highbrow_fame/app-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 = {
    "appIds": [
        "284882215",
        "https://apps.apple.com/us/app/instagram/id389801252",
    ],
    "queries": [],
    "charts": [],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("highbrow_fame/app-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 '{
  "appIds": [
    "284882215",
    "https://apps.apple.com/us/app/instagram/id389801252"
  ],
  "queries": [],
  "charts": [],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call highbrow_fame/app-store-api --silent --output-dataset

```

## MCP server setup

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