Base endpoints
Send all requests over HTTPS to 99captcha.xyz.
POST / GET
Submit task
https://99captcha.xyz/in.php
GET / POST
Get result
https://99captcha.xyz/res.php
Ready-made software
If your tool already supports 2Captcha, you do not need new code. Override the API domain to 99captcha.xyz and use your 99Captcha key.
- Open captcha settings in your software.
- Choose 2Captcha or ruCaptcha as the provider type.
- Paste your 99Captcha API key from the dashboard.
- Set the custom API domain / server to
99captcha.xyz.
Captcha methods
Pass one of these values in the method field.
CaptchaFox
captchafoxreCAPTCHA
userrecaptchahCaptcha
hcaptchaTurnstile
turnstileImage
base64Step 1 — Submit a task
POST (or GET) parameters to in.php.
| Parameter | Need | Description |
|---|---|---|
key | Required | Your 32-character API key |
method | Required | Captcha type from the list above |
sitekey | Required* | Site key from the target page |
pageurl | Required* | Full URL of the page with the captcha |
proxy | Optional | IP:PORT or user:pass@IP:PORT |
proxytype | Optional | HTTP, SOCKS4, or SOCKS5 |
userAgent | Optional | Browser user-agent your client uses |
body | Images | Base64 image body when method=base64 |
Success
OK|123456789The number is your Task ID.
Errors
ERROR_ZERO_BALANCEAlso:
ERROR_WRONG_SITEKEY, ERROR_KEY_DOES_NOT_EXISTStep 2 — Get the result
Wait 3 seconds, then poll res.php until the token is ready.
Example:
https://99captcha.xyz/res.php?key=YOUR_KEY&action=get&id=TASK_IDStill solving
CAPCHA_NOT_READYWait 3 seconds and request again.
Success
OK|token_stringUse the token in your client.
Balance & reports
| Action | Request | What it does |
|---|---|---|
getbalance | res.php?key=KEY&action=getbalance | Returns your current balance |
reportgood | action=reportgood&id=TASK_ID | Mark a token as good |
reportbad | action=reportbad&id=TASK_ID | Refund a failed solve |
Python example
Drop-in polling client. Replace the API key from your dashboard.
import requests, time
API_KEY = "YOUR_99CAPTCHA_API_KEY"
IN_URL = "https://99captcha.xyz/in.php"
RES_URL = "https://99captcha.xyz/res.php"
def solve_captcha(site_key, page_url, method="captchafox"):
payload = {
"key": API_KEY,
"method": method,
"sitekey": site_key,
"pageurl": page_url,
}
submit = requests.post(IN_URL, data=payload, timeout=20)
if "OK|" not in submit.text:
raise RuntimeError(submit.text)
task_id = submit.text.split("|", 1)[1]
for _ in range(40):
time.sleep(3)
result = requests.get(
RES_URL,
params={"key": API_KEY, "action": "get", "id": task_id},
timeout=20,
)
text = result.text.strip()
if text.startswith("OK|"):
return text.split("|", 1)[1]
if text != "CAPCHA_NOT_READY":
raise RuntimeError(text)
raise TimeoutError("Captcha was not ready in time")