# Chrome Extension Competitor Analysis Scraper (`googleapi/chrome-extension-competitor-analysis-scraper`) Actor

Compare competing extensions using public store metadata and review signals.

- **URL**: https://apify.com/googleapi/chrome-extension-competitor-analysis-scraper.md
- **Developed by:** [Google API](https://apify.com/googleapi) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.99 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Extension Competitor Analysis Scraper

### What does this Actor do?

This Actor builds a bounded comparison cohort from public [Chrome Web Store](https://chromewebstore.google.com/) listings. It accepts official extension IDs/detail URLs, store search or category URLs, and search terms, then collects listing data. Enable `includeDetails` explicitly to fetch discovered extensions' public detail pages for richer records. Missing or inaccessible information is left absent; it is never invented.

### Why use it?

Compare competitors by public install/user ranges, ratings, review totals, update dates, categories, privacy disclosures, developer information, permission declarations, and cohort-relative ranks or shares. Use the output for product research, category monitoring, and competitor shortlists. Apify runs provide the dataset, run history, scheduling, API access, and integrations; this Actor does not require a browser login.

### What data can it extract?

Fields appear when present in the public listing or embedded manifest, or when they can be calculated from the selected comparison group.

| Group | Example fields |
|---|---|
| Identity and availability | `extensionId`, `canonicalUrl`, `extensionUrl`, `availability` |
| Listing content | `title`, `name`, `descriptionText`, `descriptionHtml`, `categoryPath`, `categoryLabel`, `features` |
| Developer | `developer`, `offeredBy`, `developerUrl`, public contact fields, `developerIsTrader`, `traderStatus` |
| Popularity and updates | `rating`, `ratingCount`, `reviewCount`, `userCount`, `version`, `updatedAtText`, `updatedAtPrecision` |
| Manifest and media | `permissions`, `optionalPermissions`, `hostPermissions`, `contentScriptMatches`, `manifestVersion`, `minimumChromeVersion`, `iconUrl`, `screenshotUrls` |
| Privacy and links | `privacyDisclosureText`, nullable privacy signals, `privacyPolicyUrl`, `websiteUrl`, `supportUrl`, `externalLinks` |
| Cohort analysis | `comparisonGroup`, `cohortSize`, `userRank`, `ratingRank`, `userShare`, `reviewShare`, `ratingGapToTop`, `competitivePosition` |

The complete raw dataset retains all 84 declared properties, even though the Console overview table shows only the most useful columns. Optional values that the source does not expose are omitted.

### How to scrape Chrome Web Store competitors

1. Open the Actor input form and choose one or more extension IDs, official store URLs, queries, or a category.
2. Set the result, page, request, and optional filter limits. Detail enrichment is disabled by default; enable it explicitly when fuller discovered-extension rows are required.
3. Run the Actor and review the overview, public metadata, and comparison views. For automation, use the dataset API or schedule the Actor in Apify.

### How much does a run cost?

Apify compute pricing depends on your account plan and the resources used by a run. More sources, pages, or detail enrichment can increase runtime. Start with a small cohort, then raise `maxItems`, `maxPages`, or `maxDetailItems` as needed. `maxRequests` sets an additional cap on page requests.

### Scope and access boundary

The Actor reads public pages from official Chrome Web Store hosts. It does not log in, bypass account gates or CAPTCHAs, call private APIs, or infer fields hidden by the source. If a page is redirected, blocked, generic, malformed, or unavailable, the run summary and logs report the issue; it is not added as a competitor record.

### Input

#### Quick-start example

Omitting sources uses the default Chrome Web Store Extensions category.

```json
{
  "maxItems": 5,
  "maxPages": 1
}
```

#### Detail targets

```json
{
  "extensionIds": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"],
  "comparisonGroup": "salesforce-tools",
  "maxItems": 10,
  "sortBy": "user_count_desc"
}
```

#### Listing search, pagination, and multiple sources

```json
{
  "startUrls": [
    { "url": "https://chromewebstore.google.com/search/password+manager?hl=en" },
    { "url": "https://chromewebstore.google.com/search/credential+manager?hl=en" }
  ],
  "mode": "search",
  "includeDetails": false,
  "page": 2,
  "maxPages": 3,
  "maxItems": 40,
  "sortBy": "source_order"
}
```

#### Detail enrichment with filters

```json
{
  "queries": ["password manager", "credential manager"],
  "mode": "intelligence",
  "maxItems": 30,
  "maxDetailItems": 10,
  "minRating": 4,
  "minReviewCount": 100,
  "sortBy": "rating_desc"
}
```

Explicit extension IDs, official `startUrls`/`sourceUrls`/`urls`, queries, `query`, `searchQuery`, and category sources are supported. `maxItems` is the global emitted-row cap; `maxDetailItems` (default: the `maxItems` value) and its compatibility alias `maxDetailRequests` only cap detail-page enrichment. Detail enrichment is opt-in for discovered extensions: set `includeDetails` to `true` for fuller rows. Direct detail URLs and extension IDs are always fetched as primary targets. The one-based `page` start follows public next-page links, and `maxPages` is the number of listing pages collected from that start page per source.

#### Supported input controls

| Control | Behavior |
|---|---|
| `extensionIds`, `startUrls`, `sourceUrls`, `urls`, `query`, `queries`, `searchQuery`, `category` | Public source targets; all URLs must use an official Chrome Web Store host and supported path. Duplicate sources are removed. |
| `mode`, `includeDetails`, `maxDetailItems`, `maxDetailRequests` | Detail enrichment defaults off; `includeDetails: true` opts search/category candidates in. Explicit IDs/detail URLs are still fetched. The detail limit is separate from `maxItems`. |
| `maxItems`, `maxPages`, `maxRequests`, `page` | Global row limit; per-source listing-page limit; run-wide request ceiling (if omitted, `max(25, 3 × maxItems)`, capped at 250); one-based starting page reached through observed next links. |
| `minRating`, `minReviewCount`, `sortBy`, `comparisonGroup` | Minimum-value filters and one of `user_count_desc`, `rating_desc`, `review_count_desc`, or `source_order`; rankings/shares are calculated on the resulting cohort. |
| `locale`, `language` | Chrome Web Store language and region. `language` is a compatibility alias for `locale`. |

### Dataset contract

The schema exposes 84 supported public/business fields: extension identity, full Overview and description text plus sanitized `descriptionHtml`, category, developer/legal contact details, rating/review/user counts, version and update precision, required and optional permissions, host permissions, content-script URL patterns, manifest version and minimum Chrome version when those values are present in the public embedded manifest, privacy disclosures, policy/site/support/contact links, related extension IDs, features, size, languages, icon and screenshots, version history, availability, comparison group/query, cohort size, source/user/rating/review ranks, user/review shares, rating gap to the cohort leader, and qualitative competitive position. Each row contains only values the public page actually exposes; manifest values are not inferred and absent fields are omitted.

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. The run summary is available alongside the dataset in the Output tab.

#### Example rich record

This anonymized example demonstrates the shape of a detail-enriched business row; optional fields are omitted when the public store page does not provide them.

```json
{
  "canonicalUrl": "https://chromewebstore.google.com/detail/example-helper/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "extensionId": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "extensionUrl": "https://chromewebstore.google.com/detail/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "title": "Example Helper",
  "name": "Example Helper",
  "description": "Organize example web pages across devices.",
  "descriptionText": "Organize example web pages across devices.\n\nCreate searchable collections.",
  "descriptionHtml": "<p>Organize example web pages across devices.</p><p>Create searchable collections.</p>",
  "availability": "available",
  "categoryPath": "Productivity/Tools",
  "categoryLabel": "Tools",
  "developer": "Example Labs",
  "developerUrl": "https://developer.example/",
  "rating": 4.6,
  "ratingScale": 5,
  "ratingCount": 1280,
  "reviewCount": 1280,
  "userCount": 100000,
  "userCountText": "100,000 users",
  "version": "2.4.1",
  "updatedAt": "2025-01-02",
  "updatedAtText": "January 2, 2025",
  "updatedAtPrecision": "day",
  "updatedAtIsEstimated": false,
  "permissions": ["storage", "tabs"],
  "permissionCount": 2,
  "optionalPermissions": ["notifications"],
  "hostPermissions": ["https://example.com/*"],
  "manifestVersion": 3,
  "minimumChromeVersion": "110",
  "privacyPolicyUrl": "https://developer.example/privacy",
  "privacyDataSold": false,
  "websiteUrl": "https://product.example/",
  "supportUrl": "https://support.example/",
  "iconUrl": "https://lh3.googleusercontent.com/example-icon",
  "languages": ["English", "French"],
  "languageCount": 2,
  "comparisonGroup": "productivity-tools",
  "comparisonQuery": "bookmark manager",
  "cohortSize": 8,
  "sourceRank": 1,
  "userRank": 1,
  "ratingRank": 2,
  "reviewRank": 3,
  "userShare": 0.25,
  "reviewShare": 0.18,
  "ratingGapToTop": 0.2,
  "competitivePosition": "leader"
}
```

user_count_desc is the default comparison order. rating_desc, review_count_desc, and source_order are also supported. Missing values are left unranked and sorted after populated values. Filters apply before cohort metrics are calculated.

### Tips and responsible use

Use the search inputs to define a comparison cohort, or provide extension IDs for exact targets. Increase `maxItems` and `maxDetailItems` together when you need more fully enriched results; set `includeDetails: false` to reduce requests at the cost of narrower listing fields. Results with missing ratings or user counts sort after records with values and are left unranked for that metric. If a detail page is unavailable, the listing information already collected can still be returned; check the run summary and logs for details.

This Actor is not affiliated with Google or the Chrome Web Store. It requests public pages only and does not access private user data, log in, or bypass access controls. Users must comply with Chrome Web Store terms, applicable laws, and reasonable request rates. Public developer contact details may be personal data; use them only with a legitimate purpose and consult qualified counsel when needed. Report bugs through the Actor's Issues tab with a run ID and short description; use the API tab for programmatic runs.

# Actor input Schema

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

Chrome extension IDs or official detail URLs.

## `startUrls` (type: `array`):

Official Chrome Web Store detail, search, or category URLs.

## `sourceUrls` (type: `array`):

Alias for startUrls.

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

Compatibility alias for official source URLs.

## `queries` (type: `array`):

Public Chrome Web Store search terms that define a competitor cohort.

## `query` (type: `string`):

One public competitor search term.

## `searchQuery` (type: `string`):

Compatibility alias for query.

## `category` (type: `string`):

One category path segment used when no explicit source is supplied.

## `comparisonGroup` (type: `string`):

Business label attached to every comparison row.

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

Collection intent label. Enable Include details explicitly to enrich discovered extensions. Direct detail targets are always fetched.

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

Maximum normal comparison rows.

## `maxPages` (type: `integer`):

Maximum listing pages per source.

## `maxRequests` (type: `integer`):

Maximum public listing and detail fetches for the run. If omitted, runtime derives a bounded default from maxItems: max(25, 3 × maxItems), capped at 250.

## `maxDetailItems` (type: `integer`):

Maximum discovered listing candidates to fetch as public detail pages. This is independent of maxItems; candidates beyond this detail limit are returned as listing-only records.

## `maxDetailRequests` (type: `integer`):

Compatibility alias for maxDetailItems. It limits detail-page fetches only and never reduces global maxItems.

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

Order used for the final cohort rows.

## `minRating` (type: `number`):

Optional rating filter from 0 to 5.

## `minReviewCount` (type: `integer`):

Optional minimum review/rating count.

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

Opt in to fetching public detail pages for extensions discovered from search or category listings. Disabled by default. Explicit detail URLs and extension IDs are always fetched as primary targets.

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

Delay between public requests.

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

Fixed at one for polite sequential requests.

## `maxRequestRetries` (type: `integer`):

Retries for transient requests.

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

Compatibility alias for maxRequestRetries.

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

Per-request timeout.

## `timeoutSecs` (type: `integer`):

Compatibility timeout alias.

## `requestTimeoutMs` (type: `integer`):

Compatibility millisecond timeout.

## `maxResponseBytes` (type: `integer`):

Bound retained HTML.

## `locale` (type: `string`):

Store locale such as en-US or en.

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

Compatibility alias for locale.

## `userAgent` (type: `string`):

Optional ordinary public browser user agent.

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

Compatibility field; direct public HTTPS is used.

## `page` (type: `integer`):

One-based starting page. Earlier pages are skipped only by following observed rel=next links from the public source; no page URL offsets are invented.

## Actor input object example

```json
{
  "category": "extensions",
  "maxItems": 25,
  "maxPages": 2,
  "sortBy": "user_count_desc",
  "minRating": 0,
  "minReviewCount": 0,
  "includeDetails": false,
  "requestDelayMs": 0,
  "maxConcurrency": 1,
  "maxRequestRetries": 1,
  "requestTimeoutSecs": 25,
  "maxResponseBytes": 3000000,
  "locale": "en-US",
  "page": 1
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `runSummary` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("googleapi/chrome-extension-competitor-analysis-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("googleapi/chrome-extension-competitor-analysis-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 '{}' |
apify call googleapi/chrome-extension-competitor-analysis-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,googleapi/chrome-extension-competitor-analysis-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/cEeE6psrGqs7Y3R5Z/builds/vrfsHetcfHKx6PbNm/openapi.json
