# Chrome Extension Category Rankings Scraper (`googleapi/chrome-extension-category-rankings-scraper`) Actor

Collect public Chrome Web Store category, search, and Top Charts positions with optional rich extension details.

- **URL**: https://apify.com/googleapi/chrome-extension-category-rankings-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

### What does Chrome Extension Category Rankings Scraper do?

This Actor collects public listing order from [Chrome Web Store](https://chromewebstore.google.com/) category, search, and Top Charts pages, then optionally enriches selected extensions from their public detail pages. It emits stable extension IDs, canonical URLs, category-only ranks, source positions for category/search/chart listings, chart type, source contexts across multiple listings, and public product, publisher, policy, and media attributes when those values are exposed.

`rankingPosition` is the one-based order observed in the requested public page. Top Charts pages are displayed with numbered entries, while category/search positions are source order; `categoryRank` is emitted only for category sources. This is source context, not a separate score. The Actor does not log in, call private APIs, solve CAPTCHAs, bypass access controls, or fabricate results when the site returns a generic shell or challenge.

### Why use Chrome Extension Category Rankings Scraper?

- Capture a reproducible category/search sample or Popular, Trending, and New and notable Top Charts positions.
- Compare public ratings, review counts, user counts, versions, publishers, and permission names.
- Follow observed public next links for bounded pagination.
- Combine several category/search sources, deduplicate by extension ID, and apply global client-side sorting.
- Keep media tied to the extension card or detail page; blocked or empty sources are logged and counted without polluting the dataset.

The Actor processes pages sequentially to preserve source order. When a listing response exposes an extension manifest, the Actor retains its public version, compatibility, permission, content-script, command, and action-label fields without making extra requests. `includeDetails` is opt-in for additional detail-page fields. Requests use direct public HTTPS; `proxyConfiguration` is accepted for compatibility but does not change the connection.

### What data can Chrome Extension Category Rankings Scraper extract?

| Group | Fields |
| --- | --- |
| Identity | `extensionId`, `extensionUrl`, `canonicalUrl`, `title`, `name` |
| Ranking context | `rankingSourceType`, `recordSourceType`, `rankingChartType` (Top Charts only), `rankingPosition`, `categoryRank` (category pages only), `sourcePageNumber`, `rankingContexts`, `categoryPath`, `categoryLabel`, `categoryUrl`, `rankBasis`, `rankingSourceUrl`, `rankingPageUrl`, `rankingQuery` |
| Public listing details | `shortDescription`, `description`, `descriptionText`, `descriptionHtml`, `overviewText`, `rating`, `ratingText`, `ratingScale`, `ratingCount`, `ratingCountText`, `reviewCount`, `reviewCountText`, `userCount`, `userCountText`, `version`, `versionName`, `updatedAt`, `updatedAtText`, `updatedAtPrecision`, `updatedAtIsEstimated` |
| Publisher and policy | `developer`, `offeredBy`, `developerUrl`, `publisherUrl`, `developerEmail`, `developerPhone`, `developerAddress`, `developerPostalCode`, `developerCity`, `developerCountryCode`, `developerDunsNumber`, `developerIsTrader`, `traderStatus`, `traderStatusText`, `privacyPolicyUrl`, `privacyDisclosureText`, `privacyDataSold`, `privacyDataUsedForUnrelatedPurposes`, `privacyDataUsedForCreditworthiness`, `supportUrl`, `reviewUrl`, `websiteUrl` |
| Store details | `features`, `featuresText`, `offersInAppPurchases`, `sizeText`, `sizeBytes`, `languages`, `languageCount`, `permissions`, `requiredPermissions`, `optionalPermissions`, `hostPermissions`, `optionalHostPermissions`, `manifestVersion`, `minimumChromeVersion`, `defaultLocale`, `shortName`, `contentScriptMatches`, `contentScriptExcludeMatches`, `contentScriptCount`, `commandNames`, `actionTitle`, `optionsPagePath`, `isFeatured`, `followsRecommendedPractices`, `publisherGoodRecord` |
| Media and optional text | `iconUrl`, `thumbnail`, `imageUrls`, `imageCount`, `screenshotUrls`, `screenshotCount`, `listingText` |

Each dataset row represents an extension found on a public listing. If a source is empty or unavailable, the run summary and logs explain the result; an error page is never presented as an extension record.

### How to scrape Chrome Web Store categories

1. Open the Actor Input tab.
2. Enter official category/search/Top Charts URLs in `startUrls`, or supply `queries`/`category` to generate public source URLs.
3. Choose page/item limits, filters, sort order, detail enrichment, and media settings.
4. Run the Actor, then review the dataset and the run summary.

Custom `startUrls`, `sourceUrls`, `urls`, and `extensionIds` take precedence over generated queries/category sources. Duplicate source URLs are removed before collection. Only official HTTPS Chrome Web Store hosts and specific category/search/Top Charts/detail routes are accepted. The broad `/category/extensions` page mixes editorial shelves, so it is not treated as one ranked category. The default category is `productivity/tools`. Top Charts routes are `/top-charts/popular`, `/top-charts/trending`, and `/top-charts/notable`; `rankingChartType` preserves which tab supplied each record. `categoryRank` is present only for specific category listings. Deduplicated results retain each observed position and chart type in `rankingContexts`.

### How much will it cost to scrape Chrome Web Store?

Keep costs manageable by limiting `maxItems` and `maxPages`, or leaving optional detail enrichment off.

### Input

See the Input tab for the complete configuration. The main fields are:

- Sources: `startUrls`, `sourceUrls`, `urls`, `queries`, `query`, `searchQuery`, `category`, and `extensionIds`.
- Legacy input compatibility: `mode` (`search`/`details`), `language` (locale alias), and `maxDetailRequests` (detail-limit alias) are accepted and normalized.
- Pagination and limits: `page` (one-based starting page, default 1), `maxItems` (1–100, default 25), `maxPages` (1–10 pages per source from the selected start page, default 1), `maxRequests` (1–200, default 75), and `deduplicate` (default `true`). To reach a later page, the Actor follows observed same-host `rel="next"`/“load more” URLs while preserving source order; it does not invent URL offsets.
- Filters and sorting: `minRating` (0–5, default 0), `minReviewCount` (default 0), and `sortBy` (`source_order`, `rating_desc`, `review_count_desc`, or `user_count_desc`; default `source_order`). Missing numeric values fail a positive minimum and sort after populated values.
- Dataset fields: `includeDetails` (default `false`), `maxDetailItems` (0–50, default 10), `includeMedia` (default `true`), and `includePageText` (default `true`). Detail enrichment is explicitly opt-in; when enabled, it retains the full available Overview text and public publisher/policy/store fields. Manifest fields found in the already-fetched listing response do not require this toggle or additional requests. Detail failures retain the valid listing record and are counted outside the dataset. Diagnostics never become dataset rows.
- `locale` sets the Chrome Web Store language and region. `proxyConfiguration` is accepted for users who need to route permitted public requests through Apify Proxy.
  Unknown fields, conflicting aliases, invalid ranges, unrelated hosts, and malformed routes are rejected. Use an official Chrome Web Store category, search, Top Charts, or detail URL.

### Output

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

Example record shape (illustrative values only; runtime output is populated only from observed source data):

```json
{
  "extensionUrl": "https://chromewebstore.google.com/detail/example-tab-helper/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "canonicalUrl": "https://chromewebstore.google.com/detail/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "extensionId": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "title": "Example Tab Helper",
  "name": "Example Tab Helper",
  "description": "Organize browser tabs with a simple public extension.",
  "shortDescription": "Organize browser tabs and restore saved sessions.",
  "descriptionText": "Organize browser tabs with a simple public extension.",
  "overviewText": "Organize browser tabs with a simple public extension.",
  "categoryPath": "productivity/tools",
  "categoryLabel": "Tools",
  "rankingSourceType": "category",
  "recordSourceType": "category",
  "rankingPosition": 3,
  "categoryRank": 3,
  "sourcePageNumber": 1,
  "rankBasis": "source_order",
  "rankingSourceUrl": "https://chromewebstore.google.com/category/extensions/productivity/tools?hl=en-US",
  "rankingPageUrl": "https://chromewebstore.google.com/category/extensions/productivity/tools?hl=en-US",
  "rankingContexts": [{ "rankingSourceType": "category", "rankingPosition": 3, "categoryRank": 3, "sourcePageNumber": 1, "rankBasis": "source_order", "rankingSourceUrl": "https://chromewebstore.google.com/category/extensions/productivity/tools?hl=en-US", "rankingPageUrl": "https://chromewebstore.google.com/category/extensions/productivity/tools?hl=en-US" }],
  "rating": 4.7,
  "ratingText": "4.7 out of 5",
  "ratingScale": 5,
  "ratingCount": 1200,
  "ratingCountText": "1.2K ratings",
  "reviewCount": 1200,
  "reviewCountText": "1.2K ratings",
  "userCount": 10000,
  "userCountText": "10K",
  "version": "2.1.0",
  "versionName": "Spring release",
  "manifestVersion": 3,
  "minimumChromeVersion": "114",
  "defaultLocale": "en",
  "updatedAt": "2026-08-01T00:00:00.000Z",
  "updatedAtText": "Aug 1, 2026",
  "updatedAtPrecision": "day",
  "updatedAtIsEstimated": false,
  "developer": "Example Labs",
  "offeredBy": "Example Labs",
  "developerEmail": "hello@example.test",
  "developerIsTrader": null,
  "privacyPolicyUrl": "https://example.test/privacy",
  "privacyDataSold": null,
  "privacyDataUsedForUnrelatedPurposes": null,
  "privacyDataUsedForCreditworthiness": null,
  "supportUrl": "https://example.test/support",
  "websiteUrl": "https://example.test/",
  "features": ["Offers in-app purchases"],
  "offersInAppPurchases": true,
  "sizeText": "2.5MiB",
  "sizeBytes": 2621440,
  "languages": ["English"],
  "languageCount": 1,
  "permissions": ["storage", "tabs"],
  "requiredPermissions": ["storage", "tabs"],
  "optionalPermissions": ["bookmarks"],
  "hostPermissions": ["https://example.test/*"],
  "contentScriptMatches": ["https://example.test/*"],
  "contentScriptCount": 1,
  "commandNames": ["_execute_action"],
  "actionTitle": "Open tab manager",
  "optionsPagePath": "options.html",
  "iconUrl": "https://lh3.googleusercontent.com/example-icon",
  "thumbnail": "https://lh3.googleusercontent.com/example-image",
  "imageUrls": ["https://lh3.googleusercontent.com/example-image"],
  "imageCount": 1,
  "screenshotUrls": ["https://lh3.googleusercontent.com/example-screenshot"],
  "screenshotCount": 1
}
```

### Source coverage and verification

Listing-card values (name, card summary, rating/count labels, user labels, and card imagery) are retained only when present in the public card markup or matching source-identified structured data. The card summary is available as `shortDescription`; it may equal `description` when only that summary was fetched, while detail enrichment can populate `description`/`descriptionText` with the full Overview. The Developer-section website, a product website, and a distinct structured publisher profile remain separate fields and are not substituted for one another. When the public listing embeds a manifest, the Actor also captures its version name, manifest version, minimum Chrome version, locale, permission groups, content-script URL patterns, command names, action label, and settings page path. Detail-page enrichment adds the public Overview, publisher/contact details, update information, privacy disclosures, languages, store attributes, links, and media when actually exposed. Missing values remain absent rather than receiving guessed defaults. If the Store returns a sign-in page, challenge, generic shell, or other access boundary, the run summary and logs report it, and it does not produce a dataset row.

### Tips and advanced options

Use `sortBy: "source_order"` when you want the observed website order. Other sort choices are global only across the bounded pages actually fetched; they are not claims about the entire Store. Set `includeDetails: true` to opt into bounded detail-page enrichment, or `maxDetailItems: 0` to disable it. `includeMedia: false` removes image fields from normal output. `includePageText` retains a bounded text preview and defaults to `true`; set it to `false` to omit `listingText`.

Default input:

```json
{ "category": "productivity/tools", "maxItems": 5, "maxPages": 1 }
```

Filters and sorting:

```json
{ "queries": ["tab manager"], "minRating": 4, "minReviewCount": 100, "sortBy": "rating_desc", "maxItems": 10 }
```

Multiple sources and pagination:

```json
{ "startUrls": [{ "url": "https://chromewebstore.google.com/category/extensions/productivity/tools?hl=en-US" }, { "url": "https://chromewebstore.google.com/search/tab%20manager?hl=en-US" }], "maxPages": 2, "deduplicate": true, "maxItems": 20 }
```

### FAQ, support, and responsible use

If a run contains no records, check that the source URL is a supported public Chrome Web Store page, then review the run summary and logs. Public source availability can vary; access challenges and generic shells are reported outside the dataset. This Actor never solves CAPTCHAs or bypasses login walls.

Use only public data and respect Google/Chrome Web Store terms, privacy laws, and publisher rights. Do not use the Actor to collect private content or evade access controls. This Actor is not affiliated with Google or the Chrome Web Store. Report reproducible issues in the Issues tab with a run ID and the input you used.

# Actor input Schema

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

Official Chrome Web Store category, search, Top Charts, or detail URLs. These sources take precedence over generated category/query sources.

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

Compatibility alias for an array of official Chrome Web Store source URLs.

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

Compatibility alias for sourceUrls.

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

Public search terms converted to Chrome Web Store search URLs.

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

Compatibility alias for one search query.

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

Compatibility alias for one search query.

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

Specific category path used when no explicit source or query is supplied, for example productivity/tools or productivity/developer. The mixed Extensions landing page is not a single ranked category.

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

Compatibility detail-source alias for 32-character Chrome extension IDs.

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

Compatibility alias accepting search or details; source fields still determine the actual target pages.

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

One-based page to begin collecting from. The Actor follows observed next-page links to reach it, preserving the actual source order.

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

Global maximum normal records emitted after filtering and sorting.

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

Maximum pages collected per source starting from page. Pagination follows observed same-host next links and stops on missing or repeated URLs.

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

Global cap on listing and detail page requests.

## `deduplicate` (type: `boolean`):

Deduplicate records globally by extension ID across pages and sources.

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

Global client-side order after the permitted source pages are collected.

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

Optional minimum rating. Missing ratings fail this filter only when the value is greater than zero.

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

Optional minimum public review/rating count. Missing counts fail this filter only when the value is greater than zero.

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

Fetch selected public detail pages for full Overview text, publisher contacts, privacy, links, size, languages, and media. Manifest fields already present on listing pages are collected without extra detail requests.

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

Global bound on selected detail pages fetched after listing collection.

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

Compatibility alias for maxDetailItems.

## `includeMedia` (type: `boolean`):

Retain extension images that are associated with a listing card or detail page.

## `includePageText` (type: `boolean`):

Retain the public text preview extracted from each listing page.

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

Delay between public requests.

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

Fixed at 1 so pages per source remain ordered and bounded.

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

Bounded retries for request failures, timeouts, and HTTP 5xx responses.

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

Compatibility alias for maxRequestRetries.

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

Timeout for each public request.

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

Compatibility alias for requestTimeoutSecs.

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

Alternative timeout form.

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

Bound HTML retained from each public page.

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

Optional ordinary user-agent label; no stealth or fingerprint evasion is used.

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

Locale query used for generated sources, such as en-US.

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

Compatibility alias for locale.

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

Accepted for compatibility but not wired into transport; direct public HTTPS is used and the run summary records that it was ignored.

## Actor input object example

```json
{
  "category": "productivity/tools",
  "page": 1,
  "maxItems": 25,
  "maxPages": 1,
  "maxRequests": 75,
  "deduplicate": true,
  "sortBy": "source_order",
  "minRating": 0,
  "minReviewCount": 0,
  "includeDetails": false,
  "maxDetailItems": 10,
  "includeMedia": true,
  "includePageText": true,
  "requestDelayMs": 0,
  "maxConcurrency": 1,
  "maxRequestRetries": 1,
  "requestTimeoutSecs": 25,
  "maxResponseBytes": 3000000,
  "locale": "en-US"
}
```

# Actor output Schema

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

No description

## `summary` (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-category-rankings-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-category-rankings-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-category-rankings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,googleapi/chrome-extension-category-rankings-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/DnPLwsGJ5gheJwkiF/builds/1HsbOo9H3i0fjohfu/openapi.json
