Navigateurs hébergés
Lancez un navigateur Clearcote sur nos serveurs en un seul appel d’API et pilotez-le via le Chrome DevTools Protocol, depuis Playwright, Puppeteer ou n’importe quel client CDP. Rien à installer ni à faire tourner vous-même. Par défaut, le trafic sort par des IP résidentielles, et vous payez au Go sur un solde prépayé.
- Des IP résidentielles, pas de datacenter. Les sites voient une vraie connexion internet domestique, chez un fournisseur d’accès grand public, pas une adresse d’hébergeur ou de cloud.
- Du vrai matériel, pas un VPS. Les navigateurs tournent sur nos propres serveurs physiques dédiés, pas sur des machines virtuelles partagées dans le cloud.
Pour aller plus loin : un seul SDK en local et dans le cloud (launch(cloud=True)), les exécutions d’agent (une tâche en entrée, du JSON en sortie), les enregistrements et la chronologie des événements, la synchronisation des cookies, les secrets et la 2FA, et le passage de relais à une personne et les webhooks.GratuitRecevez €5 de trafic offerts en connectant GitHub. Sans carte.
Offre unique, une seule par compte GitHub. Le compte GitHub doit avoir été créé il y a au moins 30 jours.
1. Obtenir une clé d’API
Créez-en une sur la page « API keys ». Elle commence par cc_live_ et est envoyée comme jeton Bearer. Gardez-la secrète : quiconque la détient peut dépenser votre solde.
2. Démarrer un navigateur et s’y connecter
POST /api/v1/browsers renvoie un connectUrl : une URL WebSocket à usage unique pour ce navigateur. Connectez-vous dans les deux minutes ; elle ne peut pas servir deux fois. Le navigateur démarre dès que vous vous connectez, généralement en quelques secondes, mais avec un country cela peut prendre jusqu’à une demi-minute environ, car la localisation de l’IP de sortie est d’abord déterminée. Par défaut, Playwright abandonne au bout de 30 secondes ; les exemples passent donc un timeout de deux minutes.
// 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// Puppeteer: the same connectUrl
const browser = await puppeteer.connect({ browserWSEndpoint: connectUrl, defaultViewport: null });# 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()L’appel de création répond 201 avec tout ce dont votre code a besoin pour se connecter et connaître le prix :
{
"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
}Bonnes pratiques
- Connectez-vous, ne lancez jamais. Utilisez
connectOverCDPoupuppeteer.connectavec leconnectUrl;chromium.launch(), lui, démarre un navigateur sur votre propre machine. - Utilisez ce qui existe déjà. Prenez
browser.contexts()[0]et sa première page plutôt qu’un nouveau contexte : un nouveau contexte démarre sans les cookies ni le stockage du profil, et Playwright lui attribue un viewport émulé de 1280×720 qui ne correspond pas à la fenêtre du navigateur. - Définissez la persona à la création, pas depuis le script. Le pays, le fuseau horaire et la langue ont leur place dans l’appel de création. Surcharger le user agent, le viewport ou les propriétés de navigator depuis un script crée précisément les incohérences que recherche la détection.
- Limitez les hooks CDP au strict nécessaire. Les listeners trop larges, l’interception de toutes les requêtes et les scripts d’initialisation constituent l’empreinte propre de l’automatisation. Playwright et Puppeteer d’origine fonctionnent tels quels, à deux appels près (setContent et exposeFunction) : le moteur tient les effets de bord de
Runtime.enableà l’écart de la page elle-même, si bien qu’un driver patché comme Patchright est facultatif plutôt que nécessaire. - Une session, de nombreuses pages. Le démarrage du navigateur est l’étape lente ; naviguez à l’intérieur. Connectez-vous une seule fois grâce à un profil plutôt qu’à chaque exécution.
- Arrêtez toujours. Fermez le navigateur dans un
finally, et réglezmaxGbetidleTimeoutSecen fonction de la tâche, pour qu’un bug ne puisse pas laisser un navigateur tourner sur votre solde. - Regardez avant d’ajouter du code. Quand un site se comporte mal, observez-le dans la vue en direct (ou prenez la main) avant d’ajouter des attentes et autres rustines.