# Browser Extensions Scraper: Chrome, Firefox & Edge (`steadyrows/browser-extensions`) Actor

Extension data from the Chrome Web Store, Firefox Add-ons and Edge Add-ons in one row shape: users, rating, version, last update, permissions, developer, category, languages, screenshots. By URL/id, Firefox search, Chrome and Firefox categories. No proxy.

- **URL**: https://apify.com/steadyrows/browser-extensions.md
- **Developed by:** [SteadyRows](https://apify.com/steadyrows) (community)
- **Categories:** Developer tools, E-commerce, Other
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 extension with store page openeds

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

## Browser Extensions Scraper: Chrome Web Store, Firefox Add-ons & Edge Add-ons

One actor, three stores, one row shape. Give it extension URLs or ids from the Chrome Web Store, Firefox Add-ons (AMO) or Edge Add-ons, a Firefox / Edge search, or Chrome / Firefox categories, and get back users, rating, version, last update, permissions, developer, category, languages and screenshots for every extension. Public store pages and APIs only: no login, no proxy, no browser.

### What you can ask for

| Input | Chrome Web Store | Firefox Add-ons | Edge Add-ons |
|---|---|---|---|
| Extension URL or id | ✔ full page | ✔ full record | ✔ store API |
| Search by keyword | — (the store has no public search listing; its `/search` pages are closed to robots) | ✔ up to thousands, 8 sort orders | ✔ all results, by relevance, rating or popularity |
| Category | ✔ the store's top ~32 per category, optionally every page opened | ✔ full listing, most users first | — |
| Editorial collection | ✔ `/collection/...` pages (Favorites of 2025, Works with Gmail, …), 10-20 picks each | — | — |

Chrome and Edge share the 32-letter id format; set **Store for bare ids** to say which store a bare id belongs to (URLs are always recognised by their domain).

### Output

Every row has the same keys whatever the store: `store`, `id`, `url`, `name`, `summary`, `description`, `rating`, `ratingCount`, `users`, `version`, `updatedAt`, `createdAt`, `size`, `developerName`, `developerEmail`, `developerWebsite`, `supportUrl`, `privacyPolicyUrl`, `category`, `categories`, `languages`, `permissions`, `hostPermissions`, `optionalPermissions`, `manifestVersion`, `minBrowserVersion`, `icon`, `screenshots`, `isFeatured`, `license`, `downloadUrl`, `relatedIds`, `query`, `position`.

Chrome rows read from their page add the publisher's trader details where the store shows them: `developerLegalName`, `developerCompany`, `developerAddress`, `developerPhone`. Firefox rows add `guid`, `slug`, `weeklyDownloads`, `promoted`, `tags`, `hasPrivacyPolicy`, `licenseUrl` (custom licences have no name, so `license` says `Custom license` and `licenseUrl` points to its text). Edge rows add `storeProductId`, `isMature`.

```json
{
  "store": "chrome",
  "id": "ddkjiahejlhfcafbddmgiahcphecmpfh",
  "url": "https://chromewebstore.google.com/detail/ublock-origin-lite/ddkjiahejlhfcafbddmgiahcphecmpfh",
  "name": "uBlock Origin Lite",
  "summary": "An efficient content blocker. Blocks ads, trackers, miners, and more immediately upon installation.",
  "rating": 4.5,
  "ratingCount": 3641,
  "users": 21000000,
  "version": "2026.930.1227",
  "updatedAt": "2026-09-30T14:36:39.000Z",
  "createdAt": "2022-09-08T13:10:25.000Z",
  "size": "9.2MiB",
  "developerName": "Raymond Hill (gorhill)",
  "developerEmail": "ubo@raymondhill.net",
  "supportUrl": "https://github.com/uBlockOrigin/uBOL-issues",
  "privacyPolicyUrl": "https://github.com/gorhill/uBlock/wiki/Privacy-policy",
  "category": "make_chrome_yours/privacy",
  "languages": ["ar", "az", "bg", "…"],
  "permissions": ["activeTab", "alarms", "contextMenus", "declarativeNetRequest", "…"],
  "manifestVersion": 3,
  "minBrowserVersion": "122.0"
}
```

What each store gives and does not give:

- **Chrome**: `users` is the store's rounded figure (e.g. 21,000,000); the store hides it for a few listings (Google's own extensions among them), then it is `null`. `developerEmail` is shown by the store for most publishers. Permissions come from the published manifest. No review texts (that sub-page is closed to robots).
- **Firefox**: everything from the public add-ons API, including `license`, `downloadUrl` (the signed .xpi), `weeklyDownloads` and the `promoted` badges (`recommended`, `line`). `users` is average daily users. `size` is the .xpi size.
- **Edge**: the store API; `developerEmail`, `createdAt` and `size` are not published, so they stay `null`. Search results carry no user count, version or permissions until their record is opened (**Open extension pages**, on by default).

### Pricing

Pay per extension. A Chrome or Edge extension read from its own page or API is one **extension with store page opened**; an extension from a Firefox search / category, or a Chrome category card / Edge search result with **Open extension pages** off, is one **extension from a listing**. Duplicates within a run are delivered and charged once. Set a maximum charge per run in the run options to cap spend.

| Event | Price |
|---|---|
| Extension with store page opened | $2.00 per 1,000 |
| Extension from a listing | $1.00 per 1,000 |
| Run start | $0.002 |

### Tips

- Chrome category slugs are the last two parts of the store URL: `productivity/tools`, `productivity/developer`, `lifestyle/shopping`, `make_chrome_yours/privacy`, … (18 in total; an unknown slug stops the run with the full list).
- Chrome collection slugs are the last part of a `https://chromewebstore.google.com/collection/...` URL: `2025_favorites`, `gmail_extensions`, `ai_productivity`, `ai_content`, `dark_mode`, `side_panel`, `language_learning`, `games`, … The store's front page links the current ones; they change over time, so an unknown slug gives a warning and the run goes on.
- Edge search can be sorted by relevance, top rated or most popular (the store's own three orders).
- Firefox category slugs are as in the AMO URL: `privacy-security`, `shopping`, `tabs`, `search-tools`, `social-communication`, `download-management`, …
- To watch competitors, paste their extension URLs from all three stores in one run and schedule it: every row carries `version`, `updatedAt`, `users` and `rating`, so a diff of two runs shows releases and growth.
- The actor opens at most 4 store pages at once and backs off automatically if a store answers 429.

# Actor input Schema

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

Extension pages from any of the three stores (`https://chromewebstore.google.com/detail/name/abcd...`, `https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/`, `https://microsoftedge.microsoft.com/addons/detail/name/odfa...`), bare 32-letter Chrome/Edge ids (see **Store for bare ids**) or Firefox slugs. Each one is opened and delivered with full details.

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

Keywords searched on Firefox Add-ons and Edge Add-ons (choose the stores below), e.g. `password manager`. Firefox results are complete records; Edge results are opened one by one for users, version and permissions when **Open extension pages** is on. The Chrome Web Store has no public search listing, so use **Chrome categories** or paste extension URLs for it.

## `searchStores` (type: `array`):

Which stores the search queries run on.

## `chromeCategories` (type: `array`):

Category slugs as in the store URL, e.g. `productivity/tools`, `make_chrome_yours/privacy`, `lifestyle/shopping`. Each category page lists the store's top ~32 extensions; with **Open extension pages** on, each one is delivered with full details.

## `chromeCollections` (type: `array`):

Slugs or URLs of the store's editorial collections, e.g. `2025_favorites`, `gmail_extensions`, `ai_productivity`, `dark_mode`, `side_panel` (the slug is the last part of `https://chromewebstore.google.com/collection/...`). Each lists 10-20 hand-picked extensions; with **Open extension pages** on, each one is delivered with full details. Collections come and go; an unknown slug gives a warning, not a failure.

## `firefoxCategories` (type: `array`):

Category slugs as in the Firefox Add-ons URL, e.g. `privacy-security`, `shopping`, `tabs`, `search-tools`. Listed by users (most first) unless **Firefox sort** says otherwise.

## `maxPerQuery` (type: `integer`):

Stops each search or category after this many extensions.

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

For Chrome categories and Edge searches: open every extension's page / API record for the full description, version, last update, users (Edge), size and developer details (Chrome), support and privacy-policy URLs, languages, permissions, screenshots. Off: the listing card only (name, summary, rating, developer; Chrome cards also users, category and manifest permissions). Firefox rows are always complete.

## `idStore` (type: `string`):

Chrome and Edge both use 32-letter ids. A bare id (not a URL) in **Extension URLs or ids** is looked up in this store.

## `firefoxSort` (type: `string`):

Order of Firefox search and category results.

## `edgeSort` (type: `string`):

Order of Edge search results.

## Actor input object example

```json
{
  "extensions": [
    "https://chromewebstore.google.com/detail/ublock-origin-lite/ddkjiahejlhfcafbddmgiahcphecmpfh",
    "https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/",
    "https://microsoftedge.microsoft.com/addons/detail/ublock-origin/odfafepnkmbhccpbejgmiehpchacaeak"
  ],
  "searchQueries": [],
  "searchStores": [
    "firefox",
    "edge"
  ],
  "chromeCategories": [],
  "chromeCollections": [],
  "firefoxCategories": [],
  "maxPerQuery": 100,
  "includeDetails": true,
  "idStore": "chrome",
  "firefoxSort": "relevance",
  "edgeSort": "relevance"
}
```

# Actor output Schema

## `results` (type: `string`):

All rows the run collected, one per item, in the default dataset.

# 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/ublock-origin/",
        "https://microsoftedge.microsoft.com/addons/detail/ublock-origin/odfafepnkmbhccpbejgmiehpchacaeak"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyrows/browser-extensions").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/ublock-origin/",
        "https://microsoftedge.microsoft.com/addons/detail/ublock-origin/odfafepnkmbhccpbejgmiehpchacaeak",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("steadyrows/browser-extensions").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/ublock-origin/",
    "https://microsoftedge.microsoft.com/addons/detail/ublock-origin/odfafepnkmbhccpbejgmiehpchacaeak"
  ]
}' |
apify call steadyrows/browser-extensions --silent --output-dataset

```

## MCP server setup

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

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/JQA2VrG8Tvrft5t72/builds/NSs5okpnF09XgOvp9/openapi.json
