---
title: Primeiros passos
---
# Primeiros passos
Este guia ajuda você a integrar o CAPTCHA da CaptchaLa em 5 minutos.
::: tip Veja funcionar em 30 segundos
[demo-v1.captcha.la](https://demo-v1.captcha.la) — HTML + PHP puro, licença MIT, com view-source em todas as páginas.
- [popup.html](https://demo-v1.captcha.la/popup.html) — modo popup
- [float.html](https://demo-v1.captcha.la/float.html) — widget flutuante
- [bind.html](https://demo-v1.captcha.la/bind.html) — vinculado a botão
- [inline.html](https://demo-v1.captcha.la/inline.html) — incorporado inline
- [server-token.html](https://demo-v1.captcha.la/server-token.html) — token emitido pelo servidor (anti-replay)
:::
## 1. Criar conta
Crie uma conta gratuita no painel
[Cadastre-se agora →](https://dash.captcha.la/register)
## 2. Criar aplicação
Crie uma aplicação no painel para obter sua App Key
## 3. Instalar o SDK
Escolha o método de instalação que preferir
```html
```
```bash
# or via npm
npm install captchala
```
## 4. Inicializar o CAPTCHA
Inicialize o componente de CAPTCHA na sua página
```html
```
## 5. Validação no servidor
Valide o token no seu servidor
```bash
POST https://apiv1.captcha.la/v1/validate
X-App-Key: YOUR_APP_KEY
X-App-Secret: YOUR_APP_SECRET
Content-Type: application/json
{ "pass_token": "" }
```
```json
{
"code": 0,
"data": {
"valid": true,
"action": "login",
"challenge_id": "ch_xxx",
"uid": null,
"risk_score": 12
}
}
```
::: warning
Sempre verifique `data.valid === true` **e** que `data.action` coincide com o cenário esperado.
Os pass tokens são de uso único; o mesmo `pt_xxx` não pode ser validado duas vezes.
:::
## Modo Token emitido pelo servidor (recomendado para produção) {#server-token}
Para ações sensíveis (login, cadastro, pagamento) recomendamos o fluxo de Token emitido pelo servidor: seu backend solicita primeiro um server_token de curta duração, que o navegador então usa para inicializar o CAPTCHA. Isso impede abusos caso a app_key vaze.
### Quando usar
- Recomendado: cadastro, login, redefinição de senha, pagamento, resgate de pontos e qualquer endpoint que um atacante consiga automatizar.
- Opcional: formulários públicos casuais, caixas de pesquisa e interações de baixo valor em que a conveniência pesa mais.
### 1. O backend emite o server_token
Chame /v1/server/challenge/issue a partir do seu próprio servidor, usando os headers X-App-Key e X-App-Secret. Nunca exponha esses headers ao navegador.
```bash
# Server-side only — never call this from a browser
curl -X POST https://apiv1.captcha.la/v1/server/challenge/issue \
-H "X-App-Key: YOUR_APP_KEY" \
-H "X-App-Secret: YOUR_APP_SECRET" \
-d "action=login&ttl=300&max_uses=1&bind_ip=1.2.3.4"
# → { "code": 0, "data": { "server_token": "sct_...", "expires_in": 300 } }
```
### 2. O frontend renderiza a CaptchaLa com o server_token
Passe o token para o seu componente CaptchaLa. O SDK o encaminha à inicialização do desafio.
```js
// Browser fetches the token from YOUR backend, not from CaptchaLa directly
const { serverToken } = await fetch('/api/captcha/issue').then(r => r.json());
Captchala.init({
appKey: 'YOUR_APP_KEY',
serverToken, // single-use, short-lived
product: 'popup',
action: 'login',
})
.appendTo('#captcha-container')
.onSuccess(res => submitForm(res.token));
```
### Notas de segurança
- Nunca coloque a app_secret em código de frontend, aplicativos móveis ou repositórios públicos. Ela deve permanecer no servidor.
- Habilite "Exigir token de desafio emitido pelo servidor" no painel para rejeitar qualquer desafio tentado sem um server_token.
- Mantenha o ttl curto (300s por padrão, máx. 900s) e prefira max_uses=1 para reduzir o impacto de um vazamento de token.
## Próximos passos
- [SDK Web](/pt-BR/web-sdk)
- [Referência da API](/pt-BR/api-reference)