# iPad App Store Scraper (`muhammadafzal/ipad-app-store-scraper`) Actor

Search iPad apps by keyword, App Store URL, or ID. Export prices, ratings, versions, screenshots, compatibility, genres, and developer metadata.

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

## Pricing

from $1.00 / 1,000 ipad app results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

## iPad App Store Scraper

Search Apple’s iPad App Store catalog by keyword or look up known App Store URLs and IDs. The Actor returns flat, analysis-ready app records with pricing, ratings, versions, screenshots, genres, device compatibility, and developer metadata—without login cookies, Apple credentials, or a proxy.

It is designed for app-market research, competitor discovery, category analysis, pricing comparisons, catalog enrichment, and AI-agent workflows. Data comes from Apple’s public, first-party App Store catalog response for the storefront you select.

### What the iPad App Store Scraper extracts

Each dataset item represents one unique iPad-compatible app.

| Field group | Example fields |
|---|---|
| Identity | `appId`, `appName`, `bundleId`, `appStoreUrl` |
| Developer | `developerName`, `developerId`, `developerUrl`, `sellerName` |
| Pricing | `price`, `formattedPrice`, `currency`, `isFree` |
| Ratings | `averageUserRating`, `userRatingCount`, current-version rating fields |
| Release | `version`, `releaseDate`, `currentVersionReleaseDate`, `releaseNotes` |
| Classification | `primaryGenre`, `primaryGenreId`, `genres`, `contentAdvisoryRating` |
| Compatibility | `minimumOsVersion`, `supportedDevices`, `features`, `fileSizeBytes` |
| Media | `artworkUrl100`, `artworkUrl512`, `ipadScreenshotUrls` |
| Context | `storefrontCountry`, `searchTerm`, `scrapedAt` |

Nullable fields are always present as `null`; list fields are always arrays. This stable shape is suitable for CSV/Excel exports, databases, BI tools, Apify API clients, and MCP/AI agents.

### When to use it

Use this Actor when you need to:

- discover iPad apps matching product, industry, or feature keywords;
- compare app prices, ratings, genres, versions, and minimum OS requirements;
- enrich a list of App Store URLs or numeric Apple app IDs;
- build an iPad competitor dataset for product or market research;
- monitor public catalog metadata with scheduled Apify runs;
- feed consistent App Store records into an agent or downstream Actor.

Do not use it for customer reviews, download or revenue estimates, keyword ranks, private App Store Connect analytics, top-chart history, in-app purchase catalogs, or binary downloads. Those are outside this Actor’s truthful contract.

### Input

The Actor has two collection modes.

| Input | Type | Default | Purpose |
|---|---|---:|---|
| `mode` | `search` or `lookup` | `search` | Choose keyword discovery or direct ID/URL lookup. |
| `searchTerms` | string array | `["productivity"]` | One to 20 keywords used in Search mode. |
| `appUrls` | request-list array | `[]` | Public `apps.apple.com` app URLs used in Lookup mode. |
| `appIds` | string array | `[]` | Numeric Apple app IDs used in Lookup mode. |
| `country` | two-letter code | `US` | Storefront controlling localized availability, price, currency, and ratings. |
| `maxResults` | integer, 1–200 | `25` | Total unique app records and maximum result-event charges. |
| `includeExplicit` | boolean | `false` | Whether Apple may include explicit search results. |
| `language` | `en_us` or `ja_jp` | `en_us` | Apple-supported response language. |
| `maxRequestRetries` | integer, 0–3 | `2` | Bounded retries for rate limits, timeouts, and temporary server errors. |

Explicit lookup inputs are rejected when a URL is not an Apple App Store app URL or no usable ID is supplied. Valid searches with no matches finish successfully with an empty dataset and a structured `SUMMARY` record.

#### Search example

```json
{
  "mode": "search",
  "searchTerms": ["drawing", "note taking"],
  "country": "US",
  "maxResults": 50,
  "includeExplicit": false
}
```

#### App URL and ID lookup example

```json
{
  "mode": "lookup",
  "appUrls": [
    { "url": "https://apps.apple.com/us/app/procreate/id425073498" }
  ],
  "appIds": ["310633997"],
  "country": "GB",
  "maxResults": 10
}
```

#### Run through the Apify API

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/YOUR_USERNAME~ipad-app-store-scraper/runs" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode":"search","searchTerms":["productivity"],"country":"US","maxResults":10}'
```

Keep tokens in environment variables or secret stores rather than source code, shell history, or shared URLs.

### Output example

```json
{
  "appId": "425073498",
  "appName": "Procreate",
  "bundleId": "au.com.savageinteractive.procreate",
  "developerName": "Savage Interactive Pty Ltd",
  "developerId": "363210060",
  "developerUrl": "https://apps.apple.com/us/developer/id363210060",
  "sellerName": "Savage Interactive Pty Ltd",
  "appStoreUrl": "https://apps.apple.com/us/app/procreate/id425073498?uo=4",
  "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/example/100x100bb.jpg",
  "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/example/512x512bb.jpg",
  "description": "A creative application made for iPad.",
  "releaseNotes": "This update includes improvements and fixes.",
  "primaryGenre": "Graphics & Design",
  "primaryGenreId": "6027",
  "genres": ["Graphics & Design", "Productivity"],
  "price": 12.99,
  "formattedPrice": "$12.99",
  "currency": "USD",
  "isFree": false,
  "averageUserRating": 4.42,
  "userRatingCount": 50411,
  "currentVersionAverageRating": 4.45,
  "currentVersionUserRatingCount": 1200,
  "version": "5.4.12",
  "releaseDate": "2011-03-16T07:00:00.000Z",
  "currentVersionReleaseDate": "2026-07-27T00:39:04.000Z",
  "minimumOsVersion": "16.3",
  "fileSizeBytes": 1158609920,
  "contentAdvisoryRating": "4+",
  "advisories": [],
  "languageCodes": ["EN", "FR", "DE"],
  "features": [],
  "supportedDevices": ["iPadPro11M4-iPadPro11M4"],
  "ipadScreenshotUrls": ["https://is1-ssl.mzstatic.com/image/thumb/example/552x414bb.png"],
  "storefrontCountry": "US",
  "searchTerm": "drawing",
  "scrapedAt": "2026-08-27T12:00:00.000Z"
}
```

The default dataset contains business records only. Run diagnostics go to the default key-value store under `SUMMARY`, including outcome classification, request counts, candidate count, delivered records, confirmed result-event charges, and warnings.

### Pay-per-event pricing

| Event | Price | When charged |
|---|---:|---|
| Actor start | $0.00005 | Once when a run starts. |
| iPad app result | $0.001 | Once per validated record successfully saved to the default dataset. |

A 25-result default run costs up to **$0.02505** in events. A 200-result run costs up to **$0.20005**. Empty, rejected, or blocked runs have no result events, though the start event still applies. `maxResults` provides a predictable result-count and result-event ceiling; Apify’s run spending limit is also respected.

### Reliability and limits

The Actor uses Apple’s documented public catalog endpoint with the iPad-specific `iPadSoftware` entity. Search responses are capped at 200 items by Apple, so this Actor intentionally caps a run at 200 unique results. Apple documents an approximate request limit of 20 calls per minute; multiple search terms are paced and temporary `429`, timeout, network, and `5xx` responses use bounded exponential backoff.

Results vary by country because price, currency, ratings, availability, text, and even returned apps can differ by storefront. Search relevance and ordering belong to Apple and may change. An app is emitted only when Apple’s response indicates iPad compatibility through supported devices, iPad screenshots, or universal-app features. Duplicate app IDs are never billed twice in one run.

If some search terms fail while others succeed, valid partial data is preserved and the failures appear in `SUMMARY`. If every Apple request fails, the Actor returns a clear blocked diagnostic and zero fabricated app records.

### Legal and responsible use

Only public App Store catalog metadata is collected. Follow Apple’s applicable terms, including restrictions on promotional artwork and screenshots, and comply with local law and the rights of app developers. Do not use the output to impersonate developers, redistribute protected assets improperly, or make misleading claims. You are responsible for the purpose, retention, and downstream use of exported data.

### Support

For a reproducible issue, open an Actor issue with the redacted input, run ID, selected storefront, expected app or keyword, and observed result. Never include Apify tokens, cookies, private App Store Connect data, or other secrets.

# Actor input Schema

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

Use Search to discover iPad apps by keyword. Use Lookup when you already have App Store URLs or numeric Apple app IDs. Search is the default.

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

Use this in Search mode. Enter 1–20 App Store keywords such as `productivity` or `drawing`. Results are de-duplicated across terms. This is not a web or developer-name search guarantee.

## `appUrls` (type: `array`):

Use this in Lookup mode for public Apple App Store app URLs, for example `https://apps.apple.com/us/app/procreate/id425073498`. Non-Apple URLs are rejected.

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

Use this in Lookup mode for numeric Apple app IDs, for example `425073498`. IDs can be strings or integers and are de-duplicated with IDs found in App Store URLs.

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

Use this to select the storefront for localized price, currency, ratings, and availability. Enter a two-letter ISO country code such as `US`, `GB`, `DE`, or `JP`. Default: `US`.

## `maxResults` (type: `integer`):

Use this to cap the total number of unique app records and PPE result charges across all inputs. Accepted range: 1–200. Default: 25.

## `includeExplicit` (type: `boolean`):

Use this in Search mode to allow results Apple marks explicit. Default: false. This does not bypass age, region, or App Store availability restrictions.

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

Use this to request Apple's supported response language. `en_us` is English and `ja_jp` is Japanese. Default: `en_us`; app descriptions may still follow storefront availability.

## `maxRequestRetries` (type: `integer`):

Use this to retry temporary Apple 429, 5xx, timeout, or network responses with bounded backoff. Accepted range: 0–3. Default: 2; permanent 4xx errors are not retried.

## Actor input object example

```json
{
  "mode": "search",
  "searchTerms": [
    "productivity"
  ],
  "appUrls": [],
  "appIds": [],
  "country": "US",
  "maxResults": 25,
  "includeExplicit": false,
  "language": "en_us",
  "maxRequestRetries": 2
}
```

# Actor output Schema

## `results` (type: `string`):

One flat, schema-validated record per iPad-compatible App Store app.

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

Default dataset metadata and export endpoints.

## `summary` (type: `string`):

Outcome, counts, warnings, and PPE result-event totals.

# 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": [
        "productivity"
    ],
    "country": "US",
    "maxResults": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("muhammadafzal/ipad-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 = {
    "searchTerms": ["productivity"],
    "country": "US",
    "maxResults": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("muhammadafzal/ipad-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 '{
  "searchTerms": [
    "productivity"
  ],
  "country": "US",
  "maxResults": 25
}' |
apify call muhammadafzal/ipad-app-store-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,muhammadafzal/ipad-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/3TLHxaGukFCET1PCn/builds/Z866qYhNAOuCbOP12/openapi.json
