# Chrome Web Store Scraper (`scraper-engine/chrome-web-store-scraper`) Actor

🔎 Chrome Web Store Scraper extracts app details from Chrome Web Store—titles, ratings, pricing, reviews, screenshots & more. ⚡ Automate competitor research, SEO analysis & lead gen with reliable scraping. Perfect for developers & marketers. 🚀

- **URL**: https://apify.com/scraper-engine/chrome-web-store-scraper.md
- **Developed by:** [Scraper Engine](https://apify.com/scraper-engine) (community)
- **Categories:** Developer tools, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.99 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

## 🧩 Chrome Web Store Scraper

> 🚀 Pull every public Chrome Web Store extension into clean, structured JSON — **ratings, install counts, manifest, developer, screenshots, badges, and more**. Built for speed, designed to survive blocks, ready for API + MCP.

***

### ✨ Why choose this actor?

- 🔁 **Two run modes** — paste raw listing URLs, or just type a keyword and let the actor build the search URL for you.
- 🎯 **Search filters** built in — Featured, Established Publisher, Extension / Theme, minimum star rating.
- 📦 **Full manifest, optionally included** — get `permissions`, `version`, `manifest_version`, host permissions, content scripts, etc.
- 🛡️ **Automatic proxy ladder** — starts **direct**, falls back to **datacenter**, then **residential** with 3 retries, and **sticks** with whatever first works.
- 🧠 **Resilient parser** — no minified-key hardcoding. Survives Google rotating internal RPC / `WIZ_global_data` identifiers.
- 💾 **Live dataset push** — every extension lands in the dataset the moment it's parsed; crashes mid-run never lose work.
- 💳 **Pay-per-event ready** — one billable event per scraped extension.

***

### 🎛️ Key features

| | |
|---|---|
| 🔎 Search keyword + filters | item type, Featured, Established Publisher, min star rating |
| 🔗 Bulk URL input | any Chrome Web Store category, collection, or search-result URL |
| 🛡️ Smart proxy fallback | direct → datacenter → residential (sticky, with retries) |
| ⚡ Concurrent detail scraping | tune `detailConcurrency` (1–32, default 8) |
| 🧱 Cap output volume | `maxItems` ceiling (1–5000) |
| 📦 Manifest toggle | include or strip the full Chrome manifest dict |
| 📊 Multi-view dataset | overview, developer, media, technical tabs in Apify Console |

***

### 📥 Input

```json
{
  "mode": "search",
  "searchQuery": "ai",
  "itemTypes": ["EXTENSION"],
  "filterBy": ["featured"],
  "minimalRating": 4,
  "maxItems": 100,
  "extractManifest": false,
  "detailConcurrency": 8,
  "proxyConfiguration": { "useApifyProxy": false }
}
```

#### Field reference

| Field | Type | Purpose |
|---|---|---|
| `mode` | string `"url"` / `"search"` | Pick which set of inputs the run uses. |
| `startUrls` | array of URLs | (URL mode) Chrome Web Store listing URLs to scrape. |
| `searchQuery` | string | (Search mode) Keyword. |
| `itemTypes` | array | (Search mode) Subset of `EXTENSION`, `THEME`. Empty = no filter. |
| `filterBy` | array | (Search mode) Subset of `featured`, `establishedPublisher`. Empty = no filter. |
| `minimalRating` | integer 0–5 | (Search mode) Minimum star rating; `0` disables. |
| `maxItems` | integer | Hard cap on collected extensions. |
| `extractManifest` | boolean | Include the full manifest dict in each record. |
| `detailConcurrency` | integer 1–32 | Parallel detail-page workers. |
| `proxyConfiguration` | proxy object | Override the starting tier. Default = direct. |

***

### 📤 Output

Each record looks like this (full manifest omitted for brevity):

```json
{
  "extensionId": "difoiogjjojoaoomphldepapgpbgkhkb",
  "iconUrl": "https://lh3.googleusercontent.com/.../wTNe...",
  "promoTileUrl": "https://.../irg6...",
  "marqueeTileUrl": "https://.../eQr...",
  "name": "Sider: Chat with all AI: GPT-5, Claude, DeepSeek, Gemini, Grok",
  "rating": 4.918653426548515,
  "ratingCount": 112285,
  "users": 5000000,
  "version": "5.25.12",
  "category": "productivity/tools",
  "shortDescription": "ChatGPT, DeepSeek, Gemini, Claude, Grok all in one AI sidebar…",
  "websiteUrl": "sider.ai",
  "permissions": ["storage", "cookies", "scripting", "activeTab", "tabs"],
  "manifestVersion": 3,
  "manifest": { "...": "(only when extractManifest = true)" },
  "author": "care@sider.ai",
  "url": "https://chromewebstore.google.com/detail/difoiogjjojoaoomphldepapgpbgkhkb",
  "scrapedAt": "2026-05-17T11:29:57.813Z",
  "description": "ChatGPT, DeepSeek, Gemini, Claude, Grok all in one AI sidebar…",
  "screenshots": ["https://lh3.googleusercontent.com/.../jEZ..."],
  "developer": {
    "email": "care@sider.ai",
    "displayName": "ChatGPT Sidebar",
    "address": "335 Huntington Ave APT 35 Boston, MA 02115 US",
    "phone": "+18577560822",
    "legalEntity": "Vidline Inc.",
    "registrationNumber": "106977314",
    "developerId": "u7940399ce3ad5f805172c7a395b8b66b"
  },
  "developerWebsite": "https://sider.ai",
  "privacyPolicyUrl": "https://sider.ai/privacy.html",
  "isFeatured": true,
  "isEstablishedPublisher": true
}
```

The dataset offers four pre-configured views in Apify Console: **📊 Overview**, **👤 Developer**, **🖼️ Media & content**, and **⚙️ Technical**.

***

### 🚀 How to use (Apify Console)

1. 🔐 Log in at [console.apify.com](https://console.apify.com) → **Actors**.
2. 🔎 Open this actor (`chrome-web-store-scraper`).
3. 🎛️ Pick a run mode and fill the inputs.
4. ▶️ Click **Start**.
5. 📜 Watch the log — you'll see every extension as it's discovered and scraped, with proxy events called out live.
6. 📤 Open **Output** when the run finishes — export to JSON / CSV / XLSX.

***

### 🤖 Use via API

```bash
curl -X POST "https://api.apify.com/v2/acts/USER~chrome-web-store-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
        "mode": "search",
        "searchQuery": "password manager",
        "itemTypes": ["EXTENSION"],
        "minimalRating": 4,
        "maxItems": 50
      }'
```

***

### 🎯 Best use cases

- 🧠 **Market research** — competitor catalogues, install counts, rating trends.
- 🛒 **Store intelligence** — track Featured and Established Publisher badges across categories.
- 🔐 **Permission audits** — bulk-collect manifests and surface risky permission patterns.
- 📈 **Lead generation** — pull developer contact + website fields straight from the store.
- 📊 **Trend tracking** — schedule the actor on a cron and diff rating + user counts over time.

***

### 💰 Pricing

This actor uses Apify's **Pay-Per-Event** model. You only pay for results — not for compute, proxies, or storage.

| Event | What it bills for | Price |
|---|---|---|
| 🧩 **`row_result`** | One Chrome Web Store extension successfully written to the dataset (full record — rating, users, version, permissions, developer, screenshots, badges). | **$0.005** |

That works out to **$5 per 1,000 extensions** scraped. Failed extensions (page errors, blocks that survive the proxy ladder) are **not** charged — only successful rows count.

Runs **stop gracefully** when your spend limit (`ACTOR_MAX_TOTAL_CHARGE_USD`) is reached — partial results stay in the dataset, no failed-run penalty.

***

### ❓ FAQ

**Does this need a Google account or login?** No. Everything is fetched anonymously from public Chrome Web Store pages.

**Will it work if I leave proxy on "direct"?** Usually yes for small runs. If the store rate-limits, the actor escalates to datacenter, then residential, automatically. Large runs benefit from setting `proxyConfiguration.useApifyProxy = true` up front.

**Why is the `manifest` field sometimes missing?** You disabled `extractManifest` to keep records small. Summary fields (`version`, `permissions`, `manifestVersion`) are kept either way.

**What happens if the Chrome Web Store HTML layout changes?** The parser discovers RPC IDs, request templates, and `WIZ_global_data` keys at runtime, so most layout / minification changes are absorbed automatically. Issues are tracked in the Issues tab.

***

### ⚖️ Cautions & legal

- 🌐 Only **publicly available** Chrome Web Store data is collected.
- ✅ The Chrome Web Store does not require authentication for the pages this actor reads.
- 🧑‍⚖️ You are responsible for compliance with the Chrome Web Store [Terms of Service](https://chromewebstore.google.com/intl/en/policies/terms), as well as any GDPR / CCPA / anti-spam obligations when you use the output (especially the `developer.email` / `developer.phone` / `developer.address` fields).
- 🤝 The actor honors reasonable rate limits and politely backs off when the store pushes back.

***

### 💬 Support & feedback

Open an issue on the actor's **Issues** tab or use the **Feedback** button in Apify Console. PRs and suggestions welcome.

# Actor input Schema

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

🔗 `url` — scrape one or more Chrome Web Store listing URLs (category, search result, or sitemap pages).
🔎 `search` — build the search URL from the keyword + filter fields below.

## `startUrls` (type: `array`):

Chrome Web Store category / collection / search-result URLs to crawl. Used only when Run Mode is set to **🔗 URL list**.

## `searchQuery` (type: `string`):

Keyword to search the Chrome Web Store for. Used only when Run Mode is set to **🔎 Search keyword**.

## `itemTypes` (type: `array`):

Filter search results by item type. Leave empty for **no filter**.

## `filterBy` (type: `array`):

Restrict to featured listings and/or established publishers. Leave empty for **no filter**.

## `minimalRating` (type: `integer`):

Only include results rated **at or above** this many stars. Set to `0` to disable the filter.

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

Hard cap on how many extensions the run will collect. Detail scraping stops as soon as this limit is reached.

## `extractManifest` (type: `boolean`):

When **on**, every record carries the full Chrome extension manifest dictionary. When **off**, the bulky `manifest` blob is dropped (summary fields like `version`, `permissions`, `manifestVersion` are kept either way).

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

Override the starting tier. Leave **useApifyProxy** off to begin direct (the ladder still auto-escalates on block). Turn it on and pick **RESIDENTIAL** to start there straight away.

## Actor input object example

```json
{
  "mode": "url",
  "startUrls": [
    "https://chromewebstore.google.com/category/extensions/lifestyle/travel"
  ],
  "searchQuery": "ai",
  "itemTypes": [
    "EXTENSION"
  ],
  "filterBy": [],
  "minimalRating": 0,
  "maxItems": 10,
  "extractManifest": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "startUrls": [
        "https://chromewebstore.google.com/category/extensions/lifestyle/travel"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scraper-engine/chrome-web-store-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 = {
    "startUrls": ["https://chromewebstore.google.com/category/extensions/lifestyle/travel"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("scraper-engine/chrome-web-store-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 '{
  "startUrls": [
    "https://chromewebstore.google.com/category/extensions/lifestyle/travel"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call scraper-engine/chrome-web-store-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/PHgVe26d0ULjdCs1k/builds/cwCsCDMciSgpepb8r/openapi.json
