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
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
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.
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étodo | Endpoint | Descrição |
|---|---|---|
| GET | /v1/captcha/generate | Gera um novo captcha |
| GET | /v1/captcha/{filename} | Serve a imagem PNG do captcha |
| POST | /v1/captcha/validate | Valida a resposta do usuário |
| GET | /v1/status | Status da API, pool e rate limits |
| GET | /v1/health | Health check |
GET/v1/captcha/generate
Gera um novo captcha, salva no pool e retorna token + URL da imagem.
Parâmetros de query
| Parâmetro | Tipo | Padrão | Valores | Descriçã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
| Janela | Limite | HTTP |
|---|---|---|
| 1 minuto | 30 | 429 |
| 1 hora | 3.000 | 429 |
| 1 dia | 10.000 | 503 |
Limites por Usuário
| Endpoint | Janela | Limite |
|---|---|---|
| /generate | 1 segundo | 2 |
| /generate | 1 minuto | 10 |
| /generate | 1 hora | 60 |
| /generate | 1 dia | 120 |
| /validate | 1 segundo | 5 |
| /validate | 1 minuto | 20 |
| /validate | 1 hora | 120 |
| /validate | 1 dia | 240 |
| /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
| HTTP | Tipo | Descrição | O que fazer |
|---|---|---|---|
200 | — | Sucesso | — |
400 | bad_request | Requisição malformada | Verifique o corpo da requisição |
401 | unauthorized | API Key inválida ou ausente | Envie o header X-API-Key |
404 | not_found | Token ou imagem não encontrada | Gere um novo captcha |
409 | conflict | Token já utilizado | Gere um novo captcha |
410 | gone | Captcha expirado (10 min) | Gere um novo captcha |
422 | validation | Parâmetro inválido ou resposta incorreta | Verifique os parâmetros enviados |
429 | rate_limit | Limite de requisições atingido | Aguarde o Retry-After |
503 | service_unavailable | Limite diário global atingido | Aguarde a virada do dia |
500 | server_error | Erro interno do servidor | Tente 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.