SurSolver

How to solve Altcha

Altcha is a self-hostable proof-of-work widget with no sitekey. Here is how to capture its challenge, solve it and put the token into the hidden altcha field.

Updated

Charged when a task is accepted

On this page

What is Altcha and how to recognise it

Altcha is a privacy-first, self-hostable bot-protection widget. Instead of an image puzzle it asks the browser to run a silent proof-of-work computation in a Web Worker, then posts the result as a JSON payload. In the default flow there is nothing for the visitor to click.

The Altcha widget on the technative.eu contact form in its verified state, the "I'm not a robot" switch checked

The widget is a web component, <altcha-widget>, and its result lands in a hidden form field named altcha unless the site renamed it. The server issues a fresh challenge with an algorithm, a challenge, a salt and a signature; the browser searches for a number that satisfies it; the server checks it with one cheap verification. That is why a solve is a computation, not recognition.

Some sites running Altcha Cloud or Sentinel can escalate suspicious traffic to an interactive text or audio code challenge. A proof-of-work result does not satisfy that step, so the clean fit is a site that uses only the proof-of-work widget.

Extension, API or automation?

There is no browser extension: SurSolver is an HTTP API. For this type the input is the challenge you captured, and the answer comes back through createTask and getTaskResult. The type needs no proxy.

Automation is the practical route when the challenge has to be read from the live page: a Playwright or Puppeteer script captures the challenge response, the API solves it, and the script writes the token into the field and submits. A server-side job works the same way when the challenge endpoint can be called directly.

How to find the parameters

Altcha has no sitekey. What the task needs is the page URL plus the challenge, either as a URL or as the JSON itself.

In DevTools, open the Elements panel and look for <altcha-widget>. Its challengeurl attribute, or its challenge attribute when that holds an address, is where the widget gets the challenge from. Then open the Network tab and find that request. The endpoint differs from site to site, and some include a sitekey or apiKey query value that belongs to the URL, not to a separate key.

The DevTools Network panel on technative.eu with the sendform/challenge GET request selected, its JSON response showing the algorithm, challenge, salt and signature

The response body is the challenge JSON, with algorithm, challenge, salt and signature, and usually a maximum number. Copy it exactly as received. The algorithm matters for solve time: memory-hard ones such as Argon2id and Scrypt are heavier than the default.

Where the token goes

The solution has a single key, token. Put it into the hidden input the widget manages, named altcha by default. Confirm the name in the Elements panel, because the widget's name attribute can change it, and some sites expect an altcha cookie instead. Then submit the form as usual.

The hidden altcha input selected in the DevTools Elements panel on technative.eu, its value attribute holding the solved proof-of-work token

Submit the full token, not only the number inside it, unless the receiving server demonstrably accepts the bare number; servers differ, so test both if the first attempt is refused. In a browser-automation script, fill the field with page.fill() or the DOM equivalent and submit straight away.

Common mistakes

The commonest failure is a stale challenge. Challenges are fresh and single-use, and they carry an expiry, so capture one right before you create the task and never retry with the same one after a rejection.

The second is changing the data in transit: pass the challenge JSON through exactly as the endpoint returned it. The third is expecting a proof-of-work result to clear an interactive code challenge. If a site escalates, no number will pass that step.

Do not look for a sitekey that does not exist, and do not assume the field is called altcha without checking. Expect slower results on sites that use the memory-hard algorithms.

Solve it with SurSolver

Send the page URL and either the challenge URL or the challenge JSON to createTask with the task type AltchaTaskProxyless (or AltchaTask), then poll getTaskResult until the status is ready. The solution's token key is what you place in the altcha field. The accepted names and parameters are listed by the public catalog (GET /v1/task-types).

FAQ

How do I solve Altcha automatically?

Capture the challenge the widget fetches, send its URL or its JSON together with the page URL to createTask, poll for the result, and put the returned token into the hidden altcha field before you submit the form.

Is there an Altcha sitekey?

No. Altcha has no reCAPTCHA-style sitekey. The closest thing is the challenge URL, which sometimes carries a sitekey or apiKey query value of its own. What the task needs is that challenge URL, or the challenge JSON it returns.

Should I send challengeURL or challengeJSON?

At least one of the two is required. If you can capture the challenge response in DevTools, send the JSON exactly as received, since challenges are fresh and single-use. If you only have the address, send the URL.

Why is my Altcha solution rejected?

The usual causes are a challenge that expired or was already used, a server that expects only the bare number instead of the full token, or a site that escalates to the interactive code challenge, which a proof-of-work result cannot satisfy. Capture a fresh challenge and solve again.

Where does the Altcha token go?

Into the hidden input named altcha by default. The widget can be configured with a different field name, or to use a cookie, so confirm the name in the Elements panel before you submit.

From the blog

No posts yet — read the blog for new guides and release notes.