Skip to main content

surfsky

Python SDK for Surfsky, a cloud-based antidetect browser.

Install

uv add surfsky

Or pip install surfsky. Requires Python 3.12+.

Quick start

Get your API token and base URL from the dashboard:

export SURFSKY_API_TOKEN='your-token'
export SURFSKY_API_BASE_URL='your-base-url'
import asyncio

from surfsky import AsyncSurfsky, PremiumProxy


async def main():
    async with AsyncSurfsky() as client:
        async with client.browser(proxy=PremiumProxy(country="us")) as browser:
            await browser.goto("https://example.com")
            print(await browser.title())


asyncio.run(main())

The browser context stops the session on exit. Sessions are billed until stopped, including idle time. You can also pass api_token and base_url directly to the client.

Browser methods are async; timeouts are in seconds. Surfsky provides synchronous REST calls. Browser input uses Surfsky's human emulation.

Profiles and proxies

A profile preserves its fingerprint, proxy and cookies across sessions. Inside the client context:

from surfsky import Fingerprint

profile = await client.profiles.create(
    title="account-1",
    fingerprint=Fingerprint(os="win", os_arch="x86", os_version="11"),
    proxy=PremiumProxy(country="us"),
)
async with client.browser(profile_uuid=profile.uuid) as browser:
    await browser.goto("https://example.com/login")

Reuse the profile ID for subsequent sessions. proxy accepts PremiumProxy for residential or mobile IPs, SharedProxy for testing, or your own proxy URL. client.proxies lists locations and quota.

Parallel browsers

client.map distributes items across a browser pool. Inside the client context:

async def title(browser, url):
    await browser.goto(url)
    return await browser.title()


urls = ["https://example.com", "https://example.org"]
for result in await client.map(title, urls, concurrency=2):
    print(result.item, result.value if result.ok else result.error)

Without a concurrency limit, the pool uses your plan's maximum. Results include per-item errors.

To use a browser from the pool:

async with client.browsers() as pool:
    async with pool.lease() as browser:
        await browser.goto("https://example.com")
        print(await browser.title())

lease() waits for a free browser and returns it to the pool on exit. Cookies and browser state persist between leases.

Reference and examples

client.session() exposes a CDP URL for external browser clients. See the Playwright and Selenium examples. Install example dependencies with uv sync --group examples.

Development

uv sync --all-extras
uv run ruff check . && uv run ty check && uv run pytest

Live tests require credentials and bill your account:

SURFSKY_LIVE_TESTS=1 uv run pytest tests/test_live_concurrency.py

License

MIT

Metadata

Release files for surfsky 0.0.21

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for surfsky 0.0.21
File Size Uploaded Provenance Actions
surfsky-0.0.21.tar.gz 82.6 kB Without provenance Details for surfsky-0.0.21.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for surfsky 0.0.21
File Interpreter ABI Platform Actions
surfsky-0.0.21-py3-none-any.whl Python 3 none any Details for surfsky-0.0.21-py3-none-any.whl

Total release size: 124.1 kB

Release files / surfsky-0.0.21.tar.gz

Download URL surfsky-0.0.21.tar.gz
Size 82.6 kB
Tags Source
SHA-256 checksum
How to use checksums
a213c33a85a042770f525d0a39b18f5d4a9083dc42cf55e4fbf3d34dad5b68a9
BLAKE2b-256 checksum
How to use checksums
7010864a0fd94f8c57658a6eb79cf100dc588bb3acf1c60b34b1b9d088f33022
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / surfsky-0.0.21-py3-none-any.whl

Download URL surfsky-0.0.21-py3-none-any.whl
Size 41.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
78773df7d4a12cd0cdb7c8b8b7eab5d8e2b79e5784870a5d73be96c548b824ad
BLAKE2b-256 checksum
How to use checksums
fadf6a4bef7a31a6037a920a22e4ac377fab0c262661a856efdde871812785fb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for surfsky 0.0.21

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page