Em cerca de cinco minutos você terá um token de CAPTCHA resolvido na mão — sem montar navegador, sem infraestrutura e sem teoria. A API da CaptchaAI trabalha com três verbos: você envia o desafio, consulta o resultado e injeta o token na página ou requisição de destino. Se você já integrou algum serviço no estilo 2Captcha, os endpoints (in.php e res.php) são os mesmos, então a migração é praticamente copiar e colar.
O exemplo deste guia usa o Cloudflare Turnstile, mas todo tipo suportado — reCAPTCHA v2/v3, GeeTest v3, imagem/OCR — segue exatamente o mesmo ciclo de quatro passos:
- Enviar os dados do CAPTCHA para
in.php - Guardar o ID da tarefa que volta na resposta
- Consultar
res.phpa cada 5 segundos até o resultado ficar pronto - Injetar o token na página ou requisição de destino
Passo 0: obtenha sua chave de API
- Crie sua conta em captchaai.com
- Abra o painel de API
- Copie a chave de 32 caracteres
Sua conta precisa de threads ativas para enviar tarefas. Se você ainda está avaliando o serviço, fale com o suporte para liberar threads de teste.
Passo 1: envie o desafio CAPTCHA
O exemplo abaixo resolve um Cloudflare Turnstile — um dos tipos mais comuns hoje. Da página alvo você precisa de apenas dois valores:
- sitekey — a chave pública do widget Turnstile (no atributo
data-sitekeyou nos parâmetros do script; começa com0x) - pageurl — a URL completa onde o widget é carregado
Escolha a linguagem da sua stack; o corpo da requisição é idêntico em todas.
cURL
curl -X POST "https://ocr.captchaai.com/in.php" \
-d "key=YOUR_API_KEY" \
-d "method=turnstile" \
-d "sitekey=0x4AAAAAAAC3DHQFLr1GavNl" \
-d "pageurl=https://staging.example.com/qa-login" \
-d "json=1"
Python
import requests
response = requests.post("https://ocr.captchaai.com/in.php", data={
"key": "YOUR_API_KEY",
"method": "turnstile",
"sitekey": "0x4AAAAAAAC3DHQFLr1GavNl",
"pageurl": "https://staging.example.com/qa-login",
"json": 1,
})
print(response.json())
Node.js
const response = await fetch("https://ocr.captchaai.com/in.php", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
key: "YOUR_API_KEY",
method: "turnstile",
sitekey: "0x4AAAAAAAC3DHQFLr1GavNl",
pageurl: "https://staging.example.com/qa-login",
json: "1",
}),
});
console.log(await response.json());
PHP
<?php
$response = file_get_contents("https://ocr.captchaai.com/in.php?" . http_build_query([
"key" => "YOUR_API_KEY",
"method" => "turnstile",
"sitekey" => "0x4AAAAAAAC3DHQFLr1GavNl",
"pageurl" => "https://staging.example.com/qa-login",
"json" => 1,
]));
echo $response;
Passo 2: guarde o ID da tarefa
Uma requisição bem-sucedida devolve algo assim:
{
"status": 1,
"request": "71823469"
}
O campo request traz o ID da tarefa — guarde-o, porque é com ele que você busca o resultado no passo seguinte.
Quando status vier como 0, houve um problema, e o código de erro aparece no próprio campo request:
| Erro | Significado | Como resolver |
|---|---|---|
ERROR_WRONG_USER_KEY |
Formato da chave de API errado | Confira os 32 caracteres |
ERROR_KEY_DOES_NOT_EXIST |
Chave não encontrada | Verifique no painel |
ERROR_ZERO_BALANCE |
Sem threads disponíveis | Recarregue ou aguarde liberação |
ERROR_PAGEURL |
Faltou o parâmetro pageurl |
Adicione a URL completa |
ERROR_WRONG_GOOGLEKEY |
sitekey vazio ou inválido | Reextraia o sitekey (Turnstile começa com 0x) |
Passo 3: consulte o resultado
Espere 15 segundos antes da primeira consulta e, a partir daí, verifique a cada 5 segundos até o token chegar. Consultar antes disso só devolve CAPCHA_NOT_READY em todas as tentativas e ainda ocupa uma thread à toa.
Python
import time
time.sleep(15)
while True:
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY",
"action": "get",
"id": "71823469",
"json": 1,
}).json()
if result.get("request") == "CAPCHA_NOT_READY":
time.sleep(5)
continue
if result.get("status") == 1:
token = result["request"]
print(f"Solved! Token: {token[:60]}...")
break
raise RuntimeError(result)
Node.js
await new Promise((r) => setTimeout(r, 15000));
while (true) {
const r = await fetch(
`https://ocr.captchaai.com/res.php?key=YOUR_API_KEY&action=get&id=71823469&json=1`,
);
const data = await r.json();
if (data.request === "CAPCHA_NOT_READY") {
await new Promise((r) => setTimeout(r, 5000));
continue;
}
if (data.status === 1) {
console.log("Solved:", data.request.slice(0, 60));
break;
}
throw new Error(JSON.stringify(data));
}
Passo 4: injete o token resolvido
A forma de aplicar o token muda conforme o tipo de CAPTCHA:
- Turnstile / reCAPTCHA — escreva o valor no campo
cf-turnstile-responseoug-recaptcha-response, ou dispare o callback da página. - Imagem / OCR — coloque o texto reconhecido no input de resposta.
- GeeTest v3 — preencha os campos retornados (challenge, validate, seccode) conforme o formulário do site.
No navegador, a injeção mínima fica assim:
document.querySelector('[name="cf-turnstile-response"]').value = token;
document.querySelector("form").submit();
Ambiente de teste e uso responsável
Repare que os exemplos usam https://staging.example.com/qa-login de propósito: teste sempre em ambientes que você controla ou tem autorização para automatizar. Se o fluxo envolve coleta ou tratamento de dados de usuários, considere as obrigações da LGPD (ou do RGPD, em Portugal) antes de levar para produção.
Do ponto de vista de latência, a etapa de rede é pequena perto do tempo de resolução. Uma aplicação hospedada em São Paulo (por exemplo, na região sa-east-1) gasta poucos milissegundos no in.php e no res.php, enquanto o Turnstile costuma levar de 15 a 30 segundos para resolver. Dimensione seus timeouts pelo tempo de resolução, não pela rede.
Erros comuns na primeira integração
- Espaço extra ao copiar a chave — remova qualquer espaço no início ou no fim.
pageurlsem protocolo — a URL precisa começar comhttps://.- Primeira consulta cedo demais — aguarde os 15 segundos iniciais.
- Consultas frequentes demais — 5 s já é o suficiente; consultar mais rápido não acelera o resultado.
- Threads esgotadas — confira os códigos de erro da API e o seu plano.
Perguntas frequentes
Quanto custa para começar?
Os planos são cobrados por thread concorrente, não por resolução, e começam no BASIC (US$ 15/mês, 5 threads), com resoluções ilimitadas dentro do mês. Ou seja, você paga pela concorrência que precisa, não por CAPTCHA resolvido. A tabela completa de planos fica na página de preços da CaptchaAI.
Preciso de um navegador para usar a API?
Não. A API funciona só com requisições HTTP: você envia para in.php e consulta res.php. Um navegador com Selenium ou Puppeteer só entra em cena se o token precisar ser injetado em uma página que você está automatizando; para envios diretos por HTTP, ele é dispensável.
O hCaptcha é suportado?
Não. O hCaptcha não é suportado atualmente, assim como o FunCaptcha (Arkose Labs) e o GeeTest v4 (este anunciado como "em breve"). Os tipos cobertos incluem reCAPTCHA v2/v3, Cloudflare Turnstile e Challenge, GeeTest v3, imagem/OCR e grade de imagens, além de CaptchaFox (beta), Friendly Captcha (beta) e Lemin (beta).
Por que a primeira consulta espera 15 segundos?
Porque tipos baseados em token, como Turnstile e reCAPTCHA, levam alguns segundos para serem resolvidos. Consultar em t=0 devolve CAPCHA_NOT_READY em toda tentativa e ainda ocupa uma thread sem necessidade. Espere 15 segundos e, depois, consulte a cada 5.
Posso reaproveitar um token resolvido?
Não. Tokens de Turnstile e reCAPTCHA são de uso único e expiram em cerca de 120 segundos. O ciclo correto é enviar, usar e descartar — nunca faça cache do token.