# App Release & Category Review Benchmark Report (`taroyamada/app-release-category-review-benchmark-report`) Actor

Compare public App Store and Google Play release metadata and review samples, then generate source-linked regression alerts and reports.

- **URL**: https://apify.com/taroyamada/app-release-category-review-benchmark-report.md
- **Developed by:** [naoki anzai](https://apify.com/taroyamada) (community)
- **Categories:** Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.00 / 1,000 app benchmarkeds

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

## App Release & Category Review Benchmark Report

Product, mobile QA, ASO agencies, and portfolio teams use this Actor to benchmark app releases and category review regressions.
Input named app watchlists, Apple App IDs or Google Play package IDs, storefronts, thresholds, and a recurring monitor key.
Get source-linked app benchmarks, review regression alerts, category reports, and optional exports.

### Store Quickstart

```json
{
  "appleAppIds": ["284882215"],
  "appleCountries": ["us"],
  "googlePlayIds": [],
  "reviewLimit": 30,
  "lookbackDays": 120,
  "releaseWindowDays": 21,
  "runMode": "monitor",
  "initialRunMode": "emit_backfill",
  "emitRawReviews": false,
  "generateReport": true,
  "generateExport": false,
  "maxChargeUsd": 3,
  "dryRun": false
}
````

### Run the next report

- Start with an App Store catalog profile from [Apple App Store Intelligence](https://apify.com/taroyamada/apple-app-store-intelligence), then run this actor for release-window comparisons.

### Input examples

#### Current Apple release report

```json
{
  "appleAppIds": ["284882215"],
  "appleCountries": ["us", "gb"],
  "runMode": "audit",
  "emitRawReviews": false,
  "generateReport": true,
  "dryRun": false
}
```

#### Apple and Google Play comparison

```json
{
  "appleAppIds": ["284882215"],
  "googlePlayIds": ["com.facebook.katana"],
  "appleCountries": ["us"],
  "reviewLimit": 50,
  "ratingRegressionThreshold": 0.35,
  "negativeShareThresholdPct": 35,
  "runMode": "audit",
  "generateReport": true,
  "dryRun": false
}
```

#### Recurring no-change-safe monitor

```json
{
  "appleAppIds": ["284882215"],
  "appleCountries": ["us"],
  "runMode": "monitor",
  "monitorKey": "facebook-ios-us-release-watch",
  "initialRunMode": "baseline_only",
  "emitRawReviews": false,
  "generateReport": true,
  "dryRun": false
}
```

The first `baseline_only` monitor run stores a private baseline and emits no rows. An unchanged later run also emits zero rows and zero charges.

### Sample output

```json
{
  "rowType": "app_release_review_report",
  "billingEventName": "app-category-benchmark-report",
  "productKey": "app-store:us:284882215",
  "productName": "Sample App",
  "status": "urgent",
  "summary": "A likely post-release review regression was detected.",
  "reviewsAnalyzed": 30,
  "releaseRegression": {
    "status": "urgent",
    "regressionPlatforms": ["appStore"]
  },
  "recommendedActions": ["Inspect crash complaints introduced after the latest release."],
  "sourceUrl": "https://apps.apple.com/us/app/id284882215"
}
```

### Pricing

| Event | Price | Emitted when |
| --- | ---: | --- |
| `app-benchmarked` | $0.015 | An app release and review benchmark row is emitted |
| `app-review-regression` | $0.10 | Threshold logic identifies a release-linked regression |
| `app-category-benchmark-report` | $3.00 | A category benchmark report is generated |
| `app-benchmark-export` | $2.00 | A normalized benchmark export is generated |

Use `emitRawReviews: false` for report-first runs. `maxChargeUsd` provides an Actor-side budget in addition to Apify spending limits.

### Output fields

Every row carries `billingEventName`, `stableKey`, `sourceUrl`, `retrievedAt`, source limitations, and prohibited interpretations. Report rows add current release metadata, review-sample aggregates, regression status, and recommended investigation steps.

### Compliance and limitations

- Uses public App Store and Google Play storefront metadata and review samples; no login or cookie is required.
- Do not identify, target, or profile individual reviewers, and do not generate or manipulate reviews.
- Automated classifications are sample-based product signals, not a guarantee or professional advice.
- Google Play coverage is best effort and can be smaller than Apple public review RSS coverage.

# Actor input Schema

## `appleAppIds` (type: `array`):

Numeric Apple App Store IDs to analyze.

## `appleCountries` (type: `array`):

Two-letter Apple storefront codes.

## `googlePlayIds` (type: `array`):

Google Play package names to analyze.

## `language` (type: `string`):

Locale used for Google Play listing requests.

## `reviewLimit` (type: `integer`):

Maximum recent review samples analyzed per app and storefront.

## `lookbackDays` (type: `integer`):

Ignore sampled reviews older than this window.

## `releaseWindowDays` (type: `integer`):

Days after a release treated as the regression window.

## `ratingRegressionThreshold` (type: `number`):

Minimum average-rating drop that contributes to a regression signal.

## `negativeShareThresholdPct` (type: `integer`):

Negative review share that contributes to a regression signal.

## `minRegressionReviews` (type: `integer`):

Minimum post-release review sample before classifying a regression.

## `runMode` (type: `string`):

Audit generates a current report; monitor stores state and emits changes.

## `monitorKey` (type: `string`):

Stable private state namespace for scheduled monitoring.

## `initialRunMode` (type: `string`):

Initial run mode for this run.

## `emitRawReviews` (type: `boolean`):

Emit optional review-level rows in addition to report rows.

## `generateReport` (type: `boolean`):

Generate one source-linked report for each analyzed app and storefront.

## `maxChargeUsd` (type: `number`):

Optional Actor-side spending cap; zero uses only the Apify run limit.

## `dryRun` (type: `boolean`):

Return illustrative rows without live requests or billing.

## `watchlists` (type: `array`):

Named portfolio watch definitions.

## `emitRawRows` (type: `boolean`):

Emit optional review-level rows in addition to report rows.

## `emitUnchanged` (type: `boolean`):

Emit unchanged for this run.

## `generateExport` (type: `boolean`):

Generate benchmark export for this run.

## Actor input object example

```json
{
  "appleAppIds": [
    "284882215"
  ],
  "appleCountries": [
    "us"
  ],
  "googlePlayIds": [],
  "language": "en_US",
  "reviewLimit": 30,
  "lookbackDays": 120,
  "releaseWindowDays": 21,
  "ratingRegressionThreshold": 0.35,
  "negativeShareThresholdPct": 35,
  "minRegressionReviews": 3,
  "runMode": "monitor",
  "monitorKey": "",
  "initialRunMode": "baseline_only",
  "emitRawReviews": false,
  "generateReport": true,
  "maxChargeUsd": 0,
  "dryRun": true,
  "watchlists": [],
  "emitRawRows": false,
  "emitUnchanged": false,
  "generateExport": false
}
```

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("taroyamada/app-release-category-review-benchmark-report").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("taroyamada/app-release-category-review-benchmark-report").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call taroyamada/app-release-category-review-benchmark-report --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=taroyamada/app-release-category-review-benchmark-report",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "App Release & Category Review Benchmark Report",
        "description": "Compare public App Store and Google Play release metadata and review samples, then generate source-linked regression alerts and reports.",
        "version": "0.1",
        "x-build-id": "FLwhjc1reDBy6R8MQ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/taroyamada~app-release-category-review-benchmark-report/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-taroyamada-app-release-category-review-benchmark-report",
                "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/taroyamada~app-release-category-review-benchmark-report/runs": {
            "post": {
                "operationId": "runs-sync-taroyamada-app-release-category-review-benchmark-report",
                "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/taroyamada~app-release-category-review-benchmark-report/run-sync": {
            "post": {
                "operationId": "run-sync-taroyamada-app-release-category-review-benchmark-report",
                "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": {
                    "appleAppIds": {
                        "title": "Apple App IDs",
                        "type": "array",
                        "description": "Numeric Apple App Store IDs to analyze.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "284882215"
                        ]
                    },
                    "appleCountries": {
                        "title": "Apple storefront countries",
                        "type": "array",
                        "description": "Two-letter Apple storefront codes.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "us"
                        ]
                    },
                    "googlePlayIds": {
                        "title": "Google Play package IDs",
                        "type": "array",
                        "description": "Google Play package names to analyze.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "language": {
                        "title": "Google Play language",
                        "type": "string",
                        "description": "Locale used for Google Play listing requests.",
                        "default": "en_US"
                    },
                    "reviewLimit": {
                        "title": "Review samples per app",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum recent review samples analyzed per app and storefront.",
                        "default": 30
                    },
                    "lookbackDays": {
                        "title": "Review lookback days",
                        "minimum": 7,
                        "maximum": 365,
                        "type": "integer",
                        "description": "Ignore sampled reviews older than this window.",
                        "default": 120
                    },
                    "releaseWindowDays": {
                        "title": "Release regression window",
                        "minimum": 3,
                        "maximum": 90,
                        "type": "integer",
                        "description": "Days after a release treated as the regression window.",
                        "default": 21
                    },
                    "ratingRegressionThreshold": {
                        "title": "Rating-drop threshold",
                        "minimum": 0.1,
                        "maximum": 2,
                        "type": "number",
                        "description": "Minimum average-rating drop that contributes to a regression signal.",
                        "default": 0.35
                    },
                    "negativeShareThresholdPct": {
                        "title": "Negative-review threshold (%)",
                        "minimum": 5,
                        "maximum": 95,
                        "type": "integer",
                        "description": "Negative review share that contributes to a regression signal.",
                        "default": 35
                    },
                    "minRegressionReviews": {
                        "title": "Minimum regression sample",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Minimum post-release review sample before classifying a regression.",
                        "default": 3
                    },
                    "runMode": {
                        "title": "Run mode",
                        "enum": [
                            "audit",
                            "monitor"
                        ],
                        "type": "string",
                        "description": "Audit generates a current report; monitor stores state and emits changes.",
                        "default": "monitor"
                    },
                    "monitorKey": {
                        "title": "Monitor key",
                        "type": "string",
                        "description": "Stable private state namespace for scheduled monitoring.",
                        "default": ""
                    },
                    "initialRunMode": {
                        "title": "Initial run mode",
                        "enum": [
                            "baseline_only",
                            "emit_backfill"
                        ],
                        "type": "string",
                        "description": "Initial run mode for this run.",
                        "default": "baseline_only"
                    },
                    "emitRawReviews": {
                        "title": "Include raw review samples",
                        "type": "boolean",
                        "description": "Emit optional review-level rows in addition to report rows.",
                        "default": false
                    },
                    "generateReport": {
                        "title": "Generate report",
                        "type": "boolean",
                        "description": "Generate one source-linked report for each analyzed app and storefront.",
                        "default": true
                    },
                    "maxChargeUsd": {
                        "title": "Maximum charge (USD)",
                        "minimum": 0,
                        "maximum": 1000,
                        "type": "number",
                        "description": "Optional Actor-side spending cap; zero uses only the Apify run limit.",
                        "default": 0
                    },
                    "dryRun": {
                        "title": "Dry run",
                        "type": "boolean",
                        "description": "Return illustrative rows without live requests or billing.",
                        "default": true
                    },
                    "watchlists": {
                        "title": "Portfolio watchlists",
                        "type": "array",
                        "description": "Named portfolio watch definitions.",
                        "default": []
                    },
                    "emitRawRows": {
                        "title": "Emit raw rows",
                        "type": "boolean",
                        "description": "Emit optional review-level rows in addition to report rows.",
                        "default": false
                    },
                    "emitUnchanged": {
                        "title": "Emit unchanged",
                        "type": "boolean",
                        "description": "Emit unchanged for this run.",
                        "default": false
                    },
                    "generateExport": {
                        "title": "Generate benchmark export",
                        "type": "boolean",
                        "description": "Generate benchmark export for this run.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
