# Apple App Store Scraper: App Lookup & Search (`dj_orona/apple-app-store-metadata`) Actor

Apple App Store app metadata (title, developer, price, rating, rating count, genre, version, dates, URL) by app ID/URL or keyword search, via Apple's public iTunes Search API. No charts, no reviews. Not affiliated with Apple.

- **URL**: https://apify.com/dj_orona/apple-app-store-metadata.md
- **Developed by:** [dj orona](https://apify.com/dj_orona) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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

## Apple App Store Scraper: App Lookup & Search

Returns app metadata (title, developer, price, rating, rating count, genre, version, release and update dates, store URL, icon URL) from the Apple App Store for app IDs or URLs you give it, or for the results of App Store keyword searches. Built for app-market research, competitor tracking and keeping app catalogs up to date.

Data comes from Apple's public iTunes Search and Lookup API. The tool does not load apps.apple.com pages, does not use proxies and needs no login or API key.

**Limits, up front:**

- Apple App Store only. Google Play is not included.
- **Top charts are not included.** This version does lookups and searches only.
- No reviews, no review text, no developer contact details (email, phone, address, website).
- Up to 10 app IDs/URLs per run in lookup mode; up to 50 results per search term.
- Requests are spaced about 3 seconds apart, one at a time. A lookup of up to 10 IDs, or one search term (up to 50 apps), is a single request, so a typical run finishes in seconds; each extra search term adds about 3 seconds.

Independent tool, not affiliated with or endorsed by Apple.

### Who it's for

- App marketers and ASO analysts checking where apps appear for a keyword in a given country.
- Product and research teams tracking competitors' prices, ratings, versions and update dates.
- Developers who need clean, consistent app metadata in JSON, CSV or Excel.

### Input

You can use either mode or both in one run.

| Field | Type | What it does |
|---|---|---|
| `appIds` | array of strings | **Lookup mode.** Numeric App Store IDs (e.g. `284882215`), `id284882215`, or apps.apple.com URLs (e.g. `https://apps.apple.com/us/app/facebook/id284882215`). URLs are only parsed for the ID, never fetched. Max 10 per run. |
| `searchTerms` | array of strings | **Search mode.** Keywords to search the App Store for (iPhone apps), e.g. `weather`. Max 5 terms, 100 characters each. |
| `searchLimit` | integer | Apps returned per search term. 1 to 50, default 10. |
| `country` | string | 2-letter App Store storefront code (`us`, `gb`, `de`, `jp`...). Controls price, currency, rating and availability. Default `us`. |
| `includeRunReport` | boolean | If true, the first dataset row is a run report (not charged, different shape from app rows). Default false; the report is always saved to the key-value store as `RUN_SUMMARY`. |

**Empty input `{}`** runs a lookup of three well-known app IDs: 284882215, 310633997 and 544007664, in the `us` storefront. The form's prefill is the same.

Example:

```json
{
  "appIds": ["284882215", "https://apps.apple.com/us/app/whatsapp-messenger/id310633997"],
  "searchTerms": ["weather"],
  "searchLimit": 10,
  "country": "us"
}
```

### Output

One row per app. Every row has every field below; a value Apple doesn't provide is `null`, never missing.

| Field | Meaning |
|---|---|
| `platform` | Always `"apple"`. |
| `appId` | Numeric App Store ID, as a string. |
| `bundleId` | App bundle identifier, e.g. `com.facebook.Facebook`. |
| `title` | App name. |
| `developerName` | Seller/developer name as shown on the store. |
| `developerId` | Apple's numeric developer ID, as a string. |
| `price` | Price as a number in the storefront currency. `0` means free. |
| `currency` | Currency code, e.g. `USD`. |
| `rating` | Average user rating (0 to 5) as reported by Apple for that storefront. |
| `ratingCount` | Number of user ratings as reported by Apple for that storefront. |
| `genre` | Primary category, e.g. `Social Networking`. |
| `version` | Current version string. |
| `updatedAt` | Release date of the current version, as returned by Apple (not re-formatted). |
| `releaseDate` | Original release date, as returned by Apple (not re-formatted). |
| `contentRating` | Age rating, e.g. `12+`. |
| `url` | App Store page URL, without tracking parameters. |
| `icon` | URL of the app icon image hosted by Apple. Reuse of the image is subject to Apple's terms. |
| `searchRank` | Position in Apple's search results for the term (search mode only; `null` in lookup mode). |
| `country` | The storefront code used. |
| `scrapedAt` | When the row was collected (ISO 8601, UTC). |

Example row (values illustrative):

```json
{
  "platform": "apple",
  "appId": "284882215",
  "bundleId": "com.facebook.Facebook",
  "title": "Facebook",
  "developerName": "Meta Platforms, Inc.",
  "developerId": "284882218",
  "price": 0,
  "currency": "USD",
  "rating": 4.6,
  "ratingCount": 1000000,
  "genre": "Social Networking",
  "version": "500.0.0",
  "updatedAt": "2026-09-30T07:00:00Z",
  "releaseDate": "2019-02-05T08:00:00Z",
  "contentRating": "12+",
  "url": "https://apps.apple.com/us/app/facebook/id284882215",
  "icon": "https://is1-ssl.mzstatic.com/image/thumb/.../512x512bb.jpg",
  "searchRank": null,
  "country": "us",
  "scrapedAt": "2026-10-03T12:00:00.000Z"
}
```

**Problems are reported, not hidden.** An invalid or unknown ID, a rate limit or a block produces a status message (in the log, and in the run report) instead of an app row. Status rows and run reports are never charged.

### Pricing

Pay per event: **$1.00 per 1,000 app rows** ($0.001 per row). No start fee. You pay only for app rows returned; status rows and run reports are free. Apify platform usage is billed by Apify as usual.

### Polite by design

- About 3 seconds between requests, one request at a time.
- On HTTP 429 or 503 it waits for Apple's `Retry-After` time, then records a status row if the request still fails.
- On a 403 or challenge page it stops cleanly and reports it; it does not try to get around it.

### Reliability

Not yet measured. We will publish measured figures once we have them.

### FAQ

**Does it include top charts?** No. This version does app lookups and keyword searches only.

**Does it include Google Play?** No, Apple App Store only.

**Can I get reviews?** No. Reviews and reviewer data are not collected.

**Why are prices or ratings different from what I see?** They depend on the storefront. Set `country` to the store you want.

**Is search the same as the App Store app's search?** Results come from Apple's public iTunes Search API, which can differ from what the App Store app shows on a device.

**Why is it not faster?** Requests are deliberately spaced about 3 seconds apart to stay polite to Apple's API.

**Something broke. What now?** Open an issue on the Actor's Issues tab with the run ID. We aim to fix breaks quickly.

# Actor input Schema

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

Apps to look up. Each entry is a numeric App Store ID (e.g. "284882215"), "id284882215", or an apps.apple.com URL (e.g. https://apps.apple.com/us/app/facebook/id284882215). URLs are only parsed for the ID, never fetched. Max 10 per run. Invalid or unknown IDs produce a free status message, not an app row. If both this and Search terms are empty, the run looks up 284882215, 310633997 and 544007664.

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

Keywords to search the App Store (iPhone apps) for, e.g. "weather". Each result row gets searchRank = its position in Apple's results for that term. Max 5 terms, 100 characters each. Can be combined with App IDs in one run.

## `searchLimit` (type: `integer`):

Maximum number of apps returned per search term, a whole number from 1 to 50 (e.g. 10, not "10"). Only used when Search terms is not empty.

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

2-letter App Store storefront code, lowercase (e.g. "us", "gb", "de", "jp"). Controls price, currency, rating and availability for both lookups and searches.

## `includeRunReport` (type: `boolean`):

If true, the first dataset row is a run report (type "run_report": version, per-input status, request count, wall time). It is NOT charged and has a different shape from app rows. If false, the same report is saved only to the key-value store as RUN_SUMMARY.

## Actor input object example

```json
{
  "appIds": [
    "284882215",
    "310633997",
    "544007664"
  ],
  "searchLimit": 10,
  "country": "us",
  "includeRunReport": false
}
```

# Actor output Schema

## `results` (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 = {
    "appIds": [
        "284882215",
        "310633997",
        "544007664"
    ],
    "country": "us"
};

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

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

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

```

## Python example

```python
from apify_client import ApifyClient

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

# Prepare the Actor input
run_input = {
    "appIds": [
        "284882215",
        "310633997",
        "544007664",
    ],
    "country": "us",
}

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

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

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

```

## CLI example

```bash
echo '{
  "appIds": [
    "284882215",
    "310633997",
    "544007664"
  ],
  "country": "us"
}' |
apify call dj_orona/apple-app-store-metadata --silent --output-dataset

```

## MCP server setup

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

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/2Me1vRdp7Ocr547sY/builds/AmEXtMvebTfPVTItS/openapi.json
