Gere sua integração personalizada

Preencha as informações do seu projeto e receba o código pronto para colar no seu site.

1 Configure sua integração
URL base onde sua API está hospedada.
Analisamos o HTML e identificamos os campos do formulário automaticamente.
Preenchido automaticamente ao analisar.

DeskCaptcha v1.0.0

API DeskCaptcha

Documentação oficial da API de geração e validação de CAPTCHAs. Self-hosted, open source, construída em PHP + SQLite.

Base URL

https://seu-servidor.com/v1
REST JSON PHP 8+ SQLite

Início Rápido

Em menos de 5 minutos você pode integrar o DeskCaptcha em qualquer aplicação web.

Passo 1 — Verifique que a API está no ar
GET https://seu-servidor.com/v1/health

Resposta esperada: "status": "healthy"

Passo 2 — Gere um captcha
GET https://seu-servidor.com/v1/captcha/generate?scale=1&chars=4

Retorna um token e uma image_url para exibir ao usuário.

Passo 3 — Valide a resposta do usuário
POST https://seu-servidor.com/v1/captcha/validate
Content-Type: application/json

{ "token": "abc123...", "answer": "A3B7" }

Retorna "valid": true ou "valid": false.

Importante: Sempre valide o captcha no backend da sua aplicação, nunca diretamente no frontend.

Base URL

Produção (DeskNect):

https://seu-servidor.com/v1

Self-hosted (local):

http://localhost/deskcaptcha/public/index.php/v1

Todas as requisições devem usar Content-Type: application/json quando enviarem corpo.


Autenticação

Por padrão a API é pública. Para produção você pode habilitar autenticação por API Key no arquivo config/api.php.

Quando habilitado, envie o header:

X-API-Key: sua-chave-secreta

Configure em config/api.php: 'require_api_key' => true


Endpoints

MétodoEndpointDescrição
GET/v1/captcha/generateGera um novo captcha
GET/v1/captcha/{filename}Serve a imagem PNG do captcha
POST/v1/captcha/validateValida a resposta do usuário
GET/v1/statusStatus da API, pool e rate limits
GET/v1/healthHealth check

GET/v1/captcha/generate

Gera um novo captcha, salva no pool e retorna token + URL da imagem.

Parâmetros de query
ParâmetroTipoPadrãoValoresDescrição
scale int 1 1, 2, 3 Fator de escala da imagem. 1=400×100px, 2=800×200px, 3=1200×300px
chars int 4 4, 6, 8 Quantidade de caracteres. Sempre no padrão letra+número (ex: A3B7)
Resposta de sucesso 200
{
  "success": true,
  "data": {
    "token": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6",
    "image_url": "https://seu-servidor.com/v1/captcha/xYz12345.png",
    "expires_in": 600,
    "expires_at": "2026-04-24 10:00:00",
    "scale": 1,
    "chars": 4,
    "dimensions": { "width": 400, "height": 100 }
  },
  "meta": {
    "version": "1.0.0",
    "api": "DeskCaptcha",
    "request_id": "8dd91872875d7ada",
    "time_ms": "15.6",
    "remaining": { "minute": 28, "hour": 2998, "day": 9998 }
  }
}

GET/v1/captcha/{filename}

Serve a imagem PNG do captcha. Use a image_url retornada pelo /generate diretamente no <img src="...">.

Exemplo de uso:

<img src="https://seu-servidor.com/v1/captcha/xYz12345.png" alt="captcha">

Retorna a imagem PNG diretamente. Sem rate limit de usuário para este endpoint.

POST/v1/captcha/validate

Valida a resposta do usuário. Cada token é de uso único — após validado não pode ser reutilizado.

Corpo da requisição
{
  "token": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6",
  "answer": "A3B7"
}
Resposta correta 200
{
  "success": true,
  "data": {
    "valid": true,
    "message": "Captcha validated successfully."
  }
}
Resposta incorreta 422
{
  "success": true,
  "data": {
    "valid": false,
    "message": "Incorrect answer."
  }
}

GET/v1/status

Retorna status operacional, contagem do pool de imagens e contadores de rate limit global.

{
  "success": true,
  "data": {
    "status": "operational",
    "pool": { "active": 48, "target": 50 },
    "rate_limits": {
      "global": {
        "remaining": { "minute": 28, "hour": 2950, "day": 9800 },
        "limits": { "per_minute": 30, "per_hour": 3000, "per_day": 10000 }
      }
    },
    "database": "deskcaptcha_2026_04.sqlite"
  }
}

GET/v1/health

Verificação de integridade. Use para monitoramento e load balancers.

Saudável (HTTP 200)

{
  "data": {
    "status": "healthy",
    "database": "ok"
  }
}

Degradado (HTTP 503)

{
  "data": {
    "status": "degraded",
    "database": "error"
  }
}

Rate Limiting

A API aplica dois níveis de limites independentes: global (todos os usuários somados) e por usuário (identificado por IP + fingerprint).

Limites Globais
JanelaLimiteHTTP
1 minuto30429
1 hora3.000429
1 dia10.000503
Limites por Usuário
EndpointJanelaLimite
/generate1 segundo2
/generate1 minuto10
/generate1 hora60
/generate1 dia120
/validate1 segundo5
/validate1 minuto20
/validate1 hora120
/validate1 dia240
/captcha/{file}sem limite
Headers de resposta
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 7
X-RateLimit-Reset: 1714000000
Retry-After: 45          ← presente apenas em respostas 429/503

Códigos de Erro

HTTPTipoDescriçãoO que fazer
200Sucesso
400bad_requestRequisição malformadaVerifique o corpo da requisição
401unauthorizedAPI Key inválida ou ausenteEnvie o header X-API-Key
404not_foundToken ou imagem não encontradaGere um novo captcha
409conflictToken já utilizadoGere um novo captcha
410goneCaptcha expirado (10 min)Gere um novo captcha
422validationParâmetro inválido ou resposta incorretaVerifique os parâmetros enviados
429rate_limitLimite de requisições atingidoAguarde o Retry-After
503service_unavailableLimite diário global atingidoAguarde a virada do dia
500server_errorErro interno do servidorTente novamente; reporte se persistir

Formato padrão de erro:

{
  "success": false,
  "error": {
    "code": 429,
    "type": "rate_limit",
    "message": "Too many requests. Please wait before retrying."
  },
  "meta": {
    "rate_limit": { "window": "minute", "retry_after": 45, "limit": 10 },
    "request_id": "8dd91872875d7ada"
  }
}

Exemplos de Código

HTML + JavaScript
<img id="captcha-img" alt="captcha">
<input type="text" id="answer" placeholder="Digite os caracteres"
       oninput="this.value=this.value.toUpperCase()">
<button onclick="load()">Atualizar</button>
<button onclick="submit()">Enviar</button>

<script>
const API = 'https://seu-servidor.com/v1';
let token = '';
let busy  = false;

async function load() {
  if (busy) return;
  busy = true;
  const res  = await fetch(`${API}/captcha/generate?scale=1&chars=4`);
  const json = await res.json();
  token = json.data.token;
  // Aguarda a imagem carregar antes de liberar o lock
  await new Promise(resolve => {
    const img = document.getElementById('captcha-img');
    img.onload  = resolve;
    img.onerror = resolve;
    img.src = json.data.image_url + '?t=' + Date.now();
  });
  busy = false;
}

async function submit() {
  const answer = document.getElementById('answer').value.trim();
  const res  = await fetch(`${API}/captcha/validate`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ token, answer })
  });
  const json = await res.json();
  if (json.data?.valid) {
    alert('Captcha validado!');
  } else {
    alert('Resposta incorreta. Tente novamente.');
    load();
  }
}

load();
</script>
PHP — Validação no Backend
<?php
function validarCaptcha(string $token, string $resposta): bool {
    $ctx = stream_context_create([
        'http' => [
            'method'  => 'POST',
            'header'  => "Content-Type: application/json\r\n",
            'content' => json_encode(['token' => $token, 'answer' => $resposta]),
            'ignore_errors' => true,
        ]
    ]);
    $resp = file_get_contents(
        'https://seu-servidor.com/v1/captcha/validate',
        false, $ctx
    );
    $data = json_decode($resp, true);
    return $data['data']['valid'] ?? false;
}

// No handler do seu formulário:
if (!validarCaptcha($_POST['captcha_token'], $_POST['captcha_answer'])) {
    http_response_code(422);
    die(json_encode(['erro' => 'Captcha inválido.']));
}

// Prossiga com o processamento do formulário...
cURL
# Gerar captcha
curl "https://seu-servidor.com/v1/captcha/generate?scale=1&chars=4"

# Validar resposta
curl -X POST "https://seu-servidor.com/v1/captcha/validate" \
  -H "Content-Type: application/json" \
  -d '{"token":"abc123...","answer":"A3B7"}'

Fluxo Completo de Integração

Browser                    Seu Backend               DeskCaptcha API
  │                              │                           │
  │── página carrega ────────────▶                           │
  │                              │── GET /v1/captcha/generate ──▶
  │                              │◀── { token, image_url } ─────│
  │◀── exibe imagem captcha ─────│                           │
  │                              │                           │
  │── usuário digita e envia ────▶                           │
  │                              │── POST /v1/captcha/validate ─▶
  │                              │◀── { valid: true/false } ────│
  │                              │                           │
  │◀── sucesso ou erro ──────────│                           │

Carregar

Ao abrir a página, chame /generate e exiba a imagem retornada.

Coletar

O usuário digita os caracteres. Auto-uppercase evita erros por case.

Validar

Envie token + answer ao seu backend. Ele chama /validate.

Pronto para integrar?

O DeskCaptcha é open source e gratuito. Se ele foi útil para você, considere apoiar o projeto.