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
- SDK API reference
- REST API
- Examples: forms, tabs, retries, profiles, a closed shadow root and CDP connections.
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
Release files for surfsky 0.0.10
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| surfsky-0.0.10.tar.gz | 78.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| surfsky-0.0.10-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 117.7 kB
Release files / surfsky-0.0.10.tar.gz
| Download URL | surfsky-0.0.10.tar.gz |
|---|---|
| Size | 78.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
aa5c0e6c72cf8c9d72c3cda2d4b347bac3931098406be58b33967045ed4ee44c
|
|
BLAKE2b-256 checksum How to use checksums |
09062e8b8563960447c0d622dd13d49b8e2e94ff1444953da2c07127ec87d06e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","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.10-py3-none-any.whl
| Download URL | surfsky-0.0.10-py3-none-any.whl |
|---|---|
| Size | 39.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
52d61253566214a84e19025a9656874c3319f5cfe7067826e26e4b4c2fcab4ee
|
|
BLAKE2b-256 checksum How to use checksums |
8ac219bff7b4b4f0fce6535a718e6fcc7fd0a6564654a9e9d23d949d99aa61da
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|