From oxylabs
Connects to Oxylabs remote headless browsers via CDP using Playwright or Puppeteer. Provides anti-detection, CAPTCHA handling, residential proxies, and geo-targeting for remote browser automation.
How this skill is triggered — by the user, by Claude, or both
Slash command
/oxylabs:headless-browserThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
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.
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.
npx claudepluginhub oxylabs/agent-skills --plugin oxylabsBypasses anti-bot protections, CAPTCHAs, and fingerprinting using Oxylabs Web Unblocker. Handles JavaScript rendering, session persistence, and geo-targeting automatically.
Guides browser automation with Playwright and Puppeteer for testing, scraping, and AI agent control. Covers selectors, anti-detection, and test isolation patterns.
Builds browser automation workflows in Cloudflare Workers using Puppeteer/Playwright for screenshots, PDFs, web scraping, session management, and error handling.