# Chrome Web Store Scraper: Extensions, Users & Ratings (`tidyharvest/chrome-web-store-scraper`) Actor

Chrome Web Store extensions by keyword search (store order, with rank), URL/ID, category, collection or name keyword: users, rating, version, last updated, publisher name/website, badges, manifest permissions, privacy practices, screenshots. $3.00 per 1,000 extensions.

- **URL**: https://apify.com/tidyharvest/chrome-web-store-scraper.md
- **Developed by:** [TidyHarvest](https://apify.com/tidyharvest) (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

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Scraper

Scrape **Chrome extensions** from the **Chrome Web Store** by **keyword search**, URL/ID, **category**, editorial
collection or **name keyword**: **user count**, **rating** and rating count, **version**, **last updated**, size,
languages, full description, **publisher name and website**, trader status, Featured / **Established publisher**
badges, **permissions** (from the extension's manifest), **privacy practices** (what data it collects), screenshots
and icons. Search results come in the store's own order with each row's **rank** for the query, up to the store's
full result list (several hundred per query). Fast and cheap: **$3.00 per 1,000 full extension records**, less on
higher Apify plans.

### What you can do with it

- **Keyword rank tracking:** search `pdf editor`, `ad blocker` or your own keywords and see who ranks where, with
  users and ratings for every result. Run it on a schedule to track your extension's position over time.
- **Competitor research:** track users, ratings, versions and update cadence of the extensions in your niche; add
  `includeRelated` to discover the store's own "Related" picks for each one.
- **Publisher mapping:** publisher name, website and EU trader status for every extension in a niche, filtered by
  user count and category.
- **Security and compliance audits:** permissions, host permissions, content-script matches and declared data
  collection for a list of extension IDs (for example, everything installed across your company).
- **Market sizing:** top 190 per category by relevance and by rating, with Featured / Established filters.

### Input

| Field | What it does |
|---|---|
| `searchQueries` | Keywords to search the store for, one per line (`pdf editor`, `ad blocker`). Store search URLs work too. |
| `maxResultsPerSearch` | Results per search, from the top (default 20, up to 1,000; the store itself returns about 300-800 per query). |
| `extensions` | Extension URLs (new `chromewebstore.google.com` or old `chrome.google.com/webstore` links) or bare 32-letter IDs. |
| `categories` | Store categories, e.g. `productivity/developer`, `make_chrome_yours/privacy`, `lifestyle/shopping` (all 18 in the dropdown). |
| `sortBy` / `filterBy` | Category view: `relevance` or `highestRated`; `all`, `featured` or `establishedPublishers`. |
| `maxItemsPerCategory` | 32 = one store page. Up to 192: the actor merges the other sort/filter views of the category. |
| `collections` | Editorial collections such as `ai_assistants`, `tabs_control`, `weather_extensions`. |
| `nameKeywords` | Words that must appear in the extension's name (first ~25 characters), checked against every extension in the store, including ones search does not surface. Slower: a few minutes per run. |
| `includeDetails` | Search/category/collection results: full record (default) or a cheaper listing-only record. |
| `includeRelated` | Also scrape the related extensions shown on each page (one level). |
| `minUsers`, `maxUsers`, `minRating`, `minRatingCount`, `featuredOnly`, `establishedOnly` | Filters, applied before you are charged. |
| `language` | Store language for descriptions (`en`, `de`, `ja`, `pt-BR`...). |
| `maxItems` | Hard cap on results (and cost) for the whole run. Default 50. |

Examples:

```json
{ "searchQueries": ["pdf editor", "ad blocker", "tab manager"], "maxResultsPerSearch": 50, "maxItems": 150 }
```

```json
{ "searchQueries": ["screen recorder"], "maxResultsPerSearch": 300, "includeDetails": false, "minUsers": 1000, "maxItems": 300 }
```

```json
{ "extensions": ["https://chromewebstore.google.com/detail/grammarly-ai-writing-assi/kbfnbcaeplbcioakkpcpgfkobkghlhen", "ddkjiahejlhfcafbddmgiahcphecmpfh"] }
```

```json
{ "categories": ["productivity/developer", "productivity/tools"], "maxItemsPerCategory": 100, "minUsers": 10000, "maxItems": 200 }
```

```json
{ "nameKeywords": ["json viewer", "pdf"], "maxItems": 100 }
```

### Output

One item per extension (full record). Search results also carry `searchQuery` and `rank` (1 = the store's top result
for that query; ranks are the store's, counted before your filters). An extension that ranks for two of your searches
appears once per search, so each query's list is complete:

```json
{
  "id": "kbfnbcaeplbcioakkpcpgfkobkghlhen",
  "name": "Grammarly: AI Writing Assistant and Grammar Checker App",
  "url": "https://chromewebstore.google.com/detail/grammarly-ai-writing-assi/kbfnbcaeplbcioakkpcpgfkobkghlhen",
  "type": "extension",
  "shortDescription": "Grammarly for Chrome helps you write with confidence. ...",
  "description": "Full store description ...",
  "category": "productivity/communication",
  "categoryName": "Communication",
  "rating": 3.873,
  "ratingCount": 43150,
  "userCount": 41000000,
  "featured": true,
  "establishedPublisher": true,
  "byGoogle": false,
  "publisherName": "Grammarly",
  "publisherWebsite": "http://grammarly.com/",
  "trader": true,
  "version": "14.1338.0",
  "lastUpdated": "2026-10-14T15:56:01Z",
  "createdAt": "2012-10-22T10:17:01Z",
  "size": "17.58MiB",
  "languages": ["English"],
  "languageCodes": ["en"],
  "minChromeVersion": "98",
  "manifestVersion": 3,
  "permissions": ["scripting", "sidePanel", "tabs", "storage", "cookies"],
  "hostPermissions": ["http://*/*", "https://*/*"],
  "optionalPermissions": ["nativeMessaging", "clipboardRead"],
  "contentScriptMatches": ["<all_urls>", "*://docs.google.com/*"],
  "privacyStatus": "collects-data",
  "dataCollected": ["Personally identifiable information", "Personal communications", "Location", "User activity", "Website content"],
  "privacyPolicyUrl": "https://www.grammarly.com/privacy-policy",
  "supportUrl": "https://support.grammarly.com/",
  "iconUrl": "https://lh3.googleusercontent.com/...",
  "screenshots": ["https://lh3.googleusercontent.com/..."],
  "promoTileUrl": "https://lh3.googleusercontent.com/...",
  "marqueeUrl": "https://lh3.googleusercontent.com/...",
  "relatedExtensionIds": ["kdfieneakcjfaiglcfcgkidlkmlijjnh", "iidnbdjijdkbmajdffnidomddglmieko"],
  "source": "kbfnbcaeplbcioakkpcpgfkobkghlhen"
}
```

A search result row (listing fields shortened):

```json
{
  "id": "efaidnbmnnnibpcajpcglclefindmkaj",
  "name": "Adobe Acrobat: PDF edit, convert, sign tools",
  "userCount": 347000000,
  "rating": 4.384,
  "url": "https://chromewebstore.google.com/detail/adobe-acrobat-pdf-edit-co/efaidnbmnnnibpcajpcglclefindmkaj",
  "searchQuery": "pdf editor",
  "rank": 3,
  "source": "search: pdf editor"
}
```

`source` says which of your inputs produced the row: `search: <query>`, the URL/ID you gave, the category or
collection, `nameKeywords: ...` or `related`.
`privacyStatus` is `collects-nothing`, `collects-data` or `not-disclosed`. A listing-only record (search/category/collection
with `includeDetails: false`) has the same fields except description, lastUpdated, size, languages, publisher name, trader,
privacy and screenshots. `version` and permissions still come from the manifest. A run summary is saved to the
key-value store as `SUMMARY`: rows per input (with the store's own result count for each search) and any input
that failed, with the reason.

### Pricing

Pay per result, with lower prices on higher Apify plans:

| Event | FREE | BRONZE | SILVER | GOLD+ |
|---|---|---|---|---|
| `extension-scraped` (full record) | $3.00 / 1,000 | $2.20 / 1,000 | $1.60 / 1,000 | $1.10 / 1,000 |
| `extension-listed` (listing only) | $0.90 / 1,000 | $0.70 / 1,000 | $0.55 / 1,000 | $0.35 / 1,000 |

No start fee. Filters and `maxItems` apply before you are charged, and the run stops at your maximum charge.
A run that finds nothing fails instead of silently returning an empty dataset.

### Limits

- **No developer email, phone or street address.** Many Chrome Web Store developers are private individuals, so this
  actor does not collect their personal contact details. Publisher name, website, trader status and the privacy-policy
  and support URLs are included.
- **No reviews.** Review text is not returned (rating and rating count are).
- Search returns what the store's own search returns for a query, in the store's order; the store stops at a few
  hundred results per query (about 300 for `pdf editor`, 360 for `ad blocker`, 780 for `tab manager`, Oct 2026).
  `nameKeywords` reaches extensions search does not show but only matches the first ~25 characters of each name.
- Category pages are the store's own 32-item views; above 32 per category the actor merges sort/filter views,
  which tops out at roughly 190 unique extensions per category.
- Small extensions may have no user count or rating yet (`null`).
- Requests are paced (about 1 per second) to be polite to the store, so expect roughly 2,000-3,000 full records per
  hour; listing-only search results are much faster (hundreds per minute).

# Actor input Schema

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

Keywords to search the Chrome Web Store for, one search per line (e.g. `pdf editor`, `ad blocker`). Each returns the store's own results in the store's order, with the query and its `rank` on every row. Store search URLs (`https://chromewebstore.google.com/search/...`) work too.

## `maxResultsPerSearch` (type: `integer`):

How many results to take from each search, from the top. The store returns up to several hundred per query (about 300 for `pdf editor`, 780 for `tab manager` in Oct 2026).

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

Specific extensions: a store URL (`https://chromewebstore.google.com/detail/<name>/<id>`, old `chrome.google.com/webstore/detail/...` links work too) or the bare 32-letter ID. Category, collection and search URLs pasted here are also accepted.

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

Browse store categories. Each returns the store's own ranking for that category (up to `Max per category`).

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

Order used for category pages.

## `filterBy` (type: `string`):

Store-side filter for category pages.

## `maxItemsPerCategory` (type: `integer`):

The store shows 32 per category view. Above 32 the actor merges the other sort/filter views of the same category (up to ~190 unique).

## `collections` (type: `array`):

Editorial collections by slug or URL, e.g. `ai_assistants`, `tabs_control`, `https://chromewebstore.google.com/collection/weather_extensions`.

## `nameKeywords` (type: `array`):

Find extensions whose name starts with or contains these words (all words of a line must match), across every extension in the store, including ones search does not surface. Matches the first ~25 characters of each name. Much slower than search (it goes through the whole store, a few minutes per run), and stops as soon as `Max results` are found. For most jobs, use Search queries instead.

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

On: open each extension's page for version, last updated, size, languages, full description, publisher name, trader status, privacy practices and screenshots. Off: faster, cheaper listing data only (name, rating, users, badges, website, category, permissions). URL/ID and name-keyword results always get full details.

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

Add the ~12 'Related' extensions shown on each scraped extension's page (one level deep). Good for competitor discovery.

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

Skip extensions with fewer users.

## `maxUsers` (type: `integer`):

Skip extensions with more users (find small/new ones).

## `minRating` (type: `string`):

Skip extensions rated below this (0-5, e.g. `4.2`).

## `minRatingCount` (type: `integer`):

Skip extensions with fewer ratings.

## `featuredOnly` (type: `boolean`):

Keep only extensions with the store's Featured badge.

## `establishedOnly` (type: `boolean`):

Keep only extensions from publishers with the Established publisher badge (verified, good record).

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

Language of descriptions and labels (`en`, `de`, `fr`, `ja`, `pt-BR`...).

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

Hard cap on extensions for the whole run (also caps your cost).

## Actor input object example

```json
{
  "searchQueries": [
    "pdf editor"
  ],
  "maxResultsPerSearch": 20,
  "extensions": [
    "https://chromewebstore.google.com/detail/grammarly-ai-writing-assi/kbfnbcaeplbcioakkpcpgfkobkghlhen"
  ],
  "sortBy": "relevance",
  "filterBy": "all",
  "maxItemsPerCategory": 32,
  "includeDetails": true,
  "includeRelated": false,
  "featuredOnly": false,
  "establishedOnly": false,
  "language": "en",
  "maxItems": 50
}
```

# Actor output Schema

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

Chrome Web Store extensions with users, ratings, version, publisher, permissions and privacy practices, one item per extension (search results also carry the query and rank).

# 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 = {
    "searchQueries": [
        "pdf editor"
    ],
    "extensions": [
        "https://chromewebstore.google.com/detail/grammarly-ai-writing-assi/kbfnbcaeplbcioakkpcpgfkobkghlhen"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidyharvest/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 = {
    "searchQueries": ["pdf editor"],
    "extensions": ["https://chromewebstore.google.com/detail/grammarly-ai-writing-assi/kbfnbcaeplbcioakkpcpgfkobkghlhen"],
}

# Run the Actor and wait for it to finish
run = client.actor("tidyharvest/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 '{
  "searchQueries": [
    "pdf editor"
  ],
  "extensions": [
    "https://chromewebstore.google.com/detail/grammarly-ai-writing-assi/kbfnbcaeplbcioakkpcpgfkobkghlhen"
  ]
}' |
apify call tidyharvest/chrome-web-store-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tidyharvest/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/HCsUIABPQDp41vw8e/builds/7tOjMUmzyLgfw318v/openapi.json
