Aller au contenu
Chromium en URL
Spoofing d'empreinte
Contrôle des onglets
API Screenshot
Eval JavaScript
Interception réseau
Chrome DevTools Protocol
Compatible Puppeteer
Chromium en URL
Spoofing d'empreinte
Contrôle des onglets
API Screenshot
Eval JavaScript
Interception réseau
Chrome DevTools Protocol
Compatible Puppeteer
Chromium en URL
Spoofing d'empreinte
Contrôle des onglets
API Screenshot
Eval JavaScript
Interception réseau
Chrome DevTools Protocol
Compatible Puppeteer
Chromium en URL
Spoofing d'empreinte
Contrôle des onglets
API Screenshot
Eval JavaScript
Interception réseau
Chrome DevTools Protocol
Compatible Puppeteer
BrowserService Kit

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.

abc123-def456-browser-1.node-us-1.containers.hoody.com
GET /start?browser_id=main&stealth=true&timezoneId=America/New_York
200 OK

# 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

Trois classes d'endpoints, une URL

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.

01 / 05

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.

curl /start?stealth=true → prêt
02 / 05

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.

POST /eval → [ "Headline 1", "Headline 2", … ]
03 / 05

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.

GET /screenshot?fullPage=true → binaire PNG
04 / 05

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.

GET /devtools-url → [ ws, http, frontend ]
05 / 05

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.

boucle : screenshot → eval('click(x,y)')
Avant· Headless traditionnel

docker run chromium + fonts + patches d'empreinte

Après· Hoody Browser

curl /start?stealth=true → prêt

API

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.

browser-api.sh

# 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"

browser-api.js

// 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}`);

browser_api.py

# 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})

Utilisé pour

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.

{01}

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.

{02}

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.

{03}

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.

{04}

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.

{05}

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.

{06}

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.

API

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 endpoints

curl /browse?browser_id=main&url=https://example.com → { tabId, url, created, reused }

GET
/browse?url=Crée ou reprend une instance avec browser_id, fingerprint, stealth, proxy, viewport.
POST
/browseMet une instance en pause — l'état persiste. Utilisez /restart pour reprendre.
GET
/eval?script=Arrête et relance avec une config optionnellement mise à jour.
POST
/evalTermine l'instance et libère le slot. ?force=true tue les instances bloquées.
GET
/htmlNavigue avec un body JSON — waitUntil, timeout, referer, headers.
GET
/textNavigation raccourcie pour l'ergonomie curl-en-shell.
GET
/screenshotExécute du JavaScript (brut ou base64) dans le contexte de la page, retourne le résultat.
GET
/pdfEval inline pour les lectures one-shot type document.title.

État de session

5 endpoints

curl -X POST /cookies -d '{ cookies: [{ name, value, url }] }' → { added: 2 }

GET
/cookiesRetourne document.documentElement.outerHTML — rendu, pas brut.
POST
/cookiesRetourne document.body.innerText — ce qu'un humain lit.
DELETE
/cookiesPNG / JPEG / base64 — fullPage supporté, qualité JPEG 0-100.
GET
/historyRend en PDF — A4/Letter, landscape, marges, printBackground.
DELETE
/historyListe les cookies, optionnellement filtrés par URL.

Introspection

6 endpoints

curl /devtools-url?browser_id=main → { webSocketDebuggerUrl, devtoolsHttpUrl, devtoolsFrontendUrl }

GET
/metadataAjoute des cookies — name, value, domain, path, httpOnly, secure, sameSite.
GET
/tabsVide tous les cookies de l'instance.
POST
/tab/closeMétadonnées complètes de l'instance — session, viewport, URLs DevTools, liste d'onglets.
GET
/devtools-urlListe les onglets ouverts avec id, url, title, isActive.
GET
/consoleFerme un onglet par id — ou l'onglet actif si rien n'est précisé.
GET
/networkRetourne les URLs WebSocket CDP + HTTP DevTools + UI frontale.

Cycle de vie

5 endpoints

curl /start?browser_id=main&stealth=true → { browser_id, webSocketDebuggerUrl, stealth: true }

GET
/start500 dernières entrées console — log, error, warn, info.
GET
/stop500 dernières entrées réseau — method, URL, status, resourceType.
GET
/restartHistorique de navigation persistant paginé avec filtres domaine + temps.
GET
/shutdownSupprime les entrées d'historique correspondant au filtre.
GET
/api/v1/browser/healthVérification de liveness et de readiness — servie par l'API centrale (api.hoody.com), pas par l'URL du conteneur.

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.

Capacités

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.

Patchright stealth
Fingerprint profiles
CDP WebSocket
Proxy SOCKS5 / HTTP
DNS-over-HTTPS
Chromium channels
Firefox backend
500-entry console ring
500-entry network ring
Persistent history
Patchright stealth
Fingerprint profiles
CDP WebSocket
Proxy SOCKS5 / HTTP
DNS-over-HTTPS
Chromium channels
Firefox backend
500-entry console ring
500-entry network ring
Persistent history
Patchright stealth
Fingerprint profiles
CDP WebSocket
Proxy SOCKS5 / HTTP
DNS-over-HTTPS
Chromium channels
Firefox backend
500-entry console ring
500-entry network ring
Persistent history
Patchright stealth
Fingerprint profiles
CDP WebSocket
Proxy SOCKS5 / HTTP
DNS-over-HTTPS
Chromium channels
Firefox backend
500-entry console ring
500-entry network ring
Persistent history
Cookie injection
JS eval in page
PNG / JPEG / PDF export
Viewport + DPR
Timezone + locale
Custom UA strings
Geolocation override
QUIC / HTTP3 opt-in
Per-instance browser_id
Cookie injection
JS eval in page
PNG / JPEG / PDF export
Viewport + DPR
Timezone + locale
Custom UA strings
Geolocation override
QUIC / HTTP3 opt-in
Per-instance browser_id
Cookie injection
JS eval in page
PNG / JPEG / PDF export
Viewport + DPR
Timezone + locale
Custom UA strings
Geolocation override
QUIC / HTTP3 opt-in
Per-instance browser_id
Cookie injection
JS eval in page
PNG / JPEG / PDF export
Viewport + DPR
Timezone + locale
Custom UA strings
Geolocation override
QUIC / HTTP3 opt-in
Per-instance browser_id

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.

Lire la doc