Chromium automation over plain HTTP
Headless Chromium you drive over plain HTTP — navigate pages, evaluate JavaScript, capture screenshots and PDFs, and stream the Chrome DevTools Protocol, all from one container URL. No Puppeteer install, no binaries to manage.
1 · Spawn a stealth Chromium instance
$ curl "/start?browser_id=main&stealth=true&timezoneId=America/New_York&locale=en-US"
{ "browser_id": "main",
"webSocketDebuggerUrl": "ws://.../devtools/browser/...",
"stealth": true }
2 · Navigate to any URL
$ curl "/browse?browser_id=main&url=https://hoody.com"
200 OK
3 · Capture a full-page screenshot
$ curl "/screenshot?browser_id=main&format=png" -o shot.png
1920x1080 PNG
From URL to data in four calls
Start an instance, point it at a page, pull what you need, and hand the live session to an agent — every step a single HTTP request.
Navigate
GET /browse opens or reuses a tab and loads any URL, returning the new tab id.
Extract
Pull content with /eval, /html, or /text — read document.title or scrape the whole DOM.
Capture
Snapshot the page as a PNG, JPEG, or PDF, full-page or viewport only.
Observe
Read the 500-entry console and network buffers plus instance metadata for debugging.
Hand off to an agent
Expose the DevTools WebSocket so Puppeteer, Playwright, or an AI agent can take over.
Install Puppeteer, ship the Chromium binary, run a headless worker, and keep the version matrix patched — on every machine and every CI runner.
One container URL. curl /start, /browse, /eval, /screenshot. No binaries, no driver, no headless plumbing — any language that speaks HTTP.
The same flow in shell, JavaScript, and Python
start → browse → eval → shutdown. It is just HTTP, so any client works — here is the identical lifecycle in three.
# Full Browser flow — start, navigate, extract, shutdown
URL="https://abc123-def456-browser-1.node-us-1.containers.hoody.com"
ID="main"
# 1. Spawn a stealth Chromium (Patchright)
curl -s "$URL/start?browser_id=$ID&stealth=true"
# 2. Navigate to a page
curl -s "$URL/browse?browser_id=$ID&url=https://example.com"
# 3. Read the page title back
curl -s -X POST "$URL/eval?browser_id=$ID" \
-H 'Content-Type: application/json' \
-d '{"script":"document.title"}'
# > { "result": "Example Domain" }
# 4. Release the slot
curl -s "$URL/shutdown?browser_id=$ID"
// Full Browser flow — start, navigate, extract, shutdown
const BASE = 'https://abc123-def456-browser-1.node-us-1.containers.hoody.com';
const id = 'main';
// 1. Spawn a stealth Chromium (Patchright)
const start = await fetch(`${BASE}/start?browser_id=${id}&stealth=true`);
const { webSocketDebuggerUrl } = await start.json();
// 2. Navigate to a page
await fetch(`${BASE}/browse?browser_id=${id}&url=https://example.com`);
// 3. Read the page title back
const r = await fetch(`${BASE}/eval?browser_id=${id}`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ script: 'document.title' })
});
const { result } = await r.json();
// => "Example Domain"
// 4. Release the slot
await fetch(`${BASE}/shutdown?browser_id=${id}`);
# Full Browser flow — start, navigate, extract, shutdown
import requests
BASE = 'https://abc123-def456-browser-1.node-us-1.containers.hoody.com'
id = 'main'
# 1. Spawn a stealth Chromium (Patchright)
start = requests.get(f'{BASE}/start', params={'browser_id': id, 'stealth': 'true'})
ws = start.json()['webSocketDebuggerUrl']
# 2. Navigate to a page
requests.get(f'{BASE}/browse', params={'browser_id': id, 'url': 'https://example.com'})
# 3. Read the page title back
r = requests.post(f'{BASE}/eval',
params={'browser_id': id},
json={'script': 'document.title'})
title = r.json()['result']
# => "Example Domain"
# 4. Release the slot
requests.get(f'{BASE}/shutdown', params={'browser_id': id})
What teams build on it
Six patterns the Browser API was shaped around — each one a few HTTP calls away.
Scraping pipelines
Navigate, then pull structured data with /eval, /html, or /text — no driver to babysit between runs.
AI web agents
Let an agent browse, read, and act on pages over HTTP, or attach to the live DevTools socket.
Authenticated sessions
Inject cookies with POST /cookies and reuse a persistent browser_id to keep a logged-in session warm.
Live DevTools preview
Share the /devtools-url WebSocket to watch and debug a running instance in real time.
Visual monitoring
Capture full-page screenshots and PDFs on a schedule for regression and uptime checks.
Geo & stealth testing
Spoof timezone, locale, geolocation, and fingerprint to verify how a site behaves from anywhere.
Twenty-four endpoints, one container URL
Every browser action is a plain HTTP call against your instance host, grouped into four functional areas.
Interaction & Content
8 endpointscurl /browse?browser_id=main&url=https://example.com → { tabId, url, created, reused }
Cookies & History
5 endpointscurl -X POST /cookies -d '{ cookies: [{ name, value, url }] }' → { added: 2 }
Introspection & Debug
6 endpointscurl /devtools-url?browser_id=main → { webSocketDebuggerUrl, devtoolsHttpUrl, devtoolsFrontendUrl }
Lifecycle & Health
5 endpointscurl /start?browser_id=main&stealth=true → { browser_id, webSocketDebuggerUrl, stealth: true }
24 endpoints across four functional areas. 23 run against your browser container URL using the short paths shown; the health check is the one exception, served by the central API at api.hoody.com/api/v1/browser/health. Methods follow the docs: browse and eval accept GET and POST; cookies add GET, POST, and DELETE.
More than a headless tab
Each instance is a fully configurable Chromium — stealth, fingerprints, proxies, and the Chrome DevTools Protocol, tuned per request.
Fingerprint profiles
Load a base profile by id, then override user agent, viewport, geolocation, timezone, and locale per request.
Patchright stealth
Chromium launches in stealth mode by default, using Patchright to blunt automated-browser detection.
Chrome DevTools Protocol
The /devtools-url endpoint hands back a WebSocket you can drive with Puppeteer, Playwright, or any CDP client.
Proxy & secure DNS
Route each instance through an HTTP or SOCKS5 proxy with auth and bypass lists; DNS-over-HTTPS is on by default.
Chromium channels & Firefox
Pin an exact Chromium version or a stable, beta, dev, or canary channel — or switch the engine to Firefox.
Logs & history
Tail 500-entry console and network ring buffers, and query or clear the instance's persistent browsing history.
Spin up a browser in one request
No Puppeteer install, no Chromium binaries, no headless plumbing. Start an instance and drive it over HTTP from any language.