# Apple App Store Scraper (Apps, Ratings, Developers) (`juliob.rangel/app-store-scraper-fast`) Actor

Search the Apple App Store by keyword or paste app links and get each app's rating, rating count, price, category, developer, website, version, last update, size, languages, description and screenshots. Any country. No login.

- **URL**: https://apify.com/juliob.rangel/app-store-scraper-fast.md
- **Developed by:** [Julio Barcellos Rangel](https://apify.com/juliob.rangel) (community)
- **Categories:** Developer tools, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 app scrapeds

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

## Apple App Store Scraper (Apps, Ratings, Developers)

This Apple App Store scraper searches the App Store by keyword, or looks up the apps you paste, and returns each app's rating, number of ratings, price, category, developer, website, version, last update, size, languages, description and screenshots. It is made for ASO specialists, app marketers, analysts and developers who need App Store data in a spreadsheet. Use it to export App Store search results to Excel or CSV, or to pull iOS app details for any country, with no login and no API key.

### What does Apple App Store Scraper do?

The robot reads Apple's public iTunes search and lookup service (the same catalog the App Store shows) and turns every app into one clean row. You can give it work in two ways, and you can mix both in the same run:

- **Search terms.** Type keywords the way you would in the App Store search box, for example `habit tracker` or `budget planner`. Each term returns up to 200 apps, in the order Apple returns them, with the term in `searchTerm` and the rank in `position`.
- **Apps.** Paste App Store links (`https://apps.apple.com/us/app/instagram/id389801252`), numeric app IDs (`389801252` or `id389801252`) or bundle IDs (`com.burbn.instagram`). Each lookup row keeps what you typed in `input`.

The **country** you choose decides which App Store is read. Ratings, prices, currency and even whether an app exists can differ from one country to another.

What comes out is a table with one row per app: identity (ID, name, bundle ID, link), developer and seller, price, ratings for all versions and for the current version, categories and age rating, version history dates, release notes, description, size, minimum iOS version, languages, iPad support, icon and screenshots. When something cannot be found, the robot writes an error row instead of failing silently.

### What data can you extract?

| Field | What it means | Example |
|---|---|---|
| `searchTerm` | Search term that found the app (search rows only) | `habit tracker` |
| `position` | Rank of the app in the results for that term, starting at 1 | `1` |
| `input` | Link, ID or bundle ID you entered (lookup rows only) | `com.spotify.client` |
| `appId` | Apple's numeric app ID | `1438388363` |
| `name` | App name | `Habit Tracker` |
| `bundleId` | Bundle identifier | `com.davetech.habit` |
| `url` | App Store page, without tracking parameters | `https://apps.apple.com/us/app/habit-tracker/id1438388363` |
| `developer` | Developer name shown on the store | `InnerGrow` |
| `developerId` | Apple's developer ID | `1828382777` |
| `developerUrl` | Developer page on the App Store | `https://apps.apple.com/us/developer/innergrow/id1828382777` |
| `seller` | Seller name (often the legal company name) | `Inner Grow Limited` |
| `website` | Developer website, when the app lists one | `https://www.habitkit.app` |
| `price` | Price in the store currency (0 means free) | `0` |
| `currency` | Currency code of the store | `USD` |
| `isFree` | `true` when the price is 0 | `true` |
| `rating` | Average user rating, rounded to 2 decimals | `4.79` |
| `ratingCount` | Number of user ratings | `147824` |
| `ratingCurrentVersion` | Average rating of the current version | `4.79` |
| `ratingCountCurrentVersion` | Number of ratings of the current version | `147824` |
| `category` | Primary category | `Productivity` |
| `categories` | All categories of the app | `["Productivity", "Health & Fitness"]` |
| `contentRating` | Age rating | `4+` |
| `version` | Current version number | `2.25.1` |
| `updatedAt` | Release date of the current version | `2026-10-09T23:42:16Z` |
| `releasedAt` | First release date of the app | `2019-01-31T09:10:14Z` |
| `releaseNotes` | "What's New" text of the current version | `- support iOS 27…` |
| `description` | Full App Store description | `Habit Tracker: A simple daily planner…` |
| `sizeMB` | Download size in MB, 1 decimal | `393.2` |
| `minimumOsVersion` | Minimum iOS version required | `15.0` |
| `languages` | Language codes the app supports | `["EN", "FR", "DE", …]` |
| `supportsIpad` | `true` when iPad is among the supported devices | `true` |
| `iconUrl` | App icon (512 px when available) | `https://is1-ssl.mzstatic.com/…/512x512bb.jpg` |
| `screenshots` | iPhone and iPad screenshot URLs | `["https://is1-ssl.mzstatic.com/…"]` |
| `country` | App Store country used for the row | `us` |
| `scrapedAt` | When the row was collected (UTC) | `2026-10-12T20:24:05.574Z` |
| `error` | Only on error rows: what went wrong | `App not found in the US App Store` |

Fields with no value on the store (for example `website` when the developer lists none) come back as `null`.

### How to use Apple App Store Scraper

1. Open the robot in Apify Console and go to the **Input** tab.
2. Type one or more keywords in **Search terms**, one per line. Leave it empty if you only want to look up specific apps.
3. Paste App Store links, app IDs or bundle IDs in **Apps**, one per line (optional).
4. Set **Max apps per search** (1 to 200) and the two-letter **Country** code, for example `us`, `gb`, `br`, `de` or `jp`.
5. Click **Start** and wait for the run to finish.
6. Open the **Output** tab to see the Apps table, then export the data as JSON, CSV, Excel or HTML.
7. Optional: save the input as a task and add a schedule to track the same keywords or apps every day.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `searchTerms` | array of strings | `["habit tracker"]` | Keywords to search. Each term is searched separately. |
| `apps` | array of strings | none | App Store links, app IDs or bundle IDs to look up. |
| `maxResultsPerSearch` | integer | `50` | Apps per search term, from 1 to 200. Does not apply to lookups. |
| `country` | string | `us` | Two-letter App Store country code. Only the first two letters are used. |
| `proxy` | object | `{"useApifyProxy": true}` | Apify Proxy settings. The default works for most runs. |

Accepted forms for `apps`:

- A full App Store link: `https://apps.apple.com/us/app/instagram/id389801252`
- A numeric ID, with or without the `id` prefix: `389801252` or `id389801252`
- A bundle ID: `com.burbn.instagram`

Example input:

```json
{
  "searchTerms": ["habit tracker", "meditation"],
  "apps": [
    "https://apps.apple.com/us/app/instagram/id389801252",
    "284882215",
    "com.spotify.client"
  ],
  "maxResultsPerSearch": 100,
  "country": "us",
  "proxy": { "useApifyProxy": true }
}
```

### Output example

One real row from the latest run (search term `habit tracker`, country `us`). Long text and the screenshot list are shortened.

```json
{
  "searchTerm": "habit tracker",
  "position": 1,
  "appId": 1438388363,
  "name": "Habit Tracker",
  "bundleId": "com.davetech.habit",
  "url": "https://apps.apple.com/us/app/habit-tracker/id1438388363",
  "developer": "InnerGrow",
  "developerId": 1828382777,
  "developerUrl": "https://apps.apple.com/us/developer/innergrow/id1828382777",
  "seller": "Inner Grow Limited",
  "website": null,
  "price": 0,
  "currency": "USD",
  "isFree": true,
  "rating": 4.79,
  "ratingCount": 147824,
  "ratingCurrentVersion": 4.79,
  "ratingCountCurrentVersion": 147824,
  "category": "Productivity",
  "categories": ["Productivity", "Health & Fitness"],
  "contentRating": "4+",
  "version": "2.25.1",
  "updatedAt": "2026-10-09T23:42:16Z",
  "releasedAt": "2019-01-31T09:10:14Z",
  "releaseNotes": "- support iOS 27\n- fix bugs…",
  "description": "Habit Tracker: A simple daily planner to schedule and track your routine, making it easy to build lasting habits…",
  "sizeMB": 393.2,
  "minimumOsVersion": "15.0",
  "languages": ["EN", "FR", "DE", "IT", "JA", "PT", "RU", "ZH", "ES", "ZH"],
  "supportsIpad": true,
  "iconUrl": "https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/d4/b3/2b/d4b32bd9-f4dd-e9cb-9a26-207f33befafb/AppIcon-pink-gr-0-0-1x_U007epad-0-1-0-85-220.png/512x512bb.jpg",
  "screenshots": [
    "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource221/v4/5c/b8/05/5cb8051e-e125-e84e-f0b5-2551b6e9d69d/_U767d1.jpg/320x480bb.jpg",
    "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/13/5d/32/135d32df-678d-5c7e-d940-4f16d5c4e396/_U767d2.jpg/320x480bb.jpg"
  ],
  "country": "us",
  "scrapedAt": "2026-10-12T20:24:05.574Z"
}
```

A lookup row has `input` instead of `searchTerm` and `position`. An error row has only the input and an `error` message, for example `{"input": "id999999999999", "error": "App not found in the US App Store"}`.

### How much does it cost?

The robot uses **pay per event** pricing: you pay **$2.00 per 1,000 apps** ($0.002 per app returned) on the Free plan. Platform usage is included in the price, so there is no separate charge for compute or proxy.

| Apify plan | Price per 1,000 apps |
|---|---|
| Free | $2.00 |
| Bronze (10% off) | $1.80 |
| Silver (20% off) | $1.60 |
| Gold and higher (30% off) | $1.40 |

Worked examples on the Free plan:

- One keyword with the default 50 apps: 50 apps = **$0.10**.
- 10 keywords at 200 apps each: up to 2,000 apps = up to **$4.00** (you pay only for the apps Apple actually returns).
- 10,000 app lookups = **$20.00** (or $14.00 on Gold).

What is **not** charged: error rows. That covers a search term with no apps, an entry that is not an App Store link, ID or bundle ID, an app that is not available in the chosen country, and requests the App Store did not answer after several retries.

### Use cases

- **ASO keyword research:** see which apps rank for a keyword, in what order, and how many ratings they have.
- **Competitor tracking:** schedule a daily run on your competitors' apps and watch `version`, `updatedAt`, `releaseNotes`, `rating` and `ratingCount` change.
- **Market research:** compare prices, free versus paid apps and categories in a niche.
- **Lead generation:** collect developer names, seller names and websites, then find their emails with a contact scraper.
- **Localization research:** check `languages`, or run the same search in different countries to compare results.
- **App directories and catalogs:** fill a site with icons, screenshots, descriptions and links.
- **Text analysis:** feed descriptions and release notes into an AI model or a spreadsheet to spot features and trends.

### Tips and limits

- **200 apps per search term at most.** This is the App Store limit. Apple often returns fewer apps than the maximum you set, depending on the keyword.
- **One country per run.** To compare countries, run the robot once per country code. The country inside a pasted link is ignored; the `country` input decides which store is read.
- **No duplicate filter.** An app found by two search terms, or by a search and a lookup, appears once for each and is charged each time.
- **No reviews or top charts.** The robot returns rating averages and counts, not the text of individual reviews, and it does not read top charts.
- **Lookup-only runs from the API:** `searchTerms` has a default value, so send `"searchTerms": []` if you only want to look up the apps in `apps`.
- **Bundle IDs** must look like `com.company.app`. Anything that is not a link, an ID or a bundle ID gets the error `Not an App Store link, app ID or bundle ID`.
- **Retries:** each request to the App Store is retried up to 5 times with a growing pause. If it still fails, you get an error row such as `App Store did not answer`.

### Use it from the API, Python or JavaScript

JavaScript (Node.js) with the official `apify-client` package:

```javascript
const { ApifyClient } = require('apify-client');

const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const input = { searchTerms: ['habit tracker'], maxResultsPerSearch: 50, country: 'us' };
const run = await client.actor('juliob.rangel/app-store-scraper-fast').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

Python with the official `apify-client` package:

```python
from apify_client import ApifyClient

client = ApifyClient('YOUR_TOKEN')
input = {'searchTerms': [], 'apps': ['com.spotify.client', '389801252'], 'country': 'gb'}
run = client.actor('juliob.rangel/app-store-scraper-fast').call(run_input=input)
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

You can also connect the robot to Make, Zapier or n8n, export results to Google Sheets, send them to a webhook when a run finishes, or let AI agents call it through the Apify MCP server.

### FAQ

**Do I need an Apple account, a login or an API key?**
No. The robot reads public App Store data. You only need an Apify account.

**Can I export the data to Excel or CSV?**
Yes. Every run's dataset can be downloaded as JSON, CSV, Excel or HTML from the Output tab or through the API.

**How many apps can I get?**
Up to 200 per search term, and you can add as many search terms and app lookups as you like in one run. App IDs are looked up in groups of 100.

**Does it scrape App Store reviews?**
No. You get the average rating and the number of ratings, for all versions and for the current version, but not review texts.

**Why did I get an error row?**
The robot writes an error row instead of stopping the run: `No apps found` for a search with no results, `Not an App Store link, app ID or bundle ID` for input it cannot read, `App not found in the XX App Store` when the app does not exist in that country, or a connection message when the App Store did not answer. Error rows are free.

**Can I monitor apps over time?**
Yes. Save your input as a task and schedule it daily or weekly. Each run gives a dated table (`scrapedAt`) that you can compare.

**Is scraping the App Store legal?**
The robot only collects publicly available data. You are responsible for complying with Apple's terms and with privacy laws such as GDPR and LGPD. If you process personal data (for example the name of an individual developer), you need a legitimate reason to do so.

### Related scrapers

- [Google Play Store Scraper (Apps, Installs, Ratings, Emails)](https://apify.com/juliob.rangel/google-play-scraper-fast) for the Android side of the same market.
- [Website Contact Details Scraper (Emails, Phones, Socials)](https://apify.com/juliob.rangel/website-contact-details-scraper) to get emails and social links from developer websites.
- [Google News Scraper (Real Article URLs)](https://apify.com/juliob.rangel/google-news-scraper-fast) to follow news about apps and app companies.
- [YouTube Search Scraper (Fast & Cheap)](https://apify.com/juliob.rangel/youtube-search-fast) to find review and tutorial videos about an app.

***

## Extrator da App Store da Apple (PT-BR)

Pesquise a App Store por palavra-chave ou cole links de apps e receba nota, número de avaliações, preço, categoria, desenvolvedor, site, versão, última atualização, tamanho, idiomas, descrição e capturas de tela. Qualquer país. Sem login. Você paga só por app retornado.

# Actor input Schema

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

Keywords to search in the App Store (like the search box in the App Store app).

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

App Store links (apps.apple.com/us/app/name/id123), app IDs or bundle IDs (com.burbn.instagram).

## `maxResultsPerSearch` (type: `integer`):

Up to 200 apps per search term (App Store limit).

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

Two-letter App Store country code, e.g. us, gb, br, de, jp. Ratings and prices are per country.

## `proxy` (type: `object`):

Apify Proxy settings.

## Actor input object example

```json
{
  "searchTerms": [
    "habit tracker"
  ],
  "apps": [
    "https://apps.apple.com/us/app/instagram/id389801252"
  ],
  "maxResultsPerSearch": 50,
  "country": "us",
  "proxy": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "searchTerms": [
        "habit tracker"
    ],
    "apps": [
        "https://apps.apple.com/us/app/instagram/id389801252"
    ],
    "maxResultsPerSearch": 50,
    "country": "us"
};

// Run the Actor and wait for it to finish
const run = await client.actor("juliob.rangel/app-store-scraper-fast").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 = {
    "searchTerms": ["habit tracker"],
    "apps": ["https://apps.apple.com/us/app/instagram/id389801252"],
    "maxResultsPerSearch": 50,
    "country": "us",
}

# Run the Actor and wait for it to finish
run = client.actor("juliob.rangel/app-store-scraper-fast").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 '{
  "searchTerms": [
    "habit tracker"
  ],
  "apps": [
    "https://apps.apple.com/us/app/instagram/id389801252"
  ],
  "maxResultsPerSearch": 50,
  "country": "us"
}' |
apify call juliob.rangel/app-store-scraper-fast --silent --output-dataset

```

## MCP server setup

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

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/Sov0dgN2HB36zFpAm/builds/z9kZQgy0irLvqLUh1/openapi.json
