# App Store ASO & Competitor Intelligence Scraper (`jungle_synthesizer/app-store-aso-competitor-intelligence-scraper`) Actor

Scrape Apple App Store and Google Play competitor data for ASO research. Search apps by keyword, pull top chart rankings by country/category, or look up a specific app with cross-platform iOS/Android pairing and full rating, pricing, and developer metadata.

- **URL**: https://apify.com/jungle\_synthesizer/app-store-aso-competitor-intelligence-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Developer tools, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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 ASO & Competitor Intelligence Scraper

Scrape Apple App Store and Google Play competitor data for ASO (App Store Optimization) research. Search apps by keyword, pull top chart rankings by country and category, or enrich a specific app with full cross-platform iOS/Android pairing, rating data, pricing, and developer metadata — all in one run.

### Features

- **Three modes**: `search` (keyword → iTunes Search API), `charts` (Apple RSS top-free/paid/grossing fan-out with full iTunes Lookup enrichment), `lookup` (specific app ID → full metadata + cross-platform match)
- **Competitor set**: co-charting peers returned with each chart result (id, name, rank, rating count)
- **Cross-platform pairing**: best-effort iOS↔Android name+developer fuzzy match with confidence rating (`high` / `medium`)
- **Full metadata**: rating average, rating count, price, currency, bundle ID, release date, last update, version, description, icon URL, screenshot URLs
- **23 output fields** covering both App Store and Google Play data in a unified schema
- Supports all Apple App Store country codes (`us`, `gb`, `jp`, `de`, etc.)

### Modes

#### search
Query the iTunes Search API by keyword. Returns up to 200 iOS apps per keyword. When `includeGooglePlay` is enabled, attempts to match each result to its Google Play counterpart using the iOS bundle ID.

```json
{
  "mode": "search",
  "searchTerms": ["photo editor", "fitness tracker"],
  "country": "us",
  "maxItems": 100,
  "includeGooglePlay": true
}
````

#### charts

Pull top-free, top-paid, or top-grossing charts from the Apple RSS feed, then enrich each entry via iTunes Lookup for full rating/pricing data. The `competitor_set` field contains co-charting peers for each app.

```json
{
  "mode": "charts",
  "chartTypes": ["top-free", "top-grossing"],
  "country": "us",
  "chartLimit": 50,
  "includeGooglePlay": false
}
```

#### lookup

Enrich one or more specific apps by ID. Accepts iTunes track IDs (numeric, e.g. `389801252`) for iOS or Play package names (e.g. `com.instagram.android`) for Android. Includes cross-platform pairing when `includeGooglePlay` is enabled.

```json
{
  "mode": "lookup",
  "appIds": ["389801252", "com.spotify.music"],
  "country": "us",
  "includeGooglePlay": true
}
```

### Output Schema

Each record includes:

| Field | Type | Description |
|-------|------|-------------|
| `app_id` | string | iTunes trackId or Play package name |
| `platform` | string | `ios` or `android` |
| `name` | string | App display name |
| `developer` | string | Developer or publisher name |
| `primary_genre` | string | Primary category |
| `genres` | string | All categories as JSON array |
| `chart_rank` | integer | Rank in top-free/paid/grossing chart (null for search/lookup) |
| `chart_type` | string | Chart type (`top-free`, `top-paid`, `top-grossing`) |
| `country` | string | App Store country code |
| `rating_avg` | number | Average user rating |
| `rating_count` | integer | Total number of ratings |
| `price` | number | App price (0 = free) |
| `currency` | string | Price currency code |
| `bundle_id` | string | iOS bundle identifier |
| `release_date` | string | Initial release date |
| `last_updated` | string | Date of most recent update |
| `version` | string | Current version string |
| `description` | string | App description (up to 2000 chars) |
| `icon_url` | string | App icon URL (100×100) |
| `screenshot_urls` | string | Screenshot URLs as JSON array |
| `competitor_set` | string | Co-charting/same-genre peer apps as JSON array |
| `cross_platform_match` | string | iOS↔Android pairing as JSON object |
| `source` | string | Data source: `itunes_search`, `itunes_lookup`, `apple_rss_charts`, `google_play` |

### Data Sources

| Source | Endpoint | Auth |
|--------|----------|------|
| iTunes Search | `itunes.apple.com/search` | None |
| iTunes Lookup | `itunes.apple.com/lookup` | None |
| Apple RSS Charts | `rss.marketingtools.apple.com/api/v2/{cc}/apps/{chart}/{n}/apps.json` | None |
| Google Play | `play.google.com/store/apps/details?id={pkg}` | None |

### Input Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `mode` | string | `search` | Run mode: `search`, `charts`, or `lookup` |
| `searchTerms` | array | `["photo editor"]` | Keywords for search mode |
| `appIds` | array | — | App IDs for lookup mode |
| `country` | string | `us` | App Store country code |
| `chartTypes` | array | `["top-free"]` | Chart types: `top-free`, `top-paid`, `top-grossing` |
| `chartLimit` | integer | `50` | Apps per chart (max 200) |
| `includeGooglePlay` | boolean | `true` | Fetch Google Play data for cross-platform pairing |
| `maxItems` | integer | `100` | Max records to save (0 = no limit) |

# Actor input Schema

## `sp_intended_usage` (type: `string`):

Please describe how you plan to use the data extracted by this crawler.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

Provide your email address so we can get in touch with you.

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

Run mode: 'search' (keyword search across iOS/Android), 'charts' (top chart rankings), or 'lookup' (enrich a specific app ID)

## `searchTerms` (type: `array`):

Keywords to search (used in 'search' mode). Each term queries the iTunes Search API.

## `appIds` (type: `array`):

App IDs or package names for 'lookup' mode. Use iTunes trackId (numeric) for iOS or Play package name (e.g. com.example.app) for Android.

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

Two-letter country code for charts and search (e.g. 'us', 'gb', 'jp'). Default: us

## `chartTypes` (type: `array`):

Chart types to pull in 'charts' mode: 'top-free', 'top-paid', 'top-grossing'

## `chartLimit` (type: `integer`):

Number of apps per chart (max 200). Default: 50

## `includeGooglePlay` (type: `boolean`):

Whether to fetch Google Play data for cross-platform pairing. Slower but provides Android competitor data.

## `maxItems` (type: `integer`):

Maximum number of records to save. 0 = no limit.

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "mode": "search",
  "searchTerms": [
    "photo editor",
    "fitness tracker"
  ],
  "appIds": [
    "389801252"
  ],
  "country": "us",
  "chartTypes": [
    "top-free",
    "top-grossing"
  ],
  "chartLimit": 50,
  "includeGooglePlay": true,
  "maxItems": 10
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "mode": "search",
    "searchTerms": [
        "photo editor",
        "fitness tracker"
    ],
    "appIds": [
        "389801252"
    ],
    "country": "us",
    "chartTypes": [
        "top-free",
        "top-grossing"
    ],
    "chartLimit": 50,
    "includeGooglePlay": true,
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/app-store-aso-competitor-intelligence-scraper").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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "mode": "search",
    "searchTerms": [
        "photo editor",
        "fitness tracker",
    ],
    "appIds": ["389801252"],
    "country": "us",
    "chartTypes": [
        "top-free",
        "top-grossing",
    ],
    "chartLimit": 50,
    "includeGooglePlay": True,
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/app-store-aso-competitor-intelligence-scraper").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 '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "mode": "search",
  "searchTerms": [
    "photo editor",
    "fitness tracker"
  ],
  "appIds": [
    "389801252"
  ],
  "country": "us",
  "chartTypes": [
    "top-free",
    "top-grossing"
  ],
  "chartLimit": 50,
  "includeGooglePlay": true,
  "maxItems": 10
}' |
apify call jungle_synthesizer/app-store-aso-competitor-intelligence-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=jungle_synthesizer/app-store-aso-competitor-intelligence-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "App Store ASO & Competitor Intelligence Scraper",
        "description": "Scrape Apple App Store and Google Play competitor data for ASO research. Search apps by keyword, pull top chart rankings by country/category, or look up a specific app with cross-platform iOS/Android pairing and full rating, pricing, and developer metadata.",
        "version": "0.1",
        "x-build-id": "5mf1AeQxX1PRbIkJE"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/jungle_synthesizer~app-store-aso-competitor-intelligence-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-jungle_synthesizer-app-store-aso-competitor-intelligence-scraper",
                "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/jungle_synthesizer~app-store-aso-competitor-intelligence-scraper/runs": {
            "post": {
                "operationId": "runs-sync-jungle_synthesizer-app-store-aso-competitor-intelligence-scraper",
                "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/jungle_synthesizer~app-store-aso-competitor-intelligence-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-jungle_synthesizer-app-store-aso-competitor-intelligence-scraper",
                "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": [
                    "mode"
                ],
                "properties": {
                    "sp_intended_usage": {
                        "title": "What is the intended usage of this data?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Please describe how you plan to use the data extracted by this crawler."
                    },
                    "sp_improvement_suggestions": {
                        "title": "How can we improve this crawler for you?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide any feedback or suggestions for improvements."
                    },
                    "sp_contact": {
                        "title": "Contact Email",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide your email address so we can get in touch with you."
                    },
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search",
                            "charts",
                            "lookup"
                        ],
                        "type": "string",
                        "description": "Run mode: 'search' (keyword search across iOS/Android), 'charts' (top chart rankings), or 'lookup' (enrich a specific app ID)",
                        "default": "search"
                    },
                    "searchTerms": {
                        "title": "Search Terms",
                        "type": "array",
                        "description": "Keywords to search (used in 'search' mode). Each term queries the iTunes Search API.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "appIds": {
                        "title": "App IDs",
                        "type": "array",
                        "description": "App IDs or package names for 'lookup' mode. Use iTunes trackId (numeric) for iOS or Play package name (e.g. com.example.app) for Android.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "country": {
                        "title": "Country",
                        "type": "string",
                        "description": "Two-letter country code for charts and search (e.g. 'us', 'gb', 'jp'). Default: us",
                        "default": "us"
                    },
                    "chartTypes": {
                        "title": "Chart Types",
                        "type": "array",
                        "description": "Chart types to pull in 'charts' mode: 'top-free', 'top-paid', 'top-grossing'",
                        "items": {
                            "type": "string"
                        }
                    },
                    "chartLimit": {
                        "title": "Chart Limit",
                        "type": "integer",
                        "description": "Number of apps per chart (max 200). Default: 50",
                        "default": 50
                    },
                    "includeGooglePlay": {
                        "title": "Include Google Play",
                        "type": "boolean",
                        "description": "Whether to fetch Google Play data for cross-platform pairing. Slower but provides Android competitor data.",
                        "default": true
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "type": "integer",
                        "description": "Maximum number of records to save. 0 = no limit.",
                        "default": 100
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
