# App Store Scraper: iOS App Data, Ratings & In-App Purchases (`steadyscrape/app-store-scraper`) Actor

Scrape Apple App Store app data by link, app id, bundle id or developer, in 174 countries: subtitle, price, rating and 1–5 star breakdown, version history, in-app purchases, App Privacy labels, chart rank, similar apps, EU developer contact. Export to JSON, CSV or Excel, or via API.

- **URL**: https://apify.com/steadyscrape/app-store-scraper.md
- **Developed by:** [Steady Scrape](https://apify.com/steadyscrape) (community)
- **Categories:** Developer tools, SEO tools, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 app with product page details

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 Scraper: iOS App Data, Ratings & In-App Purchases

**App Store Scraper** reads full Apple App Store listings of iPhone and iPad apps — by App Store link, app id, bundle id
or developer — in any of 174 countries. Every app comes with Apple's own catalogue data (name, description, price,
rating, version, size, languages, release and update dates, developer and seller) and, from the app's product page on
apps.apple.com, what no lookup API gives: the **subtitle**, the **1–5 star ratings breakdown**, the **version history**
with release notes, **in-app purchases with their prices**, **App Privacy labels**, the **top chart rank**, **Editors'
Choice**, age rating notes, app events, the apps shown under "You Might Also Like" and the **developer's contact details
in EU storefronts**. Export the App Store data to JSON, CSV or Excel, or get it through the Apify API.

No login, no browser: plain requests to Apple's public pages at a polite pace.

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

- **App Store Optimization (ASO)**: compare titles, subtitles, descriptions, screenshots and release notes of your app and
  its competitors, country by country.
- **Competitor research**: track competitors' prices, in-app purchase prices and subscription tiers, update cadence
  (version history), ratings breakdown and chart rank.
- **Market maps**: start from one app and add the apps the App Store lists as similar, or list every app of a developer.
- **Privacy audits**: collect the App Privacy labels (data used to track you, linked to you, not linked) of a whole
  category of apps.
- **Lead generation**: EU storefronts show each developer's trader address, phone and e-mail (required by the Digital
  Services Act); the "Developer contacts" view lists them.

### Input

| field | what it does |
|---|---|
| **Apps** | App Store links (`https://apps.apple.com/us/app/duolingo-learn-languages/id570060128`), app ids (`570060128`) or bundle ids (`com.duolingo.DuolingoMobile`). |
| **Developers** | Developer links (`https://apps.apple.com/us/developer/duolingo/id570060151`) or ids (`570060151`): every iPhone and iPad app of each one, up to the 200 Apple lists. |
| **Countries** | App Store countries, default `us`. Each app is scraped once per country: texts, prices, currency, ratings and chart rank change by country. |
| **Include product page details** | On by default. Reads each app's App Store page for the `details` object below. Off: only the catalogue data, at the lower price. |
| **Include similar apps** | Also scrapes the up to 10 apps each of your listed apps shows under "You Might Also Like" (one level deep). Needs product page details. |

```json
{
  "apps": ["https://apps.apple.com/us/app/duolingo-learn-languages/id570060128", "com.openai.chat"],
  "developers": ["570060151"],
  "countries": ["us", "de"],
  "includeDetails": true,
  "includeSimilarApps": false
}
```

### Output: App Store data, one row per app and country

```json
{
  "appId": "570060128",
  "bundleId": "com.duolingo.DuolingoMobile",
  "url": "https://apps.apple.com/us/app/duolingo-learn-languages/id570060128",
  "country": "us",
  "countryName": "United States",
  "language": "en-US",
  "languageName": "English (US)",
  "scrapedAt": "2026-10-29T13:53:25.855Z",
  "foundVia": "input",
  "name": "Duolingo: Learn Languages",
  "description": "Learn a new language, chess & more with the world's most downloaded education app! Duoling…",
  "releaseNotes": "Our mascot owl, Duo, is trading in his usual diet of mice fo…",
  "icon": "https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/e9/99/8b/e9998b23-eef1-33e5-5817-2729377b2bc5/AppIcon-0-0-1x_U007epad-0-1-85-220.png/512x512bb.jpg",
  "screenshots": [
    "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/6e/ef/30/6eef3023-de04-3b29-21f8-a993245b9abd/iPhone6.5_-_Default_-_first_screen_adapt_Var_2_01.jpg/320x480bb.jpg",
    "…"
  ],
  "developer": "Duolingo",
  "developerId": "570060151",
  "developerUrl": "https://apps.apple.com/us/developer/duolingo/id570060151",
  "developerWebsite": "https://www.duolingo.com",
  "seller": "Duolingo, Inc",
  "price": 0,
  "formattedPrice": "Free",
  "currency": "USD",
  "free": true,
  "rating": 4.7225,
  "ratingCount": 5542365,
  "genre": "Education",
  "genreId": "6017",
  "genres": [
    "Education",
    "Social Networking"
  ],
  "contentRating": "4+",
  "advisories": [],
  "version": "7.146.1",
  "minOsVersion": "17.0",
  "sizeBytes": 514102272,
  "supportedLanguages": [
    "AR",
    "BN",
    "CS",
    "NL",
    "…"
  ],
  "gameCenterEnabled": false,
  "releasedAt": "2012-11-13T08:00:00Z",
  "updatedAt": "2026-10-28T16:01:08Z",
  "details": {
    "subtitle": "Spanish, French, Chess & Math",
    "ratingHistogram": {
      "1": 140930,
      "2": 46892,
      "3": 136015,
      "4": 561557,
      "5": 4656971
    },
    "editorsChoice": true,
    "editorsNotes": "With its friendly approach and awesome updates, Duolingo’s long been o…",
    "chartRank": {
      "position": 1,
      "chart": "top-free",
      "genre": "Education",
      "genreId": "6017"
    },
    "versionHistory": [
      {
        "version": "7.146.1",
        "releasedAt": "2026-10-28T16:01:08Z",
        "releaseNotes": "Our mascot owl, Duo, is trading in his usual diet …"
      },
      "…"
    ],
    "inAppPurchases": [
      {
        "name": "Barrel of Gems (1200)",
        "price": "$4.99",
        "priceValue": 4.99
      },
      {
        "name": "Super Duolingo",
        "price": "$9.99",
        "priceValue": 9.99
      },
      "…"
    ],
    "privacyLabels": [
      {
        "type": "DATA_USED_TO_TRACK_YOU",
        "title": "Data Used to Track You",
        "categories": [
          "PURCHASES",
          "LOCATION",
          "CONTACT_INFO",
          "…"
        ],
        "categoryTitles": [
          "Purchases",
          "Location",
          "Contact Info",
          "…"
        ]
      }
    ],
    "ageRatingDetails": [
      "Contains: Advertising, Messaging and Chat"
    ],
    "privacyPolicyUrl": "https://www.duolingo.com/privacy",
    "euTrader": null,
    "appEvents": [
      {
        "id": "6815503919",
        "title": "Say hello to Shanghainese!",
        "subtitle": "Learn local phrases and get talking.",
        "detail": "Explore Shanghai through 50 units of everyday lang…",
        "kind": "MAJOR UPDATE",
        "startsAt": "2026-10-15T16:00:00.000Z",
        "endsAt": "2026-11-15T16:00:00.000Z"
      }
    ],
    "featuredIn": [
      {
        "heading": "TRY NOW",
        "title": "5 Tips for Duolingo Domination",
        "url": "https://apps.apple.com/us/iphone/story/id1748181882"
      }
    ],
    "similarApps": [
      {
        "appId": "379968583",
        "bundleId": "com.busuu.english.app",
        "name": "Busuu: Language Learning App",
        "subtitle": "Learn Spanish, French, English",
        "developer": "Busuu Limited",
        "rating": 4.7
      },
      "…"
    ],
    "moreByDeveloper": [
      {
        "appId": "1440502568",
        "bundleId": "com.duolingo.literacy",
        "name": "Learn to Read - Duolingo ABC",
        "subtitle": "Interactive Stories for Kids",
        "developer": "Duolingo",
        "rating": 4.3
      },
      "…"
    ]
  }
}
```

In an EU storefront (`de`, `fr`, `it`, `es`, `nl`…) `details.euTrader` carries the developer's contact:

```json
"euTrader": {
  "address": "5900 Penn Ave, Pittsburgh Pennsylvania 15206, Vereinigte Staaten",
  "phone": "+1 4125676602",
  "email": "ios@duolingo.com",
  "dunsNumber": null
}
```

#### App Store fields

| field | meaning |
|---|---|
| `appId`, `bundleId`, `url` | The App Store id, the bundle id and the app's App Store page in that country. |
| `country`, `countryName`, `language`, `languageName` | The App Store country the app was read in and that storefront's language. |
| `scrapedAt` | When it was read, ISO 8601 UTC. |
| `name`, `description`, `releaseNotes`, `icon`, `screenshots` | The listing as shown in that country (iPhone screenshots first, then iPad). |
| `developer`, `developerId`, `developerUrl`, `developerWebsite`, `seller` | Who makes it and who sells it. |
| `price`, `formattedPrice`, `currency`, `free` | The app's price in the country's currency. |
| `rating`, `ratingCount` | Average rating and number of ratings in that country. |
| `genre`, `genreId`, `genres`, `contentRating`, `advisories` | Category, all categories, age rating and its content advisories. |
| `version`, `minOsVersion`, `sizeBytes`, `supportedLanguages`, `gameCenterEnabled` | Technical details. |
| `releasedAt`, `updatedAt` | First release and current version's release, ISO 8601 UTC. |
| `foundVia` | `input` (you listed it), `developer` (from a developer you listed) or `similar` (a similar app). |
| `details.subtitle` | The app's subtitle; `null` when the developer wrote none for that language. |
| `details.ratingHistogram` | Number of 1★ to 5★ ratings. |
| `details.editorsChoice`, `details.editorsNotes` | Editors' Choice badge and Apple's editorial notes. |
| `details.chartRank` | Position in the top free or top paid chart of its category, when it is in one. |
| `details.versionHistory` | Up to the last 25 versions: version, release date (UTC) and release notes. |
| `details.inAppPurchases` | The top in-app purchases the page shows (up to 10): name, price as shown, and `priceValue` as a number. |
| `details.privacyLabels` | App Privacy: each label type (`DATA_USED_TO_TRACK_YOU`, `DATA_LINKED_TO_YOU`, `DATA_NOT_LINKED_TO_YOU`, `DATA_NOT_COLLECTED`) with its data categories. |
| `details.ageRatingDetails` | Age rating notes ("Contains: Advertising, Messaging and Chat"). |
| `details.privacyPolicyUrl` | The app's privacy policy link. |
| `details.euTrader` | EU storefronts only: trader address, phone, e-mail, D-U-N-S number. `null` elsewhere. |
| `details.appEvents`, `details.featuredIn` | In-app events on the page, and App Store stories that feature the app. |
| `details.similarApps`, `details.moreByDeveloper` | Apps shown as "You Might Also Like" and the developer's other apps: id, bundle id, name, subtitle, developer, rating. |

`details` is `null` when product page details are off, or when the page could not be read (then the row is charged as a
plain app and SUMMARY says why).

### Pricing

Pay per event, only for apps delivered:

| event | price | when |
|---|---|---|
| `app` | US$0.001 | an app in one country, catalogue data only |
| `app-with-details` | US$0.002 | an app in one country with its product page details |

1,000 apps with full product page details cost US$2. Apps not found, Mac apps and refused requests are free; they are
listed in the run's `SUMMARY` record. Set a maximum cost per run and the scraper stops when it is reached.

### Limits

- iPhone and iPad apps. Apps sold only on the Mac App Store, and ids of other iTunes media (albums, podcasts, books),
  are reported in `SUMMARY` and skipped, free.
- No keyword search: Apple's robots.txt forbids crawling its search, so apps come from your links, ids, bundle ids,
  developers and similar apps. For keyword rankings see
  [App Store & Google Play Keyword Rank Tracker](https://apify.com/steadyscrape/app-keyword-rank-tracker).
- Texts come in each country's main language.
- Apple lists at most 200 apps per developer, and up to 25 versions and 10 in-app purchases per app page.
- About one request per second to each Apple host: 100 apps with product pages take about two minutes.
- Reviews are not included: [App Store Reviews Scraper](https://apify.com/steadyscrape/app-store-reviews-scraper)
  reads them. For Google Play apps use [App Store & Google Play App Details Scraper](https://apify.com/steadyscrape/app-details-scraper).

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

This Actor reads only public App Store pages and Apple's public lookup API, without logging in, and follows Apple's
robots.txt (no search pages). The EU trader contact is information Apple publishes because the law requires it; if you
store or contact developers with it, personal data rules such as the GDPR still apply to you. This Actor is not
affiliated with or endorsed by Apple. Check that your use complies with Apple's terms and the laws that apply to you.

# Actor input Schema

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

App Store links (<code>https://apps.apple.com/us/app/duolingo-learn-languages/id570060128</code>), app ids (<code>570060128</code>) or bundle ids (<code>com.duolingo.DuolingoMobile</code>), one per line. iPhone and iPad apps; Mac App Store apps are reported and skipped.

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

Developer links (<code>https://apps.apple.com/us/developer/duolingo/id570060151</code>) or developer ids (<code>570060151</code>). Every iPhone and iPad app of each developer is scraped, up to the 200 Apple lists.

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

App Store countries (storefronts). Each app is scraped once per country: price, currency, ratings, chart rank, texts and in-app purchase prices change by country. EU countries also show the developer's trader contact (address, phone, e-mail).

## `includeDetails` (type: `boolean`):

Also read each app's App Store page: subtitle, ratings histogram (1–5 stars), version history, in-app purchases with prices, App Privacy labels, chart rank, Editors' Choice, age rating notes, app events, EU trader contact, similar apps and more apps by the developer. Charged as <code>app-with-details</code> instead of <code>app</code>.

## `includeSimilarApps` (type: `boolean`):

Also scrape the apps each of your listed apps shows under "You Might Also Like" (up to 10 each, one level deep, each charged like any app). Needs product page details.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/duolingo-learn-languages/id570060128"
  ],
  "countries": [
    "us"
  ],
  "includeDetails": true,
  "includeSimilarApps": false
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "apps": [
        "https://apps.apple.com/us/app/duolingo-learn-languages/id570060128"
    ],
    "countries": [
        "us"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyscrape/app-store-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "apps": ["https://apps.apple.com/us/app/duolingo-learn-languages/id570060128"],
    "countries": ["us"],
}

# Run the Actor and wait for it to finish
run = client.actor("steadyscrape/app-store-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "apps": [
    "https://apps.apple.com/us/app/duolingo-learn-languages/id570060128"
  ],
  "countries": [
    "us"
  ]
}' |
apify call steadyscrape/app-store-scraper --silent --output-dataset

```

## MCP server setup

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

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/vqeKsPiclIndzgavi/builds/pmZelNjDyzfU78uuk/openapi.json
