# Chrome Web Store Scraper — Publisher Email & Users (`scrapersdelight/chrome-web-store-scraper`) Actor

Scrape Chrome Web Store extensions: user count, rating, review count, category, version, size and last update, plus the publisher's name, contact email and website. Search by keyword, browse categories or pass extension IDs. No login.

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

## Pricing

$3.00 / 1,000 per extension returneds

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 — users, ratings and the publisher's email

Turn the Chrome Web Store into a developer lead list. Search a keyword or browse a category and get
one row per extension: **user count, rating, review count, category, version, size, last update** —
and the **publisher's name, contact email and website**.

Every listing we have scraped carried a contact email. **Measured: 100% across 94 extensions in
three runs (2026-08-26/27).**

### What does this actor do?

- 🧩 **`name`, `tagline`, `description`, `version`, `size`, `languages`**
- 👥 **`users`** — the install count (Adobe Acrobat: 320,000,000)
- ⭐ **`rating`** and **`reviewCount`**
- 📧 **`publisherEmail`** — the developer contact shown on the public listing (present on every
  extension we measured)
- 🏢 **`publisherName`** and 🌐 **`publisherWebsite`**
- 🗂️ **`category`** / `categoryGroup`
- 📅 **`lastUpdated`**, `firstPublished`
- 🔗 **`storeUrl`**, `supportUrl`, `privacyPolicyUrl`

### Example input

```json
{
  "categories": ["productivity/developer", "productivity/workflow"],
  "searchTerms": ["crm", "email finder"],
  "minUsers": 100000,
  "minRating": 4,
  "maxItems": 200
}
```

### Field coverage — measured

From a real 32-extension category run (2026-08-27) and a 30-extension search run (2026-08-26):

| Field | Fill |
|---|---|
| `name`, `extensionId`, `rating`, `reviewCount`, `category`, `version`, `size`, `lastUpdated`, `firstPublished`, `languages`, `description`, `tagline`, `storeUrl` | **100%** |
| **`publisherEmail`** | **100%** |
| `publisherName` | **100%** |
| `publisherWebsite` | 83-88% |
| `privacyPolicyUrl` | 88-90% |
| `supportUrl` | 63-84% — lower on search-sourced rows than on category rows |
| `users` | 97% — a handful of Google's own extensions do not publish a count |

### Honest limits — read this before planning a big run

**The store does not paginate.** This is the real constraint and it is not a scraper defect:

- a **search** page returns about **10 extensions** and has no next page
- a **category** page returns **32** and has no next-page token
- all **17 categories** resolve, so category browsing addresses roughly **544 extensions**

To build a list of thousands you supply **many search terms** — one per niche you care about —
rather than asking for deep pagination that the store does not offer. The actor de-duplicates across
every source in a run, so overlapping terms cost you nothing.

Other limits worth stating:

- **Data comes from the store's own data blobs**, not the rendered DOM. That is why it is fast and
  needs no browser — but it also means a Google front-end change can require a parser update.
- **`users` is a rounded band** (1,000,000 rather than 1,043,912). That is how Google publishes it.
- **The publisher email is a support address**, not a personal one — which is what makes it usable
  for B2B outreach.

### Who is this for?

Extension monetisation and adtech networks, security and compliance vendors auditing extensions,
dev-tool sales teams, and anyone doing competitive research on the extension ecosystem.

### Pricing

| What | Price |
|---|---|
| Per extension returned | **$0.003** |

Filtered rows cost nothing — if `minUsers` drops an extension, you are not charged for it.

### FAQ

**Does every extension really have a contact email?**
Every one we have measured did — 100% across the 94 extensions in the three most recent runs. Use
`requireEmail` if you want a hard guarantee.

**Can I get more than 32 extensions from a category?**
Not from one category page — the store does not paginate. Use more categories and more search terms.

**How do I find an extension's ID?**
It is the 32-letter string in the store URL. Pass any number of them in `extensionIds`.

**Is the user count exact?**
No — Google publishes it rounded (e.g. "1,000,000+"). The actor returns the rounded number as-is.

**Do I need a proxy?**
No. The data comes back from ordinary HTTP requests — no browser and no anti-bot to defeat.

**Can I filter to popular extensions only?**
Set `minUsers` and `minRating`. Both are applied before you are charged.

**What are the category slugs?**
Three groups — `make_chrome_yours/*`, `productivity/*` and `lifestyle/*`. The input schema lists all
17 valid values.

**Does it return the full description?**
It returns the listing description truncated to 1,000 characters — on a typical run about two thirds
of rows hit that limit and are cut off.

**Is scraping this allowed?**
The store is a public catalogue with no login and no paywall; this actor reads only publicly served
listing data and backs off automatically if the store ever rate-limits it. You are responsible for
how you use publisher contact details — CAN-SPAM and GDPR apply to your outreach.

### Data source and fair use

Data comes from public Chrome Web Store listing pages. No login is used and no private API is
touched. Publisher emails are the contact addresses those publishers chose to display on their own
public listings.

# Actor input Schema

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

Keywords to search the store for, e.g. vpn, screenshot, crm. Note the store returns about 10 extensions per search and does not paginate — use several terms for a bigger list.

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

Browse whole categories (32 extensions each). Valid slugs: make\_chrome\_yours/accessibility, make\_chrome\_yours/functionality, make\_chrome\_yours/privacy, productivity/communication, productivity/developer, productivity/education, productivity/tools, productivity/workflow, lifestyle/art, lifestyle/entertainment, lifestyle/games, lifestyle/household, lifestyle/news, lifestyle/shopping, lifestyle/social, lifestyle/travel, lifestyle/well\_being.

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

32-character extension IDs to fetch directly, e.g. cjpalhdlnbpafiamejdnhcphjbkeiagm.

## `minUsers` (type: `integer`):

Skip extensions with fewer users than this. 0 = no minimum.

## `minRating` (type: `integer`):

Skip extensions rated below this (1-5). 0 = no minimum.

## `requireEmail` (type: `boolean`):

Drop extensions with no contact email. In testing every extension had one, so this rarely removes anything.

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

Stop after this many extensions. 0 = unlimited.

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

Optional. The store has no anti-bot; a proxy is not required.

## Actor input object example

```json
{
  "searchTerms": [
    "screenshot"
  ],
  "categories": [],
  "extensionIds": [],
  "minUsers": 0,
  "minRating": 0,
  "requireEmail": false,
  "maxItems": 25
}
```

# Actor output Schema

## `extensions` (type: `string`):

The dataset of scraped extensions.

# 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": [
        "screenshot"
    ],
    "maxItems": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapersdelight/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 = {
    "searchTerms": ["screenshot"],
    "maxItems": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapersdelight/chrome-web-store-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": [
    "screenshot"
  ],
  "maxItems": 25
}' |
apify call scrapersdelight/chrome-web-store-scraper --silent --output-dataset

```

## MCP server setup

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