Hunt Captcha

Task Examples

Below are examples of Hunt Captcha task types that are currently supported:

Hunt CAPTCHA is an anti-bot system used on betting platforms to detect automated activity. It monitors user behavior and, if suspicious actions are detected, triggers an interactive verification.

Attention!
For this task, use your own proxies.

Our solving system has two operating modes: X-HD generation (fingerprint) and CAPTCHA solving. If you only want to generate X-HD, do not pass the data parameter. If you need to solve the CAPTCHA, pass the token that the target site provides during certain actions (for example, when requesting an SMS).
IMPORTANT: Some parameter values are dynamic — they change with each render of the page using Hunt. Extract them immediately before creating the task to avoid errors during solving.

Request Parameters

ParameterTypeRequiredDescription
type String Required CustomTask
class String Required HUNT
websiteURL String Required The URL of the page where the Hunt CAPTCHA is located.
metadata.apiGetLib String Required The full link to the api.js file. Example: https://www.example.com/hd-api/external/apps/<hash>/api.js
metadata.data String Optional The data parameter must be specified when using CAPTCHA solving mode. Pass the meta.token value from the website.
userAgent String Optional Browser User-Agent. Pass only a valid UA from Windows OS.
proxyType String Required http - regular http/https proxy;
https - try this option only if "http" doesn't work;
socks4 - socks4 proxy;
socks5 - socks5 proxy.
proxyAddress String Required IPv4/IPv6 proxy IP address. Not allowed: transparent proxies or local machine proxies.
proxyPort Integer Required Proxy port.
proxyLogin String Required Proxy server login.
proxyPassword String Required Proxy server password.

Operating Modes

The solution supports two operating modes:

Mode 1: X-HD (fingerprint) generation

In this mode, you do not pass the data parameter. After creating the task, you will receive an X-HD — a unique fingerprint tied to your IP address, which can be used for subsequent requests to the website.

Mode 2: CAPTCHA solving

In this mode, you must pass a token (the value of meta.token) in the data parameter. This token is issued by the website during specific actions (for example, when requesting an SMS). After creating the task, you will receive the CAPTCHA solution as a token ready to be used on the website.

When to Use Each Mode

SituationIs data required?
Initial initializationNo
Need to obtain X-HDNo
Website returned Captcha errorYes
meta.token receivedYes

Complete Workflow

  1. Create a task without data
  2. Receive X-HD from our service
  3. Send a request to the website using X-HD
  4. Receive meta.token
  5. Create a task with data = meta.token
  6. Receive the solution
  7. Submit the solution to the website
Important: If you change the proxy, you must obtain a new X-HD.

Mode 1: X-HD Generation

Used to obtain an X-HD token bound to the IP address.

Create Task

POST https://captcha69.com/createTask
Content-Type: application/json

{
  "clientKey": "max1_YOUR_API_KEY",
  "task": {
    "type": "CustomTask",
    "class": "HUNT",
    "websiteURL": "https://example.com",
    "metadata": {
      "apiGetLib": "https://example.com/hd-api/external/apps/a2157wab1045d68672a63557e0n2a77edbfd15ea/api.js"
    },
    "userAgent": "userAgentPlaceholder",
    "proxyType": "http",
    "proxyAddress": "8.8.8.8",
    "proxyPort": 8080,
    "proxyLogin": "proxyLoginHere",
    "proxyPassword": "proxyPasswordHere"
  }
}

Response

{
  "errorId": 0,
  "taskId": 407533072
}

Mode 2: CAPTCHA Solving

Used after the website returns a captcha error and provides meta.token.

How to Get meta.token

  1. Send a request to the website (for example, an SMS request).
  2. Receive X-HD.
  1. The website responds with:
{
  "errors": [{"code": "113", "title": "Captcha error"}],
  "meta": {
    "token": "SITE_META_TOKEN"
  }
}

Create Task

The value of meta.token must be passed in the data parameter.

POST https://captcha69.com/createTask
Content-Type: application/json

{
  "clientKey": "max1_YOUR_API_KEY",
  "task": {
    "type": "CustomTask",
    "class": "HUNT",
    "websiteUrl": "https://example.com",
    "metadata": {
      "apiGetLib": "https://example.com/hd-api/external/apps/a2157wab1045d68672a63557e0n2a77edbfd15ea/api.js",
      "data": "kufyHK/s/jTNU...AfwIW"
    },
    "userAgent": "userAgentPlaceholder",
    "proxyType": "http",
    "proxyAddress": "8.8.8.8",
    "proxyPort": 8080,
    "proxyLogin": "proxyLoginHere",
    "proxyPassword": "proxyPasswordHere"
  }
}

Response

{
  "errorId": 0,
  "taskId": 407533072
}

Get Task Result

Use the getTaskResult method to obtain the X-HD fingerprint or the Hunt CAPTCHA solution.

Attention!
The value of solution.data.token:
  • In X-HD generation mode — this is the X-HD token that must be used in requests to the target website.
  • In CAPTCHA solving modesolution.data.token is the solution token that must be sent back to the website to confirm the action.

Request

POST https://captcha69.com/getTaskResult
Content-Type: application/json

{
  "clientKey": "max1_YOUR_API_KEY",
  "taskId": 407533072
}

Response

{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "data": {
      "token": "6IyDCCpDdSK...YGs1Wug/z/kLNSpjewI="
    }
  }
}

Solution Properties

PropertyTypeDescription
data.token String X-HD fingerprint token (Mode 1) or CAPTCHA solution token (Mode 2).

Working with Cookies

Attention!
The target site may use special cookies to manage the session. If they are missing or not sent with requests, the server may reject the request or require re-verification.

General principle of working with cookies:

  1. First, you need to open a page on the website or send a GET request to the required page. This allows the server to initialize a user session and set the necessary cookies.
  2. In the response, the server sends cookies via the Set-Cookie header.
  3. The received cookies must be stored, as they are used to identify the client in subsequent requests.
  4. When sending further requests to the site's API, the cookies must be sent back to the server in the Cookie header.
  5. All requests should be performed within the same session using the same IP address (or proxy) and User-Agent.

Code Examples

JavaScript (Node.js) - Full Hunt CAPTCHA Solving
import { gotScraping } from "got-scraping";
import crypto from "crypto";

const API_KEY = "max1_YOUR_API_KEY";
const SOLVER_URL = "https://captcha69.com";

const BASE_URL = "https://example.com";
const API_GET_LIB = "https://example.com/hd-api/external/apps/a1047eab1035d58682a53557e0b2a75edbfd15fd/api.js";

const UA = "userAgentPlaceholder";

const PROXY_HOST = "proxyAddress";
const PROXY_PORT = 8080;
const PROXY_USER = "proxyLogin";
const PROXY_PASS = "proxyPassword";
const PROXY = `http://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}:${PROXY_PORT}`;

const delay = (ms) => new Promise((r) => setTimeout(r, ms));

async function createTask(task) {
  const { body } = await gotScraping.post(`${SOLVER_URL}/createTask`, {
    json: { clientKey: API_KEY, task },
    responseType: "json",
  });
  if (body.errorId !== 0)
    throw new Error("createTask error: " + JSON.stringify(body));
  return body.taskId;
}

async function waitResult(taskId) {
  while (true) {
    const { body } = await gotScraping.post(`${SOLVER_URL}/getTaskResult`, {
      json: { clientKey: API_KEY, taskId },
      responseType: "json",
    });
    if (body.status === "ready")
      return body.solution?.token || body.solution?.data?.token;
    await delay(3000);
  }
}

(async () => {
  try {
    // Step 1: Get cookies
    console.log("STEP 1 - Getting cookies...");
    const base = await gotScraping.get(BASE_URL + "/registration?type=phone_reg", {
      headers: { "user-agent": UA },
      proxyUrl: PROXY,
    });
    let cookies = (base.headers["set-cookie"] || [])
      .map((c) => c.split(";")[0])
      .join("; ");

    const che_g = crypto.randomUUID();
    cookies += `; che_g=${che_g}`;

    // Step 2: Create fingerprint
    console.log("STEP 2 - Creating fingerprint...");
    const fingerprintTaskId = await createTask({
      type: "CustomTask",
      class: "HUNT",
      websiteURL: BASE_URL + "/",
      userAgent: UA,
      metadata: { apiGetLib: API_GET_LIB },
      proxyType: "http",
      proxyAddress: PROXY_HOST,
      proxyPort: PROXY_PORT,
      proxyLogin: PROXY_USER,
      proxyPassword: PROXY_PASS,
    });
    const xhd = await waitResult(fingerprintTaskId);
    console.log("X-HD:", xhd);

    // Step 3: Trigger action (e.g., SMS)
    console.log("STEP 3 - Trigger SMS...");
    const smsResp = await gotScraping.post(BASE_URL + "/web-api/api/web/registration/v2/sms", {
      headers: { cookie: cookies, "x-hd": xhd },
      json: { data: { attributes: { phone: "91123456789", country_code: "54" } } },
      proxyUrl: PROXY,
      responseType: "json",
    });

    const metaToken = smsResp.body?.meta?.token;
    if (!metaToken) throw new Error("meta.token not received");
    console.log("meta.token:", metaToken);

    // Step 4: Solve captcha
    console.log("STEP 4 - Solving Hunt captcha...");
    const solveTaskId = await createTask({
      type: "CustomTask",
      class: "HUNT",
      websiteURL: BASE_URL + "/",
      userAgent: UA,
      metadata: { apiGetLib: API_GET_LIB, data: metaToken },
      proxyType: "http",
      proxyAddress: PROXY_HOST,
      proxyPort: PROXY_PORT,
      proxyLogin: PROXY_USER,
      proxyPassword: PROXY_PASS,
    });
    const captchaToken = await waitResult(solveTaskId);
    console.log("Captcha token:", captchaToken);

    // Step 5: Final request
    console.log("STEP 5 - Sending final request...");
    const finalResp = await gotScraping.post(BASE_URL + "/api/web/registration/v2/sms", {
      headers: { cookie: cookies, "x-hd": xhd },
      body: JSON.stringify({
        data: { attributes: { phone: "91123456789", country_code: 54, captcha: captchaToken } },
      }),
      proxyUrl: PROXY,
    });
    console.log("FINAL RESPONSE:", finalResp.body);
  } catch (err) {
    console.error("FATAL ERROR:", err);
  }
})();
Python - Full Hunt CAPTCHA Solving
import requests
import uuid
import time

API_KEY = "max1_YOUR_API_KEY"
SOLVER_URL = "https://captcha69.com"

BASE_URL = "https://example.com"
API_GET_LIB = "https://example.com/hd-api/external/apps/c1e24d5857463de4393e3f1489b00ebd4495da64/api.js"

UA = "userAgentPlaceholder"

PROXY_HOST = "proxyAddress"
PROXY_PORT = 8080
PROXY_LOGIN = "proxyLogin"
PROXY_PASSWORD = "proxyPassword"
PROXY = f"http://{PROXY_LOGIN}:{PROXY_PASSWORD}@{PROXY_HOST}:{PROXY_PORT}"
proxies = {"http": PROXY, "https": PROXY}

def delay(ms):
    time.sleep(ms / 1000)

def create_task(task):
    r = requests.post(
        SOLVER_URL + "/createTask",
        json={"clientKey": API_KEY, "task": task}
    )
    data = r.json()
    if data["errorId"] != 0:
        raise Exception("createTask error: " + str(data))
    return data["taskId"]

def wait_result(task_id):
    while True:
        r = requests.post(
            SOLVER_URL + "/getTaskResult",
            json={"clientKey": API_KEY, "taskId": task_id}
        )
        data = r.json()
        if data["status"] == "ready":
            solution = data.get("solution", {})
            return solution.get("token") or solution.get("data", {}).get("token")
        delay(3000)

session = requests.Session()

try:
    # Step 1: Get cookies
    print("STEP 1 - Getting cookies")
    r = session.get(BASE_URL + "/en/registration?type=phone", headers={"user-agent": UA}, proxies=proxies)
    cookies = "; ".join([f"{c.name}={c.value}" for c in session.cookies])
    cookies += f"; che_g={uuid.uuid4()}"
    print("Cookies:", cookies)

    # Step 2: Create fingerprint
    print("STEP 2 - Creating fingerprint")
    fingerprint_task = create_task({
        "type": "CustomTask",
        "class": "HUNT",
        "websiteURL": BASE_URL + "/en/",
        "userAgent": UA,
        "metadata": {"apiGetLib": API_GET_LIB},
        "proxyType": "http",
        "proxyAddress": PROXY_HOST,
        "proxyPort": PROXY_PORT,
        "proxyLogin": PROXY_LOGIN,
        "proxyPassword": PROXY_PASSWORD
    })
    xhd = wait_result(fingerprint_task)
    print("X-HD:", xhd)

    # Step 3: Trigger SMS
    print("STEP 3 - Trigger SMS")
    sms_resp = session.post(
        BASE_URL + "/web-api/api/web/registration/v2/sms",
        headers={"cookie": cookies, "x-hd": xhd},
        json={"data": {"attributes": {"phone": "9102345678", "country_code": "7"}}},
        proxies=proxies
    )
    sms_data = sms_resp.json()
    meta_token = sms_data.get("meta", {}).get("token")
    if not meta_token:
        raise Exception("meta.token not received")
    print("meta.token:", meta_token)

    # Step 4: Solve captcha
    print("STEP 4 - Solving captcha")
    solve_task = create_task({
        "type": "CustomTask",
        "class": "HUNT",
        "websiteURL": BASE_URL + "/en/",
        "userAgent": UA,
        "metadata": {"apiGetLib": API_GET_LIB, "data": meta_token},
        "proxyType": "http",
        "proxyAddress": PROXY_HOST,
        "proxyPort": PROXY_PORT,
        "proxyLogin": PROXY_LOGIN,
        "proxyPassword": PROXY_PASSWORD
    })
    captcha_token = wait_result(solve_task)
    print("Captcha token:", captcha_token)

    # Step 5: Final request
    print("STEP 5 - Final request")
    final = session.post(
        BASE_URL + "/web-api/api/web/registration/v2/sms",
        headers={"cookie": cookies, "x-hd": xhd},
        json={"data": {"attributes": {"phone": "9102345678", "country_code": 7, "captcha": captcha_token}}},
        proxies=proxies
    )
    print("FINAL STATUS:", final.status_code)
    print(final.json())

except Exception as e:
    print("FATAL ERROR")
    print(e)