# Apple App Store Review & Competitor Intelligence (`datahunter_labs/apple-app-store-review-intelligence`) Actor

Monitor recent public Apple App Store reviews across apps and storefronts, detect complaints, competitor mentions, switching signals, and newly observed reviews using Apple's public customer-review feeds.

- **URL**: https://apify.com/datahunter\_labs/apple-app-store-review-intelligence.md
- **Developed by:** [DataHunter Labs](https://apify.com/datahunter_labs) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 app store review intelligences

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Apple App Store Review & Competitor Intelligence

Monitor recent **public Apple App Store written reviews** across apps and storefronts. The Actor reads Apple's public customer-review RSS/JSON feed, normalizes reviews, and adds lightweight deterministic intelligence for sentiment, complaints, competitor mentions, switching signals, and newly observed reviews.

### Why this Actor

- No Apple developer account or App Store Connect token required for the public review-feed path.
- Direct HTTP first: no browser and no proxy cost when Apple's public feed works normally.
- Cost-bounded memory profile: 256 MB default, 256 MB minimum, 512 MB maximum for this HTTP-only workload.
- Bounded Apify/custom proxy fallback for confirmed blocks or transient network failures.
- Multi-app and multi-country storefront monitoring.
- Recent review intelligence: rating, title, body, app version, date, sentiment, complaint categories, competitor mentions, switching signals.
- Optional reviewer display name; off by default.
- Monitoring state for newly delivered reviews with a bounded cumulative ID ledger, preventing repeat billing if Apple reorders review windows.
- Cache for non-monitoring runs.

### Important source limitation

Apple's public RSS customer-review feed is an undocumented public surface. It exposes a recent window per storefront rather than a complete historical archive. In practice it is commonly paginated in roughly 50-review pages with a limited recent window. The Actor therefore describes its results as **recent public reviews**, not complete lifetime history.

### Input example

```json
{
  "apps": ["389801252"],
  "countries": ["us", "gb"],
  "maxReviewsPerApp": 50,
  "sort": "mostrecent",
  "competitorNames": ["TikTok", "Snapchat"],
  "monitorChanges": true
}
```

Apps may be numeric IDs or App Store URLs containing `id<digits>`.

### Output

#### `review`

One row per successfully returned review. Complaint intelligence includes stability/performance, connectivity, ads, pricing, login/account, usability, content moderation, and support themes when supported by review text. Common explicit non-complaint phrases such as “no crashes” or “never had a problem” are masked to reduce false positives. Complaint detection is independent from star-led sentiment, so a positive-rated review can still expose a concrete complaint. Includes `appId`, `country`, `reviewId`, `title`, `reviewText`, `rating`, `appVersion`, `publishedAt`, sentiment, complaints, switching data, and competitor mentions.

#### `app_summary`

One summary per app/storefront pair with recent average rating, sentiment counts, complaint-category counts, competitor mentions, and new-review count when monitoring has a baseline.

#### `error`

Structured diagnostics for invalid inputs, exhausted request budgets, blocks, transient upstream failures, or network errors. Error and summary rows are not charged by the review event.

### Reliability design

- Actor-scoped cache and monitoring state for Limited Permissions.
- PPE-aware delivery: charged batches honor the caller spending limit, stop before extra network work when exhausted, and never mark unpushed reviews as delivered.
- Hard request budget.
- Direct-first Apple feed route.
- Bounded retry/backoff and fresh proxy sessions for 401/403/429, HTTP 408/5xx/520-524, and network timeouts.
- JSON feed primary path with Atom XML format fallback.
- Empty-page tolerance so one empty page does not automatically terminate pagination.
- No CAPTCHA solving.

### Pricing

Suggested pay-per-event price: **$0.0015 per successfully returned review intelligence row**. App summaries, errors, retries, empty pages, proxy rotations, and monitoring state updates are not charged by that event.

### Privacy

Only public App Store review data is processed. Reviewer display names are omitted by default and can be enabled explicitly.

### Disclaimer

Independent community Actor. Not affiliated with, endorsed by, or operated by Apple Inc.

# Changelog

This Actor's version history is a separate document: https://apify.com/datahunter\_labs/apple-app-store-review-intelligence/changelog.md

# Actor input Schema

## `apps` (type: `array`):

Numeric Apple App Store IDs or full App Store URLs. Example: 389801252 or https://apps.apple.com/us/app/instagram/id389801252

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

Two-letter App Store storefront codes. Reviews are storefront-specific.

## `maxReviewsPerApp` (type: `integer`):

Maximum recent written reviews returned for each app/storefront pair. Apple's public feed exposes a recent window rather than full history.

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

Apple public feed sort order.

## `ratings` (type: `array`):

Optional star filter. Empty means all ratings.

## `competitorNames` (type: `array`):

Optional app or brand names to detect inside review text and switching language.

## `monitorChanges` (type: `boolean`):

Persist review IDs per app/storefront/filter so later runs can identify newly observed reviews.

## `onlyNewReviews` (type: `boolean`):

After a monitoring baseline exists, emit only newly observed reviews plus the app summary.

## `includeReviewerName` (type: `boolean`):

Off by default. Enable only if your workflow needs the public reviewer display name.

## `cacheTtlMinutes` (type: `integer`):

Used by non-monitoring runs to avoid unnecessary Apple requests.

## `forceRefresh` (type: `boolean`):

Ignore a valid cache entry on non-monitoring runs.

## `maxRequestsPerRun` (type: `integer`):

Hard cap on Apple feed HTTP requests made during a run, including retries and format fallbacks.

## `timeoutSeconds` (type: `integer`):

Timeout per Apple feed request.

## `requestDelaySeconds` (type: `integer`):

Optional polite delay between app/storefront pairs.

## `directFirst` (type: `boolean`):

Use Apple's public feed directly first to minimize proxy cost. On confirmed blocking or transient network errors, retry through the configured proxy with bounded session rotation.

## `proxyConfiguration` (type: `object`):

Optional Apify/custom proxy fallback. It is not used when the direct Apple feed succeeds.

## `maxProxyRotations` (type: `integer`):

Bounded retries after confirmed blocks, HTTP 408/5xx/520-524, or network timeouts.

## `proxyBackoffSeconds` (type: `integer`):

Base delay before retrying on a fresh proxy route. Uses bounded linear backoff.

## Actor input object example

```json
{
  "apps": [
    "389801252"
  ],
  "countries": [
    "us"
  ],
  "maxReviewsPerApp": 50,
  "sort": "mostrecent",
  "ratings": [],
  "competitorNames": [],
  "monitorChanges": true,
  "onlyNewReviews": false,
  "includeReviewerName": false,
  "cacheTtlMinutes": 120,
  "forceRefresh": false,
  "maxRequestsPerRun": 60,
  "timeoutSeconds": 20,
  "requestDelaySeconds": 0,
  "directFirst": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxProxyRotations": 1,
  "proxyBackoffSeconds": 1
}
```

# Actor output Schema

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

All returned review, app summary, and error rows in the default Dataset.

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

Run-level request counts, status, and output counts stored in OUTPUT.

# 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 = {
    "apps": [
        "389801252"
    ],
    "countries": [
        "us"
    ],
    "directFirst": true,
    "proxyConfiguration": {
        "useApifyProxy": true
    },
    "maxProxyRotations": 1,
    "proxyBackoffSeconds": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("datahunter_labs/apple-app-store-review-intelligence").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 = {
    "apps": ["389801252"],
    "countries": ["us"],
    "directFirst": True,
    "proxyConfiguration": { "useApifyProxy": True },
    "maxProxyRotations": 1,
    "proxyBackoffSeconds": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("datahunter_labs/apple-app-store-review-intelligence").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 '{
  "apps": [
    "389801252"
  ],
  "countries": [
    "us"
  ],
  "directFirst": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxProxyRotations": 1,
  "proxyBackoffSeconds": 1
}' |
apify call datahunter_labs/apple-app-store-review-intelligence --silent --output-dataset

```

## MCP server setup

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

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/GjKiw800xrAggcQl8/builds/5y7W92yxXxEZa7WuV/openapi.json
