Tokenização de cartão
Toda cobrança no cartão é feita com um cardToken, gerado no navegador do comprador pelo @validapay/tokenize. Ele vale 5 minutos e só funciona na conta que o gerou.
cardToken e deviceId. O número do cartão não passa pelo seu servidor nem deve ser guardado por você.Como funciona
Ao abrir a página, o SDK identifica o dispositivo do comprador e devolve o deviceId
O SDK troca o cartão digitado por um cardToken, que vale 5 minutos
Seu servidor chama POST /v1/charges com cardToken e deviceId
1. Instalar
npm install @validapay/tokenize2. Identificar o dispositivo
Chame uma vez, assim que a página de pagamento carregar (antes do cliente inserir os dados do cartão).
import { collectDevice } from '@validapay/tokenize/browser';
const { deviceId } = await collectDevice({ publicId: 'SEU_ID_PUBLICO' });Retorno
{
"deviceId": "60424e5b-01ee-46ec-9d97-b1507dc23ced"
}3. Gerar o cardToken
Para gerar uma cobrança é necessário antes tokenizar o cartão chamando o método tokenize() do SDK @validapay/tokenize. Este método recebe os inputs: publicId, card, customer. A chamada deve ser feita conforme exemplificado abaixo:
import { tokenize } from '@validapay/tokenize/browser';
const { cardToken } = await tokenize({
publicId: 'SEU_ID_PUBLICO',
card: {
number: '5230552482605921',
holderName: 'LUKE SKYWALKER',
cvv: '100',
expiration: '12/2030',
},
customer: {
name: 'Luke Skywalker',
document: '86564950039',
email: 'luke@teste.com',
},
});Retorno
{
"cardToken": "ctk_9f8s7d6f5g4h3j2k1l0",
"cardTokenExpiresAt": "2026-09-17T16:37:00.720Z",
"cardBrand": "MASTERCARD",
"cardLastFour": "5921"
}4. Cobrar pelo seu servidor
Com o cardToken e o deviceId em mãos, envie-os ao seu servidor e gere a cobrança em Checkout Transparente → Gerar cobrança Cartão.
Comprador estrangeiro
Informe customer.country com o país do comprador. Com país diferente de BR, o document é opcional e, se enviado, aceita passaporte com letras:
const { deviceId } = await collectDevice({ publicId: 'SEU_ID_PUBLICO', environment: 'sandbox' });
const { cardToken } = await tokenize({
publicId: 'SEU_ID_PUBLICO',
environment: 'sandbox',
card: { number: '4111111111111111', holderName: 'JOHN SMITH', cvv: '123', expiration: '12/2030' },
customer: { name: 'John Smith', email: 'john@example.com', country: 'US' },
});Na cobrança, envie o cliente sem documentNumber, com phone em E.164 e address.country do mesmo país. A conta precisa ter o pagamento internacional habilitado pelo suporte. Regras completas em Checkout Transparente → Gerar cobrança Cartão internacional.
POST /v1/charges
{
"paymentMethod": "creditcard",
"amount": 149.90,
"installments": 1,
"cardToken": "ctk_...",
"deviceId": "...",
"customer": {
"name": "John Smith",
"email": "john@example.com",
"phone": "+14155552671",
"address": {
"country": "US",
"zipCode": "94105",
"street": "Market St",
"number": "100",
"city": "San Francisco",
"state": "CA"
}
}
}Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
| publicId | string | Identificador público da conta, no painel em Gerenciamento > Minha Conta > Id Público |
| card.number | string | Número do cartão, de 13 a 19 dígitos |
| card.holderName | string | Nome impresso no cartão |
| card.cvv | string | Código de segurança (3 ou 4 dígitos) |
| card.expiration | string | Validade no formato MM/YYYY |
| customer.name | string | Nome completo do comprador |
| customer.document | string | CPF (11) ou CNPJ (14). Opcional para comprador estrangeiro, que pode enviar o passaporte |
| customer.country | string | País do comprador (ISO 3166-1 alfa-2, ex.: US). Sem o campo, vale customer.address.country; sem os dois, BR |
| customer.email | string | E-mail do comprador |
| environment | string | sandbox para testes; sem o campo, vale produção |
Testando em sandbox
A conta de sandbox tem o seu próprio publicId, no painel em Gerenciamento > Minha Conta > Id Público. Passe environment: 'sandbox' nos comandos do SDK para apontar para o ambiente de testes:
const { deviceId } = await collectDevice({ publicId: 'SEU_ID_PUBLICO', environment: 'sandbox' });
const { cardToken } = await tokenize({ publicId: 'SEU_ID_PUBLICO', environment: 'sandbox', card, customer });Em sandbox nada é cobrado de verdade: o número digitado na tokenização decide o resultado da cobrança.
| Número | Resultado |
|---|---|
| 4111111111111111 | aprovado |
| 4000000000000002 | recusado (card_declined) |
| 4000000000000004 | saldo insuficiente (insufficient_funds) |
| 4000000000000006 | cartão expirado (expired_card) |
| 4000000000000008 | CVV inválido (invalid_cvv) |
| 4000000000000010 | suspeita de fraude (fraud_suspected) |
Qualquer outro número de 13 a 19 dígitos é aprovado. CVV, validade e nome do titular podem ser quaisquer valores válidos. O cardToken, o deviceId e os erros se comportam como em produção.
Erros
| Onde | Código | O que aconteceu |
|---|---|---|
| Cobrança | 400 MISSING_CARD_DATA | Faltou o cardToken |
| Cobrança | 400 CARD_TOKEN_EXPIRED | Passou dos 5 minutos: gere outro na página |
| Cobrança | 404 CARD_TOKEN_NOT_FOUND | Token inexistente ou de outra conta |
| Cobrança | 402 | Cartão recusado pelo banco |
Integrações antigas
Quem já tokenizava pelo servidor, com client_id e client_secret, continua funcionando: a resposta agora traz também o cardToken. Para integrações novas, use o fluxo acima.