# Scrapfly Documentation

## Table of Contents

### Dashboard

- [Intro](https://scrapfly.io/docs)
- [Project](https://scrapfly.io/docs/project)
- [Account](https://scrapfly.io/docs/account)
- [Workspace & Team](https://scrapfly.io/docs/workspace-and-team)
- [Billing](https://scrapfly.io/docs/billing)

### Products

#### MCP Server

- [Getting Started](https://scrapfly.io/docs/mcp/getting-started)
- [Tools & API Spec](https://scrapfly.io/docs/mcp/tools)
- [Authentication](https://scrapfly.io/docs/mcp/authentication)
- [Examples & Use Cases](https://scrapfly.io/docs/mcp/examples)
- [FAQ](https://scrapfly.io/docs/mcp/faq)
##### Integrations

- [Overview](https://scrapfly.io/docs/mcp/integrations)
- [Claude Desktop](https://scrapfly.io/docs/mcp/integrations/claude-desktop)
- [Claude Code](https://scrapfly.io/docs/mcp/integrations/claude-code)
- [ChatGPT](https://scrapfly.io/docs/mcp/integrations/chatgpt)
- [Cursor](https://scrapfly.io/docs/mcp/integrations/cursor)
- [Cline](https://scrapfly.io/docs/mcp/integrations/cline)
- [Windsurf](https://scrapfly.io/docs/mcp/integrations/windsurf)
- [Zed](https://scrapfly.io/docs/mcp/integrations/zed)
- [Roo Code](https://scrapfly.io/docs/mcp/integrations/roo-code)
- [VS Code](https://scrapfly.io/docs/mcp/integrations/vscode)
- [LangChain](https://scrapfly.io/docs/mcp/integrations/langchain)
- [LlamaIndex](https://scrapfly.io/docs/mcp/integrations/llamaindex)
- [CrewAI](https://scrapfly.io/docs/mcp/integrations/crewai)
- [OpenAI](https://scrapfly.io/docs/mcp/integrations/openai)
- [n8n](https://scrapfly.io/docs/mcp/integrations/n8n)
- [Make](https://scrapfly.io/docs/mcp/integrations/make)
- [Zapier](https://scrapfly.io/docs/mcp/integrations/zapier)
- [Vapi AI](https://scrapfly.io/docs/mcp/integrations/vapi)
- [Agent Builder](https://scrapfly.io/docs/mcp/integrations/agent-builder)
- [Custom Client](https://scrapfly.io/docs/mcp/integrations/custom-client)


#### Web Scraping API

- [Getting Started](https://scrapfly.io/docs/scrape-api/getting-started)
- [API Specification]()
- [Monitoring](https://scrapfly.io/docs/monitoring)
- [Customize Request](https://scrapfly.io/docs/scrape-api/custom)
- [Debug](https://scrapfly.io/docs/scrape-api/debug)
- [Anti Scraping Protection](https://scrapfly.io/docs/scrape-api/anti-scraping-protection)
- [Proxy](https://scrapfly.io/docs/scrape-api/proxy)
- [Proxy Mode](https://scrapfly.io/docs/scrape-api/proxy-mode)
- [Proxy Mode - Screaming Frog](https://scrapfly.io/docs/scrape-api/proxy-mode/screaming-frog)
- [Proxy Mode - Apify](https://scrapfly.io/docs/scrape-api/proxy-mode/apify)
- [(Auto) Data Extraction](https://scrapfly.io/docs/scrape-api/extraction)
- [Javascript Rendering](https://scrapfly.io/docs/scrape-api/javascript-rendering)
- [Javascript Scenario](https://scrapfly.io/docs/scrape-api/javascript-scenario)
- [SSL](https://scrapfly.io/docs/scrape-api/ssl)
- [DNS](https://scrapfly.io/docs/scrape-api/dns)
- [Cache](https://scrapfly.io/docs/scrape-api/cache)
- [Session](https://scrapfly.io/docs/scrape-api/session)
- [Webhook](https://scrapfly.io/docs/scrape-api/webhook)
- [Screenshot](https://scrapfly.io/docs/scrape-api/screenshot)
- [Errors](https://scrapfly.io/docs/scrape-api/errors)
- [Timeout](https://scrapfly.io/docs/scrape-api/understand-timeout)
- [Throttling](https://scrapfly.io/docs/throttling)
- [Troubleshoot](https://scrapfly.io/docs/scrape-api/troubleshoot)
- [Billing](https://scrapfly.io/docs/scrape-api/billing)
- [FAQ](https://scrapfly.io/docs/scrape-api/faq)

#### Crawler API

- [Getting Started](https://scrapfly.io/docs/crawler-api/getting-started)
- [API Specification]()
- [Retrieving Results](https://scrapfly.io/docs/crawler-api/results)
- [WARC Format](https://scrapfly.io/docs/crawler-api/warc-format)
- [Data Extraction](https://scrapfly.io/docs/crawler-api/extraction-rules)
- [Webhook](https://scrapfly.io/docs/crawler-api/webhook)
- [Billing](https://scrapfly.io/docs/crawler-api/billing)
- [Errors](https://scrapfly.io/docs/crawler-api/errors)
- [Troubleshoot](https://scrapfly.io/docs/crawler-api/troubleshoot)
- [FAQ](https://scrapfly.io/docs/crawler-api/faq)

#### Screenshot API

- [Getting Started](https://scrapfly.io/docs/screenshot-api/getting-started)
- [API Specification]()
- [Accessibility Testing](https://scrapfly.io/docs/screenshot-api/accessibility)
- [Webhook](https://scrapfly.io/docs/screenshot-api/webhook)
- [Billing](https://scrapfly.io/docs/screenshot-api/billing)
- [Errors](https://scrapfly.io/docs/screenshot-api/errors)

#### Extraction API

- [Getting Started](https://scrapfly.io/docs/extraction-api/getting-started)
- [API Specification]()
- [Rules Template](https://scrapfly.io/docs/extraction-api/rules-and-template)
- [LLM Extraction](https://scrapfly.io/docs/extraction-api/llm-prompt)
- [AI Auto Extraction](https://scrapfly.io/docs/extraction-api/automatic-ai)
- [Webhook](https://scrapfly.io/docs/extraction-api/webhook)
- [Billing](https://scrapfly.io/docs/extraction-api/billing)
- [Errors](https://scrapfly.io/docs/extraction-api/errors)
- [FAQ](https://scrapfly.io/docs/extraction-api/faq)

#### Proxy Saver

- [Getting Started](https://scrapfly.io/docs/proxy-saver/getting-started)
- [Fingerprints](https://scrapfly.io/docs/proxy-saver/fingerprints)
- [Optimizations](https://scrapfly.io/docs/proxy-saver/optimizations)
- [SSL Certificates](https://scrapfly.io/docs/proxy-saver/certificates)
- [Protocols](https://scrapfly.io/docs/proxy-saver/protocols)
- [Pacfile](https://scrapfly.io/docs/proxy-saver/pacfile)
- [Secure Credentials](https://scrapfly.io/docs/proxy-saver/security)
- [Billing](https://scrapfly.io/docs/proxy-saver/billing)

#### Cloud Browser API

- [Getting Started](https://scrapfly.io/docs/cloud-browser-api/getting-started)
- [Proxy & Geo-Targeting](https://scrapfly.io/docs/cloud-browser-api/proxy)
- [Unblock API](https://scrapfly.io/docs/cloud-browser-api/unblock)
- [File Downloads](https://scrapfly.io/docs/cloud-browser-api/file-downloads)
- [Session Resume](https://scrapfly.io/docs/cloud-browser-api/session-resume)
- [Human-in-the-Loop](https://scrapfly.io/docs/cloud-browser-api/human-in-the-loop)
- [Debug Mode](https://scrapfly.io/docs/cloud-browser-api/debug-mode)
- [Bring Your Own Proxy](https://scrapfly.io/docs/cloud-browser-api/bring-your-own-proxy)
- [Browser Extensions](https://scrapfly.io/docs/cloud-browser-api/extensions)
##### Integrations

- [Puppeteer](https://scrapfly.io/docs/cloud-browser-api/puppeteer)
- [Playwright](https://scrapfly.io/docs/cloud-browser-api/playwright)
- [Selenium](https://scrapfly.io/docs/cloud-browser-api/selenium)
- [Vercel Agent Browser](https://scrapfly.io/docs/cloud-browser-api/agent-browser)
- [Browser Use](https://scrapfly.io/docs/cloud-browser-api/browser-use)
- [Stagehand](https://scrapfly.io/docs/cloud-browser-api/stagehand)

- [Billing](https://scrapfly.io/docs/cloud-browser-api/billing)
- [Errors](https://scrapfly.io/docs/cloud-browser-api/errors)


### Tools

- [Antibot Detector](https://scrapfly.io/docs/tools/antibot-detector)

### SDK

- [Golang](https://scrapfly.io/docs/sdk/golang)
- [Python](https://scrapfly.io/docs/sdk/python)
- [Rust](https://scrapfly.io/docs/sdk/rust)
- [TypeScript](https://scrapfly.io/docs/sdk/typescript)
- [Scrapy](https://scrapfly.io/docs/sdk/scrapy)

### Integrations

- [Getting Started](https://scrapfly.io/docs/integration/getting-started)
- [LangChain](https://scrapfly.io/docs/integration/langchain)
- [LlamaIndex](https://scrapfly.io/docs/integration/llamaindex)
- [CrewAI](https://scrapfly.io/docs/integration/crewai)
- [Zapier](https://scrapfly.io/docs/integration/zapier)
- [Make](https://scrapfly.io/docs/integration/make)
- [n8n](https://scrapfly.io/docs/integration/n8n)

### Academy

- [Overview](https://scrapfly.io/academy)
- [Web Scraping Overview](https://scrapfly.io/academy/scraping-overview)
- [Tools](https://scrapfly.io/academy/tools-overview)
- [Reverse Engineering](https://scrapfly.io/academy/reverse-engineering)
- [Static Scraping](https://scrapfly.io/academy/static-scraping)
- [HTML Parsing](https://scrapfly.io/academy/html-parsing)
- [Dynamic Scraping](https://scrapfly.io/academy/dynamic-scraping)
- [Hidden API Scraping](https://scrapfly.io/academy/hidden-api-scraping)
- [Headless Browsers](https://scrapfly.io/academy/headless-browsers)
- [Hidden Web Data](https://scrapfly.io/academy/hidden-web-data)
- [JSON Parsing](https://scrapfly.io/academy/json-parsing)
- [Data Processing](https://scrapfly.io/academy/data-processing)
- [Scaling](https://scrapfly.io/academy/scaling)
- [Walkthrough Summary](https://scrapfly.io/academy/walkthrough-summary)
- [Scraper Blocking](https://scrapfly.io/academy/scraper-blocking)
- [Proxies](https://scrapfly.io/academy/proxies)

---

# Browser Extensions

 [  View as markdown ](https://scrapfly.io/?view=markdown)   Copy for LLM    Copy for LLM  [     Open in ChatGPT ](https://chatgpt.com/?hints=search&prompt=Read%20from%20https%3A%2F%2Fscrapfly.io%2Fdocs%2Fcloud-browser-api%2Fextensions%20so%20I%20can%20ask%20questions%20about%20it.) [     Open in Claude ](https://claude.ai/new?q=Read%20from%20https%3A%2F%2Fscrapfly.io%2Fdocs%2Fcloud-browser-api%2Fextensions%20so%20I%20can%20ask%20questions%20about%20it.) [     Open in Perplexity ](https://www.perplexity.ai/search/new?q=Read%20from%20https%3A%2F%2Fscrapfly.io%2Fdocs%2Fcloud-browser-api%2Fextensions%20so%20I%20can%20ask%20questions%20about%20it.) 

 

 

 Cloud Browser supports Chrome browser extensions, allowing you to enhance your automation workflows with custom functionality. Upload extensions via the dashboard and enable them in your browser sessions.

  **Plan Requirement:** Browser extensions require a **Pro** plan or higher. Extension quota varies by plan. 

##### Manage Your Extensions

Upload, view, and manage your browser extensions from the dashboard.

 

 [  Open Dashboard ](https://scrapfly.io/dashboard/cloud-browser/extensions) 

 

## Overview

 Browser extensions enable additional capabilities in your Cloud Browser sessions, such as:

- **Ad blocking** - Remove ads and tracking scripts for cleaner page content
- **CAPTCHA solving** - Integrate CAPTCHA solving services
- **Cookie management** - Handle consent popups and cookie banners
- **Custom scripts** - Inject custom JavaScript or modify page behavior
 
## Uploading Extensions

 Extensions can be uploaded via the [Cloud Browser Extensions Dashboard](https://scrapfly.io/dashboard/cloud-browser/extensions). There are two ways to add extensions:

### File Upload

Upload extension files directly from your computer. Supported formats:

- **.zip** - Unpacked Chrome extension (directory compressed as ZIP)
- **.crx** - Packed Chrome extension file
 
### Install from URL

 Install extensions directly from a URL pointing to a `.crx` file. This method offers several advantages:

- **Auto-updates** - The extension is fetched fresh on each session start
- **HTTP caching** - Standard cache headers reduce latency and bandwidth
- **Easy management** - Update your extension on the server without re-uploading
 
**URL Requirements:**

- Must use `http://` or `https://` scheme
- Must point to a valid `.crx` file
- Filename must contain only alphanumeric characters, hyphens, and underscores (e.g., `my-extension.crx`)
 
  **Tip:** For automatic updates, configure your server to set appropriate HTTP cache headers (`Cache-Control`, `ETag`, `Last-Modified`). 

### Requirements

Your extension must include a valid `manifest.json` with:

- `name` - Extension name
- `version` - Version string (e.g., "1.0.0")
- `manifest_version` - Either 2 or 3
 
  **Maximum file size:** 10MB per extension. 

## Using Extensions

 Enable extensions when connecting to Cloud Browser by passing extension IDs as a comma-separated list in the `extensions` parameter.

### WebSocket URL

 ```
wss://browser.scrapfly.io?api_key=&extensions=ext_id1,ext_id2
```

 

   

 

### Code Examples

Enable extensions by passing their IDs in the WebSocket connection URL:

    Python SDK    Python (Playwright)    JavaScript (Puppeteer)    JavaScript (Playwright)  

  ```
from scrapfly import ScrapflyClient, BrowserConfig
from playwright.sync_api import sync_playwright

client = ScrapflyClient(key='{{ YOUR_API_KEY }}')

config = BrowserConfig(
    extensions=['ext_id1', 'ext_id2'],  # Replace with your extension IDs
)

with sync_playwright() as p:
    browser = p.chromium.connect_over_cdp(client.cloud_browser(config))

    context = browser.contexts[0]
    page = context.pages[0] if context.pages else context.new_page()

    # Extensions are now active in this browser session
    page.goto('https://web-scraping.dev')
    print(page.title())

    browser.close()

```

 

   

 

 

 ```
from playwright.sync_api import sync_playwright

API_KEY = '{{ YOUR_API_KEY }}'
EXTENSION_IDS = 'ext_id1,ext_id2'  # Replace with your extension IDs
WS_URL = f'wss://browser.scrapfly.io?api_key={API_KEY}&extensions={EXTENSION_IDS}'

with sync_playwright() as p:
    browser = p.chromium.connect_over_cdp(WS_URL)

    context = browser.contexts[0]
    page = context.pages[0] if context.pages else context.new_page()

    # Extensions are now active in this browser session
    page.goto('https://web-scraping.dev')
    print(page.title())

    browser.close()

```

 

   

 

 

 ```
const puppeteer = require('puppeteer-core');

const API_KEY = '{{ YOUR_API_KEY }}';
const EXTENSION_IDS = 'ext_id1,ext_id2';  // Replace with your extension IDs
const WS_URL = `wss://browser.scrapfly.io?api_key=${API_KEY}&extensions=${EXTENSION_IDS}`;

(async () => {
    const browser = await puppeteer.connect({
        browserWSEndpoint: WS_URL
    });

    // Extensions are now active in this browser session
    const page = await browser.newPage();
    await page.goto('https://web-scraping.dev');
    console.log(await page.title());

    await browser.close();
})();

```

 

   

 

 

 ```
const { chromium } = require('playwright');

const API_KEY = '{{ YOUR_API_KEY }}';
const EXTENSION_IDS = 'ext_id1,ext_id2';  // Replace with your extension IDs
const WS_URL = `wss://browser.scrapfly.io?api_key=${API_KEY}&extensions=${EXTENSION_IDS}`;

(async () => {
    const browser = await chromium.connectOverCDP(WS_URL);

    const context = browser.contexts()[0];
    const page = context.pages()[0] || await context.newPage();

    // Extensions are now active in this browser session
    await page.goto('https://web-scraping.dev');
    console.log(await page.title());

    await browser.close();
})();

```

 

   

 

 

 

## Managing Extensions

### Finding Extension IDs

 After uploading, each extension receives a unique ID displayed in the [Extensions Dashboard](https://scrapfly.io/dashboard/cloud-browser/extensions). Copy this ID to use in your automation scripts.

### Updating Extensions

 **File uploads:** Upload a new version with the **same name**. The extension will be replaced while keeping the same ID, so your scripts continue to work.

 **URL-based extensions:** Simply update the file on your server. The new version will be fetched automatically on the next session start. HTTP caching ensures efficient delivery.

### Deleting Extensions

 Extensions can be deleted from the dashboard. Note that:

- Active browser sessions using the extension will continue to work
- New sessions will no longer be able to use the deleted extension
- Deletion frees up your extension quota
 
## API Management

 Extensions can also be managed programmatically using the Scrapfly SDK or REST API.

### Upload Extension

Upload an extension from a local `.zip` or `.crx` file:

    Python SDK    cURL  

  ```
from scrapfly import ScrapflyClient

client = ScrapflyClient(key='{{ YOUR_API_KEY }}')

# Upload from a local file (.zip or .crx)
result = client.cloud_browser_extension_upload('my-extension.zip')
print('Extension ID:', result['extension']['id'])
print('Name:', result['extension']['name'])

# Or install from a URL (auto-updates on each session)
result = client.cloud_browser_extension_upload_from_url(
    'https://example.com/my-extension.crx'
)
print('Extension ID:', result['extension']['id'])

```

 

   

 

 

 ```
# Upload from file
curl -X POST "https://browser.scrapfly.io/extension?key={{ YOUR_API_KEY }}" \
  -F "file=@my-extension.zip"

# Install from URL
curl -X POST "https://browser.scrapfly.io/extension?key={{ YOUR_API_KEY }}" \
  -H "Content-Type: application/json" \
  -d '{"extension_url": "https://example.com/my-extension.crx"}'

```

 

   

 

 

 

### List Extensions

List all uploaded extensions and quota usage:

    Python SDK    cURL  

  ```
from scrapfly import ScrapflyClient

client = ScrapflyClient(key='{{ YOUR_API_KEY }}')

result = client.cloud_browser_extension_list()
print(f'Using {result["quota"]["used"]}/{result["quota"]["limit"]} extensions')

for ext in result['extensions'] or []:
    print(f'  {ext["id"]} - {ext["name"]} v{ext["version"]}')

```

 

   

 

 

 ```
curl "https://browser.scrapfly.io/extension?key={{ YOUR_API_KEY }}"

```

 

   

 

 

 

### Delete Extension

Remove an extension by its ID:

    Python SDK    cURL  

  ```
from scrapfly import ScrapflyClient

client = ScrapflyClient(key='{{ YOUR_API_KEY }}')

result = client.cloud_browser_extension_delete('YOUR_EXTENSION_ID')
print(result['message'])

```

 

   

 

 

 ```
curl -X DELETE "https://browser.scrapfly.io/extension/YOUR_EXTENSION_ID?key={{ YOUR_API_KEY }}"

```

 

   

 

 

 

## Extension Quota

 Each plan has a maximum number of extensions that can be uploaded:

 | Plan | Extension Limit |
|---|---|
| Free / Starter | 0 (not available) |
| Pro | 5 extensions |
| Business | 10 extensions |
| Enterprise | Custom limit |

## Permissions &amp; Security

 Extensions run with the permissions declared in their `manifest.json`. The dashboard displays each extension's permissions for review:

- **Permissions** - API access like storage, cookies, webRequest
- **Host Permissions** - URL patterns the extension can access
 
  **Security Note:** Only upload extensions from trusted sources. Extensions have access to browser data and can modify page content. 

## Troubleshooting

### Extension Not Loading

- Verify the extension ID is correct in your connection URL
- Check that the extension was uploaded successfully in the dashboard
- Ensure your plan includes extension support
 
### Invalid Manifest Error

- Ensure `manifest.json` exists in the root of your ZIP/CRX
- Verify required fields: `name`, `version`, `manifest_version`
- Check JSON syntax is valid
 
### Quota Exceeded

 If you've reached your extension limit, you can:

- Delete unused extensions to free up quota
- Update existing extensions (doesn't count against quota)
- Upgrade your plan for higher limits