VeilBrowserDocs

Getting started

Create your account, your first profile, and launch it in a few minutes.

This guide takes you from zero to a running browser profile.

Set up and launch

Create an account

Sign up at veilbrowser.net/signup. A paid plan starts at checkout; there is no trial period. Enterprise deployments start with a conversation instead, from /contact.

Create your first profile

From the dashboard, open Profiles and select New profile. Choose an operating system target (Windows, macOS, Linux or Android), a browser version between 135 and 150, and an optional proxy. Android profiles also take a device model. See Profiles for every option.

Run a worker

Browsers run on your machines, not ours. The worker image is pulled with your organization key and started with one docker run — see Run a worker for the command, the flags Chromium needs, and how to verify it. For a fleet rather than a box, a self-hosted cluster manages workers for you.

Launch the profile

Open the profile from the dashboard for an interactive window, or start it through the Local API for automation:

terminal
curl -X POST http://localhost:38923/sessions/profile \
  -H "X-API-Key: $WORKER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "profileId": "<profile-uuid>" }'

Each launch authorizes against your plan's concurrency limit, applies the profile's browser build and proxy, and returns a webSocketDebuggerUrl for CDP.

Automate (optional)

Attach an automation framework over CDP using the webSocketDebuggerUrl from the launch response:

automate.ts
import puppeteer from "puppeteer-core";

const res = await fetch("http://localhost:38923/sessions/profile", {
  method: "POST",
  headers: {
    "X-API-Key": process.env.WORKER_API_KEY!,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ profileId: "<profile-uuid>" }),
});
const { data } = await res.json();

const browser = await puppeteer.connect({
  browserWSEndpoint: data.webSocketDebuggerUrl,
});
const page = await browser.newPage();
await page.goto("https://example.com");

The returned URL is addressed to the worker's own public origin and carries a per-launch capability, so this script can run anywhere that can reach the worker. To skip the REST call, connect straight to /launch.

Stop the session

Close the window, or call DELETE /sessions/:id on the Local API. Ending a session releases its concurrency slot and reports the stop to the cloud, which is what keeps the dashboard activity list accurate.

Not every exit path flushes state

Profile state persistence depends on how the browser process ends. A clean stop flushes cookies and storage; a hard kill may not. Stop sessions deliberately when the profile's state matters.

What's next

Was this page helpful?

On this page