Checkouts

Checkout Transparente

POST/v1/checkouts/pay
Base URL Produção:https://api.validapay.com.br
Base URL Sandbox:https://sandbox.validapay.com.br

Autenticação

noauthnoauthstring · header · obrigatório

Nenhuma autenticação via header — credenciais enviadas no body da requisição.

Este é o endpoint onde o pagamento é de fato processado. O cliente preenche os dados diretamente na sua página e você envia para cá.

Efetuar pagamento via checkout transparente

Use esta rota para concluir uma compra a partir de uma sessão de checkout já criada. Não precisa de login — qualquer pessoa com o ID da sessão pode pagar.

Quando o pagamento é aprovado, a sessão é marcada como paga e não pode ser usada novamente.

Autenticação: não é necessária.


Identificação da sessão (obrigatório — um dos dois)

CampoTipoDescrição
sessionIdtextoID da sessão criada pelo vendedor. Começa com cs_ (produção) ou SANDBOX_cs_ (sandbox)
checkoutIdtextoMesmo que sessionId — aceito como alternativa

Forma de pagamento

CampoObrig.TipoDescrição
paymentMethodtextoForma de pagamento: pix, creditcard ou boleto

Cartão de crédito — preencha card OU tokenId:

CampoObrig.TipoDescrição
card.number✅*textoNúmero do cartão (13 a 19 dígitos, só números)
card.cvv✅*textoCódigo de segurança (3 ou 4 dígitos)
card.name✅*textoNome exatamente como está no cartão
card.expiration✅*textoValidade no formato MM/YYYY (ex: 12/2027)
paymentMethodId✅*textoID de cartão tokenizado via /v1/payment-methods/tokenize — substitui card
tokenId✅*textoToken de cartão salvo em pagamento anterior — substitui card
cardInfo.brandtextoBandeira do cartão tokenizado (ex: VISA)
cardInfo.maskedNumbertextoNúmero mascarado do cartão tokenizado (ex: 411111******1111)
cardInfo.holderNametextoNome do titular do cartão tokenizado
cardInfo.expirationtextoValidade do cartão tokenizado (MM/YYYY)

*Para cartão, preencha card com os dados brutos, ou paymentMethodId com um cartão tokenizado, ou tokenId com um token salvo.


Dados do comprador

Se a sessão já foi criada com dados do cliente, eles são preenchidos automaticamente. Os campos enviados aqui sobrescrevem os da sessão.

CampoObrig.TipoDescrição
customer.nametextoNome completo do comprador
customer.emailtextoE-mail do comprador
customer.documentNumbertextoCPF (11 dígitos) ou CNPJ (14 dígitos), somente números
customer.phonetextoTelefone no formato internacional (ex: +5511999998888)
customer.ceptextoCEP com 8 dígitos — necessário para PIX com dados do pagador
customer.address.street✅ boletotextoRua ou logradouro
customer.address.number✅ boletotextoNúmero da residência
customer.address.complementtextoComplemento (apto, sala, etc.)
customer.address.neighborhood✅ boletotextoBairro
customer.address.city✅ boletotextoCidade
customer.address.state✅ boletotextoEstado com 2 letras (ex: SP)
customer.address.zipCode✅ boletotextoCEP com 8 dígitos
customer.address.countrytextoPaís (padrão BR)
customer.address.cityCodetextoCódigo IBGE da cidade — necessário para emissão de nota fiscal
customer.metadataobjetoInformações extras do cliente (chave-valor livre)

*Campos marcados como "✅ boleto" são obrigatórios apenas quando paymentMethod é boleto.


Produto ou valor

Se a sessão já tem produtos configurados, não é necessário enviar. Para alterar ou usar uma cobrança avulsa:

CampoObrig.TipoDescrição
items[].priceId✅*textoID do preço do produto (price_...)
items[].quantitynúmeroQuantidade (padrão: 1)
items[].isOrderBumpsim/nãoMarcar como produto adicional (order bump)
amount✅*númeroValor em reais para cobrança avulsa — use quando não há items
descriptiontextoDescrição da cobrança avulsa

*Envie items com produtos ou amount com valor avulso — um dos dois é obrigatório.


Parcelamento

CampoObrig.TipoDescrição
installmentsnúmeroQuantidade de parcelas (1 a 12, padrão 1). Limite por tipo de plano: anual→12, semestral→6, trimestral→3, avulso→12
passFeesToCustomersim/nãoRepassar as taxas da plataforma para o comprador (padrão: não)
freeInstallmentsnúmeroQuantidade de parcelas sem juros (0 a 12, padrão 1)

Recorrência

CampoObrig.TipoDescrição
billingDaynúmeroDia do mês em que as cobranças recorrentes serão geradas (1 a 31)
prorataStartDatetextoData de início para cálculo de pró-rata (YYYY-MM-DD)
recurrencyStartDatetextoData de início da recorrência (YYYY-MM-DD, hoje ou futura)

Boleto

CampoObrig.TipoDescrição
dueDatetextoData de vencimento do boleto (YYYY-MM-DD, deve ser maior que hoje)
boletoDueDaysnúmeroDias até o vencimento a partir de hoje (mínimo 1) — calculado automaticamente se dueDate for informado
expirationAfterDueDatenúmeroDias para o boleto ser cancelado após o vencimento (0 a 60)
boletoInstructions.finenúmeroMulta por atraso em porcentagem (0.1 a 100). A soma de fine + interest não pode passar de 60%
boletoInstructions.interestnúmeroJuros mensais por atraso em porcentagem (0.1 a 100)
boletoInstructions.discount.amountnúmeroValor do desconto para pagamento antecipado
boletoInstructions.discount.modalitytextoTipo do desconto: fixed (valor em reais) ou percent (porcentagem). Padrão: fixed
boletoInstructions.discount.limitDatetextoData limite para usar o desconto (YYYY-MM-DD, deve ser antes de dueDate)

PIX com dados do pagador

CampoObrig.TipoDescrição
expirationtextoData de expiração do QR Code PIX (YYYY-MM-DD, não pode ser passada)

Cupom e descontos

CampoObrig.TipoDescrição
couponCodetextoCódigo de cupom de desconto
discountslistaDescontos manuais — sobrescrevem os da sessão. Cada item deve ter type (PERCENTAGE ou FIXED) e amount ou value. Campos opcionais: paymentMethod, fromCycle, toCycle, durationMonths

Split de pagamento

CampoObrig.TipoDescrição
split[].typetextoTipo do repasse: percentage (porcentagem) ou fixed (valor fixo)
split[].accountNumbertextoNúmero da conta que vai receber o repasse
split[].amountnúmeroValor ou porcentagem do repasse

Outros

CampoObrig.TipoDescrição
metadataobjetoInformações extras (chave-valor livre) que ficam salvas na cobrança
nfConfigIdtextoID da configuração de nota fiscal. Quando informado, o endereço do comprador é obrigatório
dfp_idtextoID de device fingerprint — usado para análise antifraude

Erros comuns: 404 SESSION_NOT_FOUND (sessão não existe), 400 SESSION_INACTIVE (sessão já foi paga ou expirou), 400 INVALID_DATA (campo inválido), 402 (pagamento recusado pelo banco).

Body

application/json

Content-Type:application/json
{
  "sessionId": "cs_abc123",
  "paymentMethod": "creditcard",

  "customer": {
    "name": "João da Silva",
    "email": "joao@email.com",
    "documentNumber": "12345678901",
    "phone": "+5511999998888",
    "cep": "01310100",
    "address": {
      "street": "Av. Paulista",
      "number": "1000",
      "complement": "Apto 52",
      "neighborhood": "Bela Vista",
      "city": "São Paulo",
      "state": "SP",
      "zipCode": "01310100",
      "country": "BR",
      "cityCode": "3550308"
    },
    "metadata": { "origem": "site" }
  },

  
  "paymentMethodId": "pm_abc123",

  
  "card": {
    "number": "4111111111111111",
    "cvv": "123",
    "name": "JOAO DA SILVA",
    "expiration": "12/2027"
  },

  "items": [
    { "priceId": "price_abc123", "quantity": 1, "isOrderBump": false }
  ],

  "installments": 1,
  "passFeesToCustomer": false,
  "freeInstallments": 1,

  "billingDay": 10,
  "prorataStartDate": "2026-06-15",
  "recurrencyStartDate": "2026-07-01",

  "dueDate": "2026-07-30",
  "boletoDueDays": 7,
  "expirationAfterDueDate": 30,

  "boletoInstructions": {
    "fine": 2.0,
    "interest": 1.0,
    "discount": {
      "amount": 10.0,
      "modality": "fixed",
      "limitDate": "2026-07-28"
    }
  },

  "expiration": "2026-07-30",

  "couponCode": "PROMO10",

  "discounts": [
    {
      "type": "PERCENTAGE",
      "value": 10,
      "paymentMethod": "pix",
      "fromCycle": 1,
      "toCycle": 3,
      "durationMonths": 3
    }
  ],

  "split": [
    {
      "type": "percentage",
      "accountNumber": "123456",
      "amount": 10
    }
  ],

  "metadata": { "referencia": "pedido-001" },
  "nfConfigId": null,
  "dfp_id": null
}

Schema

FieldTypeRequiredDescription
sessionId
string-
-
paymentMethod
string-
-
customer
object-
-
paymentMethodId
string-
-
card
object-
-
items[1]
array-
-
installments
number-
-
passFeesToCustomer
boolean-
-
freeInstallments
number-
-
billingDay
number-
-
prorataStartDate
string-
-
recurrencyStartDate
string-
-
dueDate
string-
-
boletoDueDays
number-
-
expirationAfterDueDate
number-
-
boletoInstructions
object-
-
expiration
string-
-
couponCode
string-
-
discounts[1]
array-
-
split[1]
array-
-
metadata
object-
-
nfConfigId
object-
-
dfp_id
object-
-

Headers

NameTypeValueRequired
Content-Type-application/jsonOptional
const url = 'https://sandbox.validapay.com.br/v1/checkouts/pay';

const options = {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
  "sessionId": "cs_abc123",
  "paymentMethod": "creditcard",

  "customer": {
    "name": "João da Silva",
    "email": "joao@email.com",
    "documentNumber": "12345678901",
    "phone": "+5511999998888",
    "cep": "01310100",
    "address": {
      "street": "Av. Paulista",
      "number": "1000",
      "complement": "Apto 52",
      "neighborhood": "Bela Vista",
      "city": "São Paulo",
      "state": "SP",
      "zipCode": "01310100",
      "country": "BR",
      "cityCode": "3550308"
    },
    "metadata": { "origem": "site" }
  },

  
  "paymentMethodId": "pm_abc123",

  
  "card": {
    "number": "4111111111111111",
    "cvv": "123",
    "name": "JOAO DA SILVA",
    "expiration": "12/2027"
  },

  "items": [
    { "priceId": "price_abc123", "quantity": 1, "isOrderBump": false }
  ],

  "installments": 1,
  "passFeesToCustomer": false,
  "freeInstallments": 1,

  "billingDay": 10,
  "prorataStartDate": "2026-06-15",
  "recurrencyStartDate": "2026-07-01",

  "dueDate": "2026-07-30",
  "boletoDueDays": 7,
  "expirationAfterDueDate": 30,

  "boletoInstructions": {
    "fine": 2.0,
    "interest": 1.0,
    "discount": {
      "amount": 10.0,
      "modality": "fixed",
      "limitDate": "2026-07-28"
    }
  },

  "expiration": "2026-07-30",

  "couponCode": "PROMO10",

  "discounts": [
    {
      "type": "PERCENTAGE",
      "value": 10,
      "paymentMethod": "pix",
      "fromCycle": 1,
      "toCycle": 3,
      "durationMonths": 3
    }
  ],

  "split": [
    {
      "type": "percentage",
      "accountNumber": "123456",
      "amount": 10
    }
  ],

  "metadata": { "referencia": "pedido-001" },
  "nfConfigId": null,
  "dfp_id": null
})
};

fetch(url, options)
  .then(res => res.json())
  .then(json => console.log(json))
  .catch(err => console.error(err));

Response Examples

200200 assinatura cartão
{
  "success": true,
  "subscriptionId": "sub_xxx",
  "customerId": "cus_xxx",
  "chargeId": "cha_xxx"
}
200200 cobrança avulsa (cha_)
{
  "success": true,
  "chargeId": "cha_abc123",
  "status": "paid"
}
200200 assinatura PIX
{
  "success": true,
  "subscriptionId": "sub_xxx",
  "pix": {
    "emv": "...",
    "qrCode": "..."
  }
}
200200 assinatura boleto
{
  "success": true,
  "subscriptionId": "sub_xxx",
  "boleto": {
    "digitableLine": "...",
    "dueDate": "2024-02-15"
  }
}
402402
{
  "success": false,
  "status": "failed",
  "error": "Cartão recusado"
}
404404 SESSION_NOT_FOUND
{
  "code": "SESSION_NOT_FOUND"
}
404404 CHARGE_NOT_FOUND
{
  "error": {
    "message": "Cobrança não encontrada",
    "code": "CHARGE_NOT_FOUND"
  }
}
400400 CHARGE_NOT_PAYABLE
{
  "error": {
    "message": "Apenas cobranças pendentes podem ser processadas",
    "code": "CHARGE_NOT_PAYABLE"
  }
}
400400 MISSING_CARD_DATA
{
  "error": {
    "message": "tokenId, card ou paymentMethodId é obrigatório",
    "code": "MISSING_CARD_DATA"
  }
}