Chat with us, powered by LiveChat
← Return to MyDisct Solver

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.

What is Altcha?

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"
}
Important: Salt Parameter

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.

Iterations Parameter

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

POST /createTask

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

JavaScript
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"
    }
  }
}
Using the Token

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

JavaScript
// 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

Python
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

cURL
# 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

Recommendations
  • Always copy the salt parameter exactly as received, including all query parameters
  • The iterations parameter 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 number value, 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