Run Puppeteer scripts in the cloud. Change one line.

Point puppeteer.connect at our WebSocket and the script you already wrote runs on fresh cloud Chrome. You manage your script. We manage Chrome.

Puppeteer
1import puppeteer from "puppeteer";2 3const browser = await puppeteer.connect({4  browserWSEndpoint:5    `wss://cdp-lb.axiom.ai/?token=${process.env.AXIOM_API_KEY}`6});7 8try {9  const page = await browser.newPage();10  await page.goto("https://example.com");11  await page.screenshot({ path: "out.png", fullPage: true });12} finally {13  await browser.close();14}15 
Point puppeteer.connect at our WebSocket endpoint. The rest of your script doesn't change.Read the Chrome API docs

The switch

Stop launching Chromium. Connect to ours.

Your script connects to a browser in our cloud instead of launching its own. Nothing else changes.

Explore the Chrome API

Swap launch() for connect()

Add your API key and run. That's the whole change.

const browser = await puppeteer.connect({
  browserWSEndpoint: `wss://cdp-lb.axiom.ai/?token=${KEY}`
});
Explore the Chrome API

No Chromium install

Every session gets current cloud Chrome. Nothing to download in CI, nothing to rebuild when Chromium updates.

Scale your sessions

Up to 20 concurrent sessions in the cloud, unlimited on desktop, and more on request. Parallel work means more connections, not more servers, and runtime only meters while a session is open.

See infrastructure

Your data stays yours

Each cloud session gets its own server with a private Docker container, desktop runs never leave your machine, and we never train AI on anything that passes through either.

Also available

Mix Step API calls into the same script.

The browser you connected to also takes Step API calls, functions from the engine behind our No-Code Tool. One call scrapes a paginated list, solves a captcha, or walks a date picker, using the selectors you already have.

Explore the Step API
Log in and scrape
1await axiom.browserOpen();2try {3  await axiom.goto("https://example.com/login");4  await axiom.enterText("#email", "user@example.com");5  await axiom.enterText("#password", process.env.PW);6  await axiom.click("button[type=submit]");7  await axiom.wait(2000);8  const rows = await axiom.scrape(null, { hierarchy: ".product-card" }, null, 50, {});9} finally {10  await axiom.browserClose();11}12 
Fill in a form
1await axiom.goto("https://example.com/apply");2await axiom.enterText("#full-name", row.name);3await axiom.selectList("#country", row.country);4await axiom.click("button[type=submit]");5 
Use AI mid-run
1const [[title], [description]] = await axiom.scrapeMetadata([2  { id: "general_metadata_title" },3  { id: "meta_description", value: 'meta[name="description"]' }4]);5const verdict = await axiom.integrateAI({6  aiFunction: "generate",7  prompt: `Product page or category page? ${title} ${description}`8});9 
Combine with your own code
1const targets = await db.query("SELECT url FROM watchlist");2await axiom.browserOpen();3try {4  for (const { url } of targets) {5    await axiom.goto(url);6    const [[price]] = await axiom.scrape(null, { hierarchy: ".price" }, null, 1, {});7    if (Number(price) < 100) await notifySlack(url, price);8  }9} finally {10  await axiom.browserClose();11}12 

Get an API key and try the Chrome API for free.

2 free hours of runtime. No card required.