# App Store Review Alert API (`signalcrawl/app-store-review-alert-api`) Actor

Monitor public Apple App Store reviews by app ID and country. Export review alerts with ratings, sentiment, urgency, app version, CRM notes, action notes, source URLs, and dedupe-ready keys.

- **URL**: https://apify.com/signalcrawl/app-store-review-alert-api.md
- **Developed by:** [SignalCrawl](https://apify.com/signalcrawl) (community)
- **Categories:** Automation, AI, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 review alerts

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

Learn more: https://docs.apify.com/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

## App Store Review Alert API

Monitor Apple App Store reviews by app ID and country, then turn fresh customer feedback into review-intelligence alerts for support, product, growth, and competitive research teams.

This actor uses Apple's public iTunes customer reviews RSS endpoint. It does not need an API key, Apple developer account, login, or browser automation.

### Why Use This Actor

App Store reviews are public, but the raw RSS feed is not ready for customer operations. This actor adds:

- Recent reviews by `appId` and App Store country.
- Sentiment and urgency scoring for quick prioritization.
- Alert classification for bugs, crashes, billing/refund issues, churn risk, keyword matches, and negative reviews.
- CRM-ready notes and action notes so records can flow directly into Slack, Zapier, Make, HubSpot, Airtable, or a support queue.
- Stable dedupe keys, source links, timestamps, and app/version context where Apple provides it.

### Best For

| Workflow | How teams use the output |
|---|---|
| Support triage | Detect low-star reviews mentioning crashes, login, refunds, charges, or subscriptions. |
| Product monitoring | Watch post-release feedback by app version and country. |
| Review intelligence | Convert public reviews into scored, filterable customer signals. |
| Competitor research | Track repeated complaints and praised features across competing apps. |
| Automation | Trigger CRM, Slack, ticketing, or spreadsheet workflows from clean alert records. |

### What It Extracts

- App context: `appId`, `appName`, `country`, `version`.
- Review fields: `rating`, `title`, `review`, `author`, `updatedAt`.
- Intelligence fields: `sentimentScore`, `urgencyScore`, `alertType`, `crmNote`, `actionNote`.
- Traceability: `sourceUrl`, `dedupeKey`, `scrapedAt`.
- Optional keyword matches when your alert keywords are found.

### Input Example

```json
{
  "appIds": ["284882215"],
  "countries": ["us"],
  "maxReviewsPerApp": 100,
  "maxRating": 2,
  "alertOnly": true,
  "keywords": ["crash", "refund", "subscription", "login"]
}
````

### Input Options

| Field | Description |
|---|---|
| `appIds` | Required array of numeric Apple App Store app IDs. |
| `countries` | Two-letter country codes. Default: `["us"]`. |
| `maxReviewsPerApp` | Maximum recent reviews per app/country pair. Default: `100`; maximum: `500`. |
| `minRating` | Optional rating floor from 1 to 5. |
| `maxRating` | Optional rating ceiling from 1 to 5. |
| `alertOnly` | Save only records with an actionable alert type. Default: `false`. |
| `keywords` | Optional words or phrases that trigger `keyword_match` alerts. |
| `sinceDate` | Optional ISO date/datetime. Older reviews are skipped. |

### Output Example

```json
{
  "appId": "284882215",
  "appName": "Example App",
  "country": "us",
  "rating": 1,
  "title": "Crashes after the latest update",
  "review": "The app crashes on login and I was charged twice. Please refund me.",
  "author": "Customer One",
  "updatedAt": "2026-05-20T10:15:00-07:00",
  "version": "9.9.1",
  "sentimentScore": -0.88,
  "urgencyScore": 100,
  "alertType": "keyword_match",
  "crmNote": "Example App US review: 1/5 from Customer One...",
  "actionNote": "Review matched alert keywords; tag the relevant owner...",
  "sourceUrl": "https://apps.apple.com/us/app/example/id284882215?see-all=reviews",
  "dedupeKey": "f2b1...",
  "scrapedAt": "2026-05-20T12:00:00+00:00"
}
```

### Alert Types

| Alert type | Meaning |
|---|---|
| `keyword_match` | One or more configured keywords appeared in the title or review. |
| `billing_or_refund` | Review mentions billing, payment, subscription, charge, or refund issues. |
| `bug_or_crash` | Review mentions crashes, bugs, errors, freezes, or broken flows. |
| `churn_risk` | Review suggests cancellation, uninstall, deletion, or switching. |
| `negative_review` | Low-star review without a more specific alert. |
| `high_urgency` | Urgency score is high even without a specific category. |
| `monitor` | Useful for analytics, but not an immediate alert. |

### Common Run Patterns

- `cloud-smoke.json`: small single-app smoke test for Apify Cloud validation.
- `support-triage-alerts.json`: low-star support and billing/crash alert queue.
- `product-release-monitor.json`: recent multi-country review monitoring after a release.
- `competitor-review-intelligence.json`: competitor review mining for pricing, ads, privacy, and support themes.

### Pricing

Recommended pricing: `$1.50 / 1,000 review alerts`.

Primary event name: `review alert`.

Recommended Apify Store categories: Lead generation, Automation, AI.

### Data Source

This actor calls Apple's public iTunes customer reviews RSS JSON endpoint:

`https://itunes.apple.com/{country}/rss/customerreviews/page={page}/id={appId}/sortBy=mostRecent/json`

For app names, it may also call Apple's public lookup endpoint when the RSS feed does not include app metadata.

### Notes And Limitations

- Apple controls review availability, RSS pagination, country coverage, and refresh timing.
- Some reviews may not include an app version.
- Sentiment and urgency scores are heuristic prioritization signals, not legal, compliance, or customer-support advice.
- Use `dedupeKey` when sending records into CRMs, ticketing systems, or automations.

### Tested Coverage

The QA harness validates date parsing, RSS entry parsing, app metadata handling, sentiment/urgency scoring, alert classification, dedupe key generation, and output shaping. Local network smoke testing can be run with Apify storage by using `examples/cloud-smoke.json`.

# Actor input Schema

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

Apple App Store numeric app IDs to monitor.

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

Two-letter App Store country codes. Each app/country pair is queried separately.

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

Maximum recent reviews to save for each app and country.

## `minRating` (type: `integer`):

Optional rating floor from 1 to 5.

## `maxRating` (type: `integer`):

Optional rating ceiling from 1 to 5.

## `alertOnly` (type: `boolean`):

Only save reviews that trigger a negative, churn-risk, keyword, bug, billing, or high-urgency alert.

## `keywords` (type: `array`):

Optional words or phrases that should raise keyword\_match alerts when found in the title or review.

## `sinceDate` (type: `string`):

Optional ISO date/datetime. Reviews older than this are skipped.

## Actor input object example

```json
{
  "appIds": [
    "284882215"
  ],
  "countries": [
    "us"
  ],
  "maxReviewsPerApp": 100,
  "alertOnly": false,
  "keywords": [
    "crash",
    "bug",
    "refund",
    "subscription",
    "cancel",
    "support"
  ],
  "sinceDate": "2026-05-01"
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "appIds": [
        "284882215"
    ],
    "countries": [
        "us"
    ],
    "keywords": [
        "crash",
        "bug",
        "refund",
        "subscription",
        "cancel",
        "support"
    ],
    "sinceDate": "2026-05-01"
};

// Run the Actor and wait for it to finish
const run = await client.actor("signalcrawl/app-store-review-alert-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 = {
    "appIds": ["284882215"],
    "countries": ["us"],
    "keywords": [
        "crash",
        "bug",
        "refund",
        "subscription",
        "cancel",
        "support",
    ],
    "sinceDate": "2026-05-01",
}

# Run the Actor and wait for it to finish
run = client.actor("signalcrawl/app-store-review-alert-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 '{
  "appIds": [
    "284882215"
  ],
  "countries": [
    "us"
  ],
  "keywords": [
    "crash",
    "bug",
    "refund",
    "subscription",
    "cancel",
    "support"
  ],
  "sinceDate": "2026-05-01"
}' |
apify call signalcrawl/app-store-review-alert-api --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "App Store Review Alert API",
        "description": "Monitor public Apple App Store reviews by app ID and country. Export review alerts with ratings, sentiment, urgency, app version, CRM notes, action notes, source URLs, and dedupe-ready keys.",
        "version": "0.1",
        "x-build-id": "denq5aUKbQmkgDtVI"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/signalcrawl~app-store-review-alert-api/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-signalcrawl-app-store-review-alert-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/signalcrawl~app-store-review-alert-api/runs": {
            "post": {
                "operationId": "runs-sync-signalcrawl-app-store-review-alert-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/signalcrawl~app-store-review-alert-api/run-sync": {
            "post": {
                "operationId": "run-sync-signalcrawl-app-store-review-alert-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",
                "required": [
                    "appIds"
                ],
                "properties": {
                    "appIds": {
                        "title": "App IDs",
                        "type": "array",
                        "description": "Apple App Store numeric app IDs to monitor.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "countries": {
                        "title": "Countries",
                        "type": "array",
                        "description": "Two-letter App Store country codes. Each app/country pair is queried separately.",
                        "default": [
                            "us"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxReviewsPerApp": {
                        "title": "Max reviews per app/country",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum recent reviews to save for each app and country.",
                        "default": 100
                    },
                    "minRating": {
                        "title": "Minimum rating",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Optional rating floor from 1 to 5."
                    },
                    "maxRating": {
                        "title": "Maximum rating",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Optional rating ceiling from 1 to 5."
                    },
                    "alertOnly": {
                        "title": "Alert only",
                        "type": "boolean",
                        "description": "Only save reviews that trigger a negative, churn-risk, keyword, bug, billing, or high-urgency alert.",
                        "default": false
                    },
                    "keywords": {
                        "title": "Alert keywords",
                        "type": "array",
                        "description": "Optional words or phrases that should raise keyword_match alerts when found in the title or review.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "sinceDate": {
                        "title": "Since date",
                        "type": "string",
                        "description": "Optional ISO date/datetime. Reviews older than this are skipped."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
