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:
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:
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
Fingerprints
What a fingerprint is and which signals you control.
Profiles
Every profile option, explained.
Run a worker
Pull the worker image and run it, with the flags Chromium needs.
Connect
Launch on your own machines and drive with Puppeteer, Playwright or Selenium.
API reference
Provision profiles and inspect sessions.