# Chrome Web Store Extension Scraper (`webintel/chrome-webstore-scraper`) Actor

Scrape public Chrome Web Store extension metadata, ratings, users, screenshots, privacy links and manifest information. Fast HTTP-only, no browser.

- **URL**: https://apify.com/webintel/chrome-webstore-scraper.md
- **Developed by:** [Deepak Ganesh](https://apify.com/webintel) (community)
- **Categories:** Developer tools, Lead generation, E-commerce
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 extensions

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Chrome Web Store Extension Scraper

![Chrome Web Store Extension Scraper](https://api.apify.com/v2/key-value-stores/21SBwDwdNtlnapIdO/records/chrome-webstore-scraper.png?v=5a66b31b)

Scrape public Chrome Web Store extension details from extension IDs, old/new detail URLs, or optional search queries. The Actor uses fast HTTP-only requests with `CheerioCrawler` (no browser, no login) and reads both visible HTML and embedded `AF_initDataCallback` data.

This Actor is **not affiliated with Google or Chrome Web Store**.

### Use cases

- Build extension market datasets with users, ratings, versions and update dates.
- Monitor competitor extensions for changes in user counts, reviews, size or manifest version.
- Enrich lead lists with public developer names, websites and emails when shown by the store.
- Discover extension IDs from Chrome Web Store search pages, then scrape complete detail records.
- Feed public extension metadata into BI tools, spreadsheets, agents or compliance workflows.

### Input

| Field | Default | Description |
|---|---:|---|
| `extensions` | `[]` | Extension IDs (`32` lowercase letters `a-p`) or Chrome Web Store detail URLs. Supports `chromewebstore.google.com/detail/<slug>/<id>` and old `chrome.google.com/webstore/detail/.../<id>` URLs. |
| `searchQueries` | `[]` | Optional search terms. The Actor fetches `https://chromewebstore.google.com/search/<query>` and extracts IDs from server-rendered HTML / embedded data. |
| `maxResultsPerQuery` | `20` | Maximum IDs to discover per search query. |
| `maxConcurrency` | `3` | Maximum detail pages fetched in parallel. Capped at `5` for polite crawling. |
| `requestTimeoutSecs` | `30` | Request timeout. |
| `maxRetries` | `2` | Retries per page. Retries fall back to HTTP/1.1. |
| `proxyConfiguration` | no proxy | Optional proxy settings. Use Apify Proxy only if the store blocks datacenter traffic. |

```json
{
  "extensions": [
    "ddkjiahejlhfcafbddmgiahcphecmpfh",
    "https://chromewebstore.google.com/detail/dark-reader/eimadpbcbfnmbkopoojfekhnkhdbieeh",
    "https://chrome.google.com/webstore/detail/grammarly/kbfnbcaeplbcioakkpcpgfkobkghlhen"
  ],
  "searchQueries": ["ad blocker"],
  "maxResultsPerQuery": 10
}
```

### Output

One dataset item is created per requested extension. Successful items are charged; invalid, missing, blocked or failed items have `success=false` and are free.

```json
{
  "input": "ddkjiahejlhfcafbddmgiahcphecmpfh",
  "id": "ddkjiahejlhfcafbddmgiahcphecmpfh",
  "url": "https://chromewebstore.google.com/detail/ddkjiahejlhfcafbddmgiahcphecmpfh",
  "success": true,
  "error": null,
  "name": "uBlock Origin Lite",
  "shortDescription": "An efficient content blocker. Blocks ads, trackers, miners, and more immediately upon installation.",
  "description": "uBO Lite (uBOL) is an efficient MV3-based content blocker...",
  "developerName": "Raymond Hill (gorhill)",
  "developerWebsite": "https://github.com/uBlockOrigin/uBOL-issues",
  "developerEmail": "ubo@raymondhill.net",
  "category": "Privacy",
  "users": 21000000,
  "rating": 4.5,
  "ratingCount": 3641,
  "version": "2026.930.1227",
  "lastUpdated": "2026-09-30T14:36:39.683Z",
  "size": "9.2MiB",
  "languages": ["Deutsch", "English", "English (United Kingdom)", "Filipino", "Indonesia"],
  "iconUrl": "https://lh3.googleusercontent.com/lsanoOfx5N_t-7gh5Qg9FGIirVEjdCqalZXyLZYRd5d7Fydm83FQhu4Oq0JmlRyMtyF_LfwuQQZyKRTHs6emnFirsA",
  "screenshots": [
    "https://lh3.googleusercontent.com/PkdO2XWloxLDu8cDGTGGKDQnnZZBe3P9Ki9-NfvMAP_vmbmE_xF1EKYRrohRZBL_5gi3Q25gOTg_QpWUM0CKtBFt"
  ],
  "featured": true,
  "establishedPublisher": true,
  "privacyPolicyUrl": "https://github.com/gorhill/uBlock/wiki/Privacy-policy",
  "manifestVersion": 3,
  "scrapedAt": "2026-10-06T16:28:19.793Z"
}
```

Missing fields are returned as `null` (or an empty array for `languages` and `screenshots`) rather than throwing.

### Pricing

Pay per event: you only pay for successful extension detail records.

| Event | Price | When |
|---|---:|---|
| Extension | **$0.002** ($2.00 per 1,000 Extensions) | Charged for each successfully scraped extension detail page. |

Invalid IDs/URLs, missing extensions, HTTP blocks and other failed pages are pushed with `success=false` and are **not charged**. The Actor respects your maximum cost per run and stops cleanly when the charge limit is reached.

### Search support

Search is supported on a best-effort basis by parsing IDs from the public search result HTML and embedded Chrome Web Store data. If Google changes search rendering so that no IDs are available without JavaScript/private batchexecute calls, use explicit extension IDs or URLs instead.

### FAQ

**Does it run JavaScript or use a browser?** No. It uses plain HTTP requests and Cheerio for speed, cost and stability.

**Can it scrape private developer data?** No. It only extracts public fields shown in the Chrome Web Store HTML or embedded page data.

**Why is a field null?** Some extensions do not show every field publicly, and the store may hide fields by region or experiment. The Actor returns `null` rather than failing the item.

**What if the platform run is blocked?** Keep the default no-proxy setting for normal use. If you see repeated `HTTP 403`, `429`, or empty store pages from datacenter IPs, enable Apify Proxy in `proxyConfiguration`.

### Changelog

- **0.1**: Initial release. Scrapes extension IDs/URLs, best-effort search discovery, public detail metadata, screenshots, privacy links, manifest version, and pay-per-event billing.

# Actor input Schema

## `extensions` (type: `array`):

Chrome Web Store extension IDs (32 lowercase letters a-p) or detail URLs. Supports old chrome.google.com/webstore/detail/... and new chromewebstore.google.com/detail/<slug>/<id> URLs.

## `searchQueries` (type: `array`):

Optional Chrome Web Store searches used to discover extension IDs from server-rendered HTML/embedded data.

## `maxResultsPerQuery` (type: `integer`):

Maximum number of extension IDs to discover from each search query.

## `maxConcurrency` (type: `integer`):

Maximum number of pages fetched in parallel. Kept polite for the Chrome Web Store.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for a Chrome Web Store page before retrying.

## `maxRetries` (type: `integer`):

How many times to retry a page that fails to load.

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

Optional. Default is no proxy. Enable Apify Proxy if the Chrome Web Store blocks datacenter traffic for your runs.

## Actor input object example

```json
{
  "extensions": [
    "ddkjiahejlhfcafbddmgiahcphecmpfh",
    "https://chromewebstore.google.com/detail/dark-reader/eimadpbcbfnmbkopoojfekhnkhdbieeh"
  ],
  "searchQueries": [
    "ad blocker"
  ],
  "maxResultsPerQuery": 20,
  "maxConcurrency": 3,
  "requestTimeoutSecs": 30,
  "maxRetries": 2,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All scraped extensions (JSON). Each item has id, url, success, error, name, descriptions, developer details, users, ratings, version, update date, media, badges and privacy fields.

## `overview` (type: `string`):

Table view of extension names, users, ratings, developer, category, version and status.

## `media` (type: `string`):

Extension icons and screenshots.

# 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 = {
    "extensions": [
        "ddkjiahejlhfcafbddmgiahcphecmpfh",
        "https://chromewebstore.google.com/detail/dark-reader/eimadpbcbfnmbkopoojfekhnkhdbieeh"
    ],
    "searchQueries": [
        "ad blocker"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("webintel/chrome-webstore-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 = {
    "extensions": [
        "ddkjiahejlhfcafbddmgiahcphecmpfh",
        "https://chromewebstore.google.com/detail/dark-reader/eimadpbcbfnmbkopoojfekhnkhdbieeh",
    ],
    "searchQueries": ["ad blocker"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("webintel/chrome-webstore-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "extensions": [
    "ddkjiahejlhfcafbddmgiahcphecmpfh",
    "https://chromewebstore.google.com/detail/dark-reader/eimadpbcbfnmbkopoojfekhnkhdbieeh"
  ],
  "searchQueries": [
    "ad blocker"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call webintel/chrome-webstore-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,webintel/chrome-webstore-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/5WYmTZXLxPVzDa52s/builds/CEFnK1BA6GAnlyBQ6/openapi.json
