Altcha - Alternative CAPTCHA
Exemplos de tarefas
- PoW (Proof-of-Work)
- Code Captcha

Existe também um captcha invisível (Invisible Captcha), que não possui interface visível na página e não requer qualquer ação do usuário — a verificação ocorre em segundo plano.
O CapMonster Cloud, por padrão, funciona com proxies integrados — já incluídos no custo do serviço. É necessário especificar seus próprios proxies apenas nos casos em que o site não aceita o token ou quando o acesso aos serviços integrados está restrito.
Se o proxy utiliza autenticação por IP, é necessário adicionar o endereço 65.21.190.34 à lista de permissões (whitelist).
Parâmetros da solicitação
type<string>requiredCustomTask
class<string>requiredaltcha
websiteURL<string>requiredURL da página principal onde o Altcha está localizado.
websiteKey<string>requiredPara esta tarefa, é permitido enviar uma string vazia.
challenge (dentro do metadata)<string>requiredIdentificador único da tarefa obtido no site.
iterations (dentro do metadata)<string>requiredNúmero de iterações ou valor máximo para os cálculos.
Importante: o parâmetro
iterationscorresponde ao valor demaxnumber!
salt (dentro do metadata)<string>requiredSalt obtido no site, usado para gerar hashes.
Importante: sempre envie o valor completo do campo
salt! Se o site retornar algo como:
"salt":"46d5b1c8871e5152d902ee3f?edk=1493462145de1ce33a52fb569b27a364&codeChallenge=464Cjs7PbiJJhJZ_ReJ-y9UGGDndcpsnP6vS8x1nEJyTkhjQkJyL2jcnYEuMKcrG&expires=1761048664"
— copie e envie no seu pedido exatamente como está, incluindo todos os caracteres e parâmetros (edk, codeChallenge, etc.).
signature (dentro do metadata)<string>requiredAssinatura digital da requisição.
userAgent<string>optionalUser-Agent do navegador.
Passe apenas um UA válido do Windows. Atualmente é: userAgentPlaceholder
proxyType<string>optionalhttp - proxy http/https comum;
https - use esta opção apenas se "http" não funcionar (necessário para alguns proxies personalizados);
socks4 - proxy socks4;
socks5 - proxy socks5.
proxyAddress<string>optionalEndereço IPv4/IPv6 do proxy. Não permitido:
- usar proxies transparentes (onde o IP do cliente é visível);
- usar proxies em máquinas locais.
proxyPort<integer>optionalPorta do proxy.
proxyLogin<string>optionalLogin do servidor proxy.
proxyPassword<string>optionalSenha do servidor proxy.
Método de criação da tarefa
- Altcha CustomTask (sem proxy)
- Altcha CustomTask (com proxy)
https://api.capmonster.cloud/createTask
Requisição
{
"clientKey": "API_KEY",
"task": {
"type": "CustomTask",
"class": "altcha",
"websiteURL": "https://example.com",
"websiteKey": "",
"userAgent": "userAgentPlaceholder",
"metadata": {
"challenge": "3dd28253be6cc0c54d95f7f98c517e68744597cc6e66109619d1ac975c39181c",
"iterations": "5000",
"salt": "46d5b1c8871e5152d902ee3f?edk=1493462145de1ce33a52fb569b27a364&codeChallenge=464Cjs7PbiJJhJZ_ReJ-y9UGGDndcpsnP6vS8x1nEJyTkhjQkJyL2jcnYEuMKcrG&expires=1761048664",
"signature": "4b1cf0e0be0f4e5247e50b0f9a449830f1fbca44c32ff94bc080146815f31a18"
}
}
}
Resposta
{
"errorId": 0,
"taskId": 407533072
}
https://api.capmonster.cloud/createTask
Requisição
{
"clientKey": "API_KEY",
"task": {
"type": "CustomTask",
"class": "altcha",
"websiteURL": "https://example.com",
"websiteKey": "",
"userAgent": "userAgentPlaceholder",
"metadata": {
"challenge": "3dd28253be6cc0c54d95f7f98c517e68744597cc6e66109619d1ac975c39181c",
"iterations": "5000",
"salt": "46d5b1c8871e5152d902ee3f?edk=1493462145de1ce33a52fb569b27a364&codeChallenge=464Cjs7PbiJJhJZ_ReJ-y9UGGDndcpsnP6vS8x1nEJyTkhjQkJyL2jcnYEuMKcrG&expires=1761048664",
"signature": "4b1cf0e0be0f4e5247e50b0f9a449830f1fbca44c32ff94bc080146815f31a18"
},
"proxyType":"http",
"proxyAddress":"8.8.8.8",
"proxyPort":8080,
"proxyLogin":"proxyLoginHere",
"proxyPassword":"proxyPasswordHere"
}
}
Resposta
{
"errorId": 0,
"taskId": 407533072
}
Método para obter o resultado da tarefa
Use o método getTaskResult para obter a solução do Altcha.
https://api.capmonster.cloud/getTaskResult
Requisição
{
"clientKey": "API_KEY",
"taskId": 407533072
}
Resposta
{
"errorId": 0,
"status": "ready",
"solution": {
"number": 4883
}
}
Como encontrar todos os parâmetros necessários para a criação da tarefa
A seguir estão exemplos de como extrair os parâmetros do Altcha necessários para enviar uma tarefa para solução no CapMonster Cloud. Note que a implementação do captcha pode variar entre sites, então os métodos de obtenção de parâmetros podem diferir.
-
Abra a página do Altcha no navegador, abra o DevTools (F12 ou Ctrl+Shift+I) e vá para a aba Network.
-
Clique na caixa de seleção do captcha e complete-o manualmente. No campo de pesquisa em Network, digite qualquer nome de parâmetro (por exemplo, "algorithm").
-
Localize a requisição que contém JSON com os parâmetros.
-
Clique na requisição e, se necessário, vá para a aba Response para visualizar os dados retornados pelo servidor.
-
Copie os parâmetros — esses valores devem ser usados para criar a tarefa no CapMonster Cloud.

Em geral, após ativar o captcha na página, você precisa analisar as requisições de rede e identificar todas as interações relacionadas à sua operação. Essas ações são necessárias para determinar os parâmetros e entender o processo de verificação. Por exemplo, a imagem abaixo mostra uma requisição chamada
altchacontendo todos os parâmetros-chave:

Após obter os parâmetros necessários, você precisa passá‑los para o objeto metadata ao criar uma tarefa no CapMonster Cloud. Estrutura de exemplo:
metadata: {
challenge: "<valor do challenge>",
iterations: "<valor do maxnumber>", // deve estar entre aspas, assim como os demais parâmetros
salt: "<valor do salt>",
signature: "<valor do signature>",
}
Você também pode usar os seguintes exemplos de código para extrair todos os parâmetros:
Exemplo de Requisição GET
Realiza uma requisição HTTP GET para o URL especificado e registra a resposta no console.
const url = 'https://example-portal.mysite.rs.gov.br/Altcha/Example'; // Endpoint da API de onde os parâmetros do captcha são extraídos
fetch(url, { method: 'GET' })
.then(res => res.text())
.then(data => console.log('Response:', data))
.catch(err => console.error(err));
Interceptador de Parâmetros
Script para navegador que sobrescreve fetch e XMLHttpRequest para monitorar automaticamente as requisições de rede e extrair os principais parâmetros do captcha Altcha. Cole este script no console do navegador na página do captcha e ative o captcha — os parâmetros necessários serão registrados automaticamente no console.
(function() {
const keywords = ['algorithm','challenge','maxnumber','salt','signature'];
const foundParams = {};
const intercept = (url, body, text) => {
keywords.forEach(key => {
if ((url && url.includes(key)) || (body && body.includes(key)) || (text && text.includes(key))) {
foundParams[key] = foundParams[key] || [];
if (url?.includes(key)) foundParams[key].push(url);
if (body?.includes(key)) foundParams[key].push(body);
if (text?.includes(key)) foundParams[key].push(text);
}
});
if (Object.keys(foundParams).length) console.log('Found parameters:', foundParams);
};
const originalFetch = window.fetch;
window.fetch = async (...args) => {
const [resource, config] = args;
const url = typeof resource === 'string' ? resource : resource.url;
const body = config?.body;
const response = await originalFetch.apply(this, args);
try {
const text = await response.clone().text();
intercept(url, body, text);
} catch {}
return response;
};
const originalOpen = XMLHttpRequest.prototype.open;
const originalSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.open = function(method, url, ...rest) {
this._url = url;
return originalOpen.call(this, method, url, ...rest);
};
XMLHttpRequest.prototype.send = function(body) {
this.addEventListener('load', () => intercept(this._url, body, this.responseText));
return originalSend.call(this, body);
};
})();
Exemplo de resolução automática do Altcha com Node.js e Playwright
Em alguns casos, basta enviar apenas o parâmetro number para confirmar a solução. No entanto, às vezes o site exige todos os parâmetros, codificados em base64.
Por exemplo:

Decodificando esse valor, obtemos um objeto JSON contendo os dados usados para validação do captcha:
{
"algorithm": "SHA-256",
"challenge": "86d178e154a5d04665710897b7bfc269d86407830d3a49dad3a3e027f6a824a6",
"number": 92199,
"salt": "f8ec36f9d615aa2c67c7ea29e?expires=1759147489",
"signature": "29a57a68dd2b1de8cba74b104c38de8fc860f8dd5b5eacd04755dcff7eb7ee8f",
"took": 1520
}
No retorno do CapMonster Cloud, o number é fornecido separadamente, assim como o conjunto completo de parâmetros, já codificado em base64 (incluindo o number).
No exemplo abaixo, a confirmação da solução é feita usando um token que contém o conjunto completo de parâmetros.
Se você precisar enviar apenas o number, será necessário ajustar a lógica de confirmação da solução.
Mostrar exemplo de código
const { chromium } = require("playwright");
// Substitua pelos seus valores:
// - API_KEY → sua chave do CapMonster Cloud
// - ALTCHA_PAGE → URL da página com Altcha
const API_KEY = "your_capmonster_cloud_api_key";
const ALTCHA_PAGE = "https://url_with_altcha";
(async () => {
const browser = await chromium.launch({ headless: false, devtools: true });
const context = await browser.newContext();
const page = await context.newPage();
await page.route("**/*", (route) => {
const url = route.request().url();
if (url.includes("api.capmonster.cloud")) return route.abort();
return route.continue();
});
let challengeResp = null; // Variável para armazenar o challenge do Altcha
page.on("response", async (response) => {
try {
if (response.url().includes("/Altcha/GerarDesafio")) {
challengeResp = await response.json(); // Obtém o JSON com os parâmetros do challenge
console.log("Captured /Altcha/GerarDesafio:", challengeResp);
}
} catch {}
});
await page.goto(ALTCHA_PAGE, { waitUntil: "networkidle" }); // Acessa a página com Altcha
try {
await page.waitForSelector("altcha-widget input[type='checkbox']", { timeout: 10000 });
await page.click("altcha-widget input[type='checkbox']");
} catch {
const widgetHandle = await page.$("altcha-widget");
if (widgetHandle) await widgetHandle.click(); // Caso o seletor padrão não seja encontrado
}
// Espera para receber o challenge
const start = Date.now();
while (!challengeResp && Date.now() - start < 30000) {
await new Promise((r) => setTimeout(r, 300));
}
if (!challengeResp) {
console.error("Falha ao capturar /Altcha/GerarDesafio.");
await browser.close();
return;
}
const { challenge, salt, signature, maxnumbers } = challengeResp;
// Monta o corpo da requisição para criar a tarefa no CapMonster Cloud
const createTaskBody = {
clientKey: API_KEY,
task: {
type: "CustomTask",
class: "altcha",
websiteURL: ALTCHA_PAGE,
websiteKey: "",
userAgent:
"userAgentPlaceholder",
metadata: {
challenge,
iterations: maxnumbers,
salt,
signature,
},
},
};
// Cria a tarefa no CapMonster Cloud
const taskResp = await fetch("https://api.capmonster.cloud/createTask", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(createTaskBody),
}).then((r) => r.json());
console.log("CreateTask response:", taskResp);
if (!taskResp || !taskResp.taskId) {
console.error("Falha ao criar a tarefa:", taskResp);
await browser.close();
return;
}
const taskId = taskResp.taskId;
// Aguarda a solução da tarefa
let fullSolution = null;
const maxPollMs = 120000;
const pollStart = Date.now();
while (Date.now() - pollStart < maxPollMs) {
const res = await fetch("https://api.capmonster.cloud/getTaskResult", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ clientKey: API_KEY, taskId }),
}).then((r) => r.json());
if (res.status === "ready") {
fullSolution = res.solution;
console.log("Solução completa do CapMonster:", fullSolution);
break;
}
await new Promise((r) => setTimeout(r, 3000));
}
if (!fullSolution) {
console.error("Solução não recebida dentro do tempo alocado.");
await browser.close();
return;
}
// Extrai o token da solução
const token =
(fullSolution && fullSolution.data && fullSolution.data.token) ||
fullSolution.token ||
(fullSolution && fullSolution.data) ||
null;
if (!token) {
console.error("Token não encontrado na resposta do CapMonster:", fullSolution);
await browser.close();
return;
}
// Injeta o token na página
await page.evaluate((tokenValue) => {
const cpv = document.querySelector("#captchaParaValidar");
if (cpv) {
cpv.value = tokenValue;
} else {
const created = document.createElement("input");
created.type = "hidden";
created.id = "captchaParaValidar";
created.name = "captchaParaValidar";
created.value = tokenValue;
(document.querySelector("form") || document.body).appendChild(created);
}
let alt = document.querySelector('input[name="altcha"]');
if (alt) {
alt.value = tokenValue;
} else {
const created2 = document.createElement("input");
created2.type = "hidden";
created2.name = "altcha";
created2.value = tokenValue;
(document.querySelector("form") || document.body).appendChild(created2);
}
const widget = document.querySelector("altcha-widget");
if (widget) {
widget.setAttribute("data-state", "verified");
const checkbox = widget.querySelector("input[type='checkbox']");
if (checkbox) {
checkbox.checked = true;
checkbox.dispatchEvent(new Event("change", { bubbles: true }));
}
const label = widget.querySelector(".altcha-label");
if (label) label.textContent = "Verified";
}
}, token);
console.log("Token injetado:", token);
})();
