# Chrome Web Store & Firefox Add-ons Scraper: Reviews & Ranks (`aria-data/browser-extension-intelligence`) Actor

Scrape Chrome Web Store, Firefox Add-ons and Edge Add-ons extensions: users, rating, version, last updated, developer, permissions with a risk score, reviews (Chrome + Firefox) and category / keyword rank snapshots. onlyNew review monitoring.

- **URL**: https://apify.com/aria-data/browser-extension-intelligence.md
- **Developed by:** [ARIA Data](https://apify.com/aria-data) (community)
- **Categories:** Developer tools, Lead generation, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 extension profile 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?

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 & Firefox Add-ons Scraper: Extensions, Reviews & Rankings

Scrape **Chrome Web Store**, **Firefox Add-ons (AMO)** and **Microsoft Edge Add-ons** extension data in one clean schema: user count, rating, rating count, version, last updated, developer and contact email, category, **permissions with a permission risk score**, reviews, and **category / keyword rank snapshots**. Schedule it with `onlyNewReviews` to get only the new reviews since your last run.

Built for **security & IT teams** auditing browser extensions, **extension developers** tracking competitors and reviews, and **growth / M\&A teams** sizing extension businesses. HTTP only (no browser), so it is fast and cheap.

### What you get

| Store | Profile | Reviews | Rank snapshots |
|---|---|---|---|
| Chrome Web Store | ✅ users, rating, ratings count, version, updated, size, languages, developer + email, privacy policy, full manifest permissions | ✅ newest or most helpful, paged | ✅ category (first page, ~32) and search (~10) |
| Firefox Add-ons | ✅ daily users, weekly downloads, rating + 1-5★ histogram, version, created/updated, license, permissions, data-collection permissions, Recommended badge | ✅ newest first, paged, developer replies | ✅ category (sort by users/rating/updated…) and search, up to 500 |
| Edge Add-ons | ✅ active installs, rating, version, updated, permissions, privacy disclosures | – | – |

#### Permission risk score

Every profile carries `permissionRiskLevel` (low / medium / high), `permissionRiskScore` (0-100), `highRiskPermissions`, `mediumRiskPermissions` and `accessesAllSites`, computed from the extension's manifest (e.g. `<all_urls>`, `cookies`, `webRequestBlocking`, `debugger`, `nativeMessaging`, `history`). Use it to flag risky extensions across your fleet in one run.

#### Change monitor (new)

Set `monitorChanges` (and a `monitorId`) and every profile gets a `changes` list versus your last run: **new version, permissions added or removed, developer or contact email change, permission risk level change, description rewrite, users down or up 10%+, rating move of 0.1+**. Add `onlyChanged` and you are only returned (and only charged) for extensions that actually changed. The first run saves the baseline (`isFirstSnapshot: true`). Typical use: a daily schedule over the extensions your company allows, alerting when one quietly asks for `<all_urls>` or changes owner.

### Use cases

- **Extension security audit**: paste the extension IDs installed in your company and get users, last update, developer and permission risk for each.
- **Competitor tracking**: users, rating and version for your competitors on Chrome and Firefox, every week.
- **Supply-chain watch**: schedule daily with `monitorChanges` + `onlyChanged` to get an alert-ready record when an installed extension changes owner, version or permissions.
- **Review monitoring**: schedule daily with `onlyNewReviews` + `reviewRatings: [1,2]` to catch new complaints.
- **Category & keyword rankings**: who ranks for "password manager" or tops `productivity/workflow` today.
- **Market research / lead generation**: developer names, websites and support emails for extensions in a niche.

### Input examples

Profiles only:

```json
{ "extensions": ["https://chromewebstore.google.com/detail/ublock-origin-lite/ddkjiahejlhfcafbddmgiahcphecmpfh", "firefox:darkreader", "edge:odfafepnkmbhccpbejgmiehpchacaeak"] }
```

New 1-2★ reviews (daily schedule):

```json
{ "extensions": ["nngceckbapebfimnlniiiahkandclblb"], "includeReviews": true, "reviewRatings": [1, 2], "onlyNewReviews": true, "monitorId": "bitwarden-complaints" }
```

Daily change watch (only changed extensions are returned and charged):

```json
{ "extensions": ["nngceckbapebfimnlniiiahkandclblb", "firefox:darkreader"], "monitorChanges": true, "onlyChanged": true, "monitorId": "fleet-watch" }
```

Rank snapshots:

```json
{ "rankStore": "firefox", "rankCategories": ["privacy-security"], "rankSearchKeywords": ["tab manager"], "rankMaxItems": 100 }
```

Accepted inputs: store URLs (Chrome `chromewebstore.google.com/detail/...` and old `chrome.google.com/webstore/detail/...`, `addons.mozilla.org/.../addon/<slug>/`, `microsoftedge.microsoft.com/addons/detail/...`), bare 32-letter IDs (Chrome by default, or Edge via `defaultStore`), Firefox slugs or GUIDs, and `chrome:` / `firefox:` / `edge:` prefixes.

### Output

One dataset with `recordType` = `extension`, `review` or `rank-snapshot`, plus ready-made views: **Extension profiles**, **Reviews**, **Rank snapshots** and **Ranked extensions (flat)**. A `RUN_SUMMARY` record lists every input with its status (`ok` / `not_found` / `error`).

Example profile (shortened):

```json
{
  "store": "chrome", "extensionId": "ddkjiahejlhfcafbddmgiahcphecmpfh", "name": "uBlock Origin Lite",
  "developerName": "Raymond Hill (gorhill)", "developerEmail": "ubo@raymondhill.net",
  "users": 22000000, "rating": 4.519, "ratingCount": 3739, "category": "make_chrome_yours/privacy",
  "version": "2026.1021.1354", "lastUpdated": "2026-10-21T17:59:52Z", "manifestVersion": 3,
  "permissions": ["activeTab", "declarativeNetRequest", "scripting", "storage"], "hostPermissions": ["<all_urls>"],
  "permissionRiskLevel": "high", "permissionRiskScore": 71, "accessesAllSites": true
}
```

### Pricing (pay per event)

| Event | Price | Per 1,000 |
|---|---|---|
| Actor start | $0.00005 | – |
| Extension profile | $0.003 | $3.00 |
| Review | $0.00075 | $0.75 |
| Rank snapshot (one whole list) | $0.01 | $10 per 1,000 lists |

Not-found extensions, filtered-out reviews and empty lists are free. Platform usage is included. Example: 50 extension profiles + 20 reviews each = $0.15 + $0.75 = **$0.90**.

### Notes & limits

- Chrome user counts are as the store shows them (rounded, e.g. 22,000,000). Firefox `users` = average daily users. Edge `users` = active installs.
- Chrome reviews come newest first (or most helpful); a date filter stops paging as soon as it reaches older reviews.
- Chrome rank snapshots cover the first results page; Firefox lists page up to 500.
- Edge reviews and change alerts (new version, permission or owner change) are on the roadmap. Request features in the Issues tab.
- Public store pages and APIs only, politely paced. No login, no personal data beyond public reviewer display names.

### FAQ

**Can I schedule it?** Yes. Save a task and add a schedule; use `onlyNewReviews` with a `monitorId` so each run returns only new reviews.
**Integrations?** Export to CSV/Excel/JSON, or send results to Google Sheets, Slack, Make, Zapier or n8n through Apify integrations.
**Do I need a proxy?** No for normal volumes. For thousands of Chrome extensions per run you can enable Apify Proxy.

# Actor input Schema

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

Chrome Web Store, Firefox Add-ons or Edge Add-ons URLs. Bare 32-letter IDs are treated as Chrome (see Default store); other bare values as Firefox slugs. Prefixes also work: 'firefox:darkreader', 'edge:<id>', 'chrome:<id>'.

## `defaultStore` (type: `string`):

Chrome and Edge both use 32-letter IDs; pick which store a bare ID refers to.

## `includeReviews` (type: `boolean`):

Also return reviews (Chrome Web Store and Firefox Add-ons; Edge reviews are not supported yet).

## `maxReviewsPerExtension` (type: `integer`):

Stop after this many reviews per extension (newest first).

## `reviewSort` (type: `string`):

Firefox reviews are always newest first. Date filtering stops early only with newest first.

## `reviewsSince` (type: `string`):

Only reviews on or after this date: YYYY-MM-DD, or a period like '30 days' / '2 weeks'.

## `reviewRatings` (type: `array`):

e.g. \["1", "2"] for complaints only. Empty = all ratings.

## `onlyNewReviews` (type: `boolean`):

Return (and charge) only reviews not returned by an earlier run with the same Monitor ID. Ideal for scheduled runs.

## `monitorChanges` (type: `boolean`):

Compare each profile with the last run that used the same Monitor ID and add a `changes` list (new version, permissions added or removed, owner or contact change, risk level change, description rewrite, users down or up 10%+, rating moves 0.1+). The first run saves the baseline (isFirstSnapshot = true).

## `onlyChanged` (type: `boolean`):

With change monitoring on, return (and charge) a profile only when something changed since the last run. Unchanged extensions cost nothing. Ideal for daily security or competitor watches.

## `monitorId` (type: `string`):

Separate 'seen reviews' memory per monitor, so different schedules don't interfere.

## `rankStore` (type: `string`):

Which store the category / keyword lists below are taken from.

## `rankCategories` (type: `array`):

Chrome: category slugs like 'productivity/workflow', 'productivity/developer', 'make_chrome_yours/privacy', 'lifestyle/shopping' (or the category URL). Firefox: slugs like 'privacy-security', 'tabs', 'appearance', 'shopping'.

## `rankSearchKeywords` (type: `array`):

Store search results in order, e.g. 'password manager', 'ad blocker'.

## `rankMaxItems` (type: `integer`):

Firefox lists page up to 500. Chrome returns the first results page (about 32 for categories, about 10 for searches).

## `rankSortFirefox` (type: `string`):

Sort order for Firefox category lists.

## `requestIntervalSecs` (type: `number`):

Politeness delay per store.

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

Optional. Not needed for normal volumes; use it for very large Chrome runs.

## Actor input object example

```json
{
  "extensions": [
    "https://chromewebstore.google.com/detail/ublock-origin-lite/ddkjiahejlhfcafbddmgiahcphecmpfh",
    "https://addons.mozilla.org/en-US/firefox/addon/darkreader/"
  ],
  "defaultStore": "chrome",
  "includeReviews": false,
  "maxReviewsPerExtension": 20,
  "reviewSort": "recent",
  "onlyNewReviews": false,
  "monitorChanges": false,
  "onlyChanged": false,
  "monitorId": "default",
  "rankStore": "chrome",
  "rankMaxItems": 50,
  "rankSortFirefox": "users",
  "requestIntervalSecs": 1
}
```

# Actor output Schema

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

No description

## `reviews` (type: `string`):

No description

## `rankSnapshots` (type: `string`):

No description

## `rankedExtensions` (type: `string`):

No description

## `allResults` (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 = {
    "extensions": [
        "https://chromewebstore.google.com/detail/ublock-origin-lite/ddkjiahejlhfcafbddmgiahcphecmpfh",
        "https://addons.mozilla.org/en-US/firefox/addon/darkreader/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("aria-data/browser-extension-intelligence").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 = { "extensions": [
        "https://chromewebstore.google.com/detail/ublock-origin-lite/ddkjiahejlhfcafbddmgiahcphecmpfh",
        "https://addons.mozilla.org/en-US/firefox/addon/darkreader/",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("aria-data/browser-extension-intelligence").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 '{
  "extensions": [
    "https://chromewebstore.google.com/detail/ublock-origin-lite/ddkjiahejlhfcafbddmgiahcphecmpfh",
    "https://addons.mozilla.org/en-US/firefox/addon/darkreader/"
  ]
}' |
apify call aria-data/browser-extension-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,aria-data/browser-extension-intelligence"
        }
    }
}
```

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/pWRW2VAnzKfrcJh6a/builds/3ZEPfe58hlgjacj2m/openapi.json
