A troca quase nunca começa pelo preço. Começa no dia em que o site monitorado deixa de exibir um widget Turnstile e passa a entregar uma página de desafio da Cloudflare — e o wrapper do Anti-Captcha volta com o mesmo erro em toda retentativa.
Em cobertura, a diferença é objetiva: o Anti-Captcha cobre o token do widget, mas para a página de desafio inteira, o BLS dos portais de agendamento e o v3 com score baixo não há método.
Vale sair do Anti-Captcha? O resumo antes do código
- Vale, se o coletor autorizado bate na página de desafio da Cloudflare, não só no widget.
- Vale, se você automatiza portais de agendamento com BLS CAPTCHA.
- Vale, se o score do reCAPTCHA v3 chega baixo e o formulário cai em verificação extra.
- Pode esperar, se o volume é baixo e só aparece reCAPTCHA v2.
Comparativo de recursos lado a lado
As marcações vêm da documentação pública dos dois provedores e de relatos de usuários, conferidos em setembro de 2026; resultados variam conforme o ambiente.
| Recurso | Anti-Captcha | CaptchaAI |
|---|---|---|
| reCAPTCHA v2, Invisible e Enterprise | ✅ | ✅ |
| reCAPTCHA v3 | ✅ (score baixo em relatos) | ✅ |
| Cloudflare Turnstile | ✅ | ✅ |
| Challenge da Cloudflare e desafio JS | ❌ | ✅ |
| GeeTest v3 | ✅ | ✅ |
| BLS | ❌ | ✅ |
| Imagem/OCR | ✅ | ✅ 27.500+ variantes |
CaptchaFox, Friendly Captcha e Lemin estão em beta. hCaptcha, FunCaptcha (Arkose Labs) e GeeTest v4 não são tipos suportados.
Onde o Anti-Captcha trava a operação
Cloudflare: o widget passa, a página de desafio não
O Anti-Captcha entrega tokens de Turnstile, mas não trata a página de desafio completa nem o desafio JS — e boa parte dos alvos de coleta autorizada hoje responde com essa página antes de qualquer HTML útil.
Formato da API: JSON próprio contra o padrão de mercado
O Anti-Captcha usa uma API própria de tarefas JSON. A CaptchaAI usa o formato compatível com 2Captcha, adotado por dezenas de bibliotecas:
# Anti-Captcha — custom JSON format
import requests
resp = requests.post("https://api.anti-captcha.com/createTask", json={
"clientKey": "ANTICAPTCHA_KEY",
"task": {
"type": "RecaptchaV2TaskProxyless",
"websiteURL": "https://example.com",
"websiteKey": "SITE_KEY",
}
})
task_id = resp.json()["taskId"]
# Poll with different endpoint and format
result = requests.post("https://api.anti-captcha.com/getTaskResult", json={
"clientKey": "ANTICAPTCHA_KEY",
"taskId": task_id,
})
# CaptchaAI — standard 2Captcha-compatible format
import requests
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": "SITE_KEY",
"pageurl": "https://example.com",
"json": 1,
})
task_id = resp.json()["request"]
# Standard polling
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY",
"action": "get",
"id": task_id,
"json": 1,
})
Quem já tem um wrapper compatível com 2Captcha troca a URL base e a chave de API; quem escreveu o cliente direto contra createTask reescreve envio e consulta.
BLS CAPTCHA em portais de agendamento
Automação de portais governamentais e de agendamento de visto depende do BLS CAPTCHA:
# CaptchaAI — BLS with a high success rate
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": "YOUR_API_KEY",
"method": "bls",
"pageurl": "https://bls-portal.example.com",
"sitekey": "BLS_SITE_KEY",
"json": 1,
})
O Anti-Captcha não tem método BLS: ou o provedor cobre o tipo, ou o portal fica fora.
reCAPTCHA v3 e GeeTest: qualidade do resultado
Um token de v3 aceito com score baixo é quase tão ruim quanto um recusado: o envio passa, mas o backend manda o usuário para verificação extra. A abordagem assistida por humanos do Anti-Captcha produz scores variáveis, relatados entre 0,3 e 0,5; a CaptchaAI resolve o v3 por motor de IA em menos de 4 s.
| Versão do GeeTest | Anti-Captcha | CaptchaAI |
|---|---|---|
| GeeTest v3 | 85–90% em relatos | ✅ menos de 12 s |
| GeeTest v4 | 80–85% em relatos | ❌ em breve |
A CaptchaAI ainda não resolve GeeTest v4: o suporte está anunciado como em breve.
Velocidade por tipo de CAPTCHA
A coluna CaptchaAI traz tetos publicados por tipo, não médias; a do Anti-Captcha, faixas de relatos públicos.
| Tipo de CAPTCHA | Anti-Captcha | CaptchaAI |
|---|---|---|
| reCAPTCHA v2 | 15–45 s | <60 s |
| reCAPTCHA v3 | 10–30 s | <4 s |
| Cloudflare Turnstile | 10–30 s | <10 s |
| GeeTest v3 | 15–40 s | <12 s |
Para workers em São Paulo (sa-east-1), o RTT cabe dentro dessas faixas — meça ponta a ponta na sua região antes de dimensionar o plano.
Custo: threads em vez de pagamento por resolução
A CaptchaAI cobra por thread simultânea, com resoluções ilimitadas no plano: BASIC (US$ 15/mês, 5 threads), STANDARD (US$ 30/mês, 15 threads), ADVANCE (US$ 90/mês, 50 threads) até VIP-3 (US$ 7.500/mês, 5.000 threads). O que dimensiona o plano é a concorrência, e não o volume.
Caminho de migração sem parar a operação
A migração mexe no envio da tarefa e na consulta do resultado. O menor risco é um wrapper único que fala com os dois provedores na transição:
import requests
import time
class CaptchaSolver:
"""Unified solver — supports Anti-Captcha and CaptchaAI."""
def __init__(self, provider="captchaai", api_key="YOUR_API_KEY"):
self.provider = provider
self.api_key = api_key
def solve_recaptcha_v2(self, sitekey, pageurl):
if self.provider == "captchaai":
return self._solve_captchaai("userrecaptcha", sitekey, pageurl)
else:
return self._solve_anticaptcha(sitekey, pageurl)
def _solve_captchaai(self, method, sitekey, pageurl):
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": self.api_key,
"method": method,
"googlekey": sitekey,
"pageurl": pageurl,
"json": 1,
})
task_id = resp.json()["request"]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": self.api_key, "action": "get",
"id": task_id, "json": 1,
})
data = result.json()
if data["request"] != "CAPCHA_NOT_READY":
return data["request"]
raise TimeoutError("Solve timeout")
def _solve_anticaptcha(self, sitekey, pageurl):
resp = requests.post("https://api.anti-captcha.com/createTask", json={
"clientKey": self.api_key,
"task": {
"type": "RecaptchaV2TaskProxyless",
"websiteURL": pageurl,
"websiteKey": sitekey,
},
})
task_id = resp.json()["taskId"]
for _ in range(60):
time.sleep(5)
result = requests.post(
"https://api.anti-captcha.com/getTaskResult",
json={"clientKey": self.api_key, "taskId": task_id},
)
data = result.json()
if data["status"] == "ready":
return data["solution"]["gRecaptchaResponse"]
raise TimeoutError("Solve timeout")
Com provider="captchaai" nos serviços novos e o Anti-Captcha ligado nos antigos, dá para rodar os dois em paralelo e comparar resultados no tráfego real. Faça isso em QA autorizado, com URLs de staging (https://staging.example.com/...) e dados fictícios; havendo dados pessoais, avalie as obrigações da LGPD sobre o log.
Problemas comuns na troca
Os chamados da primeira semana costumam ser estes três:
| Sintoma | Causa | Correção |
|---|---|---|
| Requisição recusada no envio | Corpo ainda em tarefa JSON | POST em form-data para in.php |
Campo method ausente |
O Anti-Captcha declara type |
Troque por method=userrecaptcha |
| Consulta sem retorno | O endpoint de resultado é outro | GET em /res.php com action=get |
Perguntas frequentes
Dá para manter os dois provedores ligados durante a migração?
Sim, e é o recomendado. Direcione uma fatia do tráfego para cada back-end do wrapper acima e compare os resultados antes de desligar o antigo.
Quanto tempo leva a mudança de código?
Com uma biblioteca compatível com 2Captcha, é troca de chave de API e de URL base. Com um cliente escrito direto contra a API de tarefas, conte algumas horas.
O custo sobe se eu aumentar o volume no mesmo plano?
Não há cobrança por resolução: o plano define quantas threads simultâneas você tem. Se a fila cresce, faltam threads, não créditos.
hCaptcha e FunCaptcha entram nessa comparação?
Não. Nenhum dos dois está entre os tipos suportados pela CaptchaAI.
Guias relacionados
Compare antes de decidir: teste a CaptchaAI e meça resolução e cobertura de Cloudflare no seu ambiente.