Gehostete Browser
Starten Sie mit einem einzigen API-Aufruf einen Clearcote-Browser auf unseren Servern und steuern Sie ihn über das Chrome DevTools Protocol, aus Playwright, Puppeteer oder jedem anderen CDP-Client. Sie müssen nichts selbst installieren oder betreiben. Der Traffic läuft standardmäßig über Residential-IPs, und Sie zahlen pro GB aus einem Prepaid-Guthaben.
- Residential-IPs statt Rechenzentrum. Websites sehen einen echten privaten Internetanschluss bei einem Endkunden-Provider, keine Hosting- oder Cloud-Adresse.
- Echte Hardware statt VPS. Die Browser laufen auf unseren eigenen dedizierten physischen Servern, nicht auf geteilten virtuellen Maschinen in der Cloud.
Mehr zu gehosteten Browsern: ein SDK für lokal und Cloud (launch(cloud=True)), Agent-Runs (eine Aufgabe rein, JSON raus), Aufzeichnungen und die Ereignis-Timeline, Cookie-Sync, Secrets und 2FA sowie Übergabe an einen Menschen und Webhooks.Gratis€5 Traffic gratis, wenn Sie GitHub verbinden. Ohne Kreditkarte.
Einmaliges Guthaben, eines pro GitHub-Konto. Das GitHub-Konto muss mindestens 30 Tage alt sein.
1. API-Key erstellen
Legen Sie einen auf der Seite API-Keys an. Er beginnt mit cc_live_ und wird als Bearer-Token gesendet. Halten Sie ihn geheim: Wer ihn besitzt, kann Ihr Guthaben ausgeben.
2. Browser starten und verbinden
POST /api/v1/browsers liefert eine connectUrl: eine WebSocket-URL für genau diesen Browser, die nur einmal gilt. Verbinden Sie sich innerhalb von zwei Minuten; ein zweites Mal lässt sie sich nicht verwenden. Der Browser startet, sobald Sie sich verbinden, meist innerhalb weniger Sekunden; mit einem country kann es aber bis zu etwa einer halben Minute dauern, weil zuerst der Standort der Exit-IP ermittelt wird. Playwright gibt standardmäßig nach 30 Sekunden auf, deshalb übergeben die Beispiele ein timeout von zwei Minuten.
// 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()Der Create-Aufruf antwortet mit 201 und allem, was Ihr Code braucht, um sich zu verbinden und den Preis zu kennen:
{
"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
}Best Practices
- Verbinden, nie starten. Verwenden Sie
connectOverCDPoderpuppeteer.connectmit derconnectUrl;chromium.launch()startet stattdessen einen Browser auf Ihrem eigenen Rechner. - Nehmen Sie, was schon da ist. Verwenden Sie
browser.contexts()[0]und dessen erste Seite statt eines neuen Kontexts: Ein neuer Kontext startet ohne die Cookies und den Storage des Profils, und Playwright gibt ihm einen emulierten 1280×720-Viewport, der nicht zum Browserfenster passt. - Die Persona beim Anlegen festlegen, nicht im Skript. Land, Zeitzone und Sprache gehören in den Create-Aufruf. Wer User-Agent, Viewport oder navigator-Eigenschaften aus einem Skript überschreibt, erzeugt genau die Inkonsistenzen, nach denen die Erkennung sucht.
- CDP-Hooks eng halten. Breite Listener, das Abfangen jedes Requests und Init-Skripte sind der ganz eigene Fingerprint der Automatisierung. Unverändertes Playwright und Puppeteer funktionieren so, wie sie sind, bis auf zwei Aufrufe (setContent und exposeFunction): Die Engine hält die Nebeneffekte von
Runtime.enablevon der Seite selbst fern, sodass ein gepatchter Treiber wie Patchright optional ist statt notwendig. - Eine Session, viele Seiten. Das Starten eines Browsers ist der langsame Teil; navigieren Sie innerhalb der Session. Melden Sie sich einmal mit einem Profil an statt bei jedem Lauf.
- Immer stoppen. Schließen Sie den Browser in einem
finally, und setzen SiemaxGbundidleTimeoutSecpassend zum Job, damit ein Bug keinen Browser auf Kosten Ihres Guthabens weiterlaufen lässt. - Erst hinsehen, dann Code schreiben. Wenn sich eine Site seltsam verhält, beobachten Sie sie in der Live-Ansicht (oder übernehmen Sie die Steuerung), bevor Sie Waits und Workarounds einbauen.