Chromium à une URL
Chromium headless ou visible, contrôlable via une API HTTP plate. Mode stealth activé par défaut, WebSocket CDP retournée à /start — branchez Puppeteer, Playwright, ou n'importe quel client CDP.
# Lance un Chromium stealth avec une empreinte
$ curl "/start?browser_id=main&stealth=true&timezoneId=America/New_York&locale=en-US"
{ "browser_id": "main",
"webSocketDebuggerUrl": "ws://.../devtools/browser/...",
"stealth": true }
# Navigue — ou passe l'URL WS à Puppeteer
$ curl "/browse?browser_id=main&url=https://hoody.com"
200 OK
# Capture ; fonctionne déjà avec votre client CDP existant
$ curl "/screenshot?browser_id=main&format=png" -o shot.png
1920x1080 PNG
Pilotez, observez et inspectez un vrai navigateur en HTTP
Chaque instance Browser expose les mêmes primitives sur lesquelles Puppeteer et Playwright reposent — navigation, eval DOM, screenshots, DevTools Protocol — mais en endpoints HTTP plats. Choisissez un onglet ci-dessous pour voir quel endpoint tourne sous le capot.
Lancez une instance, pointez-la vers une URL
GET /start lance un Chromium stealth avec votre empreinte. GET /browse?url=… charge une page. Un aller-retour HTTP, pas d'install de driver, pas d'image docker à maintenir.
Eval JS dans la page, retour de données structurées
POST /eval lance du JavaScript arbitraire dans le contexte de la page. GET /html et GET /text retournent le DOM rendu et le texte visible. Pas de librairie de sélecteurs, pas de SDK headless-browser.
Screenshot ou PDF de la page courante
GET /screenshot retourne du PNG, JPEG ou base64 — fullPage ou viewport. GET /pdf rend en A4/Letter avec landscape + marges. Le binaire revient directement ; pas de flags headless-Chrome à dompter.
Récupérez les URLs CDP, branchez-les sur n'importe quoi
GET /devtools-url retourne trois URLs : la WebSocket CDP (pour Puppeteer / Playwright / tout client CDP), l'API HTTP DevTools, et l'UI frontale DevTools. Ouvre l'URL frontale dans un onglet pour voir ce que voit l'instance headless.
Screenshot → décidez → cliquez, en boucle
La forme que tout modèle Computer Use attend : un screenshot, un snapshot DOM, un moyen de cliquer en (x, y). Browser expose tout ça en HTTP plat — pose-le derrière Claude Computer Use, l'Operator d'OpenAI, ou votre propre agent.
docker run chromium + fonts + patches d'empreinte
curl /start?stealth=true → prêt
Lancez, pilotez et arrêtez Chromium en HTTP
Chaque endpoint retourne du JSON déterministe ou du binaire. Pas de scraping de stderr, pas de fichiers /tmp, pas de race conditions avec un sous-processus qui a oublié de flush.
# 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})
Là où les équipes déploient Browser
Une couche HTTP plate au-dessus de Chromium ouvre des points d'intégration qu'un navigateur headless installé localement ne peut pas couvrir. Six formes de déploiement qu'on voit le plus souvent.
Pipelines de données
Ingère du HTML rendu et du JSON dans votre entrepôt. Cron les appels /eval, pipe les résultats dans Snowflake, BigQuery ou Postgres. Pas d'install Chromium par worker, pas de dérive de version dans votre cluster.
Frameworks d'agents
Branche-vous à Claude Computer Use, OpenAI Operator, ou aux outils navigateur LangChain. Screenshot + eval, c'est la forme qu'ils attendent déjà — Browser est un endpoint HTTP drop-in pour n'importe quel runtime d'agent.
Workflows authentifiés
Pilote des dashboards connectés — panels admin SaaS, portails bancaires, outils internes. POST /cookies persiste la session, donc les appels suivants gardent l'identité sans re-s'authentifier à chaque fois.
Apps de review
Previews navigateur par PR. votre CI lance une instance Browser sur le build staged, retourne le lien frontal /devtools-url dans le commentaire de PR, les reviewers cliquent une fois et regardent l'app live.
Monitoring planifié
Captures /screenshot et /network déclenchées par cron vers des dashboards uptime, SLO et perf. Ring-buffer les 500 dernières entrées console et réseau pour chaque sonde — détecte les régressions avant les utilisateurs.
Snapshots de conformité
Captures horodatées et empreinte verrouillée d'une page tierce pour les workflows juridiques, audit ou preuve. Fige le canal Chromium, le viewport, la géolocalisation — reproduis le rendu exact des mois plus tard.
23 opérations, 4 groupes d'endpoints
Chaque capacité de Browser est un appel HTTP plat. Les variantes de méthode sur le même path sont listées séparément parce qu'elles se comportent différemment — GET /eval lance un script one-shot, POST /eval accepte un body complet.
Interaction
8 endpointscurl /browse?browser_id=main&url=https://example.com → { tabId, url, created, reused }
État de session
5 endpointscurl -X POST /cookies -d '{ cookies: [{ name, value, url }] }' → { added: 2 }
Introspection
6 endpointscurl /devtools-url?browser_id=main → { webSocketDebuggerUrl, devtoolsHttpUrl, devtoolsFrontendUrl }
Cycle de vie
5 endpointscurl /start?browser_id=main&stealth=true → { browser_id, webSocketDebuggerUrl, stealth: true }
24 endpoints répartis sur quatre domaines fonctionnels. 23 fonctionnent contre l'URL de votre conteneur browser avec les chemins courts indiqués ; le health check est la seule exception, servi par l'API centrale sur api.hoody.com/api/v1/browser/health. Les méthodes suivent les docs : browse et eval acceptent GET et POST ; cookies ajoute GET, POST et DELETE.
Stealth, fingerprinting et CDP — sans la taxe de setup
Browser est une fine couche au-dessus de Chromium — tout ce que vous installeriez, patcheriez et baby-sitteriez est à un paramètre près. Six capacités qui comptent quand vous livrez pour de vrai.
Spoofing d'empreinte
Configurez UA, viewport, fuseau, locale et géolocalisation sur /start — ou pointez sur un fingerprintId pour charger un preset JSON. Canvas et WebGL suivent le profil automatiquement.
Mode stealth
L'anti-détection Patchright est activée par défaut sur Chromium. Pas blindée contre tous les vendeurs de détection — couple-la à un fournisseur de résolution CAPTCHA pour les sites adverses.
Pass-through CDP
GET /devtools-url retourne l'URL WebSocket, l'API HTTP DevTools et l'UI frontale. votre code Puppeteer ou Playwright existant continue de marcher — connecte, ne réécris pas.
Proxy & DoH
Proxies SOCKS5, SOCKS5h, HTTP, HTTPS avec auth et listes de bypass. DNS-over-HTTPS via Cloudflare activé par défaut. QUIC/HTTP3 opt-in par instance.
Canaux Chromium
Figez n'importe quel build Chromium — version complète, version majeure ou canal (stable / beta / dev / canary). Firefox aussi supporté via browser=firefox.
Ring buffers de debug
500 dernières entrées console et 500 entrées réseau par instance, plus historique de navigation persistant avec endpoints de query et delete. Inutile de câbler une couche de logging externe.
Ajoutez un vrai navigateur à votre stack
Browser est l'un des services Hoody Kit livrés avec chaque container. Pas d'install de driver, pas d'échafaudage Puppeteer, pas de patching d'empreinte. Commencez avec une URL.