PrompteryxBeta
    ⌘K
    PlatformSupport
    Menu
    IntroductionInstall Desktop & extensionQuick StartPlatform Overview
    OverviewWhat you can makeAI Browser Agent in the chatModels and AutoConnectorsSchedulesProjectsExplore and publishingShare linksMemory and SkillsPersonal agent (beta)Welcome, settings and skinsPlans, credits and top-upsPrompteryx DesktopGroups (pilot)Phone app (early access)
    OverviewCreating WorkflowsTesting & DebuggingScheduling
    OverviewGetting StartedCommandsRecordingSettingsStructured OutputParallel AgentsTips & Best Practices
    OverviewInstallationSidebar AgentUsing Attached FilesExecute on Current TabExporting to Visual Studio
    Overview
    OverviewOpen PageClickClick CoordinatesFillExtract TextScreenshotWaitPress KeyFocus ElementBlur ElementSelect TextHighlight ElementSet ViewportGet Bounding BoxScrollHoverSelect OptionAssertionsCookiesEvaluate JavaScriptExample Workflows
    OverviewPrompteryx Browser AgentOpenAI
    OverviewSchedule TriggerWebhook Trigger
    OverviewGoogle SheetsGoogle CalendarConnect Hub (3,000+ apps)Example Workflows
    AI Vision SettingsChrome Automation ProfilesCloud BrowserBrowser Profiles & Persistent ContextVideo RecordingExecution LogsSharing & CollaborationEdit History
    Selectors GuideVariables
    Start hereGet an API keyRun the AI browser agentDrive a cloud browserRun workflows from anywhereUse connected apps (Connect Hub)SDK (TypeScript)CLIMCP for AI assistants
    REST APIWebhooksMCP toolsCloud Browser APICloud Browser quickstartMigrate from Browserbasen8nZapierMake.com

    Need help? Contact Support

    1. Documentation
    2. Cloud Browser

    Prompteryx Cloud Browser

    Real Chrome browsers in our cloud, driven from your code over CDP — recordable, proxy-capable, and metered to your plan. Or skip the session entirely with managed Fetch and Search.

    Overview

    A cloud browser is a full Chromium instance on our infrastructure. Create a session, get a WebSocket connectUrl, and connect Playwright (or any CDP client) — like a local browser, but headless, scalable, and observable. Three ways to use it:

    • Sessions API / SDK — full control: create a session, drive it with Playwright.
    • Fetch / Search — managed: we run a short session and return page content or search results.
    • No-code — build visually in Visual Studio or describe a task to the AI Browser Agent.

    Authentication

    Create a Cloud Browser API key (pcb_live_…) in Cloud Platform → APIs & Webhooks → API Keys. Pass it on every request as x-api-key (or Authorization: Bearer <key>). Keys are shown once and stored hashed; treat them like passwords and rotate by creating a new one + revoking the old.

    header
    x-api-key: pcb_live_xxxxxxxxxxxxxxxx

    The connectUrl we return is scoped with a short-lived, single-session token — so it's safe to pass to a browser/iframe; it can't create or touch other sessions and expires.

    Quickstart

    Not yet on npm. The standalone @prompteryx/cloud-browser package shown below is not published yet. Today you have two live options: install the published @prompteryx/sdk (npm install @prompteryx/sdk) and use its px.cloudBrowser.* namespace — px.cloudBrowser.sessions.create() returns a connectUrl you pass to chromium.connectOverCDP() — or the raw HTTP + Playwright approach also shown on this page. The PrompteryxCloud snippets document the dedicated package for when it ships.

    With the dedicated Cloud Browser SDK (see the note above):

    TypeScript
    import { PrompteryxCloud } from "@prompteryx/cloud-browser";
    const pc = new PrompteryxCloud({ apiKey: process.env.PROMPTERYX_API_KEY! });
    
    const browser = await pc.connect({ recordSession: true }); // create + connect
    const page = await browser.newPage();
    await page.goto("https://example.com");
    console.log(await page.title());
    await browser.close();                                       // closes the cloud session too

    Or raw HTTP + Playwright:

    TypeScript (no SDK)
    import { chromium } from "playwright-core";
    const res = await fetch("https://www.prompteryx.ai/api/v1/cloud-browser/sessions", {
      method: "POST",
      headers: { "x-api-key": process.env.PROMPTERYX_API_KEY!, "Content-Type": "application/json" },
      body: JSON.stringify({ recordSession: true }),
    });
    const { connectUrl } = await res.json();
    const browser = await chromium.connectOverCDP(connectUrl);
    // ... drive it ...
    await browser.close();

    SDK

    The dedicated @prompteryx/cloud-browser package is not on npm yet — the install below will 404 until it ships. For a published client today, use @prompteryx/sdk (npm install @prompteryx/sdk) and its px.cloudBrowser.* namespace.

    install (coming soon — not yet published)
    npm i @prompteryx/cloud-browser playwright-core

    The SDK is a thin, dependency-free wrapper over the REST API.

    methods
    const pc = new PrompteryxCloud({ apiKey });
    
    await pc.sessions.create(opts)     // -> { id, connectUrl, liveURL, status, startedAt }
    await pc.sessions.list(limit?)     // -> { sessions: [...] }
    await pc.sessions.retrieve(id)     // -> session summary
    await pc.sessions.close(id)        // -> { ok: true }
    await pc.connect(opts)             // create + connectOverCDP, returns a Playwright Browser
    await pc.fetch(url, opts)          // -> { title, content, ... }
    await pc.search(query, opts)       // -> { results: [{ title, url, snippet }] }

    Sessions API

    Create — POST /api/v1/cloud-browser/sessions

    FieldTypeDescription
    viewport{width,height}Browser viewport. Default 1280×800.
    recordSessionbooleanRecord an MP4 of the run. Default false.
    persistContextbooleanSave + restore cookies/logins across sessions (your Default Cloud Profile). Default false — sessions are ephemeral.
    profileIdstringUse a named cloud profile's saved state. Implies persistContext.
    proxybooleanRoute through a proxy.
    proxyFallbackbooleanIf you are over your proxy data allowance, start without the proxy instead of failing with 429.
    countrystringProxy geolocation, ISO code (US, GB, …).
    sessionTimeoutMinutesnumberSession lifetime in minutes (1–360), capped at the minutes you have left. Without it, sessions end after 50 minutes.
    extensionsstring[]Chrome extensions to load (headed).
    captureDownloadsbooleanCapture file downloads for later retrieval.
    response
    { "id": "pcb_...", "connectUrl": "wss://cb.prompteryx.ai/...?token=...",
      "liveURL": "https://cb.prompteryx.ai/...?token=...", "status": "active", "startedAt": "2026-..." }

    List — GET /api/v1/cloud-browser/sessions?limit=50

    Your recent sessions (newest first): id, status, provider, startedAt, endedAt, durationMs, region, hasRecording.

    Retrieve — GET /api/v1/cloud-browser/sessions/:id

    Close — DELETE /api/v1/cloud-browser/sessions/:id

    Closing finalizes the recording and stops billing. Sessions also end automatically when their session timeout is reached. Retrieve and close return 404 for a session that isn't yours.

    Connecting

    The connectUrl is a standard CDP WebSocket — use any CDP client.

    Python
    import os, requests
    from playwright.sync_api import sync_playwright
    res = requests.post("https://www.prompteryx.ai/api/v1/cloud-browser/sessions",
        headers={"x-api-key": os.environ["PROMPTERYX_API_KEY"]}, json={"recordSession": True})
    connect_url = res.json()["connectUrl"]
    with sync_playwright() as p:
        browser = p.chromium.connect_over_cdp(connect_url)
        page = browser.contexts[0].pages[0]
        page.goto("https://example.com"); print(page.title())
        browser.close()

    Fetch

    POST /api/v1/cloud-browser/fetch — load a page in a real browser and return its content, with no session to manage. Token-efficient (returns readable text/markdown by default), and JS-rendered pages work.

    FieldTypeDescription
    urlstring (required)The http(s) URL to load.
    formattext|markdown|html|linksOutput. Default text.
    waitUntilstringload | domcontentloaded | networkidle | commit. Default domcontentloaded.
    timeoutMsnumberCap (5000–60000). Default 30000.
    waitForSelectorstringAfter load, wait until this CSS selector exists (for JS-rendered content).
    waitMsnumberExtra settle time after load / selector (max 10000).
    selectorsstring[]Up to 10 CSS selectors to extract: match count plus text and HTML of the first matches.
    screenshotbooleanAlso return a base64 JPEG of the viewport.
    proxy / countryboolean / stringRoute through a proxy (geo).
    proxyFallbackbooleanOver your proxy allowance, run without the proxy instead of failing with 429.
    example
    curl -X POST https://www.prompteryx.ai/api/v1/cloud-browser/fetch \
      -H "x-api-key: $PROMPTERYX_API_KEY" -H "Content-Type: application/json" \
      -d '{"url":"https://news.ycombinator.com","format":"markdown"}'
    // -> { "url", "finalUrl", "title", "status": "ok", "content": "# ..." }

    Search

    POST /api/v1/cloud-browser/search — run a web search in a real browser and get structured results. Great for agents needing fresh web data without parsing a SERP. Body: query (required), limit (1–25, default 10), and optional proxy / country.

    example
    curl -X POST https://www.prompteryx.ai/api/v1/cloud-browser/search \
      -H "x-api-key: $PROMPTERYX_API_KEY" -H "Content-Type: application/json" \
      -d '{"query":"playwright cloud browser","limit":5}'
    // -> { "query", "results": [{ "title", "url", "snippet" }] }

    Recording

    recordSession: true captures a real MP4 of the rendered browser (not a DOM replay), uploaded on close (or finalized when a workflow finishes). Replay it from Cloud Platform → Cloud Sessions; the session's hasRecording field (list / retrieve) tells you whether a recording exists.

    Live view

    Every session has a liveURL — an interactive viewer (screencast + mouse/keyboard) you can embed or open. It shows a tab strip and follows newly-opened tabs, so multi-tab automations are fully visible. The URL carries a session-scoped token, so it's safe to embed.

    Proxies

    Set proxy: true + country to route through a residential/datacenter proxy in that region. Proxy bandwidth is measured per session and counts against your plan's proxy-data allowance. When the allowance is used up (the free trial has none), proxied requests return 429 PROXY_LIMIT_EXCEEDED unless you pass proxyFallback: true.

    Persistent contexts

    With persistContext: true, cookies/localStorage/logins are saved and restored next session — log in once, stay logged in. Pass profileId to use one of your named cloud profiles instead of the Default Cloud Profile; it's the same saved state Visual Studio and the AI Browser Agent use for that profile. With neither field, the session is ephemeral. Contexts are scoped to your account.

    Downloads

    With captureDownloads: true, downloaded files are captured server-side and retrievable after the run via signed URLs. Useful for reports, invoices, exports.

    The Cloud Platform's Downloads page, which collects every file a cloud session downloads and keeps each one until its expiry date
    Captured files also appear in Cloud Platform → Downloads — a stable link per file, kept until its expiry date.

    Extensions

    Load unpacked Chrome extensions with extensions: [...] (headed). For ad-blockers, custom tooling, auth helpers.

    CAPTCHA solving

    Through partnerships with CAPTCHA-solving providers, Prompteryx Cloud Browser can resolve challenges automatically so your sessions continue without interruption. Auto-solve is on by default for cloud sessions started from the Prompteryx app (for example Visual Studio runs and opening a cloud profile); turn it off under Settings → Cloud Browser → Auto-solve CAPTCHAs. Solves count against your plan's monthly CAPTCHA allowance plus any top-up balance. Sessions created through the Sessions API above don't turn auto-solve on today.

    How it works

    • The runtime polls the page every ~2 seconds for supported CAPTCHA widgets: reCAPTCHA v2, hCaptcha, and Cloudflare Turnstile.
    • When one is detected, the sitekey is sent to the 2Captcha-compatible solver service we operate — you don't need your own solver account.
    • The returned token is injected into the page's response field (e.g. #g-recaptcha-response) and any registered grecaptcha callbacks are invoked.
    • Solving typically takes 15–60 seconds on 2Captcha (human-in-loop), 3–10 seconds on AI-only solvers like Capsolver.
    • What you DON'T see: the visible "I'm not a robot" checkbox inside Google's iframe doesn't change colour — the iframe's visual state is controlled internally and can't be reached from outside. The token in the hidden response field IS valid; submit the form and the server will accept it.
    • Capped at 5 auto-solves per session, and never more than what's left of your monthly CAPTCHA allowance plus top-up balance.

    Listening for solve events

    In sessions where auto-solve is on, when a CAPTCHA is detected and solved the runtime emits console.log events inside the page so your automation can await them with page.on('console', …) — no need to poll a status endpoint.

    // Playwright example
    const browser = await chromium.connectOverCDP(session.connectUrl)
    const page = browser.contexts()[0].pages()[0]
    
    page.on('console', msg => {
      const text = msg.text()
      if (text.includes('solving captcha')) console.log('→ CAPTCHA detected, solving…')
      if (text.includes('captcha solved')) console.log('→ CAPTCHA solved, safe to submit form')
    })
    
    await page.goto('https://example.com/protected-form')
    // … fill the form …
    // Wait for the 'captcha solved' event before clicking Submit:
    await page.waitForEvent('console', msg => msg.text().includes('captcha solved'))
    await page.click('button[type="submit"]')

    Limitations

    • Non-standard / proprietary CAPTCHAs (image-and-text custom widgets) aren't auto-detected.
    • Cloudflare's full Bot Fight Mode (different from Turnstile) uses behavioural fingerprinting we don't solve directly — pair with the residential proxy (proxy: true) for better success rates.
    • The cooldown after a successful solve is 15 minutes per (sitekey, URL) — if you need to re-solve the same CAPTCHA on the same page within that window (e.g. token expired), navigate away and back.

    Stealth

    Sessions apply fingerprint hardening by default (consistent platform + UA, realistic plugins/WebGL, native-function masking) to reduce automated-traffic detection.

    Errors

    FieldTypeDescription
    401UnauthorizedMissing/invalid API key.
    400Bad requestInvalid params (e.g. missing url).
    404Not foundSession id unknown or not owned by your key.
    429QUOTA_EXCEEDED / PROXY_LIMIT_EXCEEDEDOut of monthly minutes, at the concurrency cap, or out of proxy data (see proxyFallback). Too many session starts in a short window also return 429.
    503CLOUD_NOT_CONFIGURED / QUOTA_UNAVAILABLECloud browser not enabled for this account, or usage could not be checked — safe to retry.
    500Server errorSession/operation failed — safe to retry.

    Errors return { "error": "...", "code"?: "..." }.

    Plans & limits

    Each plan includes a monthly allowance of cloud-browser minutes and proxy data, plus a concurrency cap (simultaneous sessions). Usage is tracked live in Cloud Platform → Plans & Usage and your dashboard. When you run out, new sessions return 429 until the next period or an upgrade. Fetch/Search count as short sessions.

    The Cloud Platform's Plans & Usage page: this month's browser-minute, proxy-data and CAPTCHA meters above the plan tier cards
    Cloud Platform → Plans & Usage — live meters for browser minutes, proxy data and CAPTCHA solves, with the plan tiers below.

    No-code

    Prefer not to write code? Build automations visually in Visual Studio or describe a task to the AI Browser Agent — both run on the same cloud browser. Pick a cloud profile (for example the Default Cloud Profile) from the Cloud Profiles section of the browser-profile dropdown.

    FAQ

    Which automation frameworks work?

    Anything that speaks CDP — Playwright (recommended), Puppeteer, or raw CDP. We hand you a standard connectUrl.

    Do I need my own proxies?

    No — set proxy: true and we route through ours.

    How is a "minute" counted?

    Wall-clock session lifetime, rounded up, minimum 1 minute — same as Fetch/Search (short sessions).

    Is it production-ready?

    Sessions run on our own cloud-browser fleet behind a TLS endpoint.

    Same engine, two ways in. The API powers our Visual Studio workflows too — anything you can do in code you can build no-code, and vice versa.