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

- **URL**: https://apify.com/smorgi\_apps/chrome-web-store-scraper.md
- **Developed by:** [Smorgi Apps](https://apify.com/smorgi_apps) (community)
- **Categories:** Developer tools, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 chrome web store items

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 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 — Pay Per Result

Scrape **Chrome extension metadata and public reviews** from the Chrome Web Store via lightweight HTTP requests. Pass extension IDs or Store URLs — metadata, reviews, or both in one run.

**Store search keywords:** Chrome Web Store scraper · extension metadata · extension reviews · Chrome extension data · CWS scraper

***

### Why this Actor

| Need | What you get |
|------|----------------|
| Extension intelligence | Name, rating, user count, version, developer, category, manifest summary |
| Review monitoring | Review text, stars, reviewer, dates, helpful votes |
| Failures that shouldn’t bill | 404 / empty / unparseable → **not charged** |
| Low cost | HTTP-only (no Playwright); PPE priced from measured unit economics |

Public listing pages only. No Google developer API key required.

***

### Endpoints (public HTTP)

There is **no official public REST API** for browsing extension catalog data or reviews. This Actor uses the same HTML pages your browser loads:

| Purpose | URL | Data source |
|---------|-----|-------------|
| Extension metadata | `GET https://chromewebstore.google.com/detail/{extensionId}` | Embedded `AF_initDataCallback({ key: 'ds:0', data: … })` SSR blob |
| Public reviews (first page) | `GET https://chromewebstore.google.com/detail/{extensionId}/reviews` | Embedded `AF_initDataCallback({ key: 'ds:1', data: … })` SSR blob |

Legacy URLs on `chrome.google.com/webstore/detail/…` redirect to `chromewebstore.google.com` and are accepted in input.

Google’s official [Chrome Web Store API](https://developer.chrome.com/docs/webstore/using-api) (`chromewebstore.googleapis.com`) is **developer-only** (publish/manage your own items) — not used here.

***

### Input

```json
{
  "extensionIds": ["gighmmpiobklfepjocnamgkkbiglidom"],
  "urls": ["https://chromewebstore.google.com/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm"],
  "mode": "both",
  "maxItemsPerExtension": 10,
  "requestDelayMs": 400
}
```

Accepted ID / URL forms:

- ID: `gighmmpiobklfepjocnamgkkbiglidom`
- Detail URL: `https://chromewebstore.google.com/detail/adblock/gighmmpiobklfepjocnamgkkbiglidom`
- Reviews URL: `https://chromewebstore.google.com/detail/gighmmpiobklfepjocnamgkkbiglidom/reviews`
- Legacy: `https://chrome.google.com/webstore/detail/…/{extensionId}`

***

### Output fields

#### `recordType: "metadata"` (one row per extension)

| Field | Description |
|-------|-------------|
| `extensionId` | 32-character extension ID |
| `name` | Extension title |
| `shortDescription` | Store listing blurb |
| `developerName` | From embedded manifest `author` |
| `websiteUrl` | Developer site when listed |
| `storeUrl` | Canonical detail URL |
| `iconUrl` / `heroImageUrl` | Image URLs from SSR data |
| `ratingValue` / `ratingCount` | Average rating and review count |
| `userCount` | Approximate install/user count (integer) |
| `category` | Store category slug (e.g. `productivity/workflow`) |
| `version` | Current published version |
| `updatedAt` | Human-readable “Updated …” text from HTML |
| `manifest` | Summary: permissions, manifest version, locale |

#### `recordType: "review"` (one row per review)

| Field | Description |
|-------|-------------|
| `reviewId` | UUID review identifier |
| `reviewerName` / `reviewerAvatarUrl` | Public reviewer profile |
| `rating` | 1–5 stars |
| `reviewText` | Review body |
| `reviewDate` / `editedDate` | ISO timestamps |
| `helpfulCount` | Helpful votes when exposed |
| `extensionVersion` | Extension version at review time |
| `language` | Review language code |

***

### Pricing

Pay-per-event for each **delivered** dataset row (`apify-default-dataset-item`).

- Empty extensions, 404 IDs, and parse failures → **not charged**
- Metadata-only runs bill one row per extension; review runs bill one row per review

**~$0.50 / 1,000 results** on the Store pricing tab (HTTP-only; empty/404 free).

***

### Limitations (honest)

- **Reviews pagination:** Each `/reviews` HTTP response embeds **~10 reviews**. Fetching older pages requires Google’s internal `batchexecute` RPC (undocumented, changes often) — **not implemented** in v0.1.
- **SSR structure drift:** Metadata/reviews are parsed from `AF_initDataCallback` blobs. Google can rearrange indices; parser may need updates.
- **No search/discovery:** Pass known extension IDs or URLs — category/search crawling is out of scope.
- **Rate limits:** High volume may trigger HTTP 429/503; use `requestDelayMs` and optional Apify Proxy.
- **Removed extensions:** Return HTTP 404 and are skipped (not charged).
- **Screenshots:** Not extracted in v0.1 (not reliably present in the SSR blob).

***

Issues / feature requests: use the Actor **Issues** tab.

# Actor input Schema

## `extensionIds` (type: `array`):

32-character Chrome extension IDs (letters a–p). Example: gighmmpiobklfepjocnamgkkbiglidom (AdBlock).

## `urls` (type: `array`):

Chrome Web Store detail or /reviews URLs. Legacy chrome.google.com/webstore links are accepted.

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

metadata = one row per extension; reviews = one row per review; both = metadata + reviews.

## `maxItemsPerExtension` (type: `integer`):

Cap review rows per extension. The public SSR reviews page embeds ~10 reviews per HTTP response; deeper pagination uses Google's internal RPC (not implemented).

## `requestDelayMs` (type: `integer`):

Throttle between detail/reviews HTTP calls.

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

Optional. Direct requests usually work; enable Apify Proxy for high volume.

## Actor input object example

```json
{
  "extensionIds": [
    "gighmmpiobklfepjocnamgkkbiglidom",
    "cjpalhdlnbpafiamejdnhcphjbkeiagm"
  ],
  "urls": [
    "https://chromewebstore.google.com/detail/adblock/gighmmpiobklfepjocnamgkkbiglidom"
  ],
  "mode": "both",
  "maxItemsPerExtension": 10,
  "requestDelayMs": 500,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `items` (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 = {
    "extensionIds": [
        "gighmmpiobklfepjocnamgkkbiglidom",
        "cjpalhdlnbpafiamejdnhcphjbkeiagm"
    ],
    "urls": [
        "https://chromewebstore.google.com/detail/adblock/gighmmpiobklfepjocnamgkkbiglidom"
    ],
    "mode": "both",
    "maxItemsPerExtension": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("smorgi_apps/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 = {
    "extensionIds": [
        "gighmmpiobklfepjocnamgkkbiglidom",
        "cjpalhdlnbpafiamejdnhcphjbkeiagm",
    ],
    "urls": ["https://chromewebstore.google.com/detail/adblock/gighmmpiobklfepjocnamgkkbiglidom"],
    "mode": "both",
    "maxItemsPerExtension": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("smorgi_apps/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 '{
  "extensionIds": [
    "gighmmpiobklfepjocnamgkkbiglidom",
    "cjpalhdlnbpafiamejdnhcphjbkeiagm"
  ],
  "urls": [
    "https://chromewebstore.google.com/detail/adblock/gighmmpiobklfepjocnamgkkbiglidom"
  ],
  "mode": "both",
  "maxItemsPerExtension": 10
}' |
apify call smorgi_apps/chrome-web-store-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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