Altcha Captcha Token Solving
Solve Altcha captcha challenges programmatically. Altcha is a privacy-focused, proof-of-work based captcha system that uses cryptographic puzzles for bot protection.
Altcha is a privacy-first captcha solution that uses cryptographic proof-of-work puzzles.
Unlike traditional captchas, it doesn't require image recognition - instead, it uses
mathematical computations to verify human users. The solution returns a number
value (and optionally a base64-encoded full solution) for form submission.
Captcha Type
Use the following captcha type identifier in your API requests:
"type": "ALTCHA_CAPTCHA_TOKEN"
Finding Captcha Parameters
To solve Altcha, you need to extract the following parameters from network requests:
// Open Developer Tools (F12), go to Network tab
{
"algorithm": "SHA-256",
"challenge": "3dd28253be6cc0c54d95f7f98c517e68744597cc6e66109619d1ac975c39181c",
"maxnumber": 5000, // This is the "iterations" parameter
"salt": "46d5b1c8871e5152d902ee3f?edk=1493462145de1ce33a52fb569b27a364&codeChallenge=464Cjs7PbiJJhJZ_ReJ-y9UGGDndcpsnP6vS8x1nEJyTkhjQkJyL2jcnYEuMKcrG&expires=1761048664",
"signature": "4b1cf0e0be0f4e5247e50b0f9a449830f1fbca44c32ff94bc080146815f31a18"
}
Always send the full value of the salt field exactly as received from the site,
including all characters and parameters (edk, codeChallenge, expires, etc.). Do not modify or truncate it.
The iterations parameter corresponds to the maxnumber value from the Altcha response.
This represents the maximum number of iterations for the proof-of-work calculation.
Request Format
Request Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
auth.token |
string | required | Your API key |
captcha.type |
string | required | Must be "ALTCHA_CAPTCHA_TOKEN" |
captcha.metadata.siteUrl |
string | required | The URL where the captcha appears |
captcha.metadata.siteKey |
string | optional | Site key (can be empty string for Altcha) |
captcha.payload.metadata.challenge |
string | required | Unique task identifier from the website |
captcha.payload.metadata.iterations |
string | required | Maximum number for calculations (maxnumber value) |
captcha.payload.metadata.salt |
string | required | Salt value (include full string with all parameters) |
captcha.payload.metadata.signature |
string | required | Digital signature of the request |
captcha.payload.userAgent |
string | optional | Browser User-Agent string |
captcha.payload.proxy |
object | optional | Proxy configuration (optional) |
Proxy Object Structure (Optional)
| Parameter | Type | Required | Description |
|---|---|---|---|
protocol |
string | required | Proxy protocol: "http", "https", "socks4", or "socks5" |
host |
string | required | Proxy IP address or hostname |
port |
number | required | Proxy port number |
username |
string | optional | Proxy authentication username |
password |
string | optional | Proxy authentication password |
Example Request
const response = await fetch('https://solver-api.mydisct.com/createTask', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'apikey': 'YOUR_API_KEY'
},
body: JSON.stringify({
auth: {
token: 'YOUR_API_KEY'
},
context: {
source: 'api',
version: '1.0.0'
},
captcha: {
type: 'ALTCHA_CAPTCHA_TOKEN',
metadata: {
siteUrl: 'https://example.com',
siteKey: ''
},
payload: {
metadata: {
challenge: '3dd28253be6cc0c54d95f7f98c517e68744597cc6e66109619d1ac975c39181c',
iterations: '5000',
salt: '46d5b1c8871e5152d902ee3f?edk=1493462145de1ce33a52fb569b27a364&codeChallenge=464Cjs7PbiJJhJZ_ReJ-y9UGGDndcpsnP6vS8x1nEJyTkhjQkJyL2jcnYEuMKcrG&expires=1761048664',
signature: '4b1cf0e0be0f4e5247e50b0f9a449830f1fbca44c32ff94bc080146815f31a18'
},
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
}
})
});
const data = await response.json();
console.log('Task ID:', data.task.id);
Response Format
Create Task Response (Processing)
{
"success": true,
"service": "MyDisct Solver",
"message": "Task created successfully",
"task": {
"id": "MyDisctSolver_abc123",
"status": "processing"
}
}
Fetch Result Response (Completed)
{
"success": true,
"service": "MyDisct Solver",
"message": "Captcha solved successfully",
"task": {
"id": "MyDisctSolver_abc123",
"status": "completed",
"result": {
"token": "{"number":4883,"algorithm":"SHA-256","challenge":"3dd28253be6cc0c54d95f7f98c517e68744597cc6e66109619d1ac975c39181c","salt":"46d5b1c8871e5152d902ee3f","signature":"4b1cf0e0be0f4e5247e50b0f9a449830f1fbca44c32ff94bc080146815f31a18","took":1520}",
"timestamp": "2025-12-01T12:00:15.000Z"
}
}
}
The token field contains a JSON string with the solution. Parse it to get the number
value. Some sites only need the number, while others require the full base64-encoded solution.
Check the site's requirements to determine which format to use.
Parsing the Token
// Parse the token to get the solution
const solution = JSON.parse(result.task.result.token);
const number = solution.number; // 4883
const fullSolution = btoa(JSON.stringify(solution));
Python Example
import requests
import time
import json
import base64
def solve_altcha_captcha(site_url, challenge, iterations, salt, signature, api_key):
# Step 1: Create task
create_response = requests.post(
'https://solver-api.mydisct.com/createTask',
headers={
'Content-Type': 'application/json',
'apikey': api_key
},
json={
'auth': {'token': api_key},
'context': {'source': 'api', 'version': '1.0.0'},
'captcha': {
'type': 'ALTCHA_CAPTCHA_TOKEN',
'metadata': {
'siteUrl': site_url,
'siteKey': ''
},
'payload': {
'metadata': {
'challenge': challenge,
'iterations': str(iterations),
'salt': salt,
'signature': signature
}
}
}
}
)
create_data = create_response.json()
if not create_data['success']:
raise Exception(create_data['error']['message'])
task_id = create_data['task']['id']
print(f'Task created: {task_id}')
# Step 2: Poll for result
while True:
time.sleep(3)
result_response = requests.post(
'https://solver-api.mydisct.com/fetchResult',
headers={'Content-Type': 'application/json', 'apikey': api_key},
json={'taskId': task_id}
)
result_data = result_response.json()
if result_data['task']['status'] == 'completed':
token = result_data['task']['result']['token']
solution = json.loads(token)
return solution
elif result_data['task']['status'] == 'failed':
raise Exception('Solving failed')
print('Still processing...')
# Usage
solution = solve_altcha_captcha(
site_url='https://example.com',
challenge='3dd28253be6cc0c54d95f7f98c517e68744597cc6e66109619d1ac975c39181c',
iterations=5000,
salt='46d5b1c8871e5152d902ee3f?edk=1493462145de1ce33a52fb569b27a364&codeChallenge=464Cjs7PbiJJhJZ_ReJ-y9UGGDndcpsnP6vS8x1nEJyTkhjQkJyL2jcnYEuMKcrG&expires=1761048664',
signature='4b1cf0e0be0f4e5247e50b0f9a449830f1fbca44c32ff94bc080146815f31a18',
api_key='YOUR_API_KEY'
)
# Get the number value
number = solution['number']
print(f'Solution number: {number}')
# Or create base64-encoded full solution
full_solution_b64 = base64.b64encode(json.dumps(solution).encode()).decode()
print(f'Base64 solution: {full_solution_b64}')
cURL Example
# Create task
curl -X POST https://solver-api.mydisct.com/createTask \
-H "Content-Type: application/json" \
-H "apikey: YOUR_API_KEY" \
-d '{
"auth": {"token": "YOUR_API_KEY"},
"context": {"source": "api", "version": "1.0.0"},
"captcha": {
"type": "ALTCHA_CAPTCHA_TOKEN",
"metadata": {
"siteUrl": "https://example.com",
"siteKey": ""
},
"payload": {
"metadata": {
"challenge": "3dd28253be6cc0c54d95f7f98c517e68744597cc6e66109619d1ac975c39181c",
"iterations": "5000",
"salt": "46d5b1c8871e5152d902ee3f",
"signature": "4b1cf0e0be0f4e5247e50b0f9a449830f1fbca44c32ff94bc080146815f31a18"
}
}
}
}'
# Fetch result (replace TASK_ID with actual task ID)
curl -X POST https://solver-api.mydisct.com/fetchResult \
-H "Content-Type: application/json" \
-H "apikey: YOUR_API_KEY" \
-d '{"taskId": "TASK_ID"}'
Best Practices
- Always copy the
saltparameter exactly as received, including all query parameters - The
iterationsparameter must be a string, even though it represents a number - Altcha parameters are regenerated on each page load - extract and use them immediately
- Some sites only need the
numbervalue, others need the full base64-encoded solution - Check the site's form submission to determine which format is required
- Altcha typically does not require a proxy for solving