SurSolver
Docs menu

Docs / Guides

Proxies

Which task types need a proxy, the proxy formats the API accepts, and how to keep exit IP and user agent consistent so solved tokens verify on your side.

Some captcha deployments tie a solution to the IP that earned it: a token or cookie is only useful from the same exit IP, and often with the same user agent. Those types take proxy details in the task. Types that run fine from shared infrastructure accept none.

Proxy mode per task type

Task typeProxy modeWhat the mode means
reCAPTCHA v2optionalProxyless, or through a proxy you supply when you send the proxy-capable name.
reCAPTCHA v3optionalProxyless, or through a proxy you supply when you send the proxy-capable name.
Cloudflare TurnstileoptionalProxyless, or through a proxy you supply when you send the proxy-capable name.
Cloudflare ChallengerequiredA proxy is required; there is no proxyless variant.
VercelrequiredA proxy is required; there is no proxyless variant.
FriendlyCaptchaoptionalProxyless, or through a proxy you supply when you send the proxy-capable name.
AltchanoneProxyless only; both accepted names work and a proxy is never required.
ProsopooptionalProxyless, or through a proxy you supply when you send the proxy-capable name.
CaptchaFoxrequiredA proxy is required; there is no proxyless variant.
GeeTestoptionalProxyless, or through a proxy you supply when you send the proxy-capable name.
MTCaptchaoptionalProxyless, or through a proxy you supply when you send the proxy-capable name.
AkamairequiredA proxy is required; there is no proxyless variant.
DataDomerequiredA proxy is required; there is no proxyless variant.
PerimeterXrequiredA proxy is required; there is no proxyless variant.

The name you send decides whether a proxy is required for an optional type: the …TaskProxyLess form never needs one, while the proxy-capable …Task form requires proxy details and a request without them is rejected with ERROR_INVALID_REQUEST. Types marked required have no proxyless name at all — sending one answers ERROR_TYPE_NOT_SUPPORTED.

Accepted proxy formats

Send the proxy as a string in task.proxy:

snippet.txt
http://user:[email protected]:8000
socks5://user:[email protected]:1080
user:[email protected]:8000
203.0.113.10:8000

The scheme is http, https, socks4 or socks5; without one, http is assumed. Credentials are optional — a bare host:port is how IP-allowlisted proxies are used. A string with exactly four colon-separated parts is always read as user:password:host:port, with or without a scheme (socks5://user:password:host:port). The order is not detected: some clients send the opposite one (host:port:user:pass), and such a string is not rejected when it happens to parse the other way — for example 203.0.113.10:8000:user:12345 would be taken as user 203.0.113.10, password 8000, host user, port 12345, and the task would be charged while using the wrong proxy. Convert strings in that order, or use the split fields below. Other layouts, such as type:ip:port:user:pass, are rejected with ERROR_INVALID_REQUEST.

Or send the split fields — the explicit form, the safest one to generate, and the recommended one when migrating from a vendor whose string order differs. They are read only when task.proxy is absent or empty:

snippet.json
{
  "proxyType": "http",
  "proxyAddress": "203.0.113.10",
  "proxyPort": 8000,
  "proxyLogin": "user",
  "proxyPassword": "password"
}

proxyAddress and proxyPort are required together; proxyType is one of http, https, socks4 or socks5 (any other value is treated as http), and proxyLogin / proxyPassword are optional. A missing or non-numeric port, or a task.proxy string that cannot be parsed or names an unknown scheme, is rejected with ERROR_INVALID_REQUEST.

Consistency rules

  • Replay a token or cookie from the same exit IP and with the same userAgent the solution reports. A different IP or user agent is the usual reason a valid-looking solution is refused by the target.
  • For cookie-producing types, use a sticky proxy session for the whole flow: challenge, solve, and the request that consumes the cookie.
  • Match the proxy class to what the target accepts. Anti-bot vendors commonly refuse datacenter ranges; choosing a type that runs proxyless avoids the question entirely.
  • The proxy is part of the task, not a global setting: each createTask that needs one carries its own details.