Connects to Oxylabs remote headless browsers via Chrome DevTools Protocol (CDP) using Playwright or Puppeteer. Provides anti-detection, CAPTCHA handling, residential proxies, and geo-targeting built in. Use when browser automation needs remote execution, stealth capabilities, rendered pages, screenshots, PDFs, or complex JavaScript interaction.
npx skills add https://github.com/oxylabs/agent-skills --skill headless-browser
Remote headless browser service with built-in anti-detection and proxy integration. Chrome supports Playwright, Puppeteer, and any CDP-compatible library. Firefox is legacy and uses Playwright's Firefox connection API.
Prefer OXY_UNBLOCKER_USERNAME and OXY_UNBLOCKER_PASSWORD for Headless Browser credentials. OXY_HB_USERNAME and OXY_HB_PASSWORD are supported aliases in older setups.
| Browser | Global endpoint | US endpoint |
|---------|-----------------|-------------|
| Chrome | wss://USERNAME:[email protected] | wss://USERNAME:[email protected] |
| Firefox (legacy) | wss://USERNAME:[email protected] | wss://USERNAME:[email protected] |
| Type | Best For | Notes |
|------|----------|-------|
| Chrome | High performance, dedicated servers, residential proxies | Use chromium.connect_over_cdp / connectOverCDP |
| Firefox (legacy) | Alternative engine for targets that perform better outside Chrome | Use firefox.connect; supported Playwright versions are 1.51 and 1.56 via ?o_pw=1.56 |
Playwright (Python):
from playwright.sync_api import sync_playwright
import os
username = os.environ.get("OXY_UNBLOCKER_USERNAME") or os.environ["OXY_HB_USERNAME"]
password = os.environ.get("OXY_UNBLOCKER_PASSWORD") or os.environ["OXY_HB_PASSWORD"]
endpoint = "ubc.oxylabs.io"
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(
f"wss://{username}:{password}@{endpoint}"
)
page = browser.new_page()
page.goto("https://example.com")
print(page.content())
browser.close()
Playwright (JavaScript):
const { chromium } = require("playwright");
const username = process.env.OXY_UNBLOCKER_USERNAME || process.env.OXY_HB_USERNAME;
const password = process.env.OXY_UNBLOCKER_PASSWORD || process.env.OXY_HB_PASSWORD;
const endpoint = "ubc.oxylabs.io";
(async () => {
const browser = await chromium.connectOverCDP(
`wss://${username}:${password}@${endpoint}`
);
const page = await browser.newPage();
await page.goto("https://example.com");
console.log(await page.content());
await browser.close();
})();
Puppeteer:
const puppeteer = require("puppeteer");
const username = process.env.OXY_UNBLOCKER_USERNAME || process.env.OXY_HB_USERNAME;
const password = process.env.OXY_UNBLOCKER_PASSWORD || process.env.OXY_HB_PASSWORD;
const endpoint = "ubc.oxylabs.io";
(async () => {
const browser = await puppeteer.connect({
browserWSEndpoint: `wss://${username}:${password}@${endpoint}`
});
const page = await browser.newPage();
await page.goto("https://example.com");
console.log(await page.content());
await browser.close();
})();
window.postMessage({action: 'solve_captcha', type: '<captcha type>'}, '*')o_vnc=trueAppend query parameters to the WebSocket URL:
| Parameter | Browser | Description |
|-----------|---------|-------------|
| p_cc=US | Chrome, Firefox | Route traffic through a 2-letter country code |
| p_city=los_angeles | Chrome, Firefox | Target a city; combine with p_cc or p_state |
| p_state=texas | Chrome, Firefox | Target a US state; takes priority over p_cc |
| p_device=mobile | Chrome | Emulate desktop, mobile, or tablet device fingerprints |
| o_vnc=true | Chrome, Firefox | Enable Session Inspection for visual debugging |
| o_pw=1.56 | Firefox | Select supported Firefox Playwright version 1.51 or 1.56 |
| bargs=disable-notifications | Chrome | Pass supported Chrome browser arguments |
Supported Chrome bargs values: force-color-profile:<profile>, window-position:X,Y, hide-scrollbars, enable-features:<feature1>,<feature2>, disable-notifications.
Repeat bargs for multiple browser arguments, e.g., ?bargs=force-color-profile:srgb&bargs=window-position:100,100. p_city requires p_cc or p_state; p_state overrides p_cc.
oxylabs-captcha-solve-start, oxylabs-captcha-solve-end, and oxylabs-captcha-solve-error window messages.window.postMessage({action: 'solve_captcha', type: '<captcha type>'}, '*').hcaptcha, recaptcha, turnstile.| Scenario | Use Headless Browser |
|----------|------------------------|
| Complex JavaScript sites | Yes |
| Anti-bot protected sites | Yes |
| Browser automation with stealth | Yes |
| Screenshot/PDF generation | Yes |
| Simple HTML scraping | Consider Web Scraper API instead |
Any library supporting Chrome DevTools Protocol (CDP):
Firefox is legacy and should use Playwright firefox.connect with supported Playwright versions 1.51 or 1.56.
For more examples, see examples.md.
Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.
Use this skill to query your Google NotebookLM notebooks directly from Claude Code for source-grounded, citation-backed answers from Gemini. Browser automation, library management, persistent auth. Drastically reduced hallucinations through document-only responses.
Complete browser automation with Playwright. Auto-detects dev servers, writes clean test scripts to /tmp. Test pages, fill forms, take screenshots, check responsive design, validate UX, test login flows, check links, automate any browser task. Use when user wants to test websites, automate browser interactions, validate web functionality, or perform any browser-based testing.
Automate Electron desktop apps (VS Code, Slack, Discord, Figma, Notion, Spotify, etc.) using agent-browser via Chrome DevTools Protocol. Use when the user needs to interact with an Electron app, automate a desktop app, connect to a running app, control a native app, or test an Electron application. Triggers include "automate Slack app", "control VS Code", "interact with Discord app", "test this Electron app", "connect to desktop app", or any task requiring automation of a native Electron application.
Automate Anchor Browser tasks via Rube MCP (Composio). Always search tools first for current schemas.
Automate Browser Tool tasks via Rube MCP (Composio). Always search tools first for current schemas.
Get Image [from] Internet Link - Zero-setup CLI for downloading full-resolution images from iCloud, Dropbox, Google Photos, and Google Drive share links. Four-tier capture strategy, browser automation, HEIC conversion, album support. Node.js/Playwright.
Expert in building browser extensions that solve real problems - Chrome, Firefox, and cross-browser extensions. Covers extension architecture, manifest v3, content scripts, popup UIs, monetization strategies, and Chrome Web Store publishing. Use when: browser extension, chrome extension, firefox addon, extension, manifest v3.
Take oxylabs/headless-browser from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.