# Enviar evento pelo navegador

> Registra um evento de captura usando o token publicável. É o endpoint que o snippet chama, e você pode chamá-lo direto se preferir não carregar o script.

Página: https://doc.rapidchargeback.com/canais/capture/enviar-evento-navegador/

Registra um evento de captura usando o token publicável. É o endpoint que o [snippet](https://doc.rapidchargeback.com/canais/capture/instalar-o-snippet/) chama, e você pode chamá-lo direto se preferir não carregar o script.

## Endpoint

```
POST https://api.rapidchargeback.com/api/v1/capture/{token}/events
```

## Autenticação

Nenhuma. O token publicável na URL identifica o merchant.

```
Content-Type: application/json
```

O token não é segredo e pode ficar no HTML da sua loja. Ele só permite escrever, e o evento só vira evidência se corresponder a um pedido real seu.

## Parâmetros de URL

| Campo | Tipo | Descrição |
|---|---|---|
| `token` | string | Token publicável do merchant, gerado no painel |

## Corpo da requisição

| Campo | Tipo | Descrição | Obrigatório |
|---|---|---|---|
| `type` | string (enum) | `checkout`, `terms_acceptance`, `access_log` ou `usage_log` | Sim |
| `order_ref` | string | Identificador do pedido no seu sistema, até 100 caracteres | Sim |
| `event_id` | string | Identificador do evento, gerado por você, até 64 caracteres | Sim |
| `payload` | objeto | Dados do fato, com campos de lista fechada | Não |

A referência completa dos valores aceitos está em [Tipos e payload](https://doc.rapidchargeback.com/canais/capture/payload/).

Dois pontos específicos deste canal:

- `event_id` é obrigatório aqui. Gere um UUID por evento
- `captured_at` enviado no corpo é ignorado. A Rapid registra o horário de chegada. Para informar o horário do fato, use o [canal servidor](https://doc.rapidchargeback.com/canais/capture/enviar-evento-servidor/)

Os tipos `delivery_confirmation`, `scan` e `delivery_gps` não existem neste canal: são fatos da sua operação, não do navegador do comprador.

## Limite de chamadas

120 requisições por minuto, por IP de origem. É folgado para um checkout real e aperta quem estiver usando o token fora do seu site.

## Validações

| Regra | Resposta |
|---|---|
| Token desconhecido, inativo ou sem merchant | `404 NOT_FOUND` |
| `type` ausente, ou fora dos quatro aceitos neste canal | `422 VALIDATION_ERROR`: *invalid_type* |
| `order_ref` ausente, vazio ou acima de 100 caracteres | `422 VALIDATION_ERROR`: *invalid_order_ref* |
| `event_id` ausente, vazio ou acima de 64 caracteres | `422 VALIDATION_ERROR`: *invalid_event_id* |
| Campo de texto do `payload` acima de 512 caracteres | `422 VALIDATION_ERROR`: *payload_too_large* |
| Acima de 120 requisições por minuto | `429 Too Many Requests` |

Não existe erro para `order_ref` inexistente. O evento é aceito, fica na fila e é descartado se nenhuma transação corresponder dentro da janela de correlação. Ver [Janela de correlação](https://doc.rapidchargeback.com/canais/capture/payload/#janela-de-correlação).

## Exemplo de requisição

```bash
curl -X POST https://api.rapidchargeback.com/api/v1/capture/seu_token_publicavel/events \
  -H "Content-Type: application/json" \
  -d '{
    "type": "terms_acceptance",
    "order_ref": "TXN-2026-001",
    "event_id": "019b0000-1111-7000-8000-000000000001",
    "payload": { "url": "https://loja.exemplo.com/checkout" }
  }'
```

Evento de checkout com identificação do aparelho:

```bash
curl -X POST https://api.rapidchargeback.com/api/v1/capture/seu_token_publicavel/events \
  -H "Content-Type: application/json" \
  -d '{
    "type": "checkout",
    "order_ref": "TXN-2026-001",
    "event_id": "019b0000-1111-7000-8000-000000000002",
    "payload": {
      "device_id": "8kJ2mQvR1nZxYb0T",
      "device_fingerprint": "8kJ2mQvR1nZxYb0T",
      "fp": "pro",
      "fp_request_id": "1712059781234.Xk9Lp2"
    }
  }'
```

## Exemplos de resposta

### Sucesso (202)

```json
{ "accepted": true }
```

`202` quer dizer que o evento entrou na fila, não que já virou evidência. A correlação com a transação acontece depois.

### Erro: token desconhecido (404)

```json
{ "error": { "code": "NOT_FOUND" } }
```

### Erro: tipo não disponível neste canal (422)

```json
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "invalid_type"
  }
}
```

### Erro: `event_id` ausente (422)

```json
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "invalid_event_id"
  }
}
```

### Erro: campo de payload longo demais (422)

```json
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "payload_too_large"
  }
}
```

## Próximos passos

- [Instalar o snippet](https://doc.rapidchargeback.com/canais/capture/instalar-o-snippet/)
- [Enviar evento pelo servidor](https://doc.rapidchargeback.com/canais/capture/enviar-evento-servidor/)
- [Configuração do snippet](https://doc.rapidchargeback.com/canais/capture/config-do-snippet/)
