Cartão Cobrança no cartão

Como criar uma cobrança no cartão de crédito.

1. Tokenize o cartão

O Paygrid não recebe dados do cartão. O cartão é tokenizado pelo provedor em um ambiente PCI; você envia apenas o token resultante.

A tokenização acontece no checkout do provedor (ex. Pagar.me). O resultado é um payment_token (Pagar.me) que você usa na cobrança.

2. Autentique com 3DS (opcional)

O desafio 3DS 2.0 roda no seu cliente, com o SDK do gateway (no caso da Pagar.me/Stone, a biblioteca 3ds-nx-js v2) ou do seu autenticador externo. A PayGrid não faz o desafio e não vê dados do cartão: no MPI Pagar.me/Stone ela gera o token efêmero; nos dois casos ela recebe o resultado da autenticação, grava para auditoria e uso único e repassa ao gateway na criação da cobrança.

São três passos. Pule esta seção se a cobrança não usar 3DS: sem o bloco threeDS, o pedido sai sem autenticação, como sempre.

2.1 Gere o token efêmero (MPI Pagar.me/Stone)

Chame POST /v1/3ds/pagarme/token do seu backend com a API key do tenant. A PayGrid resolve a conta indicada em providerAccountLogicalId (o logicalId da sua conta Pagar.me em GET /v1/providers/accounts) e chama o serviço de 3DS da Pagar.me/Stone. A secret key da conta nunca sai do servidor da PayGrid; você recebe apenas o token efêmero.

curl -X POST https://api.paygrid.tech/v1/3ds/pagarme/token \
  -H "X-Api-Key: sk_sua_chave" \
  -H "Content-Type: application/json" \
  -d '{
    "providerAccountLogicalId": "merchant-primary",
    "amount": 59900,
    "currency": "BRL"
  }'
{
  "token": "tds_abc123...",
  "expiresAt": "2026-10-22T13:30:00Z",
  "environment": "production"
}

Esse token é de uso único e diferente do token do cartão (tok_...): ele autentica a transação 3DS, não o cartão. Entregue-o ao SDK no cliente para rodar o desafio.

2.2 Envie o resultado na cobrança

Terminado o desafio, o SDK devolve o resultado da autenticação. Envie-o no campo threeDS ao criar a cobrança — a PayGrid valida apenas a forma do objeto (campos obrigatórios de cada MPI), grava o resultado para auditoria e uso único e repassa ao gateway. Quem decide se o portador autenticou é o emissor, não a PayGrid.

"threeDS": {
  "mpi": "pagarme",
  "transactionId": "tds_abc123..."
}

Para um autenticador externo (MPI third_party), o desafio é do seu provedor e a PayGrid só recebe os artefatos:

"threeDS": {
  "mpi": "third_party",
  "eci": "05",
  "cavv": "AAAB...",
  "dsTransactionId": "7f3c...",
  "version": "2.2.0"
}
CampoObrigatórioDescrição
mpisimpagarme (3DS da Stone/Pagar.me) ou third_party (autenticador externo).
transactionIdmpi = pagarmeId da autenticação devolvido pelo SDK da Pagar.me/Stone (tds_server_trans_id).
ecimpi = third_partyIndicator de autenticação emitido pelo autenticador externo.
cavvmpi = third_partyCriptograma de autenticação do portador.
dsTransactionIdmpi = third_partyId da transação no servidor de diretório (DS).
versionmpi = third_partyVersão do protocolo 3DS (ex. 2.2.0).
O bloco threeDS só vale para cartão — em Pix a cobrança é recusada com erro de validação. A PayGrid grava o resultado da autenticação (MPI, ids, eci/cavv e versão) para auditoria e para garantir uso único: reenviar a mesma autenticação devolve 409 e exige um novo token e um novo desafio. Os dados do cartão continuam fora da PayGrid.

O 3DS não muda a resposta da criação da cobrança: o desfecho chega como approved ou declined pelo webhook ou pela consulta. Se o gateway devolver o pagamento como action_required, o evento payment.action_required sinaliza que o portador ainda precisa agir.

Consultar a autenticação depois

GET /v1/transactions/{id} e GET /v1/payments/{id} devolvem o bloco threeDS com o resultado da autenticação daquela cobrança. O cavv nunca volta.

"threeDS": {
  "mpi": "pagarme",
  "authenticationId": "tds_server_trans_id_do_sdk",
  "eci": "05",
  "version": "2.2.0",
  "authenticatedAt": "2026-10-26T15:04:05Z"
}

authenticationId é o transactionId para pagarme e o dsTransactionId para third_party. O eci depende da bandeira: em Visa, Elo e Amex, 05 = autenticada, 06 = tentativa e 07 = sem autenticação; em Mastercard, 02, 01 e 00, na mesma ordem. Sem 3DS, o bloco não aparece — e também não aparece nas cobranças criadas antes de 26/10/2026.

3. Crie a cobrança

curl -X POST https://api.paygrid.tech/v1/transactions \
  -H "X-Api-Key: sk_sua_chave" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: pedido-5001" \
  -d '{
    "workflowId": "22222222-2222-2222-2222-222222222222",
    "paymentMethod": "card",
    "amount": 59900,
    "currency": "BRL",
    "token": "tok_abc123...",
    "installments": 3,
    "reference": "pedido-5001",
    "customer": {
      "name": "João da Silva",
      "email": "joao@exemplo.com",
      "document": "12345678900",
      "phone": "+5511999999999",
      "address": {
        "line1": "Rua Exemplo, 100",
        "zipCode": "01001000",
        "city": "São Paulo",
        "state": "SP",
        "country": "BR"
      }
    }
  }'
CampoObrigatórioDescrição
paymentMethodnãocard ou pix. Ausente vale card.
amountsimValor em centavos.
referencesimSeu identificador do pedido (até 128 caracteres). Volta em todo webhook.
currencynãoBRL (padrão).
customerrecomendadoPagador. A Pagar.me exige endereço de cobrança (address) para cartão.
tokensim (card)Token PCI do cartão.
installmentsnãoParcelas (padrão 1).
cardBrandnãoBandeira informada por você (visa, mastercard, etc.), usada nas condições do fluxo. Opcional.
workflowIdsimO fluxo que processa a cobrança. Pegue o id no painel (menu Fluxos) ou em GET /v1/workflows.
threeDSnãoResultado da autenticação 3DS 2.0 feita no cliente (veja a seção 2). Só cartão; ausente = sem autenticação.

4. Resultado

A resposta (202) traz transactionId, trackingId e status: "accepted": a cobrança foi enfileirada. O desfecho do cartão sai em seguida — approved ou declined — sem esperar o pagador, diferente do Pix, que fica pending até ser pago.

5. Reconsulte / Webhook

Consulte GET /v1/transactions/{transactionId} ou configure webhooks para ser notificado.

6. Detalhe do pagamento

GET /v1/payments/{paymentId} traz o que o provedor informou sobre o cartão cobrado:

{
  "paymentId": "5183e61a-...",
  "status": "approved",
  "cardBrand": "visa",
  "cardLastFour": "1234",
  "providerDetails": {
    "feeAmount": 1797,
    "hasFee": true,
    "feeState": "disponivel"
  }
}
CampoDescrição
cardBrandBandeira que o provedor identificou, em minúsculas (visa, mastercard, elo, amex, hipercard...). É diferente do cardBrand que você envia na criação: aquele é só uma informação sua para o fluxo; este é o que o cartão realmente é.
cardLastFourQuatro últimos dígitos. BIN e titular nunca são expostos.
failureReasonNuma recusa, o motivo como o emissor ou o provedor informou, sem tradução: a mensagem do emissor em português (padrão ABECS) ou erros de validação do provedor, em inglês. É texto livre: mostre e registre, mas não decida fluxo por ele.
providerDetailsTaxa do provedor na cobrança — veja abaixo.

7. Taxa do provedor

O Paygrid busca a taxa automaticamente quando a cobrança é aprovada ou estornada. O provedor nem sempre a publica na hora, então feeState diz em que pé ela está:

feeStateSignificado
aguardandoAprovada ou estornada, e o provedor ainda não publicou a taxa. O Paygrid pergunta de novo periodicamente.
disponivelA taxa está em feeAmount, em centavos.
indisponivelPassaram 40 dias sem o provedor informar a taxa; o Paygrid parou de perguntar.
nao_se_aplicaA cobrança não foi paga (pendente, recusada, cancelada...).
feeAmount só vale quando hasFee é true. Fora disso vem 0, e esse zero não significa isenção. O mesmo vale para Pix.