Puppeteer cloud

Run Puppeteer on hosted Chromium

One API call returns a CDP URL. Pass it to puppeteer.connect() and your existing Puppeteer code runs against a real headed Chrome in the cloud.

Same Puppeteer API. Same selectors. Same page.evaluate(). Only the connection URL changes.

Get API key

Free tier · $0.15/hour after · No credit card

Connect in 6 lines

import puppeteer from "puppeteer";

const res = await fetch("https://browsers.bug0.com/api/v1/sessions", {
  method: "POST",
  headers: { Authorization: "Bearer bug0_sk_YOUR_KEY" },
});
const { cdpUrl } = await res.json();

const browser = await puppeteer.connect({ browserWSEndpoint: cdpUrl });
const page = (await browser.pages())[0];
await page.goto("https://example.com");
console.log(await page.title());
await browser.disconnect();

Create session, get URL, connect, drive the page, disconnect. The session keeps billing until you stop it, so wrap it in try/finally for production.

Works with puppeteer-extra

Bug0 exposes raw Chromium over CDP. Plugins that mutate the browser at runtime (puppeteer-extra-plugin-stealth, recaptcha) work the same way they work locally. The plugin runs on your side of the connection. Bug0 doesn't ship stealth itself, that's an honest gap.

import puppeteer from "puppeteer-extra";
import StealthPlugin from "puppeteer-extra-plugin-stealth";
import { Bug0 } from "@bug0/sdk";

puppeteer.use(StealthPlugin());

const bug0 = new Bug0({ apiKey: process.env.BUG0_API_KEY! });
const { cdpUrl, sessionId } = await bug0.createBrowser();

const browser = await puppeteer.connect({ browserWSEndpoint: cdpUrl });
// ...drive with stealth-patched Puppeteer...
await browser.disconnect();
await bug0.stopBrowser(sessionId);

Real headed Chrome, predictable bill

Bug0 runs unmodified Chromium on a virtual display. Headed, not headless. Same binary your users run. Same bugs.

Billing is per minute. No 30-second units. No reconnect surcharges. A reconnect costs nothing extra, because there's no unit to burn through.

Pricing

$0.15 per hour, billed per minute. 10 free browser-minutes at sign-up. No monthly minimum.

Compare to alternatives →

Frequently asked questions

Can I use Puppeteer with cloud browsers?

Yes. Bug0 speaks standard CDP. puppeteer.connect({ browserWSEndpoint }) is all you need.

Does puppeteer-extra-plugin-stealth work?

Yes. The plugin runs in your process, not Bug0's. Register the plugin, call connect, you're done.

What about screenshot or PDF endpoints?

Bug0 doesn't ship REST shortcuts for screenshot or PDF. You take them yourself with page.screenshot() or page.pdf() and store them where you want. One less abstraction to learn.

Puppeteer or Playwright, which should I use?

If you have a working Puppeteer codebase, keep it. Both work over CDP. Bug0 doesn't push you toward either.

Is there a Puppeteer MCP server I can use?

Yes, several community ones. Most accept a CDP endpoint. Bug0's URL drops in the same way.

Is there a free tier?

10 browser-minutes free, no credit card.