# App Store Search Scraper | $0.50/1K | Keyword or ID (`extractkit/app-store-search-scraper`) Actor

Search the App Store and extract full app metadata: developer, ratings, rating count, price, category, size, version and screenshots. By keyword, app ID or bundle ID, any country. $0.50 per 1,000 apps.

- **URL**: https://apify.com/extractkit/app-store-search-scraper.md
- **Developed by:** [Extract Kit](https://apify.com/extractkit) (community)
- **Categories:** SEO tools, Developer tools
- **Stats:** 2 total users, 1 monthly users, 83.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 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/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

## App Store Search & App Details Scraper — extract iOS app data

Search the **App Store** by keyword and get structured data for every matching app: developer, star rating, rating count, price, category, size, minimum iOS version, description and screenshots.

Works three ways — by **search term**, by **App Store ID**, or by **bundle ID** — across any of Apple's 175 country storefronts. Built on Apple's own public endpoints: no login, no cookies, no proxies.

### What this App Store scraper does

- **Search the App Store** for any keyword and return up to 200 apps per term, per country
- **Look up specific apps** by App Store URL, numeric ID, or bundle ID
- Returns **ratings and rating counts** — the best public proxy for an app's install base
- Returns the **full App Store description**, the primary source for ASO keyword research
- Compares the same app **across countries**, where price, rating and availability all differ
- Covers **iPhone, iPad and Mac** apps

### Use cases

| You want to | How this helps |
|---|---|
| **App Store Optimization (ASO)** | Pull the top 200 apps for a keyword and mine their titles and descriptions |
| **Competitor tracking** | Watch rating, rating count and version across rivals over time |
| **Market sizing** | Rating counts across a whole category, in one run |
| **Lead generation** | Find apps in a niche, then use `developerUrl` to reach the publisher |
| **Find abandoned apps** | Sort by `releaseDate` to spot categories with stale incumbents |
| **Enrich your own data** | Already have bundle IDs? Batch them in and get full metadata back |

### Input

Any one of the three modes is enough — combine them freely.

```json
{
  "searchTerms": ["habit tracker", "budget app"],
  "countries": ["us", "gb"],
  "entity": "software",
  "resultsPerTerm": 50,
  "maxApps": 200
}
```

Look specific apps up instead:

```json
{
  "appIds": ["310633997", "https://apps.apple.com/us/app/id284882215"],
  "bundleIds": ["com.burbn.instagram"],
  "countries": ["us"]
}
```

| Field | Type | Default | Description |
|---|---|---|---|
| `searchTerms` | array | `[]` | Keywords to search for. |
| `appIds` | array | `[]` | App Store URLs or numeric IDs. |
| `bundleIds` | array | `[]` | Bundle identifiers. |
| `countries` | array | `["us"]` | Two-letter storefront codes. |
| `entity` | string | `software` | `software`, `iPadSoftware` or `macSoftware`. |
| `resultsPerTerm` | integer | `50` | Per term, per country. Apple's max is 200. |
| `maxApps` | integer | `200` | Total across everything. |

At least one of `searchTerms`, `appIds` or `bundleIds` is required.

### Output

One row per app, per storefront:

```json
{
  "appId": "1512573765",
  "appName": "Apple Fitness",
  "country": "us",
  "developer": "Apple",
  "bundleId": "com.apple.Fitness",
  "price": 0,
  "currency": "USD",
  "isFree": true,
  "averageRating": 4.4,
  "ratingCount": 11320,
  "primaryGenre": "Health & Fitness",
  "genres": ["Health & Fitness", "Lifestyle"],
  "contentRating": "4+",
  "version": "5.1",
  "releaseDate": "2026-07-28T12:14:00Z",
  "minimumOsVersion": "17.0",
  "fileSizeBytes": 62914560,
  "description": "Fitness brings together...",
  "languages": ["EN", "FR", "DE"],
  "iconUrl": "https://is1-ssl.mzstatic.com/image/thumb/...",
  "screenshotUrls": ["https://is1-ssl.mzstatic.com/image/thumb/..."],
  "developerUrl": "https://www.apple.com",
  "appStoreUrl": "https://apps.apple.com/us/app/apple-fitness/id1512573765"
}
```

Export as **JSON, CSV, Excel, XML or HTML**, or pull it through the Apify API.

### How many apps can I get?

**Apple caps search at 200 results per term, per country.** That is Apple's limit, not this Actor's — asking for 500 returns the same 200.

To get more coverage, add **more search terms** and **more countries** rather than raising `resultsPerTerm`. Ten terms across five countries is 10,000 potential rows.

Looking apps up by ID has no such cap: IDs are fetched in batches, so a thousand IDs costs a fraction of a thousand searches.

### Frequently asked questions

**Does this need a proxy?**
No. Apple's search and lookup endpoints are public and unauthenticated.

**Is the rating count the number of downloads?**
No — Apple does not publish download counts anywhere. `ratingCount` is the closest public proxy, and it is what analytics vendors base their estimates on.

**Why does the same app show a different rating in each country?**
Because ratings are genuinely per-storefront. That is exactly why `country` is on every row.

**Can I get the app's revenue or download numbers?**
No. Apple does not expose them publicly, and any tool claiming otherwise is modelling, not measuring.

**Can I get reviews too?**
Yes — that is a separate Actor, **App Store Reviews Scraper**, which returns the full review text, star rating and app version per review.

**Is this legal?**
It reads public, unauthenticated endpoints Apple publishes for app discovery, and collects no personal data. You remain responsible for how you use the output.

### Limitations

- 200 results per search term per country (Apple's cap)
- No download or revenue figures — Apple does not publish them
- `releaseNotes` and `description` are returned in the storefront's language
- In-app purchase prices are not included; `price` is the up-front cost only

### Support

Questions, missing fields or a storefront behaving oddly? Send a message — answered within 24 hours. The output schema is stable: fields get added, never renamed or removed without notice.

# Actor input Schema

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

Keywords to search the App Store for, exactly as a user would type them. Each term returns up to 200 apps per country.

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

Specific apps to fetch, as App Store URLs or numeric IDs. Use this when you already know the apps you want. Looked up in batches, so 100 apps cost far fewer requests than 100 searches.

## `bundleIds` (type: `array`):

Fetch apps by bundle identifier instead, e.g. com.burbn.instagram. Useful when your own data is keyed by bundle ID rather than App Store ID.

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

Two-letter country codes. Search rankings, prices and availability differ per storefront, so the same term returns different apps in each.

## `entity` (type: `string`):

Which kind of app to return.

## `resultsPerTerm` (type: `integer`):

How many apps to return per search term, per country. Apple caps this at 200.

## `maxApps` (type: `integer`):

Total apps to return across all terms, IDs and countries.

## `requestDelayMs` (type: `integer`):

Politeness delay between requests to Apple. Leave as is unless you are sweeping many countries.

## Actor input object example

```json
{
  "searchTerms": [
    "habit tracker",
    "budget app"
  ],
  "appIds": [
    "310633997",
    "https://apps.apple.com/us/app/id284882215"
  ],
  "bundleIds": [
    "com.burbn.instagram"
  ],
  "countries": [
    "us",
    "gb",
    "de"
  ],
  "entity": "software",
  "resultsPerTerm": 50,
  "maxApps": 200,
  "requestDelayMs": 200
}
```

# Actor output Schema

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

All matched apps as JSON — developer, rating, rating count, price, category, version and screenshots.

## `appsCsv` (type: `string`):

The same apps as a CSV download, for spreadsheet use.

## `runDetails` (type: `string`):

This run in Apify Console, including its log.

# 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": [
        "fitness tracker"
    ],
    "countries": [
        "us",
        "gb",
        "de"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("extractkit/app-store-search-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 = {
    "searchTerms": ["fitness tracker"],
    "countries": [
        "us",
        "gb",
        "de",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("extractkit/app-store-search-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 '{
  "searchTerms": [
    "fitness tracker"
  ],
  "countries": [
    "us",
    "gb",
    "de"
  ]
}' |
apify call extractkit/app-store-search-scraper --silent --output-dataset

```

## MCP server setup

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