# Apple App Store Reviews API | iOS & macOS JSON (`johnvc/apple-app-store-reviews-api`) Actor

Apple App Store Reviews API. Fetch iOS and macOS app reviews on demand as structured JSON: ratings, titles, text, dates, versions, author, and helpfulness across 50+ country stores. Sort by most recent, most helpful, favorable, or critical. Built for ASO, sentiment, and AI agent workflows.

- **URL**: https://apify.com/johnvc/apple-app-store-reviews-api.md
- **Developed by:** [John](https://apify.com/johnvc) (community)
- **Categories:** Developer tools, E-commerce, Integrations
- **Stats:** 7 total users, 5 monthly users, 100.0% runs succeeded, 3 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

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

## Apple App Store Reviews API

> **The fastest way to query Apple App Store reviews for any iOS or macOS app, delivered as structured JSON and built MCP-first for Claude, AI agents, and developers.**

A clean Apple App Store Reviews API. Fetch star ratings, review titles, body text, author info, app versions, dates, and helpfulness counts on demand. Works across 50+ country stores. Sort by most recent, most helpful, most favorable, or most critical. Pass a numeric App Store ID or just an app name and the API finds the right one for you. Built for App Store Optimization (ASO), sentiment analysis, competitor monitoring, churn-signal tracking, localization QA, and AI agent workflows.

This actor is fully **MCP (Model Context Protocol) ready**, with one click setup for Claude Code, Claude Cowork, and Claude.ai Chat.

---

### AI Agent and MCP Integration

The fastest path to use this actor is through the Apify MCP server. Once connected, Claude (or any MCP-compatible AI agent) can discover and invoke this actor directly from a natural language prompt. No glue code, no client SDK, no manual REST calls.

The Apify MCP server hosts three discovery tools (`search-actors`, `fetch-actor-details`, `add-actor`) that let agents find and register this actor on the fly. Pick the setup that matches your Claude surface.

#### Option 1: Claude Code (terminal CLI)

The single-command setup. Open your terminal and run:

```bash
claude mcp add apify -- npx -y @apify/actors-mcp-server
````

Then add your Apify API token (one time):

```bash
claude mcp add apify -e APIFY_TOKEN=your_apify_token_here -- npx -y @apify/actors-mcp-server
```

Get your token at https://console.apify.com/account/integrations.

Prefer to edit config by hand? Open `~/.claude.json` and add:

```json
{
  "mcpServers": {
    "apify": {
      "command": "npx",
      "args": ["-y", "@apify/actors-mcp-server"],
      "env": { "APIFY_TOKEN": "your_apify_token_here" }
    }
  }
}
```

Restart Claude Code, then try a prompt like:

> *Get the 50 most-critical Apple App Store reviews for Netflix in the US and summarize the top three complaints.*

Claude will discover this actor via `search-actors`, register it as a tool, and run it. You can pass either a numeric product ID or just the app name; the actor handles the lookup.

#### Option 2: Claude Cowork (web)

Claude Cowork uses the hosted Apify MCP endpoint over HTTP. No local install required.

1. Open Cowork.
2. Go to **Settings** > **Connectors** > **Add custom connector**.
3. Fill in:
   - **Name:** `Apify`
   - **Remote MCP URL:** `https://mcp.apify.com`
   - **Authentication:** Bearer token (paste your Apify API token).
4. Save and enable the connector.

Once connected, the Apify tools appear in the tool drawer. Try a prompt:

> *Use Apify to pull the 100 most-recent App Store reviews for Spotify in the UK store and bucket them by star rating.*

Cowork supports dynamic tool discovery, so once Claude finds this actor in a session, it stays registered as a named tool for the rest of the conversation. Subsequent prompts reuse it without re-discovery.

#### Option 3: Claude.ai Chat (Connectors)

Same hosted MCP endpoint, configured through the standard Claude.ai UI.

1. Open https://claude.ai.
2. Click your profile, then **Settings** > **Connectors** > **Add custom connector**.
3. Fill in:
   - **Name:** `Apify`
   - **Remote MCP URL:** `https://mcp.apify.com`
   - **Authentication:** Bearer token (your Apify API token).
4. Save. Toggle the connector on at the start of any chat where you want App Store review data.

Then prompt as normal:

> *Pull the most helpful App Store reviews for Duolingo and tell me what people praise most.*

#### Option 4: ChatGPT, n8n, Zapier, custom GPTs (direct REST)

Skip MCP entirely with a single REST call. Useful for custom GPTs, Zapier flows, n8n pipelines, or any HTTP client.

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/YOUR_USERNAME~apple-app-store-reviews/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"product_ids": ["534220544"], "country": "us", "max_reviews": 50}'
```

For ChatGPT custom GPT Actions, import the [Apify OpenAPI spec](https://docs.apify.com/api/v2) as a custom action. Once added, ChatGPT can call this actor as a function from any custom GPT.

#### Why this actor is MCP-discoverable

- Title and description are tuned for the Apify MCP server's `search-actors` tool: platform name, data type, and use case appear in the first 150 characters of the description.
- The input schema uses MCP-friendly descriptions that read cleanly even when prefixed with `REQUIRED`. Every array property declares an explicit `items.type` so dynamic-discovery clients (Cursor, Cline, Claude Code, VS Code, Windsurf, Glama) can register the actor as a typed tool.
- Pay-per-event pricing keeps the result-card description transparent for autonomous agents.
- Both `product_ids` (exact targeting) and `app_name` (auto-resolution) are accepted so agents that only have an app name can still call the actor in one shot.

[Full Apify MCP documentation](https://docs.apify.com/platform/integrations/mcp)

***

### What You Can Extract

Every dataset item is one review, flat and ready for analysis.

| Field | Description |
| ----- | ----------- |
| Star rating | Integer 1 to 5 |
| Review title | The headline the author wrote |
| Review text | Full body of the review |
| Author name and ID | Display name plus a stable author identifier (iOS only) |
| Review date | As returned by the store, locale-formatted |
| Review date (ISO) | Best-effort ISO 8601 normalization (e.g. `2021-06-02`) |
| App version reviewed | Version string captured at the time of review |
| Helpfulness | Original prose plus parsed integer helpful / total counts |
| Source product ID | Numeric Apple App Store ID this review came from |
| App platform | `ios` or `macos`, inferred automatically per app |
| Country store | The two-letter country store code applied |
| Sort order applied | Echoes which order was requested |
| Page number | Source page of pagination |
| Reviews for current version | Present for macOS apps only |
| Fetch timestamp | UTC ISO timestamp at request time |

Each row also carries the originating product ID and country store, so multi-app and multi-country runs stay self-contained.

***

### Use Cases

- **App Store Optimization (ASO):** Track sentiment, monitor version-specific complaints, and benchmark competitor reviews.
- **Sentiment analysis pipelines:** Feed real review text into an LLM or a classical NLP model. Star ratings already labeled.
- **Competitor monitoring:** Watch a rival app's reviews and react to negative spikes before they show in the headline rating.
- **Churn-signal tracking:** Catch the first one-star reviews on a new release and triage them in your support workflow.
- **Localization QA:** Compare reviews from the US, UK, JP, DE, and BR stores to spot region-specific bugs and translation issues.
- **AI agent feedback loops:** Let an AI agent gather reviews on demand to ground its answers in real user voice.
- **Investor and PM research:** Quickly read what users actually say about an app, not just the headline rating.

***

### Input Parameters

| Parameter | Type | Required | Default | Description |
| --------- | ---- | -------- | ------- | ----------- |
| `product_ids` | array of string | yes (one of) | `[]` | Numeric Apple App Store IDs (e.g. `["534220544"]`). Find each ID in the App Store URL: `apps.apple.com/<country>/app/<slug>/id<NNNNNNNN>`. |
| `app_name` | string | yes (one of) | (none) | Free-form Apple app name (e.g. `netflix`). If `product_ids` is empty, the actor resolves the ID automatically and reviews the top match. |
| `country` | string | no | `us` | Two-letter Apple country store code. 50+ stores supported. |
| `sort` | string | no | `mostrecent` | `mostrecent`, `mosthelpful`, `mostfavorable`, or `mostcritical`. iOS only; macOS apps always return most-recent. |
| `max_reviews` | integer | no | `100` | Hard cap on reviews per app. `0` for unlimited (internally capped at 50 pages). |
| `start_page` | integer | no | `1` | Page to start paginating from. Useful for resuming a long run. |
| `include_macos` | boolean | no | `true` | Set false to skip macOS apps entirely. |
| `normalize_dates` | boolean | no | `true` | Emit `review_date_iso` alongside the locale-formatted date. |
| `parse_helpfulness` | boolean | no | `true` | Extract `helpful_count` and `total_helpful_count` integers from the helpfulness prose. |
| `output_file` | string | no | auto | Local-only JSON output filename for debugging. Ignored on Apify platform. |

At least one of `product_ids` or `app_name` must be provided.

***

### Example Inputs

#### Basic: most recent reviews for one app (by product ID)

```json
{
  "product_ids": ["534220544"],
  "max_reviews": 50
}
```

#### Auto-resolve by app name

```json
{
  "app_name": "netflix",
  "country": "us",
  "sort": "mostcritical",
  "max_reviews": 100
}
```

#### Multi-app competitor sweep

```json
{
  "product_ids": ["324684580", "284882215", "447188370"],
  "country": "us",
  "sort": "mostrecent",
  "max_reviews": 200
}
```

#### International sentiment comparison (Japan, most helpful)

```json
{
  "app_name": "spotify",
  "country": "jp",
  "sort": "mosthelpful",
  "max_reviews": 200
}
```

#### macOS app (Xcode)

```json
{
  "product_ids": ["497799835"],
  "max_reviews": 100,
  "include_macos": true
}
```

#### Unlimited (drain all available reviews, capped at 50 pages internally)

```json
{
  "product_ids": ["534220544"],
  "max_reviews": 0
}
```

***

### Example Output

Each dataset item is one review:

```json
{
  "position_global": 1,
  "position_on_page": 1,
  "review_id": "7417861364",
  "review_title": "Lacks ratios",
  "review_text": "Beautiful app with images and videos but doesn't tell you how much of what goes in making the drink. Needs ratios!",
  "rating": 3,
  "review_date": "Jun 02, 2021",
  "review_date_iso": "2021-06-02",
  "reviewed_version": "Version 3.4.2",
  "helpfulness_text": "3 out of 5 customers found this review helpful",
  "helpful_count": 3,
  "total_helpful_count": 5,
  "author_name": "Punkiepollo",
  "author_id": "100937133",
  "product_id": "534220544",
  "app_platform": "ios",
  "app_country": "us",
  "sort_order": "mostrecent",
  "page_number": 1,
  "total_page_count": 8,
  "fetch_timestamp": "2026-05-11T18:30:00+00:00"
}
```

***

### Pricing

Transparent pay-per-event pricing. You only pay for what you get.

| Event | Cost | When charged |
| ----- | ---- | ------------ |
| `setup` | `$0.02` | Once at the start of each run. Also covers the optional app-name to product-id lookup. |
| `review` | `$0.0015` | Per review pushed to the dataset. |

#### Cost estimates

| Use case | Reviews returned | Approx. cost |
| -------- | ---------------- | ------------ |
| Quick spot-check (10 reviews) | 10 | `$0.035` |
| Standard scan (100 reviews) | 100 | `$0.17` |
| Deep crawl (500 reviews) | 500 | `$0.77` |
| Bulk competitor sweep (5 apps, 200 reviews each) | 1,000 | `$1.52` |
| Maximum iOS depth (1 app, 50 pages, about 1250 reviews) | 1,250 | `$1.90` |

No monthly subscription. No hidden fees. Stop the run at any time and pay only for what was already returned.

***

### How to Get Started

1. **Create an Apify account** at https://apify.com if you do not have one.
2. **Open the actor page** in the Apify store and click **Try for free**.
3. **Provide either** a `product_ids` array (numeric App Store IDs) or an `app_name` (free-form), then click **Start**.
4. **Watch the run live** in the Apify console, then download results as JSON, CSV, Excel, or RSS once it finishes.
5. Optional: connect via MCP (see top of this README) to call the actor directly from Claude or any AI agent.

#### How to find a product ID

Open the App Store page for any app and look at the URL. The numeric ID is the part after `/id`:

```
https://apps.apple.com/us/app/netflix/id363590051
                                       ^^^^^^^^^
                                       product_id
```

Or skip this step entirely and pass an `app_name` instead. The actor looks it up for you.

***

### FAQ

**Q: Why are some fields empty on certain reviews?**
A: Apple returns slightly different shapes for iOS and macOS apps. macOS reviews do not include `review_id` or `author_id`, and they include the `reviews_for_current_version` field that iOS does not. The actor flags each row with `app_platform` so you can branch on it cleanly downstream.

**Q: Why doesn't `sort` change the order for one of my apps?**
A: Sort applies only to iOS apps. macOS apps always return reviews in most-recent order regardless of the `sort` value. This is a behaviour of the Apple store, not of the actor.

**Q: How many reviews does one page return?**
A: About 25 per page on iOS and about 10 per page on macOS. Page size is fixed by Apple and cannot be changed via input.

**Q: How do I drain every review on an app?**
A: Set `max_reviews` to `0` for unlimited. The actor caps internally at 50 pages as a safety guard (about 1250 iOS reviews or 500 macOS reviews), which is the practical depth of what the store exposes.

**Q: What happens if I run out of budget mid-run?**
A: The API stops cleanly at the next review and writes a warning to the log. Reviews already pushed are charged; the rest are not. Raise your budget and re-run with `start_page` to resume.

**Q: Can I get developer responses?**
A: The underlying data source does not expose developer-reply text for App Store reviews. If this changes, the actor will be updated.

**Q: Which country stores are supported?**
A: 50+ stores including US, UK, CA, AU, DE, FR, JP, KR, BR, MX, IN, and more. See the `country` parameter dropdown for the full list.

**Q: Does this work with AI agents and MCP?**
A: Yes. Setup instructions for Claude Code, Claude Cowork, and Claude.ai Chat are at the top of this README. The actor is registered with the Apify MCP server and is discoverable via `search-actors`.

***

Last Updated: 2026.05.20

# Actor input Schema

## `product_ids` (type: `array`):

Numeric Apple App Store product IDs (e.g. \['534220544', '363590051']). Find each ID in the App Store URL: apps.apple.com/<country>/app/<slug>/id<NNNNNNNN>. Multiple IDs are fetched sequentially in one run. Either this or app\_name must be provided.

## `app_name` (type: `string`):

Free-form Apple app name to look up automatically (e.g. 'netflix', 'spotify', 'todoist'). If product\_ids is empty, the actor calls the App Store search engine first and reviews the top match. Convenient for AI agents that only know an app by name. Use product\_ids for exact targeting.

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

Two-letter Apple country store code (e.g. 'us', 'gb', 'jp'). Drives both the storefront and the locale of review text and dates. Defaults to 'us'.

## `sort` (type: `string`):

Order reviews by recency, helpfulness votes, or rating polarity. Note: applies to iOS apps only. macOS apps always return reviews in most-recent order regardless of this setting.

## `max_reviews` (type: `integer`):

Hard cap on reviews returned per product ID. Default 100. Set 0 for unlimited (internally capped at 50 pages, about 1250 reviews on iOS or 500 on macOS). Pages contain about 25 reviews each on iOS and 10 on macOS.

## `start_page` (type: `integer`):

Page number to start paginating from (1-based). Useful for resuming a long run. Defaults to 1.

## `include_macos` (type: `boolean`):

Set false to skip macOS apps entirely (no reviews pushed, no charges incurred for any macOS product\_id). Defaults to true (iOS and macOS both included).

## `normalize_dates` (type: `boolean`):

Emit a review\_date\_iso field alongside the locale-formatted review\_date (e.g. '2021-06-02' alongside 'Jun 02, 2021'). Best-effort parsing; falls back to null when the source format is unfamiliar. Defaults to true.

## `parse_helpfulness` (type: `boolean`):

Extract integer helpful\_count and total\_helpful\_count fields from the prose 'X out of Y customers found this review helpful' string. Defaults to true.

## `output_file` (type: `string`):

Optional filename to save a local JSON copy of the API response. Used during local testing only; ignored when running on the Apify platform. Auto-generated if blank.

## Actor input object example

```json
{
  "product_ids": [
    "534220544"
  ],
  "country": "us",
  "sort": "mostrecent",
  "max_reviews": 100,
  "start_page": 1,
  "include_macos": true,
  "normalize_dates": true,
  "parse_helpfulness": true
}
```

# Actor output Schema

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

All reviews returned across every product ID processed in the run. Each dataset item is one review with star rating, title, body text, author, version, helpfulness counts, plus the originating product ID, country store, platform (ios or macos), and sort order applied.

# 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 = {
    "product_ids": [
        "534220544"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("johnvc/apple-app-store-reviews-api").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 = { "product_ids": ["534220544"] }

# Run the Actor and wait for it to finish
run = client.actor("johnvc/apple-app-store-reviews-api").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 '{
  "product_ids": [
    "534220544"
  ]
}' |
apify call johnvc/apple-app-store-reviews-api --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Apple App Store Reviews API | iOS & macOS JSON",
        "description": "Apple App Store Reviews API. Fetch iOS and macOS app reviews on demand as structured JSON: ratings, titles, text, dates, versions, author, and helpfulness across 50+ country stores. Sort by most recent, most helpful, favorable, or critical. Built for ASO, sentiment, and AI agent workflows.",
        "version": "0.1",
        "x-build-id": "w938HYA3PeU9lKXGl"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/johnvc~apple-app-store-reviews-api/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-johnvc-apple-app-store-reviews-api",
                "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/johnvc~apple-app-store-reviews-api/runs": {
            "post": {
                "operationId": "runs-sync-johnvc-apple-app-store-reviews-api",
                "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/johnvc~apple-app-store-reviews-api/run-sync": {
            "post": {
                "operationId": "run-sync-johnvc-apple-app-store-reviews-api",
                "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": {
                    "product_ids": {
                        "title": "Apple Product IDs",
                        "type": "array",
                        "description": "Numeric Apple App Store product IDs (e.g. ['534220544', '363590051']). Find each ID in the App Store URL: apps.apple.com/<country>/app/<slug>/id<NNNNNNNN>. Multiple IDs are fetched sequentially in one run. Either this or app_name must be provided.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "app_name": {
                        "title": "App Name (Auto-Resolve)",
                        "type": "string",
                        "description": "Free-form Apple app name to look up automatically (e.g. 'netflix', 'spotify', 'todoist'). If product_ids is empty, the actor calls the App Store search engine first and reviews the top match. Convenient for AI agents that only know an app by name. Use product_ids for exact targeting."
                    },
                    "country": {
                        "title": "Country Store",
                        "enum": [
                            "us",
                            "gb",
                            "ca",
                            "au",
                            "nz",
                            "ie",
                            "in",
                            "sg",
                            "ph",
                            "my",
                            "de",
                            "fr",
                            "es",
                            "it",
                            "nl",
                            "be",
                            "at",
                            "ch",
                            "se",
                            "no",
                            "dk",
                            "fi",
                            "pt",
                            "pl",
                            "cz",
                            "gr",
                            "hu",
                            "ro",
                            "tr",
                            "ru",
                            "ua",
                            "il",
                            "ae",
                            "sa",
                            "eg",
                            "za",
                            "ng",
                            "ke",
                            "jp",
                            "kr",
                            "cn",
                            "tw",
                            "hk",
                            "th",
                            "id",
                            "vn",
                            "br",
                            "mx",
                            "ar",
                            "cl",
                            "co",
                            "pe"
                        ],
                        "type": "string",
                        "description": "Two-letter Apple country store code (e.g. 'us', 'gb', 'jp'). Drives both the storefront and the locale of review text and dates. Defaults to 'us'.",
                        "default": "us"
                    },
                    "sort": {
                        "title": "Sort Order",
                        "enum": [
                            "mostrecent",
                            "mosthelpful",
                            "mostfavorable",
                            "mostcritical"
                        ],
                        "type": "string",
                        "description": "Order reviews by recency, helpfulness votes, or rating polarity. Note: applies to iOS apps only. macOS apps always return reviews in most-recent order regardless of this setting.",
                        "default": "mostrecent"
                    },
                    "max_reviews": {
                        "title": "Maximum Reviews per App",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Hard cap on reviews returned per product ID. Default 100. Set 0 for unlimited (internally capped at 50 pages, about 1250 reviews on iOS or 500 on macOS). Pages contain about 25 reviews each on iOS and 10 on macOS.",
                        "default": 100
                    },
                    "start_page": {
                        "title": "Start Page",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Page number to start paginating from (1-based). Useful for resuming a long run. Defaults to 1.",
                        "default": 1
                    },
                    "include_macos": {
                        "title": "Include macOS Apps",
                        "type": "boolean",
                        "description": "Set false to skip macOS apps entirely (no reviews pushed, no charges incurred for any macOS product_id). Defaults to true (iOS and macOS both included).",
                        "default": true
                    },
                    "normalize_dates": {
                        "title": "Normalize Review Dates to ISO",
                        "type": "boolean",
                        "description": "Emit a review_date_iso field alongside the locale-formatted review_date (e.g. '2021-06-02' alongside 'Jun 02, 2021'). Best-effort parsing; falls back to null when the source format is unfamiliar. Defaults to true.",
                        "default": true
                    },
                    "parse_helpfulness": {
                        "title": "Parse Helpfulness Counts",
                        "type": "boolean",
                        "description": "Extract integer helpful_count and total_helpful_count fields from the prose 'X out of Y customers found this review helpful' string. Defaults to true.",
                        "default": true
                    },
                    "output_file": {
                        "title": "Local Output File",
                        "type": "string",
                        "description": "Optional filename to save a local JSON copy of the API response. Used during local testing only; ignored when running on the Apify platform. Auto-generated if blank."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
