# App Review Teardown & Insights (AI) (`fried_calamaries/reviews-insight-mcp`) Actor

Turn any app's App Store + Google Play reviews into an AI competitive teardown — strengths, weaknesses, top complaints, feature requests — and track what changes over time.

- **URL**: https://apify.com/fried\_calamaries/reviews-insight-mcp.md
- **Developed by:** [ByteMe](https://apify.com/fried_calamaries) (community)
- **Categories:** AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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 Review Teardown & Insights (AI)

Point it at any app — by name, store URL, or id — and get back an AI **competitive teardown** of its App Store (and Google Play) reviews: a summary, strengths, weaknesses, top complaints, requested features, and themed sentiment. Drop in several apps to tear down competitors side by side. Run it on a schedule and it also reports **what changed** since last time — rating moves, emerging vs resolved complaints, sentiment shifts — turning competitor and product monitoring into a set-and-forget task. Also callable as an MCP tool by AI agents.

### How to use

Set the input, run the actor, and collect results from the run's dataset (export to JSON/CSV/Excel, or pull via the Apify API). Example input:

```json
{
  "apps": [
    "Notion",
    "Evernote"
  ],
  "yourApp": "Notion",
  "maxReviews": 100,
  "compareToPrevious": true
}
````

See **Inputs** below for every available field.

### What you get

One row per record:

| Field | Description |
|---|---|
| `app` | The app reference you supplied |
| `app_name` | Resolved app name |
| `sources` | Stores that contributed reviews (apple, gplay) |
| `overall_rating` | Store-reported average rating |
| `review_count_analyzed` | Reviews fed to the AI |
| `teardown.summary` | One-paragraph competitive summary |
| `teardown.strengths / weaknesses` | What users love / dislike |
| `teardown.top_complaints` | The most common complaints |
| `teardown.feature_requests` | Features users ask for |
| `teardown.themes` | Recurring themes with sentiment + mention counts |
| `teardown.sentiment_score` | Overall sentiment 0–100 |
| `emerging_complaints / resolved_complaints` | Complaints that appeared / disappeared since last run (monitoring) |
| `rating_delta / sentiment_delta` | Changes since the previous run |
| `comparison` | When 2+ apps: an extra record with a strengths/weaknesses matrix + sales battlecards (their weaknesses, where you win, watch-outs) |
| `source_url` | The app's store page |

Sample:

```json
{
  "app": "Notion",
  "app_name": "Notion: Notes, Tasks, AI",
  "apple_id": "1232780281",
  "sources": [
    "apple"
  ],
  "overall_rating": 4.78,
  "review_count_analyzed": 100,
  "teardown": {
    "summary": "Notion is praised as a powerful, flexible workspace but is dragged down by mobile bugs, a steep learning curve, and an intrusive AI button.",
    "strengths": [
      "Powerful, flexible all-in-one workspace",
      "Great for notes, tasks, and databases"
    ],
    "weaknesses": [
      "Buggy on iOS/iPad with crashes",
      "Steep learning curve on mobile",
      "Intrusive AI chat button"
    ],
    "top_complaints": [
      "app crashes / bugs",
      "confusing mobile navigation",
      "free-tier upload limits"
    ],
    "feature_requests": [
      "offline mode",
      "remove/hide the AI button",
      "better mobile editor"
    ],
    "themes": [
      {
        "theme": "Bugs and crashes",
        "sentiment": "negative",
        "mentions": 6
      },
      {
        "theme": "Power and flexibility",
        "sentiment": "positive",
        "mentions": 5
      }
    ],
    "sentiment_score": 62
  },
  "first_seen": false,
  "rating_delta": -0.03,
  "emerging_complaints": [
    "app crashes / bugs"
  ],
  "resolved_complaints": [],
  "sentiment_delta": -4,
  "source_url": "https://apps.apple.com/us/app/id1232780281"
}
```

### Inputs

| Field | Required | Type | Default | Description |
|---|---|---|---|---|
| `apps` | yes | array | `["Notion"]` | Apps to analyze — an app name (e.g. 'Notion'), an App Store / Google Play URL, an Apple numeric id, or a Google Play package (com.x.y). One competitive teardown per app. Provide several to teardown competitors side by side. |
| `maxReviews` | no | integer | `100` | Reviews sampled per app (most-recent first) and fed to the AI. Caps cost; more reviews = richer teardown. |
| `country` | no | string | `"us"` | Two-letter store country code for reviews (e.g. 'us', 'gb', 'de'). |
| `compareApps` | no | boolean | `true` | When 2+ apps are given (default on), add a cross-app comparison record — a strengths/weaknesses matrix plus sales battlecards (their weaknesses, where you win, what to watch out for). |
| `yourApp` | no | string | — | Optional. Name one of the apps as yours, and battlecards are framed as YOUR app vs each competitor. Leave empty for a neutral comparison. |
| `compareToPrevious` | no | boolean | `true` | When on (default), diff each app against the previous run and report what changed — rating delta, emerging vs resolved complaints, sentiment delta. Run on a schedule to track competitors over time. |
| `proxyConfiguration` | no | object | `{"useApifyProxy": false}` | Optional. The app-store endpoints are reachable directly; a proxy is rarely needed. |

### Pricing (Pay Per Event)

You pay per result (`ai-insight`) — **no charge for empty runs**. Example: **20 app teardowns** at *$0.05/result* ≈ **$1.00**.

One charge per app teardown produced. Apps we can't find / with no reviews are not charged. Apify platform usage (compute) is billed separately per your plan.

### Use cases

- Competitor app teardowns — see a rival app's strengths, weaknesses, and what its users complain about.
- Sales battlecards — drop in your app + competitors and get a side-by-side comparison with where you win and what to watch out for.
- Product prioritization — surface the top complaints and feature requests across your own app's reviews.
- Monitoring — run weekly to catch emerging complaints, rating drops, and sentiment shifts on competitor apps before they spread.
- Market research / VoC — themed sentiment across an app category.

### Limitations & updates

Analyzes public app-store reviews only (Apple App Store via the official iTunes feed; Google Play best-effort). The AI teardown is generated from the most-recent sampled reviews (capped by maxReviews) and reflects what reviewers wrote — not internal metrics. Apps with no reviews or that can't be resolved are returned empty and not charged.

# Actor input Schema

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

Apps to analyze — an app name (e.g. 'Notion'), an App Store / Google Play URL, an Apple numeric id, or a Google Play package (com.x.y). One competitive teardown per app. Provide several to teardown competitors side by side.

## `maxReviews` (type: `integer`):

Reviews sampled per app (most-recent first) and fed to the AI. Caps cost; more reviews = richer teardown.

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

Two-letter store country code for reviews (e.g. 'us', 'gb', 'de').

## `compareApps` (type: `boolean`):

When 2+ apps are given (default on), add a cross-app comparison record — a strengths/weaknesses matrix plus sales battlecards (their weaknesses, where you win, what to watch out for).

## `yourApp` (type: `string`):

Optional. Name one of the apps as yours, and battlecards are framed as YOUR app vs each competitor. Leave empty for a neutral comparison.

## `compareToPrevious` (type: `boolean`):

When on (default), diff each app against the previous run and report what changed — rating delta, emerging vs resolved complaints, sentiment delta. Run on a schedule to track competitors over time.

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

Optional. The app-store endpoints are reachable directly; a proxy is rarely needed.

## Actor input object example

```json
{
  "apps": [
    "Notion",
    "com.evernote"
  ],
  "maxReviews": 100,
  "country": "us",
  "compareApps": true,
  "compareToPrevious": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `teardowns` (type: `string`):

Per-app competitive teardown (strengths, weaknesses, complaints, feature requests, themes) + what changed since last run.

# 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": [
        "Notion"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("fried_calamaries/reviews-insight-mcp").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": ["Notion"] }

# Run the Actor and wait for it to finish
run = client.actor("fried_calamaries/reviews-insight-mcp").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 '{
  "apps": [
    "Notion"
  ]
}' |
apify call fried_calamaries/reviews-insight-mcp --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "App Review Teardown & Insights (AI)",
        "description": "Turn any app's App Store + Google Play reviews into an AI competitive teardown — strengths, weaknesses, top complaints, feature requests — and track what changes over time.",
        "version": "0.1",
        "x-build-id": "QqFXoWN2hOKJEpuXX"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/fried_calamaries~reviews-insight-mcp/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-fried_calamaries-reviews-insight-mcp",
                "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/fried_calamaries~reviews-insight-mcp/runs": {
            "post": {
                "operationId": "runs-sync-fried_calamaries-reviews-insight-mcp",
                "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/fried_calamaries~reviews-insight-mcp/run-sync": {
            "post": {
                "operationId": "run-sync-fried_calamaries-reviews-insight-mcp",
                "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": [
                    "apps"
                ],
                "properties": {
                    "apps": {
                        "title": "Apps",
                        "type": "array",
                        "description": "Apps to analyze — an app name (e.g. 'Notion'), an App Store / Google Play URL, an Apple numeric id, or a Google Play package (com.x.y). One competitive teardown per app. Provide several to teardown competitors side by side.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxReviews": {
                        "title": "Max reviews per app",
                        "minimum": 10,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Reviews sampled per app (most-recent first) and fed to the AI. Caps cost; more reviews = richer teardown.",
                        "default": 100
                    },
                    "country": {
                        "title": "Store country",
                        "type": "string",
                        "description": "Two-letter store country code for reviews (e.g. 'us', 'gb', 'de').",
                        "default": "us"
                    },
                    "compareApps": {
                        "title": "Compare apps (battlecards)",
                        "type": "boolean",
                        "description": "When 2+ apps are given (default on), add a cross-app comparison record — a strengths/weaknesses matrix plus sales battlecards (their weaknesses, where you win, what to watch out for).",
                        "default": true
                    },
                    "yourApp": {
                        "title": "Your app (battlecard perspective)",
                        "type": "string",
                        "description": "Optional. Name one of the apps as yours, and battlecards are framed as YOUR app vs each competitor. Leave empty for a neutral comparison."
                    },
                    "compareToPrevious": {
                        "title": "Monitor changes",
                        "type": "boolean",
                        "description": "When on (default), diff each app against the previous run and report what changed — rating delta, emerging vs resolved complaints, sentiment delta. Run on a schedule to track competitors over time.",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional. The app-store endpoints are reachable directly; a proxy is rarely needed.",
                        "default": {
                            "useApifyProxy": 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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
