What is ALTCHA?
ALTCHA is an open-source, privacy-friendly CAPTCHA built around a proof-of-work (PoW) challenge. The visitor's browser is given a hash target — find an integer N such that `hash(salt + N) == target` — and the answer is submitted alongside the form. No tracking, no cookies, no third-party JavaScript loaded from foreign domains, no user interaction. The PoW typically iterates 0..maxnumber (default 1,000,000) until a match is found. Servers verify the submission by re-computing the hash and checking the optional HMAC signature. ALTCHA supports SHA-1, SHA-256, SHA-384, and SHA-512 hash algorithms.
How It Works
Send Task
POST your AltchaTaskProxyLess with the target URL and sitekey to our API. We'll queue it instantly.
We Solve
Capzy runs ALTCHA in a native Go solver that brute-forces the hash range across every CPU core in parallel. Pass us either the full challenge JSON (algorithm, challenge, salt, maxnumber, signature) or a challengeURL to fetch from, and we return a ready-to-submit base64-encoded payload in under 100 ms. The token is purely cryptographic — submit it from any IP, any time.
Get Token
Poll getTaskResult — when status is 'ready', the solution contains the token to inject into the target page.
Quick Integration
import requests, time
API = "https://api.capzy.ai"
KEY = "capzy_your_key_here"
# Step 1: Create task
task = requests.post(f"{API}/createTask", json={
"clientKey": KEY,
"task": {
"type": "AltchaTaskProxyLess",
"type": "AltchaTaskProxyLess",
"websiteURL": "https://example.com/contact"
}
}).json()
task_id = task["taskId"]
print(f"Task created: {task_id}")
# Step 2: Poll for result
while True:
result = requests.post(f"{API}/getTaskResult", json={
"clientKey": KEY,
"taskId": task_id
}).json()
if result["status"] == "ready":
print("Solved!", result["solution"])
break
elif result["status"] == "failed":
print("Failed:", result.get("errorDescription"))
break
time.sleep(1)
# Step 3: Use the result — paste the token into the site's captcha form field
token = result["solution"]["token"]
# Browser side: set the textarea value or the hidden input. Then submit.
# Server-to-server: post the token alongside the form fields you normally send.
resp = requests.post("https://target.example.com/submit", data={
"username": "...",
"captcha_response": token, # <-- replace with the field name your site uses
})
print(resp.status_code)Using Your Own Proxy
Use AltchaTask instead of AltchaTaskProxyLess to route the solve through your own proxy. This is useful when the target site checks the IP that solved the captcha matches the IP submitting the form.
import requests, time
API = "https://api.capzy.ai"
KEY = "capzy_your_key_here"
# Step 1: Create task
task = requests.post(f"{API}/createTask", json={
"clientKey": KEY,
"task": {
"type": "AltchaTask",
"type": "AltchaTask",
"proxyPort": "8080",
"proxyType": "http",
"proxyLogin": "user",
"websiteURL": "https://example.com/contact",
"proxyAddress": "123.45.67.89",
"proxyPassword": "pass"
}
}).json()
task_id = task["taskId"]
print(f"Task created: {task_id}")
# Step 2: Poll for result
while True:
result = requests.post(f"{API}/getTaskResult", json={
"clientKey": KEY,
"taskId": task_id
}).json()
if result["status"] == "ready":
print("Solved!", result["solution"])
break
elif result["status"] == "failed":
print("Failed:", result.get("errorDescription"))
break
time.sleep(1)
# Step 3: Use the result — paste the token into the site's captcha form field
token = result["solution"]["token"]
# Browser side: set the textarea value or the hidden input. Then submit.
# Server-to-server: post the token alongside the form fields you normally send.
resp = requests.post("https://target.example.com/submit", data={
"username": "...",
"captcha_response": token, # <-- replace with the field name your site uses
})
print(resp.status_code)additional proxy parameters
proxyTypetypestringreqyesProxy protocol: http, https, socks4, or socks5proxyAddresstypestringreqyesProxy IP address or hostnameproxyPorttypenumberreqyesProxy port numberproxyLogintypestringreqnoProxy username (if auth required)proxyPasswordtypestringreqnoProxy password (if auth required)task parameters.
typetypestringreqyesAltchaTaskProxyLess (recommended) or AltchaTaskwebsiteURLtypestringreqyesFull URL of the page hosting the ALTCHA widgetchallengetypeobjectreqnoPre-fetched challenge JSON {algorithm, challenge, salt, maxnumber, signature}. Pass this OR challengeURL.challengeURLtypestringreqnoURL from which we fetch the challenge JSON. Useful when the site exposes a known challenge endpoint.solution response.
tokentypestringBase64-encoded JSON payload — drop this into the hidden `altcha` form field or POST it as the widget's submitted valuepayloadtypeobjectThe decoded payload object for inspection: {algorithm, challenge, number, salt, signature, took (ms)}Example response
Full getTaskResult response shape. The fields in the table above describe what's inside solution — the outer envelope (errorId, status) is identical for every captcha type.
{
"errorId": 0,
"status": "ready",
"solution": {
"token": "eyJhbGdvcml0aG0iOiJTSEEtMjU2IiwiY2hhbGxlbmdlIjoiYWJjZDEyMzQ1Njc4OTBhYmNkMTIzNDU2Nzg5MGFiY2QxMjM0NTY3ODkwYWJjZDEyMzQ1Njc4OTAiLCJudW1iZXIiOjQyLCJzYWx0IjoiZGVtb19zYWx0X3ZhbHVlIiwic2lnbmF0dXJlIjoiaG1hY19zaWduYXR1cmVfb3JfZW1wdHkiLCJ0b29rIjo0Mn0=",
"payload": {
"salt": "demo_salt_value",
"took": 42,
"number": 42,
"algorithm": "SHA-256",
"challenge": "abcd1234567890abcd1234567890abcd1234567890abcd1234567890abcd1234",
"signature": "hmac_signature_or_empty"
}
}
}Error response
Failures use the same envelope with errorId: 1 plus errorCode + errorDescription. See the error-code reference for the full list.
{
"errorId": 1,
"errorCode": "ERROR_CAPTCHA_UNSOLVABLE",
"errorDescription": "Solver gave up — automatically refunded."
}Pending response
While the solver is still working, getTaskResult returns status: "processing". Poll every 1–2 seconds until ready or failed.
{
"errorId": 0,
"status": "processing"
}Features
ProxyLess Task Type
AltchaTaskProxyLessWith Proxy
AltchaTaskFrequently Asked Questions
start solving altcha.
$0.10 in free credits — no card. ~250 free solves to test before you spend.