# Tokenização de cartão

Tokenizar converte os dados do cartão em um `paymentMethodId` (`pm_...`) que pode ser usado nas cobranças. Com isso, **PAN e CVV nunca trafegam pelo seu backend nem são armazenados por você**.

## SDK

```bash
npm install @validapay/tokenize
```

```javascript
import { tokenize } from '@validapay/tokenize';

const result = await tokenize({
  clientId: process.env.VALIDAPAY_CLIENT_ID,
  clientSecret: process.env.VALIDAPAY_CLIENT_SECRET,
  card: {
    number: '5230552482605921',
    cardHolderName: 'LUKE SKYWALKER',
    cvv: '100',
    expiration: '12/2030',
  },
  customer: {
    name: 'Luke Skywalker',
    document: '86564950039',
    email: 'luke@teste.com',
  },
});

console.log(result.paymentMethodId); // pm_abc123
```

## Resposta

```json
{
  "paymentMethodId": "pm_1781878250527_57pqifbga",
  "customerId": "cus_1781730599969_0xkofruxu",
  "accountNumber": "4218590",
  "type": "CREDIT_CARD",
  "status": "ACTIVE",
  "isDefault": false,
  "cardBrand": "MASTERCARD",
  "cardLastFour": "5921",
  "cardExpirationMonth": "12"
}
```

## Usando o token na cobrança

Em `POST /v1/charges`, omita o objeto `card` e envie o `paymentMethodId`:

```json
{
  "paymentMethod": "creditcard",
  "paymentMethodId": "pm_1781878250527_57pqifbga",
  "installments": 1,
  "customer": {
    "name": "Luke Skywalker",
    "email": "luke@teste.com",
    "documentNumber": "86564950039"
  },
  "items": [{ "priceId": "price_abc123", "quantity": 1 }]
}
```

## Regras

- O SDK roda no front-end do seu checkout; o cartão vai direto do navegador para a ValidaPay.
- Nunca persista número do cartão ou CVV no seu banco de dados.
- `expiration` no formato `MM/YYYY`.
- `document` apenas dígitos: CPF (11) ou CNPJ (14).
- Uma recusa de cartão em `POST /v1/charges` retorna **402**; nas rotas de assinatura, retorna **400** com `PAYMENT_DECLINED` ou `PAYMENT_FAILED`.
