Skip to main content

Python client for the Solvex FunCaptcha solving API.

Project description

solvex-sdk

Python client for the Solvex FunCaptcha solving API.

Install

pip install solvex-sdk
# or, from this repo:
pip install .

The distribution is published as solvex-sdk; the import name is solvex.

Requires Python 3.10+. Depends on httpx.

Quickstart

from solvex import SolvexClient, FunCaptchaTask, Proxy

with SolvexClient("sk_live_...") as sx:
    result = sx.solve(FunCaptchaTask(
        website_url="https://roblox.com",
        website_public_key="476068BF-9607-4799-B53D-966BE98E2B81",
        proxy=Proxy.from_url("http://user:pass@184.82.39.210:8080"),
    ))
    print(result.token)
    print(f"cost=${result.cost_usd}  solved in {result.solve_seconds}s")

A proxy is required — Solvex does not run proxyless solves.

Supported site keys

Solvex rejects websitePublicKey values it doesn't know, rather than silently forwarding bad context (wrong surl, wrong location.href, wrong referrer) that Arkose would quietly suppress a token for. The currently-registered keys:

Label websitePublicKey
Roblox Login 476068BF-9607-4799-B53D-966BE98E2B81
Roblox Signup A2A14B1D-1AF3-C791-9BBC-EE33CC7A0A6F

Passing anything else raises UnsupportedSiteKeyError (errorId: 23) — contact support to add the site you need.

Logged-in sessions (blob + cookies)

When the challenge is tied to a logged-in Roblox session (e.g. authenticated actions that hand you a dataExchangeBlob), pass the blob in data and the matching session cookie string in cookies. Without the cookie Arkose will treat the session as mismatched and suppress the token:

result = sx.solve(FunCaptchaTask(
    website_url="https://www.roblox.com",
    website_public_key="476068BF-9607-4799-B53D-966BE98E2B81",
    proxy=Proxy.from_url("http://user:pass@1.2.3.4:8080"),
    data=roblox_data_exchange_blob,
    cookies=".ROBLOSECURITY=...; RBXEventTrackerV2=...;",
))

Cookie formats

The API accepts cookies in any of the shapes you'd get from common clients — they're normalized to a Cookie: header server-side:

# Raw header string (default)
cookies=".ROBLOSECURITY=...; RBXEventTrackerV2=..."

# Python requests
cookies=session.cookies.get_dict()

# rnet — same dict shape
cookies=dict(client.cookies)

# Playwright / Selenium / Puppeteer
cookies=[{"name": ".ROBLOSECURITY", "value": "..."}, {"name": "RBXEventTrackerV2", "value": "..."}]

# List of pair strings
cookies=[".ROBLOSECURITY=...", "RBXEventTrackerV2=..."]

PoW-flagged sessions

When Arkose returns pow=true, the server can solve the PoW challenge and still hand you a token instead of failing. Opt in with solve_pow=True — it trades 1–3s (C++ fast path) or 15–30s (Node fallback) of latency for a higher success rate on flagged sessions. Billed as a normal solve.

task = FunCaptchaTask(..., solve_pow=True)

Async

import asyncio
from solvex import AsyncSolvexClient, FunCaptchaTask, Proxy

async def main():
    async with AsyncSolvexClient("sk_live_...") as sx:
        result = await sx.solve(FunCaptchaTask(
            website_url="https://roblox.com",
            website_public_key="476068BF-9607-4799-B53D-966BE98E2B81",
            proxy=Proxy.from_url("socks5://184.82.39.210:1080"),
            use_http3=True,   # None = server default (enabled)
        ))
        print(result.token)

asyncio.run(main())

Low-level

If you want to manage polling yourself:

task_id = sx.create_task(task)
while True:
    r = sx.get_task_result(task_id)
    if r["status"] == "ready":
        print(r["solution"]["token"])
        break

Balance

print(f"${sx.get_balance():.4f} remaining")

Errors

Every non-zero errorId raises a typed exception:

Exception errorId Meaning
InvalidKeyError 1 clientKey missing / bad / revoked
UnsupportedTaskError 2, 22 task type not enabled
UnsupportedSiteKeyError 23 websitePublicKey not registered — contact support
InsufficientCreditsError 10 account balance too low
TaskFailedError 12 solver couldn't produce a token (credits refunded)
TaskNotFoundError 16 unknown taskId
RateLimitedError 31 per-key or per-user rate limit
TaskTimeoutError 40 task exceeded server timeout / client wait

Catch SolvexError to catch everything.

from solvex import SolvexClient, TaskFailedError, RateLimitedError

try:
    result = sx.solve(task, timeout=90)
except TaskFailedError:
    # server already refunded — retry with fresh proxy
    ...
except RateLimitedError:
    time.sleep(5)

Idempotency

Pass idempotency_key= to guard against double-billing on retries. Replays within 24h return the same taskId without a second charge.

sx.solve(task, idempotency_key=f"user-42-{run_id}")

HTTP/3

Set use_http3=False on the task to force HTTP/2 (useful when debugging proxies that mangle h3). Default is server-side (h3 enabled).

Browser profile

Set browser= to route the solve through a specific fingerprints_v2 profile. Accepts a family alias ("firefox", "chrome", "brave", "edge", "safari") or a specific profile name ("firefox_win_140", "chrome_win_141", etc.). Omit or pass "auto" for the legacy Safari path.

task = FunCaptchaTask(..., browser="firefox")

License

MIT.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

solvex_sdk-0.1.1.tar.gz (8.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

solvex_sdk-0.1.1-py3-none-any.whl (10.0 kB view details)

Uploaded Python 3

File details

Details for the file solvex_sdk-0.1.1.tar.gz.

File metadata

  • Download URL: solvex_sdk-0.1.1.tar.gz
  • Upload date:
  • Size: 8.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for solvex_sdk-0.1.1.tar.gz
Algorithm Hash digest
SHA256 c6bde8cb90ebda5eae590fa577ce248fa0c91a5d543e4aad9df59641b4b91919
MD5 2667b544c058153f4622a185c7ea6b2f
BLAKE2b-256 7f09248623d068aee855429b58c8fd62bba0efb3170fcaa403dfb566b35cb9ff

See more details on using hashes here.

Provenance

The following attestation bundles were made for solvex_sdk-0.1.1.tar.gz:

Publisher: publish.yml on sexfrance/Solvex-SDK

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file solvex_sdk-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: solvex_sdk-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 10.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for solvex_sdk-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 0eb52ea791627be0edc3a249d50c9c283ce5e5be80f9f87bb5bc3b9ebede4af4
MD5 afb891cb11477c68b0e95296dc818aee
BLAKE2b-256 a1ab9a7ee29ad9a3552a9aec08eaafd61f2af9c49e6654a80dd8292539abd370

See more details on using hashes here.

Provenance

The following attestation bundles were made for solvex_sdk-0.1.1-py3-none-any.whl:

Publisher: publish.yml on sexfrance/Solvex-SDK

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page