# Chrome Web Store Extension Scraper (`dariomory/chrome-web-store-extension-scraper`) Actor

Scrape Chrome Web Store extensions and themes. Export user counts, ratings, versions, manifest permissions, publisher contacts and privacy disclosures to JSON, CSV or Excel.

- **URL**: https://apify.com/dariomory/chrome-web-store-extension-scraper.md
- **Developed by:** [Dario Mory](https://apify.com/dariomory) (community)
- **Categories:** Developer tools, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 extension results

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?

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** — export Chrome extension and theme data from [chromewebstore.google.com](https://chromewebstore.google.com) as JSON, CSV, or Excel. Get user counts, ratings, versions, **manifest permissions**, publisher contact details, and privacy disclosures for any extension, category, or search term.

Google publishes no official Chrome Web Store API. This Actor reads the store's own internal JSON endpoints directly — no browser, no rendering, no API key — so a 1,000-extension export finishes in about 20 requests.

### What you can scrape

| Source | Paginated | Notes |
| --- | --- | --- |
| **Search terms** | Yes, 50/page | Any keyword. Returns extensions *and* themes, plus a total result count. |
| **Categories** | Yes, 50/page | All 18 store categories. Extensions only — the store publishes no per-category theme listing. |
| **Extension IDs / URLs** | n/a | Exact lookups. Accepts bare IDs or full `chromewebstore.google.com/detail/...` URLs. |
| **Top charts** | ~25 items | Trending, Popular, and Notable. |
| **Store landing shelves** | ~50 / ~24 items | Curated Extensions and Themes landing pages. |

### What you get for every extension

- **Install base and reception** — `userCount`, `rating`, `ratingCount`
- **Permissions from the real `manifest.json`** — `permissions`, `optionalPermissions`, `hostPermissions`, `contentScriptMatches`, `manifestVersion`, `usesServiceWorker`
- **Release data** — `version`, `lastUpdatedAt`, `size`, `minimumChromeVersion`, `languageCodes`
- **Publisher** — name, legal/trader name, email, postal address, phone, website and whether it is domain-verified
- **Privacy** — `dataCollected` (the developer's own disclosure), `privacyPolicyUrl`, `supportUrl`
- **Media** — icon, promo tile, marquee banner, screenshots, promo videos
- **Discovery** — `categorySlug`, `relatedExtensionIds`, full store `url`

### Common use cases

- **Competitor and market research** — track user counts, ratings, and release cadence across a category over time.
- **Extension security auditing** — find every extension requesting `<all_urls>`, `cookies`, `webRequest`, or other sensitive permissions, straight from the shipped manifest.
- **Manifest V2 → V3 migration tracking** — filter by `manifestVersion` to see who has migrated.
- **Lead generation** — publisher email, phone, and company address are published as EU Digital Services Act trader disclosures.
- **App store optimization (ASO)** — mine titles, descriptions, and category rankings of the highest-installed extensions.

### Input

```json
{
  "searchTerms": ["password manager"],
  "categories": ["productivity/developer"],
  "topCharts": ["popular"],
  "extensionIds": ["eimadpbcbfnmbkopoojfekhnkhdbieeh"],
  "sortBy": "mostUsers",
  "includeDetails": true,
  "minUserCount": 1000,
  "maxItems": 500
}
```

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `searchTerms` | string\[] | – | Keywords to search. Each term is paginated until the item limit is reached. |
| `extensionIds` | string\[] | – | Extension IDs or full detail URLs. |
| `categories` | string\[] | – | Category slugs, e.g. `productivity/developer`. |
| `topCharts` | string\[] | – | `trending`, `popular`, `notable`. |
| `storefronts` | string\[] | – | `extensions`, `themes` — curated landing shelves. |
| `sortBy` | string | `mostUsers` | `recommended`, `mostUsers`, `highestRated`. Applies to category browsing. |
| `includeDetails` | boolean | `true` | Fetch the full detail record per item (one extra request each). |
| `includeRelated` | boolean | `false` | Also scrape the related extensions each detail page links to. |
| `minUserCount` | integer | `0` | Skip items below this user count. |
| `language` | string | `en` | Store language code, e.g. `en`, `de`, `nl`, `ja`. |
| `maxItems` | integer | `200` | Maximum unique items saved across every source. |
| `proxyConfiguration` | object | off | Optional. The endpoints are public; a proxy mainly helps on large runs. |

At least one of `searchTerms`, `extensionIds`, `categories`, `topCharts`, or `storefronts` is required.

#### Category slugs

`productivity/communication` · `productivity/workflow` · `productivity/tools` · `productivity/education` · `productivity/developer` · `lifestyle/shopping` · `lifestyle/news` · `lifestyle/entertainment` · `lifestyle/games` · `lifestyle/social` · `lifestyle/art` · `lifestyle/well_being` · `lifestyle/travel` · `lifestyle/household` · `lifestyle/fun` · `make_chrome_yours/accessibility` · `make_chrome_yours/functionality` · `make_chrome_yours/privacy`

### Output sample

```json
{
  "extensionId": "eimadpbcbfnmbkopoojfekhnkhdbieeh",
  "name": "Dark Reader",
  "url": "https://chromewebstore.google.com/detail/dark-reader/eimadpbcbfnmbkopoojfekhnkhdbieeh",
  "itemType": "extension",
  "shortDescription": "Dark mode for every website. Take care of your eyes, use dark theme for night and daily browsing.",
  "rating": 4.657688503385833,
  "ratingCount": 13143,
  "userCount": 7000000,
  "categorySlug": "make_chrome_yours/accessibility",
  "categoryGroup": "Make Chrome Yours",
  "categoryName": "Accessibility",
  "version": "4.9.129",
  "manifestVersion": 3,
  "minimumChromeVersion": "106.0.0.0",
  "size": "820KiB",
  "lastUpdatedAt": "2026-07-15T14:56:13.000Z",
  "permissions": ["alarms", "fontSettings", "scripting", "storage"],
  "optionalPermissions": ["contextMenus"],
  "hostPermissions": ["*://*/*"],
  "contentScriptMatches": ["<all_urls>"],
  "usesServiceWorker": true,
  "publisher": {
    "name": "Alexander Shutau",
    "legalName": "Alexander Shutau",
    "email": "support@darkreader.org",
    "address": "Office 40 Unit 5\n399-405 Oxford Street\nLondon W1C 2BU\nGB",
    "phone": "+447585769555",
    "websiteUrl": "https://darkreader.org/",
    "websiteVerified": true
  },
  "privacyPolicyUrl": "https://darkreader.org/privacy/",
  "dataCollected": [],
  "screenshots": ["https://lh3.googleusercontent.com/..."],
  "hasDetails": true,
  "source": "extension-id",
  "scrapedAt": "2026-08-22T09:14:02.113Z"
}
```

Export the dataset as JSON, CSV, Excel, XML, or HTML from the Apify Console, or pull it through the [Apify API](https://docs.apify.com/api/v2).

### FAQ

#### Is there an official Chrome Web Store API?

No. Google offers the [Chrome Web Store Publish API](https://developer.chrome.com/docs/webstore/api), but it only manages **your own** items — it cannot read public listings, user counts, or ratings. This Actor fills that gap by reading the storefront's own endpoints.

#### How do I find the number of users of a Chrome extension?

Pass the extension ID or its store URL in `extensionIds`. The `userCount` field returns the store's published figure. Note that Google rounds this — an extension showing "7,000,000 users" returns `7000000`, not an exact count.

#### Can I get the permissions an extension requests?

Yes. Every listing ships its real `manifest.json`, so `permissions`, `hostPermissions`, `optionalPermissions`, and `contentScriptMatches` are extracted for every item — even with `includeDetails` turned off.

#### Can I scrape every extension in the Chrome Web Store?

Not in one pass. The store exposes no endpoint that enumerates all items. Categories and search are the only fully paginated surfaces, so a broad dataset is built by combining the 18 category slugs with a set of search terms. Top charts and landing shelves are fixed curated lists.

#### How do I scrape Chrome themes?

Use `searchTerms` — search returns both extensions and themes, and each record is tagged with `itemType`. The `storefronts: ["themes"]` option adds the curated themes shelf. There is no per-category theme listing, because the store itself does not publish one.

#### Does this need a proxy or login?

No. The endpoints are public and unauthenticated. `proxyConfiguration` is available for very large runs but is off by default.

#### What does a run cost?

This Actor is **pay per event**: $5.00 per 1,000 extension records ($0.005 each), plus a $0.00005 Actor start event. You pay for results saved, not for time spent — a run that finds nothing costs essentially nothing.

| Extensions scraped | Cost |
| --- | --- |
| 100 | $0.50 |
| 1,000 | $5.00 |
| 10,000 | $50.00 |

Turning `includeDetails` off does not change the price per record, but it is far faster: one request returns 50 items, whereas full details cost one extra request per item. A 300-item run with details off completes in about 35 seconds and peaks at 94 MB, so the compute cost on top is negligible.

Use `maxItems` to cap spend on any run, and `minUserCount` to avoid paying for long-tail listings you do not need.

### Limitations

- `userCount` is Google's rounded figure, not an exact install count.
- `dataCollected` reflects the developer's self-declared privacy disclosure. An empty array means nothing was declared — not that nothing is collected.
- Publisher address, phone, and legal name appear for business publishers subject to EU trader disclosure. Many individual developers have none.
- Individual user reviews are not collected; only the aggregate `rating` and `ratingCount`.
- With `includeDetails: false`, the full description, screenshots, size, languages, and publisher contact fields stay empty. `hasDetails` records which mode produced each row.

### Legal

This Actor collects only publicly available listing data — the same information any visitor sees on a store page — and does not access private, personal, or authenticated content. Publisher contact details are those the publishers themselves are legally required to display. You are responsible for using the output in line with applicable law, including GDPR where personal data is involved.

# Actor input Schema

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

Keywords to search the Chrome Web Store, for example "dark mode" or "crm". Paginated 50 at a time and returns both extensions and themes.

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

Exact 32-character extension IDs, or full chromewebstore.google.com/detail/... URLs. Fastest and most precise option.

## `categories` (type: `array`):

Browse whole store categories, paginated. Use the official slugs shown in the store URL. The store serves categories as extensions only; use search to collect themes.

## `topCharts` (type: `array`):

Fixed 25-item editorial charts from the store home page.

## `storefronts` (type: `array`):

Curated picks from the store's Extensions and Themes landing pages. These are fixed shelves (about 50 and 24 items) with no pagination - the Chrome Web Store offers no way to enumerate every item, so use categories or search for bulk collection.

## `sortBy` (type: `string`):

Ordering for category browsing, matching the store's own Sort by dropdown. Search, top charts, and landing shelves use the store's own ranking.

## `includeDetails` (type: `boolean`):

Adds the full description, screenshots, publisher contact details, privacy disclosures, support and privacy policy URLs, size, and supported languages. Costs one extra request per item.

## `includeRelated` (type: `boolean`):

After the main run, follow the "related" extensions listed on each detail page. Requires full details to be enabled.

## `minUserCount` (type: `integer`):

Skip items with fewer weekly users than this. Set to 0 to keep everything.

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

Language code used for store listings, for example en, de, fr, es, nl, or ja. Affects localized titles and descriptions.

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

Maximum number of unique extensions or themes saved across every source.

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

Optional. The Chrome Web Store API is public and usually works without a proxy, but a proxy helps on large runs.

## Actor input object example

```json
{
  "searchTerms": [
    "dark mode"
  ],
  "sortBy": "mostUsers",
  "includeDetails": true,
  "includeRelated": false,
  "minUserCount": 0,
  "language": "en",
  "maxItems": 200,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "searchTerms": [
        "dark mode"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("dariomory/chrome-web-store-extension-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 = { "searchTerms": ["dark mode"] }

# Run the Actor and wait for it to finish
run = client.actor("dariomory/chrome-web-store-extension-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 '{
  "searchTerms": [
    "dark mode"
  ]
}' |
apify call dariomory/chrome-web-store-extension-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dariomory/chrome-web-store-extension-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/KJ02Hn2YROogBc9tG/builds/CaGORMGYccgacIt7U/openapi.json
