# Apple App Store Scraper: Apps, Reviews & ASO (`scrapingmonkey/apple-app-store-scraper`) Actor

Extract Apple App Store apps, reviews, rankings, privacy labels, version history, in-app purchases, events, editorial features, similar apps, developer portfolios, and country availability. Get 55-field app details and up to 500 reviews per app. No Apple account or API key required.

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

## Pricing

from $0.38 / 1,000 search 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Apple App Store Scraper - App Details, Reviews, Rankings and Market Data

Extract public Apple App Store apps, enriched product details, customer reviews, charts, developer catalogs, similar apps, privacy labels, regional availability, in-app purchases, events, editorial features, and search suggestions into analysis-ready datasets.

- Run 11 focused modes for discovery, product intelligence, review research, localization, and monitoring
- Get 55 top-level fields in each enriched details row, including ratings histogram, App Privacy, version history, device requirements, IAPs, events, and editorial placements
- Search multiple keywords or process multiple apps and developers in one run
- Accept numeric Apple IDs, bundle IDs, and full `apps.apple.com` URLs
- Localize catalog metadata, prices, ratings, and availability by App Store country and language
- Filter reviews by star rating and ISO date; retain review and parent-app context in every row
- No Apple account, API key, browser cookies, or user-supplied proxy configuration is required
- Export results to JSON, CSV, Excel, XML, or consume them through the Apify API

### What can you do with this Apple App Store Scraper?

| Mode | Input | One dataset row | Best for |
| --- | --- | --- | --- |
| `search` | `searchTerms` | One matching app with 44 App Store fields plus query context | Keyword research and competitor discovery |
| `details` | `appIds` | One app with 55 top-level fields and nested enrichment | Complete product intelligence |
| `reviews` | `appIds` | One customer review with app context | Voice-of-customer and sentiment analysis |
| `charts` | Collection and optional genre ID | One ranked chart app | Ranking and category monitoring |
| `developer` | `developerIds` | One app published by the developer | Portfolio research |
| `similar` | `appIds` | One Apple-recommended related app | Competitive landscape discovery |
| `suggest` | `searchTerms` | One App Store search suggestion | ASO keyword expansion |
| `availability` | `appIds`, `countries` | One app-country availability result | Launch and localization audits |
| `iap` | `appIds` | One displayed in-app purchase and localized price | Monetization research |
| `events` | `appIds` | One current or upcoming in-app event | Live-ops monitoring |
| `editorial` | `appIds` | One Apple editorial placement featuring the app | Featuring and promotion research |

Choose one mode per run. You can feed IDs discovered by `search`, `charts`, `developer`, or `similar` into `details`, `reviews`, `availability`, `iap`, `events`, or `editorial` in a later run.

### Quick start

1. Open the Actor and click **Try for free**.
2. Keep `search` selected and enter one or more keywords in **Search terms**.
3. Set **Maximum items per input** to a small value such as `10`.
4. Click **Start**.
5. Preview the Dataset or download it in your preferred format.

The default input searches for `photo editor` and works without credentials or proxy setup.

### Input examples

#### Search apps

```json
{
  "mode": "search",
  "searchTerms": ["photo editor", "video editor"],
  "maxItems": 20,
  "country": "us",
  "language": "en-US"
}
```

`maxItems` applies separately to each search term. One row represents one matching app.

#### Enriched app details

```json
{
  "mode": "details",
  "appIds": [
    "https://apps.apple.com/us/app/instagram/id389801252",
    "com.google.ios.youtube",
    "835599320"
  ],
  "country": "us",
  "language": "en-US",
  "includePrivacy": true,
  "includeVersionHistory": true,
  "includeRatingsHistogram": true,
  "includeIAP": true,
  "includeEvents": true,
  "includeReviews": false
}
```

#### Filtered reviews

```json
{
  "mode": "reviews",
  "appIds": ["389801252", "com.spotify.client"],
  "maxItems": 100,
  "country": "us",
  "language": "en-US",
  "reviewSort": "mostRecent",
  "reviewScore": 1,
  "reviewsSince": "2026-01-01"
}
```

#### Top charts

```json
{
  "mode": "charts",
  "chartCollection": "topFree",
  "category": 6014,
  "maxItems": 100,
  "country": "us",
  "language": "en-US"
}
```

#### Apps by developer

```json
{
  "mode": "developer",
  "developerIds": ["570060151"],
  "maxItems": 100,
  "country": "us"
}
```

#### Similar apps

```json
{
  "mode": "similar",
  "appIds": ["570060128"],
  "maxItems": 20,
  "country": "us"
}
```

#### Search suggestions

```json
{
  "mode": "suggest",
  "searchTerms": ["photo", "fitness"],
  "maxItems": 10,
  "country": "us",
  "language": "en-US"
}
```

#### Availability by country

```json
{
  "mode": "availability",
  "appIds": ["com.duolingo.DuolingoMobile"],
  "countries": ["us", "gb", "de", "jp"],
  "language": "en-US"
}
```

#### In-app purchases

```json
{
  "mode": "iap",
  "appIds": ["570060128"],
  "country": "us",
  "language": "en-US"
}
```

#### App events

```json
{
  "mode": "events",
  "appIds": ["1094591345"],
  "country": "us",
  "language": "en-US"
}
```

#### Featured editorial stories

```json
{
  "mode": "editorial",
  "appIds": ["570060128"],
  "country": "us",
  "language": "en-US"
}
```

### Complete output examples

Every distinct dataset shape is shown below. Optional scalar values are `null` when Apple does not publish them; repeatable groups are empty arrays when unavailable. Failed targets are logged and skipped rather than emitted as artificial error rows.

#### Complete `search` output - 46 top-level fields

```json
{
  "appId": "570060128",
  "bundleId": "com.duolingo.DuolingoMobile",
  "title": "Duolingo: Language Lessons",
  "url": "https://apps.apple.com/us/app/id570060128",
  "description": "Learn languages with short lessons.",
  "icon": "https://example.com/icon-512.jpg",
  "icon60": "https://example.com/icon-60.jpg",
  "icon100": "https://example.com/icon-100.jpg",
  "icon512": "https://example.com/icon-512.jpg",
  "genres": ["Education", "Productivity"],
  "genreIds": ["6017", "6007"],
  "primaryGenre": "Education",
  "primaryGenreId": 6017,
  "contentRating": "4+",
  "trackContentRating": "4+",
  "languages": ["EN", "DE"],
  "sizeBytes": 498500000,
  "minimumOsVersion": "17.0",
  "released": "2012-11-13T08:00:00Z",
  "updated": "2026-08-03T18:03:04Z",
  "releaseNotes": "Performance improvements.",
  "version": "7.134.0",
  "price": 0.0,
  "formattedPrice": "Free",
  "currency": "USD",
  "free": true,
  "developerId": "570060151",
  "developer": "Duolingo",
  "developerUrl": "https://apps.apple.com/us/developer/id570060151",
  "developerWebsite": "https://www.duolingo.com/",
  "sellerName": "Duolingo, Inc",
  "score": 4.7,
  "ratingCount": 5374930,
  "currentVersionScore": 4.7,
  "currentVersionRatingCount": 1200,
  "screenshots": ["https://example.com/iphone.jpg"],
  "ipadScreenshots": ["https://example.com/ipad.jpg"],
  "appleTvScreenshots": [],
  "supportedDevices": ["iPhone15,2"],
  "features": ["iosUniversal"],
  "advisories": [],
  "kind": "software",
  "isGameCenterEnabled": false,
  "country": "us",
  "searchTerm": "language learning",
  "recordType": "search"
}
```

#### Complete `details` output - 55 top-level fields

```json
{
  "appId": "570060128",
  "bundleId": "com.duolingo.DuolingoMobile",
  "title": "Duolingo: Language Lessons",
  "url": "https://apps.apple.com/us/app/id570060128",
  "description": "Learn languages with short lessons.",
  "icon": "https://example.com/icon-512.jpg",
  "icon60": "https://example.com/icon-60.jpg",
  "icon100": "https://example.com/icon-100.jpg",
  "icon512": "https://example.com/icon-512.jpg",
  "genres": ["Education", "Productivity"],
  "genreIds": ["6017", "6007"],
  "primaryGenre": "Education",
  "primaryGenreId": 6017,
  "contentRating": "4+",
  "trackContentRating": "4+",
  "languages": ["EN", "DE"],
  "sizeBytes": 498500000,
  "minimumOsVersion": "17.0",
  "released": "2012-11-13T08:00:00Z",
  "updated": "2026-08-03T18:03:04Z",
  "releaseNotes": "Performance improvements.",
  "version": "7.134.0",
  "price": 0.0,
  "formattedPrice": "Free",
  "currency": "USD",
  "free": true,
  "developerId": "570060151",
  "developer": "Duolingo",
  "developerUrl": "https://apps.apple.com/us/developer/id570060151",
  "developerWebsite": "https://www.duolingo.com/",
  "sellerName": "Duolingo, Inc",
  "score": 4.7,
  "ratingCount": 5374930,
  "currentVersionScore": 4.7,
  "currentVersionRatingCount": 1200,
  "screenshots": ["https://example.com/iphone.jpg"],
  "ipadScreenshots": ["https://example.com/ipad.jpg"],
  "appleTvScreenshots": [],
  "supportedDevices": ["iPhone15,2"],
  "features": ["iosUniversal"],
  "advisories": [],
  "kind": "software",
  "isGameCenterEnabled": false,
  "country": "us",
  "formattedSize": "498.5 MB",
  "information": [
    {
      "name": "Compatibility",
      "value": null,
      "details": [
        {
          "name": "iPhone",
          "value": "Requires iOS 17.0 or later."
        }
      ]
    }
  ],
  "deviceRequirements": [
    {
      "device": "iPhone",
      "requirement": "Requires iOS 17.0 or later."
    }
  ],
  "ratingsHistogram": {
    "average": 4.7,
    "total": 5374930,
    "1": 134624,
    "2": 44984,
    "3": 131110,
    "4": 543631,
    "5": 4520581
  },
  "privacyDetails": {
    "privacyPolicyUrl": "https://www.duolingo.com/privacy",
    "privacyTypes": [
      {
        "identifier": "DATA_USED_TO_TRACK_YOU",
        "title": "Data Used to Track You",
        "description": "Data may be used to track you.",
        "dataCategories": [
          {
            "identifier": "CONTACT_INFO",
            "title": "Contact Info",
            "dataTypes": ["Email Address"]
          }
        ],
        "purposes": [
          {
            "identifier": "THIRD_PARTY_ADVERTISING",
            "title": "Third-Party Advertising",
            "description": "Used to display third-party advertisements."
          }
        ]
      }
    ]
  },
  "versionHistory": [
    {
      "version": "7.134.0",
      "releaseDate": "Mon Aug 03 2026 18:03:04 GMT+0000 (Coordinated Universal Time)",
      "releaseNotes": "Performance improvements."
    }
  ],
  "inAppPurchases": [
    {
      "rank": 1,
      "name": "Super Duolingo",
      "priceText": "$9.99"
    }
  ],
  "appEvents": [
    {
      "eventId": "event-123",
      "title": "Learning challenge",
      "subtitle": "Complete daily lessons",
      "description": "A limited-time learning event.",
      "promotionType": "event",
      "badge": "CHALLENGE",
      "kind": "event",
      "startDate": "2026-08-01T00:00:00Z",
      "endDate": "2026-08-10T00:00:00Z",
      "formattedDates": [
        {
          "kind": "AppEventFormattedDate",
          "showLiveIndicator": false,
          "displayText": "HAPPENING NOW",
          "displayFromDate": "2026-08-01T00:00:00Z",
          "countdownToDate": null,
          "countdownStringKey": null
        }
      ],
      "image": "https://example.com/event.jpg",
      "url": "https://apps.apple.com/us/app/id570060128"
    }
  ],
  "featuredEditorial": [
    {
      "editorialId": "1825160725",
      "heading": "APP OF THE DAY",
      "title": "Make language practice a habit",
      "description": "Learn something new every day.",
      "style": "EditorialCard",
      "image": "https://example.com/editorial.jpg",
      "url": "https://apps.apple.com/us/iphone/story/id1825160725"
    }
  ],
  "includedReviews": [
    {
      "appId": "570060128",
      "reviewId": "14158523706",
      "userName": "Reviewer",
      "userUrl": null,
      "version": null,
      "score": 5,
      "title": "Experience so far",
      "text": "A useful review.",
      "url": "https://apps.apple.com/us/app/id570060128?see-all=reviews",
      "date": "2026-06-08T14:19:22.000Z",
      "isEdited": null,
      "thumbsUpCount": null,
      "thumbsUpTotal": null,
      "country": "us",
      "reviewSort": "mostHelpful",
      "requestedReviewSort": "mostRecent",
      "reviewSource": "appPageFallback",
      "appTitle": "Duolingo: Language Lessons",
      "appUrl": "https://apps.apple.com/us/app/id570060128",
      "bundleId": "com.duolingo.DuolingoMobile",
      "developer": "Duolingo",
      "appScore": 4.7,
      "appRatingCount": 5374930,
      "primaryGenre": "Education"
    }
  ],
  "recordType": "details"
}
```

When `includeReviews` is `false`, `includedReviews` is `[]`. Disabled detail enrichments keep their stable keys and return an empty array or an empty/default object.

#### Complete `review` output - 25 top-level fields

```json
{
  "appId": "389801252",
  "reviewId": "14158523706",
  "userName": "Reviewer",
  "userUrl": "https://itunes.apple.com/us/reviews/id123",
  "version": "390.0",
  "score": 5,
  "title": "Great app",
  "text": "Works well for sharing photos.",
  "url": "https://itunes.apple.com/review?id=14158523706",
  "date": "2026-08-01T12:30:00-07:00",
  "isEdited": null,
  "thumbsUpCount": 42,
  "thumbsUpTotal": 50,
  "country": "us",
  "reviewSort": "mostRecent",
  "requestedReviewSort": "mostRecent",
  "reviewSource": "rss",
  "appTitle": "Instagram",
  "appUrl": "https://apps.apple.com/us/app/instagram/id389801252",
  "bundleId": "com.burbn.instagram",
  "developer": "Instagram, Inc.",
  "appScore": 4.7,
  "appRatingCount": 28000000,
  "primaryGenre": "Photo & Video",
  "recordType": "review"
}
```

Paginated rows use `reviewSource: "api"`. If that source is temporarily unavailable, the Actor tries Apple's RSS feed and then public helpful reviews embedded in the app page. Embedded rows have `reviewSource: "appPageFallback"`, `reviewSort: "mostHelpful"`, and preserve the requested value in `requestedReviewSort`; source-specific fields may be `null`.

#### Complete `chart` output - 48 top-level fields

```json
{
  "appId": "389801252",
  "bundleId": "com.burbn.instagram",
  "title": "Instagram",
  "url": "https://apps.apple.com/us/app/id389801252",
  "description": "Share photos and videos.",
  "icon": "https://example.com/icon-512.jpg",
  "icon60": "https://example.com/icon-60.jpg",
  "icon100": "https://example.com/icon-100.jpg",
  "icon512": "https://example.com/icon-512.jpg",
  "genres": ["Photo & Video", "Social Networking"],
  "genreIds": ["6008", "6005"],
  "primaryGenre": "Photo & Video",
  "primaryGenreId": 6008,
  "contentRating": "12+",
  "trackContentRating": "12+",
  "languages": ["EN"],
  "sizeBytes": 315000000,
  "minimumOsVersion": "15.1",
  "released": "2010-10-06T08:12:41Z",
  "updated": "2026-08-01T09:00:00Z",
  "releaseNotes": "Performance improvements.",
  "version": "390.0",
  "price": 0.0,
  "formattedPrice": "Free",
  "currency": "USD",
  "free": true,
  "developerId": "389801255",
  "developer": "Instagram, Inc.",
  "developerUrl": "https://apps.apple.com/us/developer/id389801255",
  "developerWebsite": "https://www.instagram.com/",
  "sellerName": "Instagram, Inc.",
  "score": 4.7,
  "ratingCount": 28000000,
  "currentVersionScore": 4.7,
  "currentVersionRatingCount": 120000,
  "screenshots": ["https://example.com/iphone.jpg"],
  "ipadScreenshots": ["https://example.com/ipad.jpg"],
  "appleTvScreenshots": [],
  "supportedDevices": ["iPhone15,2"],
  "features": ["iosUniversal"],
  "advisories": ["Infrequent/Mild Mature/Suggestive Themes"],
  "kind": "software",
  "isGameCenterEnabled": false,
  "country": "us",
  "chartCollection": "topFree",
  "chartCategory": 6008,
  "chartRank": 1,
  "recordType": "chart"
}
```

#### Complete `developer` output - 47 top-level fields

```json
{
  "appId": "570060128",
  "bundleId": "com.duolingo.DuolingoMobile",
  "title": "Duolingo: Language Lessons",
  "url": "https://apps.apple.com/us/app/id570060128",
  "description": "Learn languages with short lessons.",
  "icon": "https://example.com/icon-512.jpg",
  "icon60": "https://example.com/icon-60.jpg",
  "icon100": "https://example.com/icon-100.jpg",
  "icon512": "https://example.com/icon-512.jpg",
  "genres": ["Education"],
  "genreIds": ["6017"],
  "primaryGenre": "Education",
  "primaryGenreId": 6017,
  "contentRating": "4+",
  "trackContentRating": "4+",
  "languages": ["EN"],
  "sizeBytes": 498500000,
  "minimumOsVersion": "17.0",
  "released": "2012-11-13T08:00:00Z",
  "updated": "2026-08-03T18:03:04Z",
  "releaseNotes": "Performance improvements.",
  "version": "7.134.0",
  "price": 0.0,
  "formattedPrice": "Free",
  "currency": "USD",
  "free": true,
  "developerId": "570060151",
  "developer": "Duolingo",
  "developerUrl": "https://apps.apple.com/us/developer/id570060151",
  "developerWebsite": "https://www.duolingo.com/",
  "sellerName": "Duolingo, Inc",
  "score": 4.7,
  "ratingCount": 5374930,
  "currentVersionScore": 4.7,
  "currentVersionRatingCount": 1200,
  "screenshots": ["https://example.com/iphone.jpg"],
  "ipadScreenshots": ["https://example.com/ipad.jpg"],
  "appleTvScreenshots": [],
  "supportedDevices": ["iPhone15,2"],
  "features": ["iosUniversal"],
  "advisories": [],
  "kind": "software",
  "isGameCenterEnabled": false,
  "country": "us",
  "sourceDeveloperId": "570060151",
  "developerAppRank": 1,
  "recordType": "developer"
}
```

#### Complete `similar` output - 47 top-level fields

```json
{
  "appId": "1546079573",
  "bundleId": "com.example.languageapp",
  "title": "Language Learning App",
  "url": "https://apps.apple.com/us/app/id1546079573",
  "description": "Practice another language.",
  "icon": "https://example.com/icon-512.jpg",
  "icon60": "https://example.com/icon-60.jpg",
  "icon100": "https://example.com/icon-100.jpg",
  "icon512": "https://example.com/icon-512.jpg",
  "genres": ["Education"],
  "genreIds": ["6017"],
  "primaryGenre": "Education",
  "primaryGenreId": 6017,
  "contentRating": "4+",
  "trackContentRating": "4+",
  "languages": ["EN"],
  "sizeBytes": 125000000,
  "minimumOsVersion": "16.0",
  "released": "2021-01-01T00:00:00Z",
  "updated": "2026-07-30T00:00:00Z",
  "releaseNotes": "Bug fixes.",
  "version": "5.2.0",
  "price": 0.0,
  "formattedPrice": "Free",
  "currency": "USD",
  "free": true,
  "developerId": "123456789",
  "developer": "Example Developer",
  "developerUrl": "https://apps.apple.com/us/developer/id123456789",
  "developerWebsite": "https://example.com/",
  "sellerName": "Example Developer LLC",
  "score": 4.6,
  "ratingCount": 42000,
  "currentVersionScore": 4.6,
  "currentVersionRatingCount": 500,
  "screenshots": ["https://example.com/iphone.jpg"],
  "ipadScreenshots": [],
  "appleTvScreenshots": [],
  "supportedDevices": ["iPhone15,2"],
  "features": ["iosUniversal"],
  "advisories": [],
  "kind": "software",
  "isGameCenterEnabled": false,
  "country": "us",
  "sourceAppId": "570060128",
  "similarityRank": 1,
  "recordType": "similar"
}
```

#### Complete `suggestion` output - 5 top-level fields

```json
{
  "searchTerm": "photo",
  "suggestion": "photo editor",
  "rank": 1,
  "country": "us",
  "recordType": "suggestion"
}
```

#### Complete `availability` output - 10 top-level fields

```json
{
  "appId": "570060128",
  "bundleId": "com.duolingo.DuolingoMobile",
  "title": "Duolingo: Language & Chess",
  "country": "gb",
  "available": true,
  "url": "https://apps.apple.com/gb/app/id570060128",
  "price": 0.0,
  "formattedPrice": "Free",
  "currency": "GBP",
  "recordType": "availability"
}
```

Unavailable country rows retain the same 10 keys with `available: false` and unavailable catalog values set to `null`.

#### Complete `iap` output - 8 top-level fields

```json
{
  "appId": "570060128",
  "bundleId": "com.duolingo.DuolingoMobile",
  "appTitle": "Duolingo: Language Lessons",
  "country": "us",
  "rank": 1,
  "name": "Super Duolingo",
  "priceText": "$9.99",
  "recordType": "iap"
}
```

#### Complete `app-event` output - 17 top-level fields

```json
{
  "appId": "1094591345",
  "bundleId": "com.nianticlabs.pokemongo",
  "appTitle": "Pokémon GO",
  "country": "us",
  "eventId": "event-123",
  "title": "Community Day",
  "subtitle": "A featured Pokémon appears",
  "description": "Join a limited-time in-game event.",
  "promotionType": "event",
  "badge": "SPECIAL_EVENT",
  "kind": "event",
  "startDate": "2026-08-09T14:00:00Z",
  "endDate": "2026-08-09T17:00:00Z",
  "formattedDates": [
    {
      "kind": "AppEventFormattedDate",
      "showLiveIndicator": false,
      "displayText": "HAPPENING NOW",
      "displayFromDate": "2026-08-09T14:00:00Z",
      "countdownToDate": null,
      "countdownStringKey": null
    }
  ],
  "image": "https://example.com/event.jpg",
  "url": "https://apps.apple.com/us/app/id1094591345",
  "recordType": "app-event"
}
```

#### Complete `editorial` output - 12 top-level fields

```json
{
  "appId": "570060128",
  "bundleId": "com.duolingo.DuolingoMobile",
  "appTitle": "Duolingo: Language Lessons",
  "country": "us",
  "editorialId": "1825160725",
  "heading": "APP OF THE DAY",
  "title": "Make language practice a habit",
  "description": "Learn something new every day.",
  "style": "EditorialCard",
  "image": "https://example.com/editorial.jpg",
  "url": "https://apps.apple.com/us/iphone/story/id1825160725",
  "recordType": "editorial"
}
```

### What data can you extract?

| Category | Complete field inventory |
| --- | --- |
| Record context | `recordType`, `searchTerm`, `suggestion`, `rank`, `sourceAppId`, `sourceDeveloperId`, `chartCollection`, `chartCategory`, `chartRank`, `developerAppRank`, `similarityRank` |
| App identity and content | `appId`, `bundleId`, `title`, `url`, `description`, `icon`, `icon60`, `icon100`, `icon512`, `kind` |
| Classification and compatibility | `genres`, `genreIds`, `primaryGenre`, `primaryGenreId`, `contentRating`, `trackContentRating`, `languages`, `sizeBytes`, `formattedSize`, `minimumOsVersion`, `supportedDevices`, `features`, `advisories`, `isGameCenterEnabled`, `information`, `deviceRequirements` |
| Release data | `released`, `updated`, `releaseNotes`, `version`, `versionHistory` |
| Pricing and monetization | `price`, `formattedPrice`, `currency`, `free`, `inAppPurchases`, `name`, `priceText` |
| Developer | `developerId`, `developer`, `developerUrl`, `developerWebsite`, `sellerName` |
| Ratings | `score`, `ratingCount`, `currentVersionScore`, `currentVersionRatingCount`, `ratingsHistogram` |
| Media | `screenshots`, `ipadScreenshots`, `appleTvScreenshots`, `image` |
| App Privacy | `privacyDetails` with `privacyPolicyUrl`; each privacy type has `identifier`, `title`, `description`, `dataCategories`, and `purposes`; categories have `identifier`, `title`, `dataTypes`; purposes have `identifier`, `title`, `description` |
| Reviews | `includedReviews`, `reviewId`, `userName`, `userUrl`, `text`, `date`, `isEdited`, `thumbsUpCount`, `thumbsUpTotal`, `reviewSort`, `requestedReviewSort`, `reviewSource`, `appTitle`, `appUrl`, `appScore`, `appRatingCount` |
| Availability | `country`, `available` plus localized `title`, `url`, `price`, `formattedPrice`, `currency` |
| Events | `appEvents`, `eventId`, `subtitle`, `promotionType`, `badge`, `startDate`, `endDate`, `formattedDates` |
| Editorial | `featuredEditorial`, `editorialId`, `heading`, `style` |

### Input parameters

| Parameter | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `mode` | string | Yes | `search` | `search`, `details`, `reviews`, `charts`, `developer`, `similar`, `suggest`, `availability`, `iap`, `events`, or `editorial` |
| `searchTerms` | string\[] | In `search` / `suggest` | `["photo editor"]` | Keywords processed independently |
| `appIds` | string\[] | In app-target modes | `[]` | Numeric IDs, bundle IDs, or App Store URLs |
| `developerIds` | string\[] | In `developer` | `[]` | Numeric Apple developer IDs |
| `country` | string | No | `us` | Two-letter App Store country controlling catalog and prices |
| `countries` | string\[] | In `availability` | `[]` | Regions checked independently; `country` is used when empty |
| `language` | string | No | `en-US` | Locale such as `en-US`, `de-DE`, `ja-JP`, or `en` |
| `maxItems` | integer | No | `50` | Maximum per search term, app, developer, or chart; `0` requests all source-exposed items; accepted range `0`-`500` |
| `maxConcurrency` | integer | No | `5` | Independent terms, app IDs, developer IDs, or availability regions processed concurrently, from 1 to 20 |
| `includeReviews` | boolean | No | `false` | Nest reviews inside details rows; every nested review is billed as one `review` event in addition to the `app-detail` event |
| `includePrivacy` | boolean | No | `true` | Include privacy policy and structured App Privacy labels |
| `includeVersionHistory` | boolean | No | `true` | Include embedded version-history entries |
| `includeRatingsHistogram` | boolean | No | `true` | Include exact 1-star through 5-star counts |
| `includeIAP` | boolean | No | `true` | Include displayed in-app purchases in details |
| `includeEvents` | boolean | No | `true` | Include displayed app events in details |
| `reviewSort` | string | No | `mostRecent` | `mostRecent` or `mostHelpful` |
| `reviewScore` | integer | No | unset | Keep only a rating from `1` to `5` |
| `reviewsSince` | string | No | unset | ISO date or timestamp lower bound |
| `chartCollection` | string | No | `topFree` | `topFree`, `topPaid`, `topGrossing`, `new`, `newFree`, `newPaid`, `topFreeIpad`, `topPaidIpad`, `topGrossingIpad`, `topFreeMac`, `topPaidMac`, or `topGrossingMac` |
| `category` | integer | No | unset | Optional Apple genre ID, for example `6014` for Games |

### Use cases

#### App Store optimization and keyword research

Combine `suggest` and `search` to expand seed keywords, measure the apps Apple returns for each query, and track competitors occupying important discovery positions.

#### Competitive product and monetization intelligence

Use `details`, `similar`, `developer`, and `iap` to compare positioning, screenshots, releases, ratings distributions, device requirements, portfolios, and localized purchase prices.

#### Review and customer research

Collect rating-filtered reviews with parent-app metadata, then send the Dataset to a notebook, warehouse, or language model for topic, complaint, and sentiment analysis.

#### Ranking and launch monitoring

Schedule `charts`, `availability`, `events`, and `editorial` runs to observe rank changes, country launches, live-ops campaigns, and Apple featuring over time.

#### Privacy and compliance research

Compare the public App Privacy categories and policies disclosed across competing apps or across repeated snapshots.

### Performance and cost

This Actor uses pay-per-event billing when that pricing model is enabled. Each saved row triggers the matching event: `search-result`, `app-detail`, `review`, `chart-result`, `developer-app`, `similar-app`, `suggestion`, `availability-result`, `iap-item`, `app-event`, or `editorial-item`. When `includeReviews` is enabled in details mode, the details row triggers one `app-detail` event and every review stored inside `includedReviews` triggers one additional `review` event. The Actor limits the nested review count before saving when the run is close to its maximum charge limit. Check the Actor's **Pricing** tab for the current per-event rates.

Details requests are heavier than basic app rows because they load the public product page. `includeReviews` adds review requests. Independent terms, app IDs, developer IDs, and availability app-country pairs run concurrently up to `maxConcurrency`. Pagination for one target remains sequential because each page depends on the previous response. Runtime also depends on Apple's response time, retries, input count, and source-controlled pagination. The Actor stops cleanly when an Apify maximum charge limit is reached.

No precise runtime or cost table is published here because repeatable production measurements depend on the final Store pricing and Apify run configuration.

### API usage

The public username is not yet stored in this project. Replace `YOUR_USERNAME` with the final Apify account name:

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/YOUR_USERNAME~apple-app-store-data-scraper/runs?token=APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "mode": "details",
    "appIds": ["389801252", "com.spotify.client"],
    "country": "us",
    "language": "en-US"
  }'
```

Use Apify schedules for recurring snapshots and webhooks for downstream processing. Dataset results work naturally with Google Sheets, Make, Zapier, n8n, Airbyte, Slack, databases, and data warehouses through Apify integrations or API exports.

The Output tab uses one unified **Results** view with all 94 top-level fields across every supported mode. Fields that do not apply to a row's `recordType` remain empty, so users never need to switch mode-specific tabs or open the automatic All fields view.

### Best for / not for

**Best for:** ASO research, public competitive intelligence, App Store ranking monitoring, review analysis, localized pricing and availability audits, developer portfolio mapping, and Apple featuring research.

**Not for:** private Apple account data, authenticated purchase history, downloading IPA binaries, modifying App Store listings, bypassing paid content, or real-time streaming of every Store change.

### Limits and good to know

- One mode runs at a time; arrays batch multiple terms, apps, developers, or countries.
- `maxItems` accepts `0`-`500`, but Apple controls actual availability: search and developer lookup expose up to about 200; legacy charts up to 200; modern chart fallback up to 100; paginated reviews up to the Actor limit of 500; suggestions, similar apps, IAPs, events, editorial stories, and embedded review fallback return only what the page exposes.
- Some legacy chart collections and category-filtered charts require a supported Apple storefront region. Top free, paid, and grossing charts have a country-based fallback where Apple offers it.
- App titles, descriptions, prices, rating counts, charts, availability, reviews, and some media can differ by country and language.
- Apple may temporarily rate-limit its paginated review source or return an empty RSS feed. The Actor falls back safely and identifies the source and actual ordering with `reviewSource`, `reviewSort`, and `requestedReviewSort`.
- Search, chart, developer, and similar rows always contain the stable 44-field app object plus their mode context. Details always retains all enrichment keys even when a block is disabled or unavailable.
- Retries use exponential backoff for blocks, rate limits, transient HTTP responses, proxy failures, and network errors.
- A failed target is logged and skipped so valid inputs can still finish. If every operation fails, the Actor run fails instead of producing a misleading empty success.
- All production traffic is routed through Apify Proxy. Proxy setup is internal and no proxy field is shown in the input.

### Frequently asked questions

#### What input should I provide?

For app-target modes use a numeric ID (`389801252`), bundle ID (`com.burbn.instagram`), or full App Store URL. Search and suggestion modes take keywords; developer mode takes numeric developer IDs.

#### How many results can I extract?

Set `maxItems` from `1` to `500`, or `0` for everything exposed by the selected public source. The effective limits listed above are imposed by Apple and vary by mode.

#### Why are some fields empty?

Not every app has iPad or Apple TV screenshots, IAPs, events, editorial stories, privacy purposes, a developer website, or reviews in every storefront. Stable optional scalars use `null`; repeatable data uses `[]`.

#### Can I process multiple inputs?

Yes. `searchTerms`, `appIds`, `developerIds`, and `countries` accept arrays. Limits apply independently as documented for the selected mode.

#### Can I schedule recurring runs?

Yes. Use Apify schedules for recurring jobs and webhooks to notify or trigger another system after completion.

#### Do I need an Apple account, API key, cookies, or proxy?

No Apple credentials or cookies are required. Production requests automatically use Apify Proxy, so users do not need to configure or supply a proxy.

### Responsible use

This Actor extracts publicly available Apple App Store information. Users are responsible for complying with applicable laws, privacy regulations, contractual obligations, and Apple's terms.

Apple, App Store, iPhone, iPad, and related marks are trademarks of Apple Inc. This Actor is independent and is not affiliated with, endorsed by, or sponsored by Apple Inc.

### Support

If you encounter a problem, create an issue in the Actor's **Issues** tab. Include the Apify run ID, selected mode, country/language, and a non-sensitive reproducible input. Do not publish tokens, credentials, or private proxy URLs.

# Actor input Schema

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

Choose the Apple App Store dataset to collect.

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

One or more keywords. Used by search and suggest modes.

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

Numeric Apple IDs, bundle IDs such as com.burbn.instagram, or full apps.apple.com URLs. Used by details, reviews, similar, availability, IAP, events, and editorial modes.

## `developerIds` (type: `array`):

Numeric Apple developer IDs. Used by developer mode.

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

Two-letter App Store country or region code controlling catalog, ratings, prices, and localization.

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

Two-letter country codes checked by availability mode. If empty, country is used.

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

Language or locale such as en-US, de-DE, ja-JP, or en.

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

Maximum results per search term, app, developer, or chart. Set to 0 for everything the public source exposes, subject to Apple's endpoint limits.

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

Number of independent terms, app IDs, developer IDs, or availability country jobs processed concurrently. Pagination for one target remains sequential.

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

Store reviews inside includedReviews on every details record. Each nested review is billed as one review event in addition to the app-detail event.

## `includePrivacy` (type: `boolean`):

Extract privacy types, categories, data types, purposes, and the privacy-policy URL in details mode.

## `includeVersionHistory` (type: `boolean`):

Extract every version entry embedded in the public app page.

## `includeRatingsHistogram` (type: `boolean`):

Extract exact 1-star through 5-star rating counts.

## `includeIAP` (type: `boolean`):

Extract the named in-app purchases and localized prices displayed by Apple.

## `includeEvents` (type: `boolean`):

Extract current and upcoming in-app events displayed on the app page.

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

Review order in reviews mode and details review enrichment.

## `reviewScore` (type: `integer`):

Keep only reviews with this star rating. Leave empty for all ratings.

## `reviewsSince` (type: `string`):

Keep reviews on or after this ISO date or timestamp, for example 2026-01-01.

## `chartCollection` (type: `string`):

Chart used in charts mode.

## `category` (type: `integer`):

Optional Apple genre ID such as 6014 for Games or 6008 for Photo & Video.

## Actor input object example

```json
{
  "mode": "search",
  "searchTerms": [
    "photo editor"
  ],
  "appIds": [],
  "developerIds": [],
  "country": "us",
  "countries": [],
  "language": "en-US",
  "maxItems": 50,
  "maxConcurrency": 5,
  "includeReviews": false,
  "includePrivacy": true,
  "includeVersionHistory": true,
  "includeRatingsHistogram": true,
  "includeIAP": true,
  "includeEvents": true,
  "reviewSort": "mostRecent",
  "chartCollection": "topFree"
}
```

# Actor output Schema

## `dataset` (type: `string`):

Apps, enriched details, reviews, charts, developer catalogs, similar apps, suggestions, availability, in-app purchases, events, and editorial records.

# 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("scrapingmonkey/apple-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 = {}

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

```

## MCP server setup

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