# App Store & Google Play Listing Gap Report (`taroyamada/mobile-app-listing-gap-report`) Actor

Compare public App Store and Google Play listing metadata against competitor apps and produce an action-ready listing improvement report.

- **URL**: https://apify.com/taroyamada/mobile-app-listing-gap-report.md
- **Developed by:** [太郎 山田](https://apify.com/taroyamada) (community)
- **Categories:** Business, Developer tools, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $9,000.00 / 1,000 listing snapshot checklists

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 Store & Google Play Listing Gap Report

<!-- v29-buyability:start -->
### Buyable first run

Use this Actor when mobile growth, indie app, and ASO teams need to decide which app listing metadata and positioning gaps to fix before spending on paid acquisition. It is positioned as a report, not a raw scraper.

- Entry report: $9 / listing_snapshot_checklist. $9 gives one target listing checklist with score, warnings, and next actions.
- Premium report: $29 / competitor_listing_gap_report. $29 compares the target against competitors and adds gap-backed rewrite suggestions.
- Public price surface is entry and premium only. High-tier/watch events are held until real paid proof exists.
- Safety cap: `maxChargeUsd` is the hard budget limit.
- Why it is worth paying for: A 20 minute ASO triage report that replaces the first manual competitor-listing pass.

Recommended first paid run:

```json
{
  "demoMode": false,
  "dryRun": false,
  "reportTier": "entry",
  "maxChargeUsd": 9,
  "maxReports": 1,
  "targetApp": "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
  "competitorApps": [
    "https://apps.apple.com/us/app/babbel-language-learning/id829587759",
    "https://play.google.com/store/apps/details?id=com.busuu.android"
  ],
  "country": "us",
  "language": "en",
  "seedKeywords": [
    "language learning",
    "spanish lessons"
  ]
}
````

This Actor does not promise rankings, revenue, conversion lifts, or sales outcomes. It returns source-backed summaries, warnings, and prioritized actions.

### Next report-style Actors

If you already have data from this Actor, these follow-on Actors turn public or user-provided inputs into decision-ready reports. They are optional, capped by `maxChargeUsd`, and do not make business outcome claims.

- [App Release Review Regression Report](https://apify.com/taroyamada/app-release-review-regression-report) - turn public App Store and Google Play review signals into release regression and QA action reports.

Create an action-ready listing improvement report from public App Store and Google Play metadata. This actor compares one target app against competitor listings and highlights metadata coverage, seed-keyword presence, positioning gaps, and prioritized listing edits.

### First-run quality and billing cue

Start with demoMode or dryRun when you only want to inspect the output shape. For paid runs, use the entry report first, set maxChargeUsd as a hard cap, and move to premium only when you need comparison, recommendations, or a decision-ready action list. Pricing is controlled by the Apify Store listing, and `maxChargeUsd` should match the tier the buyer expects to run.

### Store Quickstart

Start with one target app and 3-10 competitor app listings. You can use App Store URLs, numeric App Store IDs, Google Play URLs, or Android package names.

```json
{
  "targetApp": "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
  "competitorApps": [
    "https://apps.apple.com/us/app/babbel-language-learning/id829587759",
    "https://apps.apple.com/us/app/busuu-language-learning/id379968583",
    "com.memrise.android.memrisecompanion"
  ],
  "country": "us",
  "language": "en",
  "seedKeywords": ["language learning", "spanish", "vocabulary"],
  "reportTier": "entry",
  "maxChargeUsd": 9,
  "dryRun": false
}
```

### What It Does

For each run, the actor:

1. Fetches public App Store metadata via the iTunes Lookup API or public Google Play listing metadata.
2. Scores listing metadata coverage across title, description, category, icon, screenshots, rating, release notes/version, and pricing.
3. Checks buyer-provided seed keywords in listing metadata only.
4. Compares the target app against valid competitors.
5. Emits a prioritized action list and rewrite suggestions.

This is a report actor, not a keyword-rank scraper. It does not scrape rankings, autocomplete, Apple Search Ads, App Store Connect, login-only dashboards, or paid ASO data.

### Pricing Events

| Tier | Event | Price | Public status |
|---|---|---:|---|
| Entry | `listing_snapshot_checklist` | $9 | Public launch |
| Premium | `competitor_listing_gap_report` | $29 | Public launch |

For recurring checks, save a successful listing report input as an Apify task and keep `maxChargeUsd` aligned with the selected tier.

### Output

Each dataset row includes:

- `status`, `chargedEvent`, `chargedUsd`, and `reason`
- `listingScore` and `metadataCoverageScore`
- `keywordCoverage`
- `competitorGaps`
- `actionList`
- `rewriteSuggestions`
- `sourceUrls`, `confidence`, `errors`, and `recoveryHint`

### Next Actors

- Use `app-release-review-regression-monitor` when you need release/review regression monitoring.
- Use `app-review-cross-platform-intelligence` when you need cross-platform review themes.
- Use `apple-app-store-intelligence` or `google-play-intelligence` when you need raw platform metadata and public review samples.

# Actor input Schema

## `targetApp` (type: `string`):

App Store URL/numeric ID or Google Play URL/package for the app you want to improve.

## `competitorApps` (type: `array`):

Add 3-10 competitor App Store or Google Play listings for a paid competitor gap report.

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

Two-letter country/storefront code. Used for public metadata requests only.

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

Language code for Google Play listing pages.

## `seedKeywords` (type: `array`):

Optional buyer-provided terms. The actor checks listing metadata coverage only; it does not scrape rankings, autocomplete, or search volume.

## `reportTier` (type: `string`):

Choose entry or premium. Watch templates are proof-gated and not selectable during public launch.

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

Safety cap for this run. This cap always wins before charging any report group.

## `demoMode` (type: `boolean`):

Return a no-charge preview and sample nextRunInput.

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

Set true to return a no-charge previewReport with nextRunInput and estimated cost.

## `maxReports` (type: `integer`):

Advanced. Maximum report groups to charge; maxChargeUsd is still checked first.

## `sourceDatasetId` (type: `string`):

Advanced only. Optional prepared input dataset. Not needed for the first run.

## `webhookUrl` (type: `string`):

Advanced. Optional URL to receive results outside Apify.

## Actor input object example

```json
{
  "targetApp": "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
  "competitorApps": [
    "https://apps.apple.com/us/app/babbel-language-learning/id829587759",
    "https://apps.apple.com/us/app/busuu-language-learning/id379968583",
    "com.memrise.android.memrisecompanion"
  ],
  "country": "us",
  "language": "en",
  "seedKeywords": [
    "language learning",
    "spanish",
    "vocabulary"
  ],
  "reportTier": "entry",
  "maxChargeUsd": 9,
  "demoMode": false,
  "dryRun": false,
  "maxReports": 1,
  "sourceDatasetId": "",
  "webhookUrl": ""
}
```

# 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/mobile-app-listing-gap-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/mobile-app-listing-gap-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/mobile-app-listing-gap-report --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "App Store & Google Play Listing Gap Report",
        "description": "Compare public App Store and Google Play listing metadata against competitor apps and produce an action-ready listing improvement report.",
        "version": "0.1",
        "x-build-id": "pCB84PkmglqVKBhkQ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/taroyamada~mobile-app-listing-gap-report/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-taroyamada-mobile-app-listing-gap-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~mobile-app-listing-gap-report/runs": {
            "post": {
                "operationId": "runs-sync-taroyamada-mobile-app-listing-gap-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~mobile-app-listing-gap-report/run-sync": {
            "post": {
                "operationId": "run-sync-taroyamada-mobile-app-listing-gap-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",
                "required": [
                    "targetApp"
                ],
                "properties": {
                    "targetApp": {
                        "title": "Target app URL, App Store ID, or package",
                        "type": "string",
                        "description": "App Store URL/numeric ID or Google Play URL/package for the app you want to improve.",
                        "default": "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128"
                    },
                    "competitorApps": {
                        "title": "Competitor app URLs, IDs, or packages",
                        "type": "array",
                        "description": "Add 3-10 competitor App Store or Google Play listings for a paid competitor gap report.",
                        "default": [
                            "https://apps.apple.com/us/app/babbel-language-learning/id829587759",
                            "https://apps.apple.com/us/app/busuu-language-learning/id379968583",
                            "com.memrise.android.memrisecompanion"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "country": {
                        "title": "Country/storefront",
                        "type": "string",
                        "description": "Two-letter country/storefront code. Used for public metadata requests only.",
                        "default": "us"
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Language code for Google Play listing pages.",
                        "default": "en"
                    },
                    "seedKeywords": {
                        "title": "Seed keywords",
                        "type": "array",
                        "description": "Optional buyer-provided terms. The actor checks listing metadata coverage only; it does not scrape rankings, autocomplete, or search volume.",
                        "default": [
                            "language learning",
                            "spanish",
                            "vocabulary"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "reportTier": {
                        "title": "Report tier",
                        "enum": [
                            "entry",
                            "premium"
                        ],
                        "type": "string",
                        "description": "Choose entry or premium. Watch templates are proof-gated and not selectable during public launch.",
                        "default": "entry"
                    },
                    "maxChargeUsd": {
                        "title": "Max charge USD",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "number",
                        "description": "Safety cap for this run. This cap always wins before charging any report group.",
                        "default": 9
                    },
                    "demoMode": {
                        "title": "Demo mode",
                        "type": "boolean",
                        "description": "Return a no-charge preview and sample nextRunInput.",
                        "default": false
                    },
                    "dryRun": {
                        "title": "Dry run",
                        "type": "boolean",
                        "description": "Set true to return a no-charge previewReport with nextRunInput and estimated cost.",
                        "default": false
                    },
                    "maxReports": {
                        "title": "Advanced max reports",
                        "minimum": 1,
                        "maximum": 1,
                        "type": "integer",
                        "description": "Advanced. Maximum report groups to charge; maxChargeUsd is still checked first.",
                        "default": 1
                    },
                    "sourceDatasetId": {
                        "title": "Advanced source dataset ID",
                        "type": "string",
                        "description": "Advanced only. Optional prepared input dataset. Not needed for the first run.",
                        "default": ""
                    },
                    "webhookUrl": {
                        "title": "Advanced webhook URL",
                        "type": "string",
                        "description": "Advanced. Optional URL to receive results outside Apify.",
                        "default": ""
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
