# Apple App Store Competitor Monitor (`vincesoft/apple-app-store-competitor-monitor`) Actor

Stateful Apple App Store listing and review change monitoring.

- **URL**: https://apify.com/vincesoft/apple-app-store-competitor-monitor.md
- **Developed by:** [VinceSoft](https://apify.com/vincesoft) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 app storefront checks

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

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

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Apple App Store Competitor Monitor

Monitor Apple App Store apps for listing, version, price, rating, screenshot, and written-review changes. The Actor keeps state in an Apify Key-Value Store and writes Dataset records only when something changes.

It uses Apple's public lookup and customer-review JSON endpoints. It does not use a browser, proxy, Apple App Store Connect account, external database, or AI service.

### Input

`apps` accepts numeric App Store IDs or complete `apps.apple.com` URLs containing an ID. `countries` defaults to `us` and is normalized to lowercase. A run allows at most 100 apps, 20 countries, and 500 app-country targets.

```json
{
  "apps": ["284882215", "https://apps.apple.com/us/app/example/id123456789"],
  "countries": ["us", "gb"],
  "includeReviews": true,
  "negativeReviewMaxRating": 3,
  "emitExistingReviewsOnFirstRun": false,
  "resetState": false
}
```

The default first run creates a baseline and emits one `baseline_created` event per target. Existing reviews are stored but not emitted. Later successful checks emit no Dataset rows when nothing changed.

### Events

The Dataset can contain `baseline_created`, `metadata_changed`, `version_changed`, `price_changed`, `rating_changed`, `screenshots_changed`, `new_review`, and `review_updated` records. Every event has an idempotent `eventId`, app/storefront identity, timestamp, and before/after values where applicable.

Rating count changes are retained as internal observations but do not produce noisy Dataset events by themselves. A review is negative when its rating is less than or equal to `negativeReviewMaxRating`.

### Billing

The deployed Actor charges one `app_check` pay-per-event unit ($0.002) only after a target completes successfully, output is written, and its state is committed. Failed targets are reported in the run-level `OUTPUT` summary and are not charged.

`app_check` is configured in the Actor's Apify Console monetization settings as one successfully completed app-storefront check. Apify stores Store pricing on the platform rather than in the source Actor manifest.

### Scheduling

Use an ordinary Apify Schedule or Task Schedule for hourly, daily, or weekly checks. State is keyed by app ID and storefront, so the same app can be monitored independently in multiple countries.

### Examples

Own app review monitoring:

```json
{"apps":["123456789"],"countries":["us"],"includeReviews":true,"negativeReviewMaxRating":3}
```

Competitor listing monitoring without review requests:

```json
{"apps":["111111111","222222222","333333333"],"countries":["us"],"includeReviews":false}
```

Multi-country monitoring:

```json
{"apps":["111111111","222222222"],"countries":["us","gb","de","fr","jp"]}
```

# Actor input Schema

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

App Store numeric IDs or complete apps.apple.com URLs containing an ID.

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

Two-letter storefront codes. Defaults to us.

## `includeReviews` (type: `boolean`):

Fetch public written reviews and detect new or edited visible reviews.

## `negativeReviewMaxRating` (type: `integer`):

Ratings at or below this value are marked isNegative.

## `emitExistingReviewsOnFirstRun` (type: `boolean`):

When enabled, emit currently visible reviews as new\_review events while creating the baseline.

## `resetState` (type: `boolean`):

Replace state only for the requested app-storefront targets after a successful fresh check.

## Actor input object example

```json
{
  "apps": [
    "284882215"
  ],
  "countries": [
    "us"
  ],
  "includeReviews": true,
  "negativeReviewMaxRating": 3,
  "emitExistingReviewsOnFirstRun": false,
  "resetState": false
}
```

# Actor output Schema

## `changes` (type: `string`):

No description

## `summary` (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 = {
    "apps": [
        "284882215"
    ],
    "countries": [
        "us"
    ],
    "includeReviews": true,
    "negativeReviewMaxRating": 3,
    "emitExistingReviewsOnFirstRun": false,
    "resetState": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("vincesoft/apple-app-store-competitor-monitor").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": ["284882215"],
    "countries": ["us"],
    "includeReviews": True,
    "negativeReviewMaxRating": 3,
    "emitExistingReviewsOnFirstRun": False,
    "resetState": False,
}

# Run the Actor and wait for it to finish
run = client.actor("vincesoft/apple-app-store-competitor-monitor").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": [
    "284882215"
  ],
  "countries": [
    "us"
  ],
  "includeReviews": true,
  "negativeReviewMaxRating": 3,
  "emitExistingReviewsOnFirstRun": false,
  "resetState": false
}' |
apify call vincesoft/apple-app-store-competitor-monitor --silent --output-dataset

```

## MCP server setup

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

```

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/TBPH0onZV5Ra6bfx4/builds/Av1yFSd0mnMVJ6lrs/openapi.json
