# App Reviews & Sentiment — Google Play + App Store (`teamkamkod/app-store-intel`) Actor

Structured app metadata, reviews and an optional AI summary (top complaints, feature requests, sentiment) from the Apple App Store via Apple's public endpoints (Google Play phase 2). Use for competitive intelligence or a sentiment read without pulling raw reviews into your context.

- **URL**: https://apify.com/teamkamkod/app-store-intel.md
- **Developed by:** [Team Kamkod](https://apify.com/teamkamkod) (community)
- **Categories:** SEO tools
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 app-metadata

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## App Reviews & Sentiment — Google Play + App Store

**Monitor any app like a product analyst: metadata, recent reviews and a structured AI
summary (recurring complaints, feature requests, sentiment) — from one call.**

Data comes from **Apple's own public endpoints** (Lookup, Search, Reviews RSS): no login,
no HTML scraping, no anti-bot, no proxy needed.

**Google Play support arrives in phase 2.** Every output row carries `platformStatus` so an
agent can filter safely: `stable` (App Store — live today) vs `beta` (Google Play — phase 2).

***

### What it's for

- Competitive / product intelligence on any app (yours or a rival's)
- Review monitoring & support benchmarking
- Quick sentiment read for a product decision or due diligence (VC / M\&A)
- ASO research and pain-point discovery for marketing

**Why an agent likes it:** you ask for one app, you get 3 structured rows — metadata,
reviews, and a ready-to-use summary — *without pulling 5,000 raw reviews into your context*.

### Two modes, one tool

**Direct** — you know the app id:

```json
{
  "mode": "direct",
  "apps": [{ "platform": "app_store", "appId": "324684580", "country": "fr" }],
  "maxReviewsPerApp": 200,
  "includeSummary": true
}
```

**Search** — discover apps by keyword, then fetch their reviews:

```json
{
  "mode": "search",
  "searchTerm": "CRM",
  "country": "fr",
  "maxAppsFromSearch": 3,
  "maxReviewsPerApp": 100
}
```

### Output (one row per kind)

| kind | content |
|---|---|
| `app` | metadata: name, developer, category, rating & ratingCount, price, version, last update, icon + run diagnostics (`status`, `reviewsFetched`, `platformStatus`) |
| `review` | one row per review: author, rating, date, title, text, appVersion, helpfulCount |
| `summary` | opt-in: `sentimentScore` (-1..1), `topComplaints[]`, `topFeatureRequests[]`, `topPraises[]` — each theme with mention count and a real quote |

```json
{
  "kind": "app", "platform": "app_store", "platformStatus": "stable",
  "appId": "324684580", "name": "Spotify : Musique et podcasts",
  "rating": 4.3, "ratingCount": 912000, "reviewsFetched": 200, "status": "ok"
}
```

The AI summary uses **one Claude Haiku call on up to 100 reviews** (cost-controlled by
design). Themes are grounded in the reviews — a theme needs at least 2 mentions to appear,
and every count is verified against the sample.

### Input reference

| field | meaning |
|---|---|
| `mode` | `direct` (known ids) or `search` (keyword discovery first) |
| `apps[]` | `{platform, appId, country, language}` |
| `searchTerm` / `searchPlatforms` | keyword discovery (search mode) |
| `maxAppsFromSearch` | top N results per store (1-20, default 5) |
| `maxReviewsPerApp` | 0 = metadata only; App Store RSS caps at ~500 reviews/app |
| `reviewsSort` | `newest` (default) · `most_relevant` · `rating_low` / `rating_high` |
| `reviewsSince` | only reviews after this ISO date |
| `includeSummary` | opt-in AI summary (charged separately) |
| `summaryFocus` | `all` · `bugs_and_complaints` · `feature_requests` · `sentiment_only` |

### Pricing (pay-per-event)

| Event | Price |
|---|---|
| `app-metadata` | $0.001 / app |
| `app-review` | $0.00015 / review ($0.15 per 1,000) |
| `app-summary` | $0.02 / app (1 LLM call ≤100 reviews) |

Example: 200 reviews + summary on one app ≈ **$0.05**. No subscription, pay per use.

### Schedule it weekly

Review sentiment drifts. Point a weekly schedule at your competitor set (or your own app)
to watch complaints and feature requests trend over time — same inputs, recurring run, delta
you can actually act on. Agents can also subscribe to the run dataset via webhook for a
continuous review-monitoring pipeline.

### Reliability & honesty

- Runs **never crash** on a bad app id: failures come back as `status: not_found | error`
  rows and the run continues — one bad app never fails a batch.
- Apple's public RSS does **not** expose developer replies → `developerReply: null`
  (documented, not a bug).
- Zero setup for you: **no credential, no proxy, no config** — the summary key lives on
  the actor, buyers never touch it.

### Roadmap

- ✅ Phase 1: App Store (`platformStatus: stable`) — direct + search + reviews + AI summary
- 🔜 Phase 2: Google Play — same schema, same summary (actor stays a single tool)
- 🔜 Rating pagination beyond the RSS window

# Actor input Schema

## `mode` (type: `string`):

direct = you already know the app ids. search = discover apps by keyword first (App Store), then fetch their reviews.

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

Apps to analyze. Each entry: {"platform":"app\_store","appId":"324684580","country":"fr"}. platform google\_play is accepted but returns a 'beta' status row until phase 2.

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

App Store country (ISO 3166-1 alpha-2), used for search and as default for apps without country. Supported at launch: fr, us, uk, de, es.

## `searchTerm` (type: `string`):

Keyword to discover apps, e.g. "CRM mobile app". Returns the top apps from the App Store before fetching their reviews.

## `searchPlatforms` (type: `array`):

Values: app\_store (live) or google\_play (beta — returns a status row until phase 2).

## `maxAppsFromSearch` (type: `integer`):

How many top results to take per store in search mode (1-20).

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

0 = metadata only. Apple's public RSS caps at ~500 reviews per app.

## `reviewsSort` (type: `string`):

newest/most\_relevant come from Apple RSS; rating sorts are applied client-side to fetched reviews.

## `reviewsSince` (type: `string`):

ISO 8601 date (YYYY-MM-DD). Reviews posted after this date only.

## `includeSummary` (type: `boolean`):

Adds a structured per-app summary (recurring complaints, feature requests, sentiment score). Requires ANTHROPIC\_API\_KEY secret. Charged separately.

## `summaryFocus` (type: `string`):

Which sections to extract: all, complaints only, feature requests only, or sentiment score only (reduces LLM cost).

## Actor input object example

```json
{
  "mode": "direct",
  "country": "fr",
  "searchPlatforms": [
    "app_store"
  ],
  "maxAppsFromSearch": 5,
  "maxReviewsPerApp": 200,
  "reviewsSort": "newest",
  "includeSummary": false,
  "summaryFocus": "all"
}
```

# Actor output Schema

## `appResults` (type: `string`):

Dataset items of kind 'app' (metadata + fetch status) and kind 'summary' (AI sentiment summary when requested).

## `reviews` (type: `string`):

Dataset items of kind 'review' (raw reviews) — filtered view available via the dataset views.

## `input` (type: `string`):

The input used for this 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 = {
    "mode": "direct",
    "country": "fr",
    "searchPlatforms": [
        "app_store"
    ],
    "reviewsSort": "newest",
    "summaryFocus": "all"
};

// Run the Actor and wait for it to finish
const run = await client.actor("teamkamkod/app-store-intel").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 = {
    "mode": "direct",
    "country": "fr",
    "searchPlatforms": ["app_store"],
    "reviewsSort": "newest",
    "summaryFocus": "all",
}

# Run the Actor and wait for it to finish
run = client.actor("teamkamkod/app-store-intel").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 '{
  "mode": "direct",
  "country": "fr",
  "searchPlatforms": [
    "app_store"
  ],
  "reviewsSort": "newest",
  "summaryFocus": "all"
}' |
apify call teamkamkod/app-store-intel --silent --output-dataset

```

## MCP server setup

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

```

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/Ia35YSJII7qHUBhk5/builds/aj8ggbi0ejBKlVbap/openapi.json
