PassXAPI Python SDK
Official Python SDK for PassXAPI captcha & anti-bot solving service
Python · Node.js · API Docs · Pricing · 中文文档
Monthly Unlimited Plan
Unlimited requests for ALL 27 captcha types. View plans →
Installation
pip install passxapi
Requires Python 3.7+. Only dependency: requests.
Quick Start
- Sign up at www.passxapi.com — free, no credit card
- Create API key in your dashboard
- Install:
pip install passxapi
from passxapi import PassXAPI
client = PassXAPI("YOUR_API_KEY")
result = client.cloudflare_turnstile(
target_url="https://example.com",
proxy="http://user:pass@ip:port",
site_key="0x4AAAAAAA...",
)
print(result["token"]) # Verification token
print(result["cookies"]) # {"cf_clearance": "..."}
print(result["ua"]) # User-Agent string to use
Configuration
client = PassXAPI(
api_key="YOUR_API_KEY",
polling_interval=1.5, # Seconds between polls (default: 1.5)
timeout=120.0, # Max wait in seconds (default: 120)
)
Supported CAPTCHA Types
| Type | Method | Avg. Time | Sites |
|---|---|---|---|
| reCAPTCHA v3 | recaptcha_v3() |
8-15s | Google, YouTube, LinkedIn, Steam, PayPal |
| hCaptcha | hcaptcha() |
5-12s | Cloudflare, Discord, Epic Games, Coinbase |
| hCaptcha Pro | hcaptcha_pro() |
8-15s | Cloudflare Enterprise, Binance, Kraken |
| Cloudflare Turnstile | cloudflare_turnstile() |
3-8s | DHL, Notion, Canva, Vercel, GitLab, Figma |
| Cloudflare WAF | cloudflare_waf() |
5-10s | Shopify, Medium, Discord, OpenAI |
| Akamai Bot Manager | akamai() |
5-15s | Nike, Adidas, United Airlines, Walmart |
| Akamai sec_cpt | akamai_sec_cpt() |
5-15s | Nike, Ticketmaster, Best Buy, Nordstrom |
| PerimeterX Silent | perimeterx_silent() |
5-12s | Zillow, Craigslist, Indeed, StockX |
| PerimeterX Challenge | perimeterx_challenge() |
8-15s | Zillow, Wayfair, Glassdoor, Redfin |
| Kasada ct | kasada_ct() |
5-12s | Kick, bet365, DraftKings, PlayStation |
| Kasada cd | kasada_cd() |
5-12s | Kick, bet365, FanDuel, Canada Goose |
| Kasada TL Payload | kasada_tl_payload() |
5-10s | Kick, bet365, DraftKings, Twitch |
| DataDome Silent | datadome_silent() |
5-12s | Reddit, SoundCloud, TripAdvisor, Vinted |
| DataDome Invisible | datadome_invisible() |
5-12s | Reddit, Rakuten, AllTrails, Foot Locker EU |
| DataDome Slider | datadome_slider() |
5-15s | Reddit, Leboncoin, Hermes, TripAdvisor |
| Shape Security | shape() |
8-20s | Southwest Airlines, Starbucks, Citibank |
| FunCaptcha | funcaptcha() |
8-15s | Microsoft, Roblox, GitHub, Snapchat, X |
| AWS WAF | aws() |
5-12s | Amazon, Twitch, IMDb, Audible, Zappos |
| Vercel Challenge | vercel_challenge() |
3-8s | TikTok Web, Hashnode, Cal.com, Loom |
| Castle | castle() |
5-10s | Carta, Plaid, Mercury, Brex, Notion |
| Reese84 | reese84() |
5-15s | Glassdoor, Western Union, HSBC, Siemens |
| UTMVC | utmvc() |
5-15s | Glassdoor, Indeed, Kroger, AutoTrader |
| Sbsd | sbsd() |
5-12s | Ticketmaster, StubHub, SeatGeek, AXS |
| CaptchaFox | captchafox() |
3-8s | Zalando, Otto, Booking.com, BMW |
| Forter | forter() |
5-12s | Nordstrom, Instacart, Sephora, Uber Eats |
| ThreatMetrix | threatmetrix() |
5-15s | Chase, Wells Fargo, PayPal, Robinhood |
| TLS Forward | tls_forward() |
3-8s | Any site with JA3/JA4 fingerprint detection |
27 types supported · Failed requests are never charged · Avg success rate 99.5%+
Why PassXAPI?
| PassXAPI | 2Captcha | CapSolver | |
|---|---|---|---|
| Price per solve | $0.001 | $0.003 | $0.002 |
| Captcha types | 27 | ~15 | ~12 |
| Akamai / PerimeterX / Kasada | ✅ | ❌ | ❌ |
| Shape / Forter / ThreatMetrix | ✅ | ❌ | ❌ |
| TLS fingerprint forwarding | ✅ | ❌ | ❌ |
| Webhook callback | ✅ | ❌ | ❌ |
| Failed = free | ✅ | ❌ | ❌ |
Table of Contents
- Installation
- Quick Start
- Configuration
- Supported CAPTCHA Types
- Solve CAPTCHA
- Webhook Callback
- Account & Billing
- Error Handling
- Low-Level API
- Migration from 2Captcha
- Links
Solve CAPTCHA
All methods follow the same pattern: submit → poll → return result. The SDK handles polling automatically.
- Proxy required for all methods. Format:
http://user:pass@ip:port(residential recommended) - Result is a dict containing
token, and optionallycookiesandua
reCAPTCHA v3
Google, YouTube, LinkedIn, Steam, PayPal, Binance · API docs →
result = client.recaptcha_v3(
target_url="https://example.com",
proxy="http://user:pass@ip:port",
site_key="6Le-wvkSAAAA...",
action="login", # Action parameter
enterprise=False, # Set True for Enterprise
title="Page Title", # Optional
)
| Parameter | Required | Description |
|---|---|---|
target_url |
✅ | Page URL with reCAPTCHA |
proxy |
✅ | HTTP proxy string |
site_key |
✅ | Google site key |
action |
❌ | Action parameter (default: "verify") |
enterprise |
❌ | Enterprise version (default: False) |
title |
❌ | Page title |
hCaptcha
Cloudflare, Discord, Epic Games, Coinbase, NordVPN · API docs →
result = client.hcaptcha(
target_url="https://example.com",
proxy="http://user:pass@ip:port",
site_key="SITE_KEY",
)
| Parameter | Required | Description |
|---|---|---|
target_url |
✅ | Page URL |
proxy |
✅ | HTTP proxy |
site_key |
✅ | hCaptcha site key |
hCaptcha Pro
Cloudflare Enterprise, Coinbase, Binance, Kraken · API docs →
result = client.hcaptcha_pro(
target_url="https://example.com",
proxy="http://user:pass@ip:port",
)
Cloudflare Turnstile
DHL, Notion, Canva, Vercel, GitLab, Figma, HubSpot · API docs →
result = client.cloudflare_turnstile(
target_url="https://example.com",
proxy="http://user:pass@ip:port",
site_key="0x4AAAAAAA...",
)
| Parameter | Required | Description |
|---|---|---|
target_url |
✅ | Page URL |
proxy |
✅ | HTTP proxy |
site_key |
✅ | Turnstile site key |
Cloudflare WAF
Shopify, Medium, Discord, OpenAI, Notion, Figma · API docs →
result = client.cloudflare_waf(
target_url="https://example.com",
proxy="http://user:pass@ip:port",
target_method="GET", # HTTP method (GET/POST)
)
Akamai
Nike, Adidas, Delta Airlines, Walmart, Costco, Airbnb · API docs →
result = client.akamai(
target_url="https://nike.com",
proxy="http://user:pass@ip:port",
akamai_js_url="https://nike.com/_sec/cp_challenge/ak-challenge-xxx.js",
page_fp="abc123", # Optional: page fingerprint
)
| Parameter | Required | Description |
|---|---|---|
target_url |
✅ | Page URL |
proxy |
✅ | HTTP proxy |
akamai_js_url |
✅ | Akamai challenge JS URL |
page_fp |
❌ | Page fingerprint value |
Akamai sec_cpt
Nike, Adidas, Ticketmaster, Best Buy, Nordstrom · API docs →
result = client.akamai_sec_cpt(
target_url="https://nike.com",
proxy="http://user:pass@ip:port",
sec_cpt="challenge_token",
sec_json={
"nonce": "...",
"difficulty": 5,
"token": "...",
"count": 0,
"timestamp": 1234567890,
},
)
PerimeterX
Zillow, Craigslist, Indeed, StockX, Wayfair, Reddit · API docs →
Silent (no visual challenge):
result = client.perimeterx_silent(
target_url="https://zillow.com",
proxy="http://user:pass@ip:port",
perimeterx_js_url="https://client.px-cdn.net/PX.../main.min.js",
pxAppId="PX...",
)
Interactive challenge:
result = client.perimeterx_challenge(
target_url="https://zillow.com",
proxy="http://user:pass@ip:port",
pxvid="...",
pxuuid="...",
pxAppId="PX...",
perimeterx_js_url="...",
captcha_js_url="...",
init_cookies={"pxhd": "..."},
)
Kasada
Kick, bet365, DraftKings, FanDuel, PlayStation, Twitch · API docs →
ct:
result = client.kasada_ct(
target_url="https://kick.com",
proxy="http://user:pass@ip:port",
protected_api_domain="kick.com",
kasada_js_domain="k.tl",
)
cd (advanced):
result = client.kasada_cd(
target_url="https://kick.com",
proxy="http://user:pass@ip:port",
ct="...", st="...", fc="...", site="kick.com",
)
TL Payload:
result = client.kasada_tl_payload(
target_url="https://kick.com",
proxy="http://user:pass@ip:port",
)
DataDome
Reddit, SoundCloud, Rakuten, TripAdvisor, Vinted, Hermes · API docs →
Silent:
result = client.datadome_silent(
target_url="https://reddit.com",
proxy="http://user:pass@ip:port",
target_method="GET",
)
Invisible:
result = client.datadome_invisible(
target_url="https://reddit.com",
proxy="http://user:pass@ip:port",
datadome_js_url="https://js.datadome.co/tags.js",
ddjskey="ABCDEF123",
ddoptions='{"ajaxListenerPath":"..."}',
)
Slider:
result = client.datadome_slider(
target_url="https://reddit.com",
proxy="http://user:pass@ip:port",
target_method="GET",
init_cookies={"datadome": "..."},
)
Shape Security
Southwest Airlines, Starbucks, Citibank, Capital One, Macy's · API docs →
result = client.shape(
target_url="https://southwest.com",
proxy="http://user:pass@ip:port",
target_api="https://southwest.com/api/air-booking/...",
shape_js_url="https://southwest.com/.../shape.js",
method="POST",
title="Page Title", # Optional
)
FunCaptcha
Microsoft, Roblox, GitHub, Snapchat, LinkedIn, Adobe, X · API docs →
result = client.funcaptcha(
target_url="https://outlook.com",
proxy="http://user:pass@ip:port",
public_key="B7D8911C-5CC8-A9A3-...",
custom_api_host="client-api.arkoselabs.com", # Optional
)
AWS WAF
Amazon, Twitch, IMDb, Audible, Zappos · API docs →
result = client.aws(
target_url="https://amazon.com",
proxy="http://user:pass@ip:port",
aws_js_url="https://xxx.token.awswaf.com/xxx/challenge.js",
)
Vercel Challenge
TikTok Web, Hashnode, Cal.com, Loom, Neon · API docs →
result = client.vercel_challenge(
target_url="https://example.vercel.app",
proxy="http://user:pass@ip:port",
)
Castle
Carta, Gusto, Plaid, Mercury, Brex, Notion · API docs →
result = client.castle(
target_url="https://example.com",
proxy="http://user:pass@ip:port",
config_json={"pk": "pk_xxx", "avoidCookies": False},
)
# Returns "request_token" instead of "token"
Reese84
Glassdoor, Western Union, HSBC, Singapore Airlines · API docs →
result = client.reese84(
target_url="https://glassdoor.com",
proxy="http://user:pass@ip:port",
reese84_js_url="https://glassdoor.com/.../reese84.js",
)
UTMVC
Glassdoor, Indeed, Kroger, AutoTrader, TripAdvisor · API docs →
result = client.utmvc(
target_url="https://indeed.com",
proxy="http://user:pass@ip:port",
utmvc_js_url="https://indeed.com/.../incapsula.js",
incap_cookie={
"visid_incap_xxx": "...",
"nlbi_xxx": "...",
"incap_ses_xxx": "...",
},
)
Sbsd
Ticketmaster, StubHub, Vivid Seats, SeatGeek, AXS · API docs →
result = client.sbsd(
target_url="https://ticketmaster.com",
proxy="http://user:pass@ip:port",
sbsd_js_url="https://ticketmaster.com/.../bot-manager.js",
init_cookies={"bm_s": "...", "bm_sc": "..."},
)
CaptchaFox
Zalando, Otto, Booking.com, BMW, Deutsche Telekom · API docs →
result = client.captchafox(
target_url="https://example.de",
proxy="http://user:pass@ip:port",
site_key="sk-xxx",
)
Forter
Nordstrom, Instacart, Sephora, Lululemon, Uber Eats · API docs →
result = client.forter(
target_url="https://nordstrom.com",
proxy="http://user:pass@ip:port",
forter_js_url="https://cdn4.forter.com/xxx.js",
site_id="xxx",
)
ThreatMetrix
Chase, Wells Fargo, Bank of America, PayPal, Robinhood · API docs →
result = client.threatmetrix(
target_url="https://chase.com",
proxy="http://user:pass@ip:port",
org_id="xxx",
page_id="xxx",
session_id="xxx",
custom_domain="h.online-metrix.net",
title="Page Title", # Optional
)
TLS Forward
Any site with JA3/JA4 fingerprint detection · API docs →
result = client.tls_forward(
target_url="https://example.com",
proxy="http://user:pass@ip:port",
)
Webhook Callback
Instead of polling, receive results via webhook:
task_id = client.submit(
task_type="cloudflare_turnstile",
proxy="http://user:pass@ip:port",
target_url="https://example.com",
site_key="0x4AAAAAAA...",
callback_url="https://your-server.com/webhook",
)
Your server receives:
{
"taskId": "abc123-def456",
"status": "ready",
"errorId": 0,
"solution": {
"token": "P0_eyJ...",
"cookies": {"cf_clearance": "xxx"},
"userAgent": "Mozilla/5.0..."
}
}
Retry policy: up to 3 retries at 5s, 30s, 120s intervals if HTTP 200 is not returned.
Account & Billing
# Check balance
balance = client.get_balance()
print(f"${balance}")
# API key info (status, limits, today's spend)
info = client.get_key_info()
print(f"Key: {info['keyPrefix']}...")
print(f"Active: {info['isActive']}")
print(f"Today: ${info['todaySpent']}")
print(f"Daily limit: {info['dailySpendLimit'] or 'unlimited'}")
# Spending stats (by day, by type)
stats = client.get_spending_stats()
stats = client.get_spending_stats(queue="cloudflare_turnstile")
# Pricing (no auth required)
for p in client.get_pricing():
print(f"{p['name']}: ${p['price_per_solve']}/solve, "
f"~{p['avg_solve_time']}s, {p['success_rate']}%")
Error Handling
from passxapi import (
PassXAPI,
AuthError,
ZeroBalanceError,
CaptchaUnsolvableError,
BadParametersError,
)
try:
result = client.cloudflare_turnstile(...)
except AuthError:
print("Invalid API key")
except ZeroBalanceError:
print("Top up at https://www.passxapi.com/app/billing/deposit")
except CaptchaUnsolvableError:
print("Could not solve")
except BadParametersError as e:
print(f"Bad params: {e}")
| Exception | Error Code | When |
|---|---|---|
AuthError |
ERROR_AUTH |
Invalid API key |
ZeroBalanceError |
ERROR_ZERO_BALANCE |
Insufficient balance |
BadParametersError |
ERROR_BAD_PARAMETERS |
Missing or invalid params |
CaptchaUnsolvableError |
ERROR_CAPTCHA_UNSOLVABLE |
Failed to solve / timeout |
TaskNotFoundError |
ERROR_NO_SUCH_CAPCHA_ID |
Task ID not found |
RateLimitError |
ERROR_RATE_LIMIT |
Concurrency limit exceeded |
DailyLimitError |
ERROR_DAILY_LIMIT_REACHED |
Daily spend limit hit |
IPNotAllowedError |
ERROR_IP_NOT_ALLOWED |
IP not in whitelist |
Failed requests are never charged.
Low-Level API
# Submit task manually
task_id = client.submit(
task_type="cloudflare_turnstile",
proxy="http://user:pass@ip:port",
target_url="https://example.com",
site_key="0x4AAAAAAA...",
)
# Poll for result
import time
while True:
result = client.get_result(task_id)
if result["status"] == "SUCCESS":
print(result["result"]["token"])
break
time.sleep(1.5)
Migration from 2Captcha
- from twocaptcha import TwoCaptcha
- solver = TwoCaptcha("API_KEY")
- result = solver.recaptcha(sitekey="KEY", url="https://example.com")
+ from passxapi import PassXAPI
+ solver = PassXAPI("API_KEY")
+ result = solver.recaptcha_v3(
+ target_url="https://example.com",
+ proxy="http://user:pass@ip:port",
+ site_key="KEY",
+ )
Links
| Website | https://www.passxapi.com |
| Sign Up | https://www.passxapi.com/login |
| API Keys | https://www.passxapi.com/app/api-keys |
| API Docs | https://www.passxapi.com/docs |
| Dashboard | https://www.passxapi.com/app/dashboard |
| Pricing | https://www.passxapi.com/#pricing |
| Support | contact@passxapi.com |
License
MIT © PassXAPI
Metadata
Release files for passxapi 2.0.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| passxapi-2.0.3.tar.gz | 17.5 kB | Without provenance | Details for passxapi-2.0.3.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| passxapi-2.0.3-py3-none-any.whl | Python 3 | none | any | Details for passxapi-2.0.3-py3-none-any.whl |
Total release size: 30.3 kB
Release files / passxapi-2.0.3.tar.gz
| Download URL | passxapi-2.0.3.tar.gz |
|---|---|
| Size | 17.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
34111ee7fa10ba6c4f8de454f5f700ca2792ed1dd126c1c4d0e3f1de0251c720
|
|
BLAKE2b-256 checksum How to use checksums |
8e0b99dba142091e55193d2ab9456137a4a1ae90052a77fb4f775a8b2d6285d6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.3
|
Release files / passxapi-2.0.3-py3-none-any.whl
| Download URL | passxapi-2.0.3-py3-none-any.whl |
|---|---|
| Size | 12.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6871090dfb832f026e8bf6b7e8be87e99bd3a8bfe2db2ae79a14569c1bd0380a
|
|
BLAKE2b-256 checksum How to use checksums |
0412acc479cb8239c21d49c8ea9732bef68671ee606b3325e9b0c2f095935c30
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.3
|
Security for passxapi 2.0.3
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.