> ## Documentation Index
> Fetch the complete documentation index at: https://developer.pagou.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Template CLAUDE.md

> Copie este arquivo CLAUDE.md para dar ao Claude Code contexto completo para integrações Pagou.

Crie um arquivo `CLAUDE.md` na raiz do seu projeto. O Claude Code lê este arquivo automaticamente.

## Template

````markdown theme={null}
# Integração Pagou

Este projeto integra com a API Pagou.ai para pagamentos, assinaturas, transferências e webhooks.

## API

- Sandbox: https://api.sandbox.pagou.ai
- Produção: https://api.pagou.ai
- Docs rápidas: https://developer.pagou.ai/llms.txt
- Docs completas: https://developer.pagou.ai/llms-full.txt
- OpenAPI v2: https://developer.pagou.ai/api-reference/openapi-v2.json

## Autenticação

Escolha um método:
- `Authorization: Bearer <PAGOU_API_KEY>`
- Header `apiKey: <PAGOU_API_KEY>`
- Basic Auth (username=token, password=x)

Mantenha chaves secretas apenas no servidor. Use variáveis de ambiente. Nunca exponha uma chave secreta Pagou no navegador.

## Regras principais

- Valide endpoints, campos, status e formatos de webhook no OpenAPI antes de codar
- Não invente endpoints, campos, status ou fluxos não documentados
- Valores na API v2 são em centavos
- Sempre inclua `external_ref` e idempotência em escritas
- Use Payment Element / SDK v3 para cartões; envie ao back-end apenas tokens `pgct_`
- Implemente webhooks reais, deduplique pelo id do evento no topo e processe de forma assíncrona
- Use polling/GET apenas para reconciliação, suporte ou recuperação, nunca como fluxo principal

## Pagamentos

### Criar pagamento Pix
```
POST /v2/transactions
{
  "external_ref": "order_1001",
  "amount": 1500,
  "currency": "BRL",
  "method": "pix",
  "buyer": {
    "name": "Nome do Cliente",
    "email": "cliente@example.com",
    "document": { "type": "CPF", "number": "12345678901" }
  }
}
```

Resposta inclui `pix_qr_code` (base64) e `pix_code` (string).

### Criar pagamento com cartão
```
POST /v2/transactions
{
  "external_ref": "order_1001",
  "amount": 2490,
  "currency": "BRL",
  "method": "credit_card",
  "token": "<token_do_payment_element>",
  "installments": 1
}
```

Pagamentos com cartão requerem Payment Element no navegador para tokenizar dados do cartão.

### Status de transações
pending → paid | expired | canceled | refused | refunded | partially_refunded | chargedback

## Assinaturas

Crie cobrança recorrente com cartão pelo back-end depois que o navegador retornar um token do Payment Element:

```
POST /v2/subscriptions
{
  "customer_id": "cus_1001",
  "token": "pgct_...",
  "amount": 4990,
  "currency": "BRL",
  "interval": "month",
  "interval_count": 1,
  "external_ref": "sub_1001"
}
```

Use webhooks de assinatura para conceder, renovar, pausar ou remover acesso. Reconcilie estado incerto com `GET /v2/subscriptions/{id}`.

### Status de assinaturas
trialing → active | past_due | cancel_scheduled | canceled

## Transferências (Pix Out)

```
POST /v2/transfers
{
  "pix_key_type": "EMAIL",
  "pix_key_value": "destinatario@example.com",
  "amount": 1200,
  "description": "Descrição do pagamento",
  "external_ref": "payout_1001"
}
```

pix_key_type: CPF, CNPJ, EMAIL, PHONE, EVP

### Status de transferências
pending → in_analysis → processing → paid | error | cancelled

## Webhooks

### Estrutura de evento de pagamento
```json
{
  "id": "evt_pay_1001",
  "event": "transaction",
  "data": {
    "event_type": "transaction.paid",
    "id": "tr_1001",
    "status": "paid",
    "correlation_id": "order_1001"
  }
}
```

### Estrutura de evento de transferência
```json
{
  "id": "evt_payout_1001",
  "type": "payout.transferred",
  "data": {
    "object": {
      "id": "po_1001",
      "status": "paid"
    }
  }
}
```

### Estrutura de evento de assinatura
```json
{
  "id": "evt_sub_1001",
  "event": "subscription",
  "data": {
    "event_type": "subscription.created",
    "id": "sub_1001",
    "status": "active",
    "customer_email": "customer@example.com"
  }
}
```

### Eventos de pagamento
- transaction.created
- transaction.pending
- transaction.paid
- transaction.cancelled
- transaction.refunded
- transaction.chargedback
- transaction.three_ds_required

### Eventos de assinatura
- subscription.created
- subscription.started
- subscription.renewed
- subscription.updated
- subscription.canceled
- subscription.payment_failed
- subscription.past_due
- subscription.trial_will_end
- subscription.chargeback_received

### Eventos de transferência
- payout.created
- payout.in_analysis
- payout.processing
- payout.transferred
- payout.failed
- payout.canceled

## SDK TypeScript

```bash
bun add @pagouai/api-sdk
```

```ts
import { Client } from "@pagouai/api-sdk";

const client = new Client({
  apiKey: process.env.PAGOU_API_KEY!,
  environment: "sandbox",
});

// Pagamento Pix
const tx = await client.transactions.create({
  external_ref: "order_1001",
  amount: 1500,
  currency: "BRL",
  method: "pix",
});

// Transferência
const transfer = await client.transfers.create({
  pix_key_type: "EMAIL",
  pix_key_value: "destinatario@example.com",
  amount: 1200,
  external_ref: "payout_1001",
});
```

## Regras

- Sempre inclua `external_ref` para correlação e idempotência
- Use `requestId` para rastreamento quando a API retornar
- Deduplique webhooks pelo id do evento no topo, não pelo id da transação, assinatura ou transferência
- Roteie pagamentos por `event="transaction"` + `data.event_type`
- Roteie assinaturas por `event="subscription"` + `data.event_type`
- Roteie transferências pelo `type` no topo
- Reconcilie estados incertos com GET; não use polling como fluxo principal
- Cartões requerem Payment Element; nunca manipule dados brutos de cartão
- Confirme webhooks rapidamente com `{ "received": true }`

## Erros comuns a evitar

- Fazer retry de POST em falha (usar GET para reconciliar)
- Deduplicar webhooks por id do recurso (o mesmo recurso emite múltiplos eventos)
- Pular external_ref (impossibilita reconciliação)
- Manipular números de cartão brutos (usar tokens do Payment Element)
- Ignorar next_action em fluxos 3DS
- Atualizar pedido, acesso ou payout por sucesso no browser em vez de webhook confirmado ou estado reconciliado no servidor
````

## Uso

1. Copie o template acima para `CLAUDE.md` na raiz do projeto
2. Customize os exemplos de comprador/destinatário para seu caso de uso
3. Execute o Claude Code no diretório do projeto

O Claude Code lerá automaticamente este arquivo e usará como contexto para todas as suas tarefas de integração Pagou.

<Tip>
  Adicione detalhes específicos do projeto como URL do endpoint de webhook, variáveis de ambiente ou lógica de negócio customizada para tornar o contexto ainda mais útil.
</Tip>
