API de CAPTCHA
Integração pública e sem autenticação. Seis endpoints, três passos de fluxo, e o restante fica por sua conta.
Introdução
Esta API disponibiliza um serviço de verificação humana que utiliza o Cloudflare Turnstile internamente. Você solicita um desafio, envia o endereço gerado para o seu usuário e depois consulta se ele foi aprovado. Não existe cadastro, chave de acesso nem cota mensal.
Endereço base
https://captcha.ggxdev.com
Fluxo de uso
- Primeiro: o seu sistema chama
POST /api/captcha/createe recebe umidjunto com o endereçocaptchaUrl. - Segundo: você entrega o
captchaUrlao usuário, seja por mensagem no bot, por e-mail ou dentro da sua página. - Terceiro: o seu sistema consulta
GET /api/captcha/status/:ida cada poucos segundos até receber o statussuccess, ou até o desafio expirar em cinco minutos.
Projetos e o campo team
Ao criar um desafio você pode enviar o campo opcional team com o nome do seu projeto. A partir daí acontecem três coisas:
- O nome recebe um identificador próprio, gerado automaticamente a partir do texto informado.
- O nome do projeto aparece na própria página de verificação que o usuário abre.
- O projeto passa a contar no ranking público exibido na página inicial.
O identificador é gerado convertendo o texto para minúsculas, removendo acentos e trocando espaços por hífens:
Meu Projeto 4, meu projeto 4 ou MEU PROJETO 4 leva todos ao mesmo registro meu-projeto-4, somando as estatísticas em um único lugar.
Criar desafio
Corpo da requisição
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
team | texto | Opcional | Nome do seu projeto, com até quarenta e oito caracteres. Gera o identificador e alimenta o ranking público. |
customData | objeto | Opcional | Qualquer conteúdo em JSON. Você recebe exatamente o mesmo objeto ao consultar o status. |
siteUrl | texto | Opcional | Endereço de origem, guardado apenas como referência interna. |
Resposta
{
"success": true,
"id": "550e8400-e29b-41d4-a716-446655440000",
"captchaUrl": "https://captcha.ggxdev.com/captcha/550e8400-...",
"expiresIn": 300,
"team": {
"id": "meu-projeto-4",
"name": "Meu Projeto 4"
},
"customData": { "userId": 42 }
}
Quando o campo team não é enviado, o campo team da resposta volta como null.
Consultar status
{
"success": true,
"status": "success",
"id": "550e8400-...",
"createdAt": 1735776000000,
"expiresIn": 240,
"completedAt": 1735776060000,
"team": { "id": "meu-projeto-4", "name": "Meu Projeto 4" },
"customData": { "userId": 42 }
}
Os valores possíveis do campo status são pending, success, failed e expired.
Ranking de projetos
{
"success": true,
"total": 2,
"teams": [
{
"id": "meu-projeto-4",
"name": "Meu Projeto 4",
"generated": 120,
"solved": 108,
"failed": 7,
"successRate": 90
}
]
}
Estatísticas gerais
Verificar (uso interno)
Exemplo em Node.js
const BASE = 'https://captcha.ggxdev.com'; async function criarDesafio(userId) { const resposta = await fetch(BASE + '/api/captcha/create', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ team: 'Meu Projeto 4', customData: { userId } }) }); return resposta.json(); } async function aguardarResultado(id) { while (true) { await new Promise((r) => setTimeout(r, 2000)); const resposta = await fetch(BASE + '/api/captcha/status/' + id); const dados = await resposta.json(); if (dados.status === 'success') return true; if (dados.status === 'failed' || dados.status === 'expired') return false; } }
Exemplo em Python
import requests, time BASE = "https://captcha.ggxdev.com" def criar_desafio(user_id): resposta = requests.post(f"{BASE}/api/captcha/create", json={ "team": "Meu Projeto 4", "customData": {"userId": user_id} }) return resposta.json() def aguardar_resultado(desafio_id): while True: time.sleep(2) dados = requests.get(f"{BASE}/api/captcha/status/{desafio_id}").json() if dados["status"] == "success": return True if dados["status"] in ("failed", "expired"): return False
Exemplo com cURL
curl -X POST https://captcha.ggxdev.com/api/captcha/create \ -H "Content-Type: application/json" \ -d '{"team":"Meu Projeto 4","customData":{"userId":42}}' curl https://captcha.ggxdev.com/api/captcha/status/<id> curl https://captcha.ggxdev.com/api/captcha/teams?limit=5