Give your AI agent
a real browser.

Antidetect Chromium that passes bot detection so your agent can actually interact with websites. Built-in fingerprints, CAPTCHA solving, proxy rotation.

Passes Cloudflare, Akamai, DataDome, PerimeterX, and more. Works with browser-use, LangChain, Claude Computer Use, and OpenAI Agents SDK.

Built for every detection layer.
Challenges solved automatically.

Antibot systems challenge your agent at every stage of its loop: network layer, JS environment, browser fingerprint, behavioral patterns, and session identity. Surfsky handles each one so your agent keeps moving.

Product demo

From task to data
in a single session.

1

Schema in, data out

Declare a typed schema for the data you need. Pass it to the agent and the output gets validated against it automatically. No HTML parsing, no post-processing.

from typing import TypedDict

class Flight(TypedDict):
    airline: str
    price: float
    departure: str
    stops: int

flights: list[Flight] = (await agent.run()).parsed_output()
# → [{"airline": "United", "price": 187.0, "departure": "06:15", "stops": 0},
#    {"airline": "Delta",  "price": 203.0, "departure": "08:30", "stops": 0}, ...]
2

Start a browser session

Surfsky spins up a browser with a real device fingerprint, residential proxy, and auto captcha solving, then returns a standard CDP WebSocket URL your agent framework already speaks.

surfsky = Surfsky(api_key="sk-...")

session = surfsky.sessions.create(
    proxy={"country": "us", "type": "residential"},
    fingerprint={"os": "mac", "os_arch": "arm"},
    anti_captcha={"enabled": True},
)
# → wss://browser.surfsky.io/session/abc123
3

Connect your agent framework

Pass the CDP URL to your agent. Human-like mouse moves, keystrokes, and timing are injected at the browser level. Your agent loop runs unchanged.

# browser-use - just swap the CDP URL
browser = Browser(config=BrowserConfig(cdp_url=session.cdp_url))

agent = Agent(
    task="Find cheapest SFO→JFK flights for next Friday",
    llm=ChatOpenAI(model="o3"),
    browser=browser,
)
# LLM reasons → act() → observe → repeat

Plug into your stack

Surfsky works with every major agent framework. Connect via CDP or use our native SDK. Switch one line and your agent code stays the same.

from surfsky import Surfsky
from pydantic import BaseModel

class Startup(BaseModel):
    name: str
    funding: str
    stage: str

client = Surfsky(api_key="sk-...")

session = client.sessions.create(
    proxy={"type": "residential", "country": "us"},
    fingerprint={"os": "mac", "os_arch": "arm"},
    anti_captcha={"enabled": True},
)

result = await client.run(
    "Find the top 10 AI startups on Crunchbase",
    output_schema=Startup,
)

for s in result.output:
    print(s.name, s.funding, s.stage)
# Antidetect browser, proxies, captchas - all automatic

MCP Server

Give any MCP-compatible client (Claude Desktop, Cursor, Windsurf, or your own agent) full control over antidetect browsers, proxies, and captcha solving with a single config block.

Claude Desktop · claude_desktop_config.json

{
  "mcpServers": {
    "surfsky": {
      "command": "npx",
      "args": ["@surfsky/mcp-server"],
      "env": { "SURFSKY_API_TOKEN": "sk-..." }
    }
  }
}

Available tools

session_create — Launch a browser with fingerprint, proxy, and captcha config
session_close — Stop the session, persist storage if enabled
navigate — Go to URL, wait for selector or network idle
act — Click, type, scroll with human-like behavior
scrape — HTML + cookies + screenshot in one call
screenshot — Full-page capture as base64 for vision models
profile_manage — CRUD for persistent browser profiles
cookies — Import / export cookies to seed authenticated sessions

Ship agents that
don't get blocked.

Tell us what you're building. We'll get you set up.