Chromium en una URL
Chromium headless o visible, controlable a través de una API HTTP plana. Stealth activado por defecto, WebSocket CDP disponible en /start: apunta Puppeteer, Playwright o cualquier cliente CDP hacia él.
# Lanzar un Chromium stealth con una huella digital
$ curl "/start?browser_id=main&stealth=true&timezoneId=America/New_York&locale=en-US"
[ "browser_id": "main",
"webSocketDebuggerUrl": "ws://.../devtools/browser/...",
"stealth": true ]
# Navegar — o pasa la URL WS a Puppeteer
$ curl "/browse?browser_id=main&url=https://hoody.com"
200 OK
# Capturar; ya funciona con tu cliente CDP existente
$ curl "/screenshot?browser_id=main&format=png" -o shot.png
1920x1080 PNG
Controla, observa e inspecciona un navegador real por HTTP
Cada instancia de Browser expone los mismos primitivos en los que confían Puppeteer y Playwright — navegación, eval de DOM, capturas, DevTools Protocol — pero como endpoints HTTP planos. Elige una pestaña para ver qué endpoint se ejecuta por debajo.
Inicia una instancia, apúntala a una URL
GET /start lanza un Chromium stealth con tu huella digital. GET /browse?url=… carga una página. Un round-trip HTTP, sin instalar driver, sin imagen Docker que mantener.
Evalúa JS en la página, devuelve datos estructurados
POST /eval ejecuta JavaScript arbitrario en el contexto de la página. GET /html y GET /text devuelven el DOM renderizado y el texto visible. Sin librería de selectores, sin SDK headless.
Captura o convierte la página actual a PDF
GET /screenshot devuelve PNG, JPEG o base64 — fullPage o viewport. GET /pdf renderiza a A4/Letter con orientación horizontal + márgenes. El binario viene directamente; sin flags de headless-Chrome que gestionar.
Obtén las URLs CDP y pásalas a cualquier herramienta
GET /devtools-url devuelve tres URLs: el WebSocket CDP (para Puppeteer / Playwright / cualquier cliente CDP), la API HTTP de DevTools y la UI frontend de DevTools. Abre la URL del frontend en una pestaña del navegador para ver lo que ve la instancia headless.
Captura → decide → clic, en un bucle
La forma que espera todo modelo Computer-Use: una captura de pantalla, un snapshot del DOM, una forma de hacer clic en (x, y). Browser expone esto por HTTP simple: ponlo detrás de Claude Computer Use, Operator de OpenAI o tu propio agente.
docker run chromium + fonts + fingerprint patches
curl /start?stealth=true → listo
Inicia, controla y destruye Chromium por HTTP
Cada endpoint devuelve JSON determinista o binario. Sin parsear stderr, sin archivos /tmp, sin condiciones de carrera con un subprocess que olvidó hacer flush.
# Flujo completo de Browser — iniciar, navegar, extraer, apagar
URL="https://proj-dev-browser-1.hoody.com"
ID="main"
# 1. Lanzar un Chromium stealth
curl -s "$URL/start?browser_id=$ID&stealth=true"
# 2. Navegar
curl -s "$URL/browse?browser_id=$ID&url=https://hoody.com"
# 3. Extraer datos estructurados
curl -s -X POST "$URL/eval?browser_id=$ID" \
-H 'Content-Type: application/json' \
-d '["script":"document.title"]'
# > "Example Domain"
# 4. Liberar el slot
curl -s "$URL/shutdown?browser_id=$ID"
// Flujo completo de Browser — iniciar, navegar, extraer, apagar
const BASE = 'https://proj-dev-browser-1.hoody.com';
const id = 'main';
// 1. Lanzar un Chromium stealth
const start = await fetch(`$[BASE]/start?browser_id=$[id]&stealth=true`);
const [ webSocketDebuggerUrl ] = await start.json();
// 2. Navegar
await fetch(`$[BASE]/browse?browser_id=$[id]&url=https://hoody.com`);
// 3. Extraer datos estructurados
const r = await fetch(`$[BASE]/eval?browser_id=$[id]`, [
method: 'POST',
headers: [ 'Content-Type': 'application/json' ],
body: JSON.stringify([ script: 'document.title' ])
]);
const title = await r.json();
// => "Example Domain"
// 4. Liberar el slot
await fetch(`$[BASE]/shutdown?browser_id=$[id]`);
# Flujo completo de Browser — iniciar, navegar, extraer, apagar
import requests
BASE = 'https://proj-dev-browser-1.hoody.com'
id = 'main'
# 1. Lanzar un Chromium stealth
start = requests.get(f'[BASE]/start', params=['browser_id': id, 'stealth': 'true'])
ws = start.json()['webSocketDebuggerUrl']
# 2. Navegar
requests.get(f'[BASE]/browse', params=['browser_id': id, 'url': 'https://hoody.com'])
# 3. Extraer datos estructurados
r = requests.post(f'[BASE]/eval',
params=['browser_id': id],
json=['script': 'document.title'])
title = r.json()
# => "Example Domain"
# 4. Liberar el slot
requests.get(f'[BASE]/shutdown', params=['browser_id': id])
Dónde los equipos despliegan Browser
Una capa HTTP plana sobre Chromium abre puntos de integración que un navegador headless instalado localmente no puede cubrir. Las seis formas de despliegue que vemos con más frecuencia.
Pipelines de datos
Ingesta HTML renderizado y JSON en tu warehouse. Programa las llamadas a /eval con cron y pasa los resultados a Snowflake, BigQuery o Postgres. Sin instalar Chromium por worker, sin drift de versiones en tu cluster.
Frameworks de agentes
Conéctalo a Claude Computer Use, OpenAI Operator o herramientas de browser de LangChain. Screenshot + eval es la forma que ya esperan: Browser es un endpoint HTTP drop-in para cualquier runtime de agente que uses.
Flujos de trabajo autenticados
Controla dashboards con sesión iniciada: paneles de admin SaaS, portales bancarios, herramientas internas. POST /cookies persiste la sesión, así las llamadas posteriores mantienen la identidad sin re-autenticar en cada ejecución.
Apps de revisión
Previsualizaciones de browser por PR. Tu CI lanza una instancia de Browser contra el build de staging, devuelve el enlace frontend de /devtools-url en el comentario del PR y los revisores hacen clic una vez para ver la app en vivo.
Monitoreo programado
Capturas de /screenshot y /network activadas por cron en dashboards de uptime, SLO y rendimiento. Buffer circular de las últimas 500 entradas de consola y red por cada sonda: detecta regresiones antes que los usuarios.
Snapshots de cumplimiento
Capturas con timestamp y huella digital bloqueada de una página de terceros para flujos de trabajo legales, de auditoría o de evidencia. Fija el canal de Chromium, el viewport, la geolocalización: reproduce el render exacto meses después.
23 operaciones, 4 grupos de endpoints
Cada capacidad de Browser es una llamada HTTP plana. Las variantes de método en el mismo path se listan por separado porque se comportan de forma diferente: GET /eval ejecuta un script puntual, POST /eval acepta un body completo.
Interacción
[count, plural, one [# endpoint] other [# endpoints]]'curl -X POST /eval -d '["script":"document.title"]' → "Example"
Estado de sesión
[count, plural, one [# endpoint] other [# endpoints]]'curl -X POST /cookies -d '[[name,value,domain,...]]' → [ added: 4 ]
Introspección
[count, plural, one [# endpoint] other [# endpoints]]'curl /devtools-url?browser_id=main → [ ws, http, frontend ]
Ciclo de vida
[count, plural, one [# endpoint] other [# endpoints]]'curl /start?browser_id=main&stealth=true → [ ws, stealth: true ]
Más GET /health y GET /metrics heredados de la plataforma, presentes en todos los servicios de Hoody Kit.
Stealth, fingerprinting y CDP sin el coste de configuración
Browser es una capa fina sobre Chromium: todo lo que instalarías, parchearías y mantendrías está a un parámetro de distancia. Seis capacidades que importan cuando realmente lanzas.
Spoofing de fingerprint
Configura UA, viewport, zona horaria, locale y geolocalización en /start, o apunta a un fingerprintId para cargar un JSON preconfigurado. Canvas y WebGL siguen el perfil automáticamente.
Modo stealth
La antidetección de Patchright está activada por defecto para Chromium. No es infalible ante todos los proveedores de detección; combínala con un proveedor de resolución de CAPTCHA para sitios adversariales.
CDP pass-through
GET /devtools-url devuelve la URL de WebSocket, la API HTTP de DevTools y el frontend UI. El código existente de Puppeteer o Playwright sigue funcionando: conéctate, no reescribas.
Proxy y DoH
Proxies SOCKS5, SOCKS5h, HTTP, HTTPS con autenticación y listas de bypass. DNS over HTTPS via Cloudflare activado por defecto. QUIC/HTTP3 opcional por instancia.
Canales de Chromium
Fija cualquier build de Chromium: string de versión completa, versión mayor o canal (stable / beta / dev / canary). Firefox también compatible via browser=firefox.
Buffers de depuración
Últimas 500 entradas de consola y 500 de red por instancia, más historial de navegación persistente con endpoints de consulta y eliminación. Sin necesidad de conectar una capa de logging externa.
Añade un browser real a tu stack
Browser es uno de los servicios de Hoody Kit incluidos en cada contenedor. Sin instalar drivers, sin scaffolding de Puppeteer, sin parchear fingerprints. Empieza con una URL.