Checkout the full documentation here
Hyperbrowser can be installed via npm by running:
npm install @hyperbrowser/sdkor
yarn add @hyperbrowser/sdkimport { chromium } from "playwright-core";
import { Hyperbrowser } from "@hyperbrowser/sdk";
import { config } from "dotenv";
config();
const client = new Hyperbrowser({
apiKey: process.env.HYPERBROWSER_API_KEY,
});
const main = async () => {
const session = await client.sessions.create();
try {
const browser = await chromium.connectOverCDP(session.wsEndpoint);
const defaultContext = browser.contexts()[0];
const page = await defaultContext.newPage();
// Navigate to a website
console.log("Navigating to Hacker News...");
await page.goto("https://news.ycombinator.com/");
const pageTitle = await page.title();
console.log("Page 1:", pageTitle);
await page.evaluate(() => {
console.log("Page 1:", document.title);
});
await page.goto("https://example.com");
console.log("Page 2:", await page.title());
await page.evaluate(() => {
console.log("Page 2:", document.title);
});
await page.goto("https://apple.com");
console.log("Page 3:", await page.title());
await page.evaluate(() => {
console.log("Page 3:", document.title);
});
await page.goto("https://google.com");
console.log("Page 4:", await page.title());
await page.evaluate(() => {
console.log("Page 4:", document.title);
});
} catch (err) {
console.error(`Encountered error: ${err}`);
} finally {
await client.sessions.stop(session.id);
}
};
main();import { connect } from "puppeteer-core";
import { Hyperbrowser } from "@hyperbrowser/sdk";
import { config } from "dotenv";
config();
const client = new Hyperbrowser({
apiKey: process.env.HYPERBROWSER_API_KEY,
});
const main = async () => {
const session = await client.sessions.create();
try {
const browser = await connect({
browserWSEndpoint: session.wsEndpoint,
defaultViewport: null,
});
const [page] = await browser.pages();
// Navigate to a website
console.log("Navigating to Hacker News...");
await page.goto("https://news.ycombinator.com/");
const pageTitle = await page.title();
console.log("Page 1:", pageTitle);
await page.evaluate(() => {
console.log("Page 1:", document.title);
});
await page.goto("https://example.com");
console.log("Page 2:", await page.title());
await page.evaluate(() => {
console.log("Page 2:", document.title);
});
await page.goto("https://apple.com");
console.log("Page 3:", await page.title());
await page.evaluate(() => {
console.log("Page 3:", document.title);
});
await page.goto("https://google.com");
console.log("Page 4:", await page.title());
await page.evaluate(() => {
console.log("Page 4:", document.title);
});
} catch (err) {
console.error(`Encountered error: ${err}`);
} finally {
await client.sessions.stop(session.id);
}
};
main();For local sandbox development, you can explicitly route sandbox runtime traffic through a regional proxy override:
const client = new Hyperbrowser({
apiKey: process.env.HYPERBROWSER_API_KEY,
runtimeProxyOverride: process.env.REGIONAL_PROXY_DEV_HOST,
});import { Hyperbrowser } from "@hyperbrowser/sdk";
const client = new Hyperbrowser({
apiKey: process.env.HYPERBROWSER_API_KEY,
});
const main = async () => {
const sandbox = await client.sandboxes.create({
imageName: "ubuntu-24-node",
region: "us-west",
cpu: 4,
memoryMiB: 4096,
diskMiB: 8192,
});
// Provide exactly one launch source:
// snapshotName or imageName.
// snapshotId requires snapshotName and imageId requires imageName.
// cpu, memoryMiB, and diskMiB are only available for image launches.
const version = await sandbox.exec("node -v");
console.log(version.stdout.trim());
await sandbox.files.writeText("/tmp/hello.txt", "hello from sdk");
const content = await sandbox.files.readText("/tmp/hello.txt");
console.log(content);
const watch = await sandbox.files.watchDir(
"/tmp",
(event) => {
if (event.type === "write") {
console.log(event.name);
}
},
{
recursive: false,
}
);
await sandbox.files.writeText("/tmp/watch-demo.txt", "watch me");
await watch.stop();
const proc = await sandbox.processes.start({
command: "bash",
args: ["-lc", "echo process-started && sleep 1 && echo process-finished"],
});
for await (const event of proc.stream()) {
if (event.type === "stdout") {
process.stdout.write(event.data);
}
}
const terminal = await sandbox.terminal.create({
command: "bash",
cols: 120,
rows: 30,
});
const connection = await terminal.attach();
await connection.write("echo terminal-ok\n");
for await (const event of connection.events()) {
if (event.type === "output" && event.data.includes("terminal-ok")) {
break;
}
}
await connection.close();
const snapshot = await sandbox.createMemorySnapshot();
console.log(snapshot.snapshotId);
await sandbox.stop();
};
main().catch(console.error);Reconnect an existing sandbox:
const sandbox = await client.sandboxes.connect("sandbox-id");
await sandbox.files.readText("/tmp/hello.txt");
await sandbox.stop();connect() refreshes runtime auth and throws if the sandbox is no longer running.
Create a sandbox with pre-exposed ports:
const sandbox = await client.sandboxes.create({
imageName: "node",
cpu: 2,
memoryMiB: 2048,
diskMiB: 8192,
exposedPorts: [{ port: 3000, auth: true }],
});
console.log(sandbox.exposedPorts[0].browserUrl);List sandboxes with time-range and search filters:
const sandboxes = await client.sandboxes.list({
status: "active",
start: Date.now() - 60 * 60 * 1000,
end: Date.now(),
search: "sbx_",
limit: 25,
});List snapshots for a specific image:
const snapshots = await client.sandboxes.listSnapshots({
imageName: "node",
status: "created",
limit: 10,
});Expose and unexpose ports:
const sandbox = await client.sandboxes.create({ imageName: "node" });
const exposure = await sandbox.expose({ port: 8080, auth: true });
console.log(exposure.url, exposure.browserUrl, exposure.browserUrlExpiresAt);
await sandbox.unexpose(8080);Write batch files with per-entry options:
await sandbox.files.write([
{
path: "/tmp/hello.txt",
data: "hello",
append: true,
mode: "600",
},
{
path: "/tmp/payload.bin",
data: Buffer.from([1, 2, 3]).toString("base64"),
encoding: "base64",
},
]);Resume a PTY attach from a cursor:
const terminal = await sandbox.terminal.create({
command: "bash",
rows: 24,
cols: 80,
});
const connection = await terminal.attach(10);