Skip to main content

API Reference

Terms

  • Profile - A profile is a generated set of fingerprints collected from real devices that is seen as a unique device by services. A profile stores information about the browser settings that have been set, and launches the browser.
  • One time profile - A profile that is used only once and then deleted.
  • Persistent profile - A profile that is saved and can be reused for multiple sessions.
  • Session - A session is a browser instance that uses a profile. Session means started browser that is ready to use. Connection to the browser is done via WebSocket and can be used with automation tools like Playwright, Puppeteer, Selenium, etc. When using scraping API you don't need to start a session, just use profile to scrape page.
  • Inactive browser - A browser that is not used for inactive_kill_timeout seconds and will be closed by the system. Default value is 30 seconds.
  • Proxy - A proxy is a server that acts as an intermediary between the client and the target server. Supported schemes are HTTP, HTTPS, SOCKS5, SSH with or without auth that will be used by browser. Also you can use OpenVPN to connect to the browser. Proxy is set implicitly when you start one-time profile or create a persistent profile.

Start one time profile browser

One-time profile browser doesn't save its state after stop. It's ideal for scraping and one-time tasks that don't require persistent state:

  • Scraping data from websites that don't require authentication
  • Short-term tasks that don't need to maintain state

Start

POST /profiles/one_time

Headers

NameRequiredTypeDescription
X-Cloud-Api-TokenYesstringYour API authentication token
Content-TypeYesstringMust be application/json

Body Parameters

NameRequiredTypeDescription
fingerprintNoobjectCustomization options for the browser fingerprint
proxyNostringProxy URL (supports HTTP, HTTPS, SOCKS5, SSH)
browser_settingsNoobjectBrowser configuration options

Example Request

curl -X POST 'https://api-public.surfsky.io/profiles/one_time' \
-H 'accept: application/json' \
-H 'x-cloud-api-token: YOUR_API_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"proxy": "socks5://username:[email protected]:1080"
}'

Response

Success (200 OK)
{
"internal_uuid": "a8fb62f90611456aa75422b01c385a62",
"ws_url": "wss://api-public.surfsky.io/proxy/a8fb62f90611456aa75422b01c385a62",
"inspector": {
"list": "https://api-public.surfsky.io/proxy/a8fb62f90611456aa75422b01c385a62/inspector",
"pages": [{
"page_title": "New Tab",
"page_url": "chrome://newtab/",
"devtools_url": "https://api-public.surfsky.io/proxy/a8fb62f90611456aa75422b01c385a62/inspector/devtools/..."
}]
},
"success": true
}
Error Responses
  • 400 Bad Request: Invalid parameters or proxy configuration
  • 401 Unauthorized: Invalid API token
  • 429 Too Many Requests: Rate limit exceeded

After successful request you can use ws_url to connect to the browser and use it for automation. All popular automation tools support WebSocket connections: Playwright, Puppeteer, chromedp, etc.

Persistent profiles

Persistent profiles are saved profiles that can be reused across multiple sessions. They maintain their state between runs, including cookies and browser settings. To stop profile you need to use stop method or inactive_kill_timeout will close it automatically. It's ideal for long-term automation tasks that require persistent state:

  • Scraping data from websites that require authentication
  • Automating workflows that involve complex interactions

Maximum number of profiles is 100. Please contact us if you need more.

Create

Create a new persistent profile.

POST /profiles

Headers

NameRequiredTypeDescription
X-Cloud-Api-TokenYesstringYour API authentication token
Content-TypeYesstringMust be application/json

Body Parameters

NameRequiredTypeDescription
titleYesstringProfile name
fingerprintYesobjectProfile fingerprint configuration
proxyNostringProxy URL string
cookiesNostring/arrayCookies in JSON, Mozilla, or Netscape format

Example Request

curl -X POST 'https://api-public.surfsky.io/profiles' \
-H 'accept: application/json' \
-H 'x-cloud-api-token: YOUR_API_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"title": "My profile",
"fingerprint": {
"os": "win"
},
"proxy": "http://username:[email protected]:10002"
}'

Response

{
"success": true,
"msg": "Profile was created",
"data": {
"uuid": "02c57bf2d66d4c179cd958fb74c92bb1"
},
"code": null
}

Start

Start a persistent profile session.

POST /profiles/{uuid}/start

Headers

NameRequiredTypeDescription
X-Cloud-Api-TokenYesstringYour API authentication token
Content-TypeYesstringMust be application/json

Example Request

curl -X POST 'https://api-public.surfsky.io/profiles/47be1a81ad7c4246affe1a1a79c2df80/start' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-H 'x-cloud-api-token: YOUR_API_TOKEN'

Response

{
"internal_uuid": "a8fb62f90611456aa75422b01c385a62",
"ws_url": "wss://api-public.surfsky.io/proxy/...",
"inspector": {
"list": "https://api-public.surfsky.io/proxy/.../inspector",
"pages": [{
"page_title": "New Tab",
"page_url": "chrome://newtab/",
"devtools_url": "https://api-public.surfsky.io/proxy/.../inspector/devtools/..."
}]
}
}
note

internal_uuid in response is a temporary uuid of the session that is used to identify the profile in the Surfsky system. It's not the same as the profile uuid.

Stop

Stop a running persistent profile session.

POST /profiles/{uuid}/stop

Headers

NameRequiredTypeDescription
X-Cloud-Api-TokenYesstringYour API authentication token
Content-TypeYesstringMust be application/json

Example Request

curl -X POST 'https://api-public.surfsky.io/profiles/47be1a81ad7c4246affe1a1a79c2df80/stop' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-H 'x-cloud-api-token: YOUR_API_TOKEN'

Response

{
"success": true,
"msg": "Profile stopped",
"data": {
"uuid": "cf2d63d7269d48a6850a32c1c5fa8796"
}
}
note

uuid is a internal_uuid of the profile that get from start method.

Get

Get profile info

GET /profiles/{uuid}

Headers

NameRequiredTypeDescription
X-Cloud-Api-TokenYesstringYour API authentication token
Content-TypeYesstringMust be application/json

Parameters

NameRequiredPlaceTypeDescription
uuidYesPathstringProfile uuid

Example Request

curl -X GET 'https://api-public.surfsky.io/profiles/cf2d63d7269d48a6850a32c1c5fa8796' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-H 'x-cloud-api-token: YOUR_API_TOKEN'

Response

{
"success": true,
"data": {
"uuid": "cf2d63d7269d48a6850a32c1c5fa8796",
"title": "My profile",
"description": "",
"start_pages": [],
"pinned_tag": null,
"proxy": "http://username:[email protected]:10002",
"status": "stopped",
"storage_options": {
"cookies": true,
"passwords": true,
"extensions": true,
"localstorage": false,
"history": false,
"bookmarks": true,
"serviceworkers": false
},
"last_active": "2025-01-07T20:54:48",
"fingerprint": {
"os_arch": "x86",
"os_version": "11",
"os": "win",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
"languages": null,
"timezone": null,
"geolocation": null,
"cpu": 4,
"ram": 8,
"renderer": "AMD Radeon(TM) 610M",
"noise": {
"webgl": false,
"canvas": false,
"audio": false,
"client_rects": false
},
"dns": null,
"media_devices": {
"video_in": 1,
"audio_out": 1,
"audio_in": 1
},
"screen": "1680x1050"
},
"has_user_password": false,
"password_set_at": null,
"created_at": "2025-01-07T20:52:08",
"updated_at": "2025-01-07T20:54:48"
},
"code": null
}

Update

Update persistent profile

About unchangeable fields

Note that you can't update profile's os, os_arch and os_version fields

PATCH /profiles/{uuid}

Headers

NameRequiredTypeDescription
X-Cloud-Api-TokenYesstringYour API authentication token
acceptYesstringMust be application/json
Content-TypeYesstringMust be application/json

Path Parameters

NameRequiredTypeDescription
uuidYesstringProfile UUID to update

Request Body Parameters

NameRequiredTypeDescription
fingerprintNoobjectProfile fingerprint settings
fingerprint.user_agentNostringBrowser user agent string
fingerprint.cpuNonumberNumber of CPU cores
fingerprint.ramNonumberAmount of RAM in GB
fingerprint.rendererNostringGraphics card name. See get_renderers method for available renderers
fingerprint.noiseNoobjectNoise generation settings
fingerprint.noise.webglNobooleanEnable WebGL fingerprint noise
fingerprint.noise.canvasNobooleanEnable Canvas fingerprint noise
fingerprint.noise.audioNobooleanEnable Audio fingerprint noise
fingerprint.noise.client_rectsNobooleanEnable Client Rects fingerprint noise
fingerprint.media_devicesNoobjectMedia devices configuration
fingerprint.media_devices.video_inNonumberNumber of video input devices
fingerprint.media_devices.audio_outNonumberNumber of audio output devices
fingerprint.media_devices.audio_inNonumberNumber of audio input devices
fingerprint.screenNostringScreen resolution (format: "WIDTHxHEIGHT"). See get_screens method for available resolutions
fingerprint.languagesNoarrayList of browser languages
fingerprint.timezoneNostringBrowser timezone
fingerprint.geolocationNoobjectBrowser geolocation settings
fingerprint.geolocation.latitudeNonumberLatitude coordinate
fingerprint.geolocation.longitudeNonumberLongitude coordinate
fingerprint.geolocation.accuracyNonumberLocation accuracy in meters
fingerprint.dnsNostringDNS server address

Example Request

curl -X PATCH 'https://api-public.surfsky.io/profiles/cf2d63d7269d48a6850a32c1c5fa8796' \
-H 'accept: application/json' \
-H 'x-cloud-api-token: YOUR_API_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"fingerprint": {
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
"cpu": 8,
"ram": 16,
"renderer": "Intel(R) Iris(TM) Plus Graphics 650",
"noise": {"webgl": false, "canvas": true, "audio": true, "client_rects": true},
"media_devices": {"video_in": 1, "audio_out": 1, "audio_in": 1},
"screen": "1440x900",
"languages": [
"[ga-IE] Irish (Ireland)",
"[gl-ES] Galician (Spain)"
],
"timezone": "Europe/Paris",
"geolocation": {"latitude": 60, "longitude": 60, "accuracy": 10},
"dns": "8.8.8.8"
}
}'

Response

{
"success": true,
"data": {
"uuid": "cf2d63d7269d48a6850a32c1c5fa8796",
"title": "My profile",
"description": "",
"start_pages": [],
"pinned_tag": null,
"proxy": "socks5://username:[email protected]:10000",
"status": "stopped",
"storage_options": {
"cookies": true,
"passwords": true,
"extensions": true,
"localstorage": false,
"history": false,
"bookmarks": true,
"serviceworkers": false
},
"last_active": "2025-01-07T20:54:48",
"fingerprint": {
"os_arch": "x86",
"os_version": "11",
"os": "win",
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
"languages": ["[ga-IE] Irish (Ireland)","[gl-ES] Galician (Spain)"],
"timezone": "Europe/Paris",
"geolocation": {"latitude": 60.0, "longitude": 60.0, "accuracy": 10},
"cpu": 8,
"ram": 16,
"renderer": "Intel(R) Iris(TM) Plus Graphics 650",
"noise": {"webgl": false, "canvas": true, "audio": true, "client_rects": true},
"dns": "8.8.8.8",
"media_devices": {"video_in": 1, "audio_out": 1, "audio_in": 1},
"screen": "1440x900"
},
"has_user_password": false,
"password_set_at": null,
"created_at": "2025-01-07T20:52:08",
"updated_at": "2025-01-07T20:54:48"
},
"code": null
}
Error Responses
  • 400 Bad Request: Invalid parameters
  • 401 Unauthorized: Invalid API token
  • 404 Not Found: Profile not found
  • 429 Too Many Requests: Rate limit exceeded

Delete

Delete a persistent profile by uuid.

DELETE /profiles/{uuid}

Headers

NameRequiredTypeDescription
X-Cloud-Api-TokenYesstringYour API authentication token
acceptYesstringMust be application/json
Content-TypeYesstringMust be application/json

Path Parameters

NameRequiredTypeDescription
uuidYesstringUUID of the profile to delete

Example Request

curl -X DELETE 'https://api-public.surfsky.io/profiles/cf2d63d7269d48a6850a32c1c5fa8796' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-H 'x-cloud-api-token: YOUR_API_TOKEN'

Response

Success Response (200 OK)
{
"success": true,
"msg": "Profile was deleted",
"data": {
"uuid": "cf2d63d7269d48a6850a32c1c5fa8796"
}
}
Error Responses
  • 401 Unauthorized: Invalid API token
  • 404 Not Found: Profile not found
  • 429 Too Many Requests: Rate limit exceeded
note

Deleting a profile is permanent and cannot be undone. Make sure to back up any important profile data before deletion.

Delete Batch

Delete multiple profiles in a single request.

DELETE /profiles

Headers

NameRequiredTypeDescription
X-Cloud-Api-TokenYesstringYour API authentication token
acceptYesstringMust be application/json
Content-TypeYesstringMust be application/json

Request Body Parameters

NameRequiredTypeDescription
uuidsYesarrayList of profile UUIDs to delete

Example Request

curl -X DELETE 'https://api-public.surfsky.io/profiles' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-H 'x-cloud-api-token: YOUR_API_TOKEN' \
-d '{
"uuids": ["61107eadb77941d39ab867098c2f6542"]
}'

Response

Success Response (200 OK)
{
"success": true,
"msg": "Profiles were deleted",
"data": {
"deleted_uuids": ["61107eadb77941d39ab867098c2f6542"],
"active_uuids": [],
"not_found_uuids": []
}
}
Partial Success Response (200 OK)
{
"success": false,
"msg": "Some profiles were not deleted",
"data": {
"deleted_uuids": [],
"active_uuids": [],
"not_found_uuids": [
"cf2d63d7269d48a6850a32c1c5fa8796",
"effbe126819e470da332e521f1b9df9d"
]
}
}
Error Responses
  • 400 Bad Request: Invalid request body
  • 401 Unauthorized: Invalid API token
  • 429 Too Many Requests: Rate limit exceeded
note
  • This operation is permanent and cannot be undone
  • Profiles that are currently active cannot be deleted
  • The operation will attempt to delete all provided profiles and return the status for each

List

Get list of persistent profiles.

GET /profiles

Headers

NameRequiredTypeDescription
X-Cloud-Api-TokenYesstringYour API authentication token
acceptYesstringMust be application/json
Content-TypeYesstringMust be application/json

Query Parameters

NameRequiredTypeDefaultDescription
pageNointeger0Page number for pagination
page_lenNointeger100Number of profiles per page
orderingNostring'active'Sort order for results. Options: 'created', '-created', 'active', '-active', 'title', '-title' (prefix '-' means reverse order)

Example Request

curl -X GET 'https://api-public.surfsky.io/profiles?page=1&page_len=10' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-H 'x-cloud-api-token: YOUR_API_TOKEN'

Example Response

[
{
"uuid": "02c57bf2d66d4c179cd958fb74c92bb1",
"title": "My profile",
"description": "",
"proxy": "socks5://username:[email protected]:1080",
"status": "stopped"
},
{
"uuid": "2b73cd78a7c54965a5ac5738803b6a5f",
"title": "Test account",
"description": "",
"proxy": "socks5://username:[email protected]:1080",
"status": "started"
}
// ... more profiles
]
Error Responses
  • 400 Bad Request: Invalid request body
  • 401 Unauthorized: Invalid API token
  • 429 Too Many Requests: Rate limit exceeded
note
  • Maximum page size is 100 profiles
  • Use pagination for efficient data retrieval when you have many profiles
  • The ordering parameter can help you sort profiles based on different criteria

Active

Get list of currently running profiles.

GET /profiles/active

Headers

NameRequiredTypeDescription
X-Cloud-Api-TokenYesstringYour API authentication token
acceptYesstringMust be application/json
Content-TypeYesstringMust be application/json

Example Request

curl -X GET 'https://api-public.surfsky.io/profiles/active' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-H 'x-cloud-api-token: YOUR_API_TOKEN'

Example Response

{
"success": true,
"msg": "",
"data": [
{
"profile_uuid": "8698fcea8f3644718b11b2be92b1819c",
"internal_uuid": "5c417784972f4c0b9db30e586be79013",
"one_time": false
}
]
}
Error Responses
  • 401 Unauthorized: Invalid API token
  • 429 Too Many Requests: Rate limit exceeded
note
  • internal_uuid is a temporary identifier used for the current browser session
  • profile_uuid is the permanent identifier of the profile
  • One-time profiles will have one_time: true and no associated profile_uuid

Export cookies

Export profile cookies in specified format.

GET /profiles/{uuid}/cookies

Headers

NameRequiredTypeDescription
X-Cloud-Api-TokenYesstringYour API authentication token
Content-TypeYesstringMust be application/json

Query Parameters

NameRequiredTypeDefaultDescription
export_formatNostringjsonFormat to export cookies: json or netscape

Example Request

curl -X GET 'https://api-public.surfsky.io/profiles/8698fcea8f3644718b11b2be92b1819c/cookies?export_format=json' \
-H 'Content-Type: application/json' \
-H 'x-cloud-api-token: YOUR_API_TOKEN'

Example Response

{
"success": true,
"msg": "Cookies were exported",
"data": {
"cookies": [
{
"domain": ".google.com",
"expirationDate": 1770471524.076367,
"hostOnly": false,
"httpOnly": true,
"name": "__Secure-ENID",
"path": "/",
"sameSite": "lax",
"secure": true,
"value": ""
}
]
}
}

Import cookies

Import cookies to a profile.

POST /profiles/{uuid}/cookies

Headers

NameRequiredTypeDescription
X-Cloud-Api-TokenYesstringYour API authentication token
Content-TypeYesstringMust be application/json

Request Body Parameters

NameRequiredTypeDescription
cookiesYesstringCookies in JSON, Netscape, or Mozilla format

Example Request

curl -X POST 'https://api-public.surfsky.io/profiles/8698fcea8f3644718b11b2be92b1819c/cookies' \
-H 'Content-Type: application/json' \
-H 'x-cloud-api-token: YOUR_API_TOKEN' \
-d '{
"cookies": "[{
\"domain\": \".google.com\",
\"expirationDate\": 1639134293.313654,
\"hostOnly\": false,
\"httpOnly\": false,
\"name\": \"1P_JAR\",
\"path\": \"/\",
\"sameSite\": \"no_restriction\",
\"secure\": true,
\"value\": \"2021-11-10-11\"
}]"
}'

Example Response

{
"success": true,
"msg": "Cookies were imported"
}
Error Responses
  • 400 Bad Request: Invalid cookie format
  • 401 Unauthorized: Invalid API token
  • 404 Not Found: Profile not found
  • 429 Too Many Requests: Rate limit exceeded
note
  • Cookies can be exported in either JSON or Netscape format
  • When importing, the API accepts cookies in JSON, Netscape, or Mozilla format
  • Make sure to properly escape quotes in the JSON cookie string

Fingerprint

Methods for retrieving available fingerprint options.

Get Renderers

Get list of available GPU renderers for specified OS and architecture.

GET /fingerprint/renderers

Headers

NameRequiredTypeDescription
X-Cloud-Api-TokenYesstringYour API authentication token
Content-TypeYesstringMust be application/json

Query Parameters

NameRequiredTypeDescription
osYesstringOperating system (win or mac)
os_archYesstringCPU architecture (x86 or arm)

Example Request

curl -X GET 'https://api-public.surfsky.io/fingerprint/renderers?os=win&os_arch=x86' \
-H 'Content-Type: application/json' \
-H 'x-cloud-api-token: YOUR_API_TOKEN'

Example Response

{
"success": true,
"msg": "",
"data": [
{
"value": "NVIDIA GeForce MX450",
"platform": "win",
"archs": ["x86"]
},
{
"value": "AMD Radeon RX 640",
"platform": "win",
"archs": ["x86"]
}
// ... more renderers
],
"total_count": 356,
"page": 0
}

Get Screens

Get list of available screen resolutions for specified OS and architecture.

GET /fingerprint/screens

Headers

NameRequiredTypeDescription
X-Cloud-Api-TokenYesstringYour API authentication token
Content-TypeYesstringMust be application/json

Query Parameters

NameRequiredTypeDescription
osYesstringOperating system (win or mac)
os_archYesstringCPU architecture (x86 or arm)

Example Request

curl -X GET 'https://api-public.surfsky.io/fingerprint/screens?os=win&os_arch=x86' \
-H 'Content-Type: application/json' \
-H 'x-cloud-api-token: YOUR_API_TOKEN'

Example Response

{
"success": true,
"msg": "",
"data": [
{
"value": "1280x800",
"platform": "win",
"archs": ["x86"]
},
{
"value": "1440x900",
"platform": "win",
"archs": ["x86"]
}
// ... more resolutions
]
}
Error Responses
  • 400 Bad Request: Invalid OS or architecture
  • 401 Unauthorized: Invalid API token
  • 429 Too Many Requests: Rate limit exceeded
note

Available options:

  • Operating Systems: win, mac
  • CPU Architectures: x86, arm

CAPTCHA Solving

Surfsky provides automatic CAPTCHA solving capabilities that can be enabled when starting a profile. This feature supports major CAPTCHA types including reCAPTCHA v2/v3/Enterprise, hCaptcha, DataDome and others.

Enable CAPTCHA Solving

To enable CAPTCHA solving, include the anti_captcha parameter when starting a profile:

One-Time Profile Example

curl -X POST 'https://api-public.surfsky.io/profiles/one_time' \
-H 'Content-Type: application/json' \
-H 'X-Cloud-Api-Token: YOUR_API_TOKEN' \
-d '{
"browser_settings": {
"inactive_kill_timeout": 300
},
"proxy": "socks5://username:[email protected]:1080",
"anti_captcha": {
"enabled": true
}
}'

Parameters

NameRequiredTypeDescription
anti_captcha.enabledNobooleanEnable automatic CAPTCHA solving
note
  • CAPTCHA solving is available for both one-time and persistent profiles
  • The service automatically detects and solves CAPTCHAs when they appear
  • CAPTCHA solving may add additional time to requests while solutions are processed
  • Most CAPTCHAs are solved using integration with external solving services. In specific cases where needed, we develop custom solvers for unique CAPTCHA implementations
  • For certain implementations, you may need to subscribe to event statuses using JavaScript code. Please contact our team for detailed implementation guidance

Error Responses

This section describes common error responses that can be returned by the API endpoints.

No Subscription Error

Returned when trying to perform an action without an active subscription.

{
"success": false,
"msg": "No subscription",
"data": null
}

Rate Limit Error (429 Too Many Requests)

Returned when you've exceeded the API rate limits.

{
"success": false,
"msg": "Too many requests",
"data": null
}

Authentication Error (401 Unauthorized)

Returned when using an invalid or expired API token.

{
"success": false,
"msg": "Invalid API token",
"data": null
}

Not Found Error (404)

Returned when requesting a resource that doesn't exist.

{
"success": false,
"msg": "Profile not found",
"data": null
}

Invalid Parameters Error (400 Bad Request)

Returned when the request contains invalid parameters.

{
"success": false,
"msg": "Invalid parameters",
"data": {
"errors": ["Invalid proxy format"]
}
}

Profile Active Error

Returned when trying to perform an operation on an active profile that requires it to be stopped.

{
"success": false,
"msg": "Profile is active",
"data": null
}
note
  • All error responses follow the same structure with success, msg, and data fields
  • The msg field contains a human-readable description of the error
  • The data field may contain additional error details when available