Saltar al contenido

Navegadores alojados

Inicia un navegador Clearcote en nuestros servidores con una sola llamada a la API y contrólalo por el Chrome DevTools Protocol desde Playwright, Puppeteer o cualquier cliente CDP. No tienes que instalar ni ejecutar nada por tu cuenta. Por defecto, el tráfico sale por IPs residenciales y pagas por GB con un saldo prepago.

  • IPs residenciales, no de centro de datos. Los sitios web ven una conexión doméstica real de un proveedor de internet para hogares, no una dirección de hosting o de la nube.
  • Hardware real, no un VPS. Los navegadores corren en nuestros propios servidores físicos dedicados, no en máquinas virtuales compartidas en la nube.
Más sobre navegadores alojados: un SDK para local y nube (launch(cloud=True)), ejecuciones de agente (entra una tarea, sale JSON), grabaciones y la línea de tiempo de eventos, sincronización de cookies, secretos y 2FA, y traspaso a una persona y webhooks.

GratisObtén €5 de tráfico gratis al conectar GitHub. Sin tarjeta.

Una sola vez, uno por cuenta de GitHub. La cuenta de GitHub debe tener al menos 30 días de antigüedad.

Reclamar €5

1. Obtén una clave de API

Crea una en la página “API keys”. Empieza con cc_live_ y se envía como token Bearer. Mantenla en secreto: cualquiera que la tenga puede gastar tu saldo.

2. Inicia un navegador y conéctate

POST /api/v1/browsers devuelve una connectUrl: una URL de WebSocket de un solo uso para ese navegador. Conéctate dentro de los dos minutos siguientes; no se puede usar dos veces. El navegador arranca en cuanto te conectas, normalmente en pocos segundos, pero con un country puede tardar hasta alrededor de medio minuto, porque antes se consulta la ubicación de la IP de salida. Por defecto, Playwright deja de esperar a los 30 segundos, así que los ejemplos pasan un timeout de dos minutos.

javascript
// Node.js + Playwright
import { chromium } from "playwright";

const res = await fetch("https://www.clearcotelabs.com/api/v1/browsers", {
  method: "POST",
  headers: { authorization: "Bearer cc_live_...", "content-type": "application/json" },
  body: JSON.stringify({ identity: "account-1", country: "us" }),
});
const { connectUrl, id, error } = await res.json();
if (error) throw new Error(error);

const browser = await chromium.connectOverCDP(connectUrl, { timeout: 120_000 }); // the browser starts as you connect
const context = browser.contexts()[0];
const page = context.pages()[0] ?? (await context.newPage());
await page.goto("https://example.com");
await browser.close(); // ends the session
javascript
// Puppeteer: the same connectUrl
const browser = await puppeteer.connect({ browserWSEndpoint: connectUrl, defaultViewport: null });
python
# Python + Playwright
import requests
from playwright.sync_api import sync_playwright

r = requests.post("https://www.clearcotelabs.com/api/v1/browsers",
                  headers={"authorization": "Bearer cc_live_..."},
                  json={"identity": "account-1", "country": "de"}).json()
with sync_playwright() as p:
    browser = p.chromium.connect_over_cdp(r["connectUrl"], timeout=120_000)
    page = browser.contexts[0].new_page()
    page.goto("https://example.com")
    browser.close()

La llamada de creación responde 201 con todo lo que tu código necesita para conectarse y para saber el precio:

json
{
  "id": "bs_…",                       // use it with GET / DELETE /api/v1/browsers/<id>
  "connectUrl": "wss://…/v1/connect/bs_…?token=…",
  "expiresAt": "2026-09-24T10:02:00.000Z", // connect before this (two minutes)
  "worker": "w_…",
  "pricing": { "eurPerGb": 1, "eurPerHour": 0 },
  "limits": { "maxSeconds": 14400, "idleSeconds": 300 } // plus maxBytes when capped
}

Buenas prácticas

  1. Conéctate; nunca lances un navegador. Usa connectOverCDP o puppeteer.connect con la connectUrl; chromium.launch() inicia un navegador en tu propia máquina.
  2. Usa lo que ya existe. Toma browser.contexts()[0] y su primera página en lugar de crear un contexto nuevo: un contexto nuevo empieza sin las cookies ni el almacenamiento del perfil, y Playwright le asigna un viewport emulado de 1280×720 que no coincide con la ventana del navegador.
  3. Define la persona al crear la sesión, no desde el script. El país, la zona horaria y el idioma van en la llamada de creación. Sobrescribir el user agent, el viewport o las propiedades de navigator desde un script genera justo las inconsistencias que busca la detección.
  4. Mantén los hooks de CDP al mínimo. Los listeners amplios, la intercepción de todas las solicitudes y los init scripts son la huella propia de la automatización. Playwright y Puppeteer sin modificar funcionan tal cual, salvo dos llamadas (setContent y exposeFunction): el motor mantiene los efectos secundarios de Runtime.enable fuera de la página, así que un driver parcheado como Patchright es opcional, no necesario.
  5. Una sesión, muchas páginas. Iniciar un navegador es la parte lenta; navega dentro de él. Inicia sesión una sola vez con un perfil en lugar de hacerlo en cada ejecución.
  6. Detenlo siempre. Cierra el navegador en un finally, y ajusta maxGb y idleTimeoutSec al trabajo, para que un bug no pueda dejar un navegador corriendo a costa de tu saldo.
  7. Mira antes de agregar código. Cuando un sitio se comporta de forma extraña, obsérvalo en la vista en vivo (o toma el control) antes de agregar esperas y parches.