cdpfleet Pre-launch Get early access

cdpfleet / Browsers / Opera

Chromium family · Chromium-based

Opera, one socket away.

Opera, with stable and developer channels (beta is a deprecated alias for developer: Opera stopped shipping Linux betas). Headless over CDP (cdpUrl), open pages in a new context (browser.newContext()): Opera doesn't render pages in its default context there — so keep_alive over CDP, which only keeps the default context, needs headful Opera or wsUrl.

  • /opera/sessionlaunch endpoint
  • 1.60Playwright client
  • 1thread headless

Why Opera

  • Opera with its own OPR/ user agent and client hints, on stable and the developer channel.
  • Sites that serve Opera users differently.
  • CDP with "cdp": true — headless over CDP, open pages in a new context.

Versions on the fleet now

stable137.0.6036.63developer139.0.6051.0

Choose a build with channel; without one you get stable.

New majors are announced on /docs/updates.

Launch it

One HTTPS call to POST /opera/session returns a WebSocket URL; connect to it with Playwright's chromium.connect() (client 1.60), or launch with "cdp": true and use cdpUrl. A headless session takes 1 thread, a headful one 2.

Opera: launch, open a page, print its title
// npm install [email protected]
// Browsers run on cdpfleet, so no `npx playwright install` is needed.
import { chromium } from 'playwright';

const KEY = process.env.CDPFLEET_API_KEY;

// 1. Launch the browser
const res = await fetch('https://starter.cdpfleet.com/opera/session', {
  method: 'POST',
  headers: { 'x-api-key': KEY, 'content-type': 'application/json' },
  body: JSON.stringify({
    proxy: 'http://user:[email protected]:8080',
    headless: 'new',
  }),
});
if (!res.ok) throw new Error(`launch failed: ${res.status} ${await res.text()}`);
const { wsUrl } = await res.json();

// 2. Connect and drive it
const browser = await chromium.connect(wsUrl, { headers: { 'x-api-key': KEY } });
const page = await browser.newPage();
await page.goto('https://example.com');
console.log(await page.title());
await browser.close(); // ends the session and stops billing

Launch options

OptionWhat it does
proxy_rulesSend specific destination hosts through specific proxies.
inactivity_timeoutEnd the session after this long with no traffic on its WebSocket.
overall_timeoutHard cap on the session's total lifetime, regardless of activity.
vpn_tunnelVPN Tunnel: UDP/WebRTC full support — all of the browser's traffic, UDP included, goes through the residential exit.
vpnOwn network (dedicated plans): send all of the browser's traffic through your own VPN instead of a proxy.
headlessRun without a display.
channelRelease channel of the browser build.
cdpAlso expose a Chrome DevTools Protocol endpoint (cdpUrl).
screencastStream the page to your code (Playwright page.screencast).
live_viewMake a headless session watchable and controllable from outside.
screen_sizeResolution of the session's own display (headful only).
keep_aliveKeep the session when your client disconnects (dedicated threads only).
start_urlOpen this page at launch so the session can be driven in live view with no client connected.
profileRestore a saved browser profile and save it again when the session ends.
recordOpt this session out of recording with false.

Every session also needs a proxy — yours, or the residential proxy.