# iOS App Store Scraper (`unfenced-group/ios-app-store-scraper`) Actor

Scrape Apple App Store app data and localized prices across 41 storefronts. Search, charts, or by ID. 50+ fields per app.

- **URL**: https://apify.com/unfenced-group/ios-app-store-scraper.md
- **Developed by:** [Unfenced Group](https://apify.com/unfenced-group) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.79 / 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.
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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## iOS App Store Scraper

Scrape structured app data and **localized pricing** from the Apple App Store. Search by keyword, pull a top chart, or fetch specific apps by ID or URL — and price every app across as many as 41 storefronts in a single run, each in its own local currency.

Built on Apple's own public app data, this scraper returns deep, clean metadata with no login and no proxy hassle. You only pay for results.

### What it does

- **Keyword search** across the App Store
- **Top charts** — Top Free, Top Paid, Top Grossing
- **Direct fetch** by App ID or apps.apple.com URL
- **Multi-currency in one run** — the same app priced in USD, EUR, GBP, JPY, BRL and dozens more, all in one pass
- **Rich metadata** — 50+ fields per app including ratings, content rating, advisories, languages, supported devices, file size, screenshots, and full descriptions
- **Filters** — free/paid, price range, minimum rating, rating count, genre, release window, Game Center

### Why this scraper

Most App Store scrapers only pull reviews, or price in a single currency. This one combines deep app metadata, multi-storefront pricing in one run, and three discovery modes — at the lowest price in its category.

### Input

| Field | Type | Description |
|---|---|---|
| `searchQuery` | string | Keyword(s) to search for |
| `chart` | select | `none`, `topfree`, `toppaid`, `topgrossing` |
| `appIds` | array | Specific numeric App Store IDs |
| `startUrls` | array | apps.apple.com URLs to fetch directly |
| `country` | select | Single storefront (local currency) |
| `countries` | array | Several storefronts in one run |
| `allCountries` | boolean | Price across all 41 major storefronts |
| `maxResults` | integer | Max apps per storefront (default 50) |
| `priceFilter` | select | `all`, `free`, `paid` |
| `minPrice` / `maxPrice` | integer | Price range (local major units) |
| `minRating` | number | Minimum average rating (0-5) |
| `minRatingCount` | integer | Minimum number of ratings |
| `genres` | array | Genre substring match |
| `releasedAfter` / `releasedBefore` | string | Release date window (ISO) |
| `gameCenterOnly` | boolean | Only Game Center apps |
| `includeDescription` | boolean | Include description + release notes |
| `includeScreenshots` | boolean | Include screenshot URLs |
| `fetchInAppPurchases` | boolean | Fetch IAP price list, localized (slower) |
| `fetchDetails` | boolean | Premium: privacy label, rating histogram, chart position, advisories, screenshots, app preview |
| `fetchDeveloperApps` | boolean | Premium: list the developer's other apps |
| `developerAppsLimit` | integer | Max developer apps to return (default 50) |
| `requestDelayMs` / `maxRequestsPerMinute` | integer | Request pacing |

### Output

Each record is one app in one storefront. Always present:

| Field | Description |
|---|---|
| `trackId`, `bundleId` | App identifiers |
| `name`, `censoredName`, `url` | App name and store URL |
| `country` | Storefront the price reflects |
| `price`, `formattedPrice`, `currency`, `isFree` | Localized pricing |
| `sellerName`, `artistName`, `artistId`, `sellerUrl`, `developerUrl` | Developer / seller |
| `primaryGenre`, `primaryGenreId`, `genres`, `genreIds` | Categorization |
| `averageUserRating`, `userRatingCount` | Ratings (all-time) |
| `averageUserRatingCurrentVersion`, `userRatingCountCurrentVersion` | Ratings (current version) |
| `contentRating`, `advisories` | Content rating and advisories |
| `version`, `releaseDate`, `currentVersionReleaseDate`, `releaseNotes` | Versioning |
| `minimumOsVersion`, `fileSizeBytes`, `fileSizeMB` | Technical requirements |
| `supportedDevices`, `features`, `isGameCenterEnabled`, `languageCodes` | Compatibility |
| `description` | Full description (toggle with `includeDescription`) |
| `artworkUrl512`, `artworkUrl100`, `artworkUrl60` | App icon |
| `screenshots`, `ipadScreenshots` | Media (toggle with `includeScreenshots`) |
| `inAppPurchases`, `hasInAppPurchases` | IAP price list, localized (with `fetchInAppPurchases`) |
| `privacyLabel`, `managePrivacyChoicesUrl` | Privacy nutrition label (with `fetchDetails`) |
| `ratingHistogram` | 1-5 star rating breakdown (with `fetchDetails`) |
| `chartPosition` | Live chart rank, chart, genre (with `fetchDetails`) |
| `contentRatingDetail` | Structured age rating + advisories (with `fetchDetails`) |
| `appPreviewVideo`, `screenshotsByType` | App preview video + HQ screenshots, per device (with `fetchDetails`) |
| `versionHistory` | Full changelog: version, date, release notes (with `fetchDetails`) |
| `deviceFamilies` | Supported device families (with `fetchDetails`) |
| `inAppEvents`, `inAppEventCount` | Live & upcoming in-app events / limited-time content (with `fetchDetails`) |
| `developerApps`, `developerAppCount` | Developer's other apps (with `fetchDeveloperApps`) |
| `scrapedAt` | Extraction timestamp |

#### Example record

```json
{
  "trackId": 425073498,
  "bundleId": "com.savage.procreate",
  "name": "Procreate",
  "country": "DE",
  "price": 14.99,
  "formattedPrice": "14,99 €",
  "currency": "EUR",
  "isFree": false,
  "sellerName": "Savage Interactive Pty Ltd",
  "primaryGenre": "Graphics & Design",
  "genres": ["Graphics & Design", "Entertainment"],
  "averageUserRating": 4.78,
  "userRatingCount": 21450,
  "contentRating": "4+",
  "version": "5.3",
  "minimumOsVersion": "16.0",
  "fileSizeMB": 412.6,
  "languageCodes": ["EN", "DE", "FR", "JA"],
  "url": "https://apps.apple.com/de/app/procreate/id425073498",
  "scrapedAt": "2026-06-23T12:00:00.000Z"
}
````

### Examples

**Search, single storefront**

```json
{ "searchQuery": "meditation", "country": "us", "maxResults": 25 }
```

**One app, priced across many currencies**

```json
{ "appIds": ["425073498"], "allCountries": true }
```

**Top Free chart, filtered to high-rated apps**

```json
{ "chart": "topfree", "country": "gb", "minRating": 4.5, "maxResults": 50 }
```

**Daily feed of new paid games in two markets**

```json
{ "searchQuery": "puzzle game", "countries": ["us", "jp"], "priceFilter": "paid", "releasedAfter": "2026-01-01" }
```

**App with its in-app purchase price list**

```json
{ "appIds": ["1517783697"], "country": "us", "fetchInAppPurchases": true }
```

**Full detail: privacy label, rating histogram, chart position, developer apps**

```json
{ "appIds": ["1517783697"], "country": "us", "fetchDetails": true, "fetchDeveloperApps": true }
```

### Notes

- Prices are Apple's real regional prices per storefront, not currency conversions.
- Apple's API throttles aggressively; the scraper paces itself and backs off automatically. Large multi-storefront runs take longer by design.
- Some smaller storefronts price in USD; that reflects Apple's own configuration.
- Premium fields (`fetchDetails`, `fetchDeveloperApps`) are billed per detailed record; basic records are billed at the standard rate. A record is billed at one rate or the other, never both.

### Related scrapers

Other scrapers in our **Game & App Stores** collection:

- [PlayStation Store Scraper](https://apify.com/unfenced-group/playstation-store-scraper)
- [Nintendo eShop Scraper](https://apify.com/unfenced-group/nintendo-eshop-scraper)
- [Steam Store Scraper](https://apify.com/unfenced-group/steam-store-scraper)
- [Xbox Store Scraper](https://apify.com/unfenced-group/xbox-store-scraper)

***

### Need a custom scraper?

**[Unfenced Group](https://www.unfencedgroup.nl)** builds Apify actors for any website — for free.

If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.

**Get in touch:** [www.unfencedgroup.nl](https://www.unfencedgroup.nl)

# Actor input Schema

## `searchQuery` (type: `string`):

Keyword(s) to search the App Store for (e.g. "meditation", "photo editor"). Leave empty if you use charts, App IDs, or Start URLs instead.

## `chart` (type: `string`):

Discover apps from an App Store top chart instead of (or in addition to) a search.

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

Specific numeric App Store track IDs to fetch directly (e.g. 310633997). Found in any apps.apple.com URL after "id".

## `startUrls` (type: `array`):

Optional apps.apple.com URLs to scrape directly. The app ID is extracted from each URL.

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

Single storefront to price against. Each country returns prices in its own local currency. Ignored if you set multiple Countries below or enable All major storefronts.

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

Price each app across several storefronts in one run (multi-currency). Each adds a row per app with that country's local price.

## `allCountries` (type: `boolean`):

Price every app across all 41 major storefronts in one run. Overrides the country selection above.

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

Maximum number of apps to return per storefront.

## `priceFilter` (type: `string`):

Restrict to free or paid apps.

## `minPrice` (type: `integer`):

Only return apps priced at or above this amount (in the storefront's local currency, major units).

## `maxPrice` (type: `integer`):

Only return apps priced at or below this amount (in the storefront's local currency, major units).

## `minRating` (type: `number`):

Only return apps with an average user rating at or above this value (0–5). Apps with no rating are kept.

## `minRatingCount` (type: `integer`):

Only return apps with at least this many ratings. Apps with no rating count are kept.

## `genres` (type: `array`):

Only return apps matching one of these genres (case-insensitive substring, e.g. "Games", "Productivity", "Photo & Video").

## `releasedAfter` (type: `string`):

Only return apps first released on or after this date (ISO, e.g. 2024-01-01).

## `releasedBefore` (type: `string`):

Only return apps first released on or before this date (ISO, e.g. 2025-12-31).

## `gameCenterOnly` (type: `boolean`):

Only return apps with Game Center enabled.

## `includeDescription` (type: `boolean`):

Include the full app description and release notes in each record.

## `includeScreenshots` (type: `boolean`):

Include screenshot URLs (iPhone, iPad) in each record.

## `fetchInAppPurchases` (type: `boolean`):

Fetch the in-app purchase price list (top IAPs with localized prices) from each app's store page. Adds one extra request per app per storefront, so runs are slower. Prices are localized to each storefront.

## `fetchDetails` (type: `boolean`):

Premium enrichment per app: privacy nutrition label (data used to track / linked to you), rating histogram (1-5 star breakdown), live chart position, structured content advisories, app preview video, and high-quality screenshots. Adds one extra request per app per storefront and is billed at the detailed-record rate.

## `fetchDeveloperApps` (type: `boolean`):

For each app, also list other apps by the same developer. Adds one extra request per app per storefront and is billed at the detailed-record rate.

## `developerAppsLimit` (type: `integer`):

Maximum number of other apps to return per developer.

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

Minimum pause between requests to the Apple API. Apple throttles aggressively; do not set this too low.

## `maxRequestsPerMinute` (type: `integer`):

Hard cap on requests over a rolling 60-second window.

## Actor input object example

```json
{
  "searchQuery": "",
  "chart": "none",
  "appIds": [],
  "startUrls": [],
  "country": "us",
  "countries": [],
  "allCountries": false,
  "maxResults": 50,
  "priceFilter": "all",
  "genres": [],
  "releasedAfter": "",
  "releasedBefore": "",
  "gameCenterOnly": false,
  "includeDescription": true,
  "includeScreenshots": true,
  "fetchInAppPurchases": false,
  "fetchDetails": false,
  "fetchDeveloperApps": false,
  "developerAppsLimit": 50,
  "requestDelayMs": 1200,
  "maxRequestsPerMinute": 30
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("unfenced-group/ios-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("unfenced-group/ios-app-store-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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 unfenced-group/ios-app-store-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=unfenced-group/ios-app-store-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "iOS App Store Scraper",
        "description": "Scrape Apple App Store app data and localized prices across 41 storefronts. Search, charts, or by ID. 50+ fields per app.",
        "version": "0.0",
        "x-build-id": "i0OnvOm0IFq6EdiVs"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/unfenced-group~ios-app-store-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-unfenced-group-ios-app-store-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/unfenced-group~ios-app-store-scraper/runs": {
            "post": {
                "operationId": "runs-sync-unfenced-group-ios-app-store-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/unfenced-group~ios-app-store-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-unfenced-group-ios-app-store-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQuery": {
                        "title": "Search query",
                        "type": "string",
                        "description": "Keyword(s) to search the App Store for (e.g. \"meditation\", \"photo editor\"). Leave empty if you use charts, App IDs, or Start URLs instead.",
                        "default": ""
                    },
                    "chart": {
                        "title": "Top chart",
                        "enum": [
                            "none",
                            "topfree",
                            "toppaid",
                            "topgrossing"
                        ],
                        "type": "string",
                        "description": "Discover apps from an App Store top chart instead of (or in addition to) a search.",
                        "default": "none"
                    },
                    "appIds": {
                        "title": "App IDs",
                        "type": "array",
                        "description": "Specific numeric App Store track IDs to fetch directly (e.g. 310633997). Found in any apps.apple.com URL after \"id\".",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Optional apps.apple.com URLs to scrape directly. The app ID is extracted from each URL.",
                        "default": [],
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "country": {
                        "title": "Storefront country",
                        "enum": [
                            "us",
                            "gb",
                            "de",
                            "fr",
                            "it",
                            "es",
                            "nl",
                            "ie",
                            "pt",
                            "at",
                            "ch",
                            "se",
                            "no",
                            "dk",
                            "fi",
                            "pl",
                            "cz",
                            "hu",
                            "ro",
                            "gr",
                            "tr",
                            "ua",
                            "ru",
                            "au",
                            "nz",
                            "jp",
                            "kr",
                            "cn",
                            "hk",
                            "tw",
                            "sg",
                            "my",
                            "th",
                            "id",
                            "ph",
                            "vn",
                            "in",
                            "br",
                            "mx",
                            "ar",
                            "cl",
                            "co",
                            "pe",
                            "ca",
                            "za",
                            "ae",
                            "sa",
                            "eg",
                            "il"
                        ],
                        "type": "string",
                        "description": "Single storefront to price against. Each country returns prices in its own local currency. Ignored if you set multiple Countries below or enable All major storefronts.",
                        "default": "us"
                    },
                    "countries": {
                        "title": "Multiple storefronts",
                        "type": "array",
                        "description": "Price each app across several storefronts in one run (multi-currency). Each adds a row per app with that country's local price.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "us",
                                "gb",
                                "de",
                                "fr",
                                "it",
                                "es",
                                "nl",
                                "ie",
                                "pt",
                                "at",
                                "ch",
                                "se",
                                "no",
                                "dk",
                                "fi",
                                "pl",
                                "cz",
                                "hu",
                                "ro",
                                "gr",
                                "tr",
                                "ua",
                                "ru",
                                "au",
                                "nz",
                                "jp",
                                "kr",
                                "cn",
                                "hk",
                                "tw",
                                "sg",
                                "my",
                                "th",
                                "id",
                                "ph",
                                "vn",
                                "in",
                                "br",
                                "mx",
                                "ar",
                                "cl",
                                "co",
                                "pe",
                                "ca",
                                "za",
                                "ae",
                                "sa",
                                "eg",
                                "il"
                            ]
                        },
                        "default": []
                    },
                    "allCountries": {
                        "title": "All major storefronts",
                        "type": "boolean",
                        "description": "Price every app across all 41 major storefronts in one run. Overrides the country selection above.",
                        "default": false
                    },
                    "maxResults": {
                        "title": "Max results per storefront",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of apps to return per storefront.",
                        "default": 50
                    },
                    "priceFilter": {
                        "title": "Price filter",
                        "enum": [
                            "all",
                            "free",
                            "paid"
                        ],
                        "type": "string",
                        "description": "Restrict to free or paid apps.",
                        "default": "all"
                    },
                    "minPrice": {
                        "title": "Minimum price",
                        "type": "integer",
                        "description": "Only return apps priced at or above this amount (in the storefront's local currency, major units)."
                    },
                    "maxPrice": {
                        "title": "Maximum price",
                        "type": "integer",
                        "description": "Only return apps priced at or below this amount (in the storefront's local currency, major units)."
                    },
                    "minRating": {
                        "title": "Minimum rating",
                        "type": "number",
                        "description": "Only return apps with an average user rating at or above this value (0–5). Apps with no rating are kept."
                    },
                    "minRatingCount": {
                        "title": "Minimum rating count",
                        "type": "integer",
                        "description": "Only return apps with at least this many ratings. Apps with no rating count are kept."
                    },
                    "genres": {
                        "title": "Genres",
                        "type": "array",
                        "description": "Only return apps matching one of these genres (case-insensitive substring, e.g. \"Games\", \"Productivity\", \"Photo & Video\").",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "releasedAfter": {
                        "title": "Released after",
                        "type": "string",
                        "description": "Only return apps first released on or after this date (ISO, e.g. 2024-01-01).",
                        "default": ""
                    },
                    "releasedBefore": {
                        "title": "Released before",
                        "type": "string",
                        "description": "Only return apps first released on or before this date (ISO, e.g. 2025-12-31).",
                        "default": ""
                    },
                    "gameCenterOnly": {
                        "title": "Game Center only",
                        "type": "boolean",
                        "description": "Only return apps with Game Center enabled.",
                        "default": false
                    },
                    "includeDescription": {
                        "title": "Include description",
                        "type": "boolean",
                        "description": "Include the full app description and release notes in each record.",
                        "default": true
                    },
                    "includeScreenshots": {
                        "title": "Include screenshots",
                        "type": "boolean",
                        "description": "Include screenshot URLs (iPhone, iPad) in each record.",
                        "default": true
                    },
                    "fetchInAppPurchases": {
                        "title": "Fetch in-app purchases",
                        "type": "boolean",
                        "description": "Fetch the in-app purchase price list (top IAPs with localized prices) from each app's store page. Adds one extra request per app per storefront, so runs are slower. Prices are localized to each storefront.",
                        "default": false
                    },
                    "fetchDetails": {
                        "title": "Fetch detailed data (premium)",
                        "type": "boolean",
                        "description": "Premium enrichment per app: privacy nutrition label (data used to track / linked to you), rating histogram (1-5 star breakdown), live chart position, structured content advisories, app preview video, and high-quality screenshots. Adds one extra request per app per storefront and is billed at the detailed-record rate.",
                        "default": false
                    },
                    "fetchDeveloperApps": {
                        "title": "Fetch developer's other apps (premium)",
                        "type": "boolean",
                        "description": "For each app, also list other apps by the same developer. Adds one extra request per app per storefront and is billed at the detailed-record rate.",
                        "default": false
                    },
                    "developerAppsLimit": {
                        "title": "Developer apps limit",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of other apps to return per developer.",
                        "default": 50
                    },
                    "requestDelayMs": {
                        "title": "Request delay (ms)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum pause between requests to the Apple API. Apple throttles aggressively; do not set this too low.",
                        "default": 1200
                    },
                    "maxRequestsPerMinute": {
                        "title": "Max requests per minute",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Hard cap on requests over a rolling 60-second window.",
                        "default": 30
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
