Minstrel
Navegar na documentação

Pagamentos

Transações

Liste e filtre pagamentos, acompanhe os indicadores do período, entenda o caminho de cada transação, confirme um pagamento que espera o cartão e capture, cancele ou estorne.

Guia de integração · 31 min de leitura

Nesta página

Depois de criado, um pagamento precisa ser encontrado, explicado e, as vezes, desfeito. Esta pagina cobre as consultas e as operacoes que movem dinheiro de volta. Leitura exige o escopo payments:read; confirmacao, captura, cancelamento e estorno, payments:write.

Toda consulta vale para o ambiente da chave: sandbox e producao nunca se misturam, nem num indicador.

Novas cobranças estão sujeitas à proteção de transações. O guia explica 429, Retry-After, fingerprints e relatórios de padrões suspeitos.

Meios de pagamento

methodType diz como o pagamento foi feito:

methodTypeComo funciona
cardCartao de credito, pelo token do cofre ou pelo checkout transparente. Aprovado ou recusado na hora.
debit_cardCartao de debito, so pelo checkout transparente: captura automatica e autenticacao 3DS obrigatoria.
pixCobranca Pix: nasce requires_action com o QR Code em nextAction; o banco confirma depois.
boletoBoleto registrado: nasce requires_action com a linha digitavel; o banco confirma depois.
walletCarteira digital, vinda de link de pagamento.
bank_transferTransferencia, vinda de link de pagamento.

Pix e boleto tem pagina propria: Pix e boleto cobre a criacao, a confirmacao pelo banco, o vencimento e a simulacao no sandbox.

Status de um pagamento

StatusSignificado
requires_payment_methodPagamento de cartao criado pelo servidor sem o cartao: espera o portador digita-lo no checkout do lojista, ate actionExpiresAt (24 horas). Confirmado, segue como pending ou processing; abandonado, vira canceled (o Minstrel cancela sozinho, sem esperar alguem consultar). Tambem e para onde volta um pagamento do checkout transparente cujo cartao foi recusado por motivo reversivel: o portador tenta outro cartao no mesmo pagamento, com decline preenchido. Veja Checkout transparente.
pendingCriado, ainda nao processado.
processingEm processamento no fluxo de roteamento.
requires_actionAguardando o portador (autenticacao 3DS no navegador, com nextAction.type = "three_ds"), o pagamento de um Pix ou boleto, ou uma pausa do fluxo (revisao manual, espera).
authorizedAprovado e reservado no cartao, sem captura. Com fraudReview.status = "pending", a venda esta segura na revisao de fraude do adquirente, mesmo com captura automatica.
capturedCapturado: a venda esta confirmada.
partially_capturedCapturado em parte.
failedRecusado ou com falha, e encerrado. O motivo esta em decline; um erro no meio do processamento (no do fluxo, conector ausente) tambem fecha aqui, com error no evento payment.failed. No checkout transparente so chega aqui a recusa irreversivel, o fim das tentativas de cartao ou o prazo vencido.
canceledCancelado antes da autorizacao: pagamento que esperava o cartao e foi cancelado ou venceu, ou Pix e boleto vencidos ou cancelados sem pagamento.
voidedAutorizacao cancelada antes da captura.
partially_refundedEstornado em parte.
refundedEstornado integralmente.
disputedEm contestacao.
charged_backChargeback efetivado.

requires_payment_method e o unico status que nasce antes de qualquer tentativa: ainda nao ha cartao, entao nenhum adquirente foi acionado e attempts vem vazio (volta preenchido se o pagamento reabriu depois de uma recusa reversivel). A resposta da criacao traz clientSecret (<paymentId>_secret_...) e actionExpiresAt. O clientSecret e entregue a pagina do portador e nunca aparece no painel. Veja Confirmar um pagamento sem cartao.

Listar e filtrar

cURL / Bash
curl "http://localhost:3333/v1/payments?status=failed&declineReason=INSUFFICIENT_FUNDS&createdAfter=2026-10-01T03:00:00Z&limit=50" \
  -H "Authorization: Bearer $MINSTREL_API_KEY"
ParametroExemploEfeito
statuscaptured,authorizedUm ou mais status, separados por virgula.
customerIdcus_01HQ...Pagamentos de um cliente.
externalIdpedido-1234O seu identificador do pedido, exato.
declineReasonINSUFFICIENT_FUNDSMotivo canonico da ultima recusa.
connectorAccountIdca_01HQ...Pagamentos com ao menos uma tentativa na conta, inclusive os que cairam para outra.
connectorcieloTodas as contas de um conector, pelo slug.
brandvisa,mastercardBandeira do cartao.
methodTypepix,boletoMeio de pagamento: card, debit_card, pix, boleto, wallet, bank_transfer.
initiatormerchantcustomer (CIT, cliente presente) ou merchant (MIT).
amountMin, amountMax10000Faixa de valor, em centavos.
hasFallbacktrueSo pagamentos com mais de uma tentativa (fallback ou retentativa).
createdAfter, createdBeforeISO 8601Periodo de criacao, com os extremos incluidos.
search4242Busca livre, descrita abaixo.
limit50De 1 a 100. Padrao 25.
startingAfterpay_01HQ...Cursor: id do ultimo item da pagina anterior.

Valor fora do vocabulario em status ou methodType e recusado com 422 e a lista do que e aceito: um filtro digitado errado que devolvesse lista vazia pareceria "nao ha nada", e voce procuraria o problema no lugar errado.

search aceita o que o suporte costuma receber do cliente:

  • id do pagamento (exato ou o comeco, a partir de pay_);
  • externalId, descricao, nome ou e-mail do cliente (trecho, sem diferenciar maiusculas);
  • os 4 ultimos digitos do cartao;
  • CPF ou CNPJ do cliente, com ou sem pontuacao (a partir de 6 digitos);
  • NSU, TID, codigo de autorizacao, id da transacao no adquirente (o txid do Pix, o id do boleto no banco) ou id da tentativa (4 caracteres ou mais, sem espaco).

A lista vem do mais recente para o mais antigo. totalCount vem so na primeira pagina (sem startingAfter): a contagem com filtros e a parte cara da consulta.

Resposta (resumida):

json
{
  "object": "list",
  "data": [
    {
      "object": "payment",
      "id": "pay_01HQ...",
      "status": "captured",
      "amount": 14990,
      "capturedAmount": 14990,
      "refundedAmount": 0,
      "customer": {
        "id": "cus_01HQ...",
        "name": "Maria Oliveira",
        "email": "maria.oliveira@exemplo.com.br"
      },
      "attemptSummary": {
        "count": 1,
        "fallback": false,
        "connectorAccount": {
          "accountId": "ca_01HQ...",
          "name": "Cielo principal",
          "slug": "cielo",
          "connectorName": "Cielo",
          "removed": false
        },
        "path": [
          {
            "attemptNumber": 1,
            "connector": "Cielo principal",
            "slug": "cielo",
            "outcome": "approved",
            "trigger": "initial"
          }
        ],
        "lastDecline": null,
        "latencyMs": 812
      }
    }
  ],
  "hasMore": true,
  "nextCursor": "pay_01HQ...",
  "totalCount": 1284
}

Cada item traz os campos do pagamento (os mesmos do data.object dos webhooks), o cliente e o resumo das tentativas em attemptSummary: quem decidiu, o caminho percorrido e a ultima recusa. lastDecline aparece mesmo quando o pagamento terminou aprovado - e ela que mostra o que o fallback recuperou (Pix e boleto, ou cartao com token de bandeira proprio: o cartao comum nao troca de adquirente). technical: true indica falha tecnica do conector, sem codigo do emissor.

Indicadores do periodo

cURL / Bash
curl "http://localhost:3333/v1/payments/summary?from=2026-10-01T03:00:00Z" \
  -H "Authorization: Bearer $MINSTREL_API_KEY"

Sem from, valem os ultimos 30 dias; sem to, ate agora. O periodo pode ter no maximo 400 dias. A resposta compara com o periodo anterior de mesma duracao, deslocado em dias inteiros: "hoje ate agora" compara com "ontem ate a mesma hora", e nao com as ultimas horas de ontem.

Resposta (resumida):

json
{
  "object": "payment_summary",
  "period": {
    "from": "2026-10-01T03:00:00.000Z",
    "to": "2026-10-15T15:00:00.000Z",
    "timezone": "America/Sao_Paulo",
    "granularity": "day"
  },
  "current": {
    "count": 1840,
    "approved": 1602,
    "declined": 221,
    "inProgress": 17,
    "approvalRate": 8788,
    "capturedVolume": 23918450,
    "capturedCount": 1577,
    "averageTicket": 15167,
    "refunds": { "count": 12, "amount": 180400 },
    "recovered": {
      "count": 96,
      "amount": 1402300,
      "fallback": { "count": 81, "amount": 1190500 },
      "retry": { "count": 15, "amount": 211800 }
    }
  },
  "previous": { "count": 1712, "approved": 1466, "declined": 230, "approvalRate": 8644 }
}

Como ler cada numero:

  • Aprovado e todo pagamento que o emissor aprovou em algum momento: authorized, captured, partially_captured, partially_refunded, refunded, disputed, charged_back e voided. A taxa mede a decisao do emissor, nao o que aconteceu com a venda depois.
  • approvalRate vem em basis points (8788 = 87,88%): aprovados sobre aprovados mais recusados. Pagamentos em andamento ficam fora da conta, e sem nenhuma decisao no periodo a taxa e null.
  • capturedVolume soma o valor capturado, em centavos; averageTicket e a media por pagamento capturado.
  • recovered e a venda salva por uma nova tentativa, em duas origens que nunca se somam duas vezes: fallback (aprovado numa tentativa depois da primeira, no mesmo pagamento) e retry (aprovado de primeira, numa fatura cuja cobranca anterior tinha sido recusada).
  • refunds conta os estornos concluidos pela data do estorno, nao da venda.

A resposta traz ainda series (por hora ate 2 dias de periodo, por dia acima disso, no fuso da organizacao e com os intervalos vazios zerados), connectors (desempenho por conta de conector, contado por tentativa: aprovou, recusou, falha tecnica, recuperou e latencia media) e facets.connectorAccounts, as contas que servem de filtro na listagem.

Detalhe de um pagamento

GET /v1/payments/:id traz tudo o que explica o caminho da transacao:

CampoO que traz
nextActionO que falta para o pagamento andar: QR Code e copia e cola do Pix, linha digitavel e codigo de barras do boleto, ou a autenticacao 3DS (type: "three_ds"). null fora de requires_action.
threeDsAutenticacao 3DS ou Data Only: status, eci e version. null quando o pagamento nao passou por ela. Veja Autenticacao 3DS.
methodDetailsPix e boleto: a cobranca emitida, com o historico (txid, endToEndId do Pix pago, vencimento, linha digitavel). Continua depois de pago ou vencido.
attemptsCada tentativa: conta de conector, desfecho (outcome), motivo (trigger), codigo bruto do emissor, Merchant Advice Code, classificacao ABECS, NSU, TID, codigo de autorizacao e latencia.
routingResumo do roteamento: tentativas, se houve fallback, se ele salvou a venda (recovered), quem decidiu (decidedBy) e por que parou (stopReason).
flowRunsExecucoes do fluxo, com a versao e cada passo (steps): porta de saida, explicacao da decisao e configuracao relevante do no.
antifraudAnalises antifraude: score, recomendacao e regras acionadas. origin diz de onde vem: flow_node (no Antifraude do fluxo) ou acquirer (analise embutida na autorizacao, com providerStatus). Veja Analise de fraude da adquirente.
fraudReviewRevisao de fraude do adquirente: { status } com pending, accepted, rejected ou merchant_decided. null quando nao houve revisao.
fraudReviewCheckedAtQuando o Minstrel perguntou ao adquirente pela ultima vez como a revisao estava.
fraudAnalysisO que voce enviou para a analise (fingerprintSessionId, shipping, isGift, returnsAccepted, merchantDefinedFields), sem o endereco do script do navegador. Ajuda a explicar uma analise skipped.
orderItemsOs items do pedido enviados na criacao, ou null.
operationsCapturas, cancelamentos e estornos enviados ao conector, com status HTTP e erro. No Pix e no boleto, tambem as consultas ao banco que importaram, com a origem e o resultado em check.
refundsEstornos, inclusive os recusados (status: failed, com failureReason).
splitsParcelas do split: valor configurado e calculado, comissao gravada, liquido e tarifa que o adquirente informou, e quanto de cada parcela foi capturado e devolvido. Veja Split no pagamento.
disputesContestacoes.
eventsLinha do tempo de eventos do pagamento, com a situacao das entregas de webhook de cada um.
actionsO que da para fazer agora: capturar, cancelar ou estornar.

O cartao vem so com dados de exibicao (bandeira, BIN, ultimos 4 digitos, validade, tipo e emissor) - nunca token, nunca numero.

Tentativas

outcomeSignificado
approvedO emissor aprovou.
requires_actionAprovacao pendente de acao do portador; no Pix e no boleto, cobranca emitida aguardando o pagamento.
declinedO emissor recusou. Ha codigo de resposta e classificacao.
technical_failureO conector falhou (timeout, erro do parceiro). Sem codigo; o erro vem em error.
pendingAinda sem resposta.
expiredPix ou boleto que venceu sem pagamento. Nao e recusa.
canceledPix ou boleto cancelado antes do pagamento.

trigger diz por que a tentativa aconteceu: initial, fallback_reversible (recusa reversivel na anterior) ou fallback_connector_failure (falha tecnica na anterior). No checkout transparente, cada cartao que o portador tenta no mesmo pagamento gera as suas tentativas, em sequencia (attemptNumber continua de onde parou) e todas ficam no detalhe, com o motivo da recusa de cada uma. connector continua sendo o slug; a conta completa vem em connectorAccount, com removed: true quando ela foi removida depois.

Autenticacao 3DS

Quando o fluxo tem o no Autenticacao 3DS e o pagamento e confirmado no navegador pelo SDK, a transacao passa por duas etapas visiveis na API:

  1. A pausa. No no, o pagamento fica requires_action e nextAction traz type: "three_ds", com o provedor (cielo_mpi ou, no sandbox, minstrel_sandbox), o ambiente, o modo (challenge, frictionless ou data_only) e o prazo (expiresAt). Quem o consome e o SDK; o seu servidor nao precisa fazer nada.
  2. O resultado. O SDK roda o script de 3DS da Cielo na pagina do portador e envia o resultado a POST /v1/public/payments/:id/three-ds (rota publica, com o header Minstrel-Client-Secret, como as demais rotas do checkout transparente). O fluxo continua do no e a autorizacao segue com a autenticacao.

Depois disso, threeDs no detalhe do pagamento registra o que aconteceu. O CAVV e o XID nunca sao gravados.

json
{
  "id": "pay_01M5...",
  "methodType": "debit_card",
  "threeDs": { "status": "authenticated", "eci": "05", "version": "2.2.0" }
}
threeDs.statusSignificado
pendingO portador ainda nao concluiu: o navegador esta rodando o 3DS.
authenticatedO emissor autenticou o portador.
data_onlyOs dados foram enviados ao emissor sem autenticar o portador (Visa e Mastercard).
not_authenticatedO emissor negou a autenticacao ou o portador nao concluiu o desafio.
unavailableO 3DS nao pode rodar nesta transacao (portador fora da pagina, bandeira sem suporte, recurso desligado).

eci e o indicador que a bandeira devolveu; ele diz quem responde pela fraude. Mastercard 01 ou 02, e Visa, Elo e Amex 05 ou 06, transferem a responsabilidade ao emissor. O Data Only (Mastercard 04, Visa 07) nao transfere. version e a versao do protocolo 3DS (2.2.0 na Visa e Mastercard, 2.1.0 na Elo e Amex). threeDs e null quando o pagamento nao passou pelo no de 3DS: fluxo sem o no, Pix e boleto.

No painel, o detalhe da transacao mostra o cartao Autenticacao 3DS com a situacao (Pendente, Autenticado, Data Only, Nao autenticado ou Indisponivel), o ECI com o que ele significa para a responsabilidade, e a versao.

Por que o roteamento parou

E a pergunta que todo operador faz diante de uma recusa: "por que nao tentou outro adquirente?". A resposta esta em routing.stopReason:

ValorSignificado
approvedA ultima tentativa aprovou.
requires_actionAprovacao pendente de acao do portador.
in_progressA ultima tentativa ainda nao terminou.
charge_expiredO Pix ou o boleto venceu sem pagamento.
charge_canceledO Pix ou o boleto foi cancelado antes do pagamento.
irreversible_declineRecusa irreversivel: o fallback para sempre, independentemente da configuracao.
fallback_disabledO no de rota estava com o fallback desligado para esse tipo de falha.
max_attemptsO limite de tentativas do no foi atingido com candidatos sobrando.
candidates_exhaustedTodos os candidatos foram tentados.
card_single_acquirerCartao: o token so vale na adquirente que o gerou; a nova tentativa e da retentativa (ABECS).
single_connectorRoteamento direto, sem fluxo publicado: so havia uma conta.
unknownNao foi possivel associar a ultima tentativa a um no de rota.

Acoes possiveis

actions.capture, actions.void, actions.refund e actions.simulate trazem available e, quando a acao nao esta disponivel, o motivo em reason. Captura e estorno disponiveis trazem tambem maxAmount. No Pix e no boleto, void cancela a cobranca aguardando pagamento e simulate e a simulacao do banco, so no sandbox. Em requires_payment_method, void cancela o pagamento que ainda nao recebeu o cartao; capturar e estornar nao se aplicam.

reasonSignificado
not_authorizedO pagamento nao esta authorized (captura e cancelamento).
no_authorizationNao ha tentativa aprovada com id da transacao no adquirente.
authorization_expiredA autorizacao expirou (authorizationExpiresAt).
connector_unsupportedO conector que aprovou nao faz a operacao.
not_capturedNada foi capturado: nao ha o que estornar.
fully_refundedJa estornado integralmente.
disputedPagamento em contestacao ou com chargeback.
method_unsupportedO meio nao tem a operacao (boleto nao tem estorno).
not_pendingPix ou boleto que nao esta mais aguardando pagamento.
already_canceledPix ou boleto ja cancelado.
live_environmentSimulacao do banco: so existe no sandbox.
not_issuedSimulacao: a cobranca ainda nao foi emitida (fluxo pausado).

Desenhe os botoes da sua interface a partir daqui: so o servidor sabe o que o conector que aprovou consegue fazer.

Linha do tempo

events lista os eventos do pagamento em ordem (ate 200), com status, previousStatus e o resumo das entregas de webhook de cada um (total, succeeded, failed, pending). Quando o evento tem explicacao, ela vem junto: error (code, message e a conta envolvida, por exemplo no payment.checkout_not_configured), decline (motivo e reversibilidade da recusa) e checkout (tentativas de cartao usadas e, se o pagamento acabou, endedBy). Para o payload completo, use GET /v1/events/:id - veja Webhooks.

Split no pagamento

Um pagamento criado com splits (ou que passa por um no Split do fluxo) traz uma parcela por recebedor em splits. A divisao e executada no adquirente, e a parcela acompanha o que ele faz:

Campo da parcelaO que traz
amount, type, configuredValueA parcela bruta calculada sobre o valor autorizado, e a regra que a gerou.
commissionRateBps, commissionFixedAmountComissao do marketplace gravada na hora do pagamento. null: vale o acordo do recebedor no adquirente.
netAmount, feeAmountO que o recebedor recebe e o que o adquirente descontou (feeAmount = amount - netAmount), como ele informou. null e 0 ate la.
capturedAmountQuanto da parcela foi capturado. null antes da captura.
refundedAmountQuanto da parcela ja foi devolvido em cancelamentos e estornos.
  • So ha autorizacao numa conta que executa o split, com todos os recebedores registrados nela. Se nenhuma candidata serve, o pagamento nao e autorizado e a resposta e split_not_supported, explicando o que falta. Veja Quando o pagamento nao e autorizado e o catalogo de erros.
  • Captura e estorno dividem o valor entre as parcelas: veja Capturar e Estornar.
  • Os eventos payment.captured, payment.voided, payment.refunded e payment.partially_refunded levam as parcelas no data.object.

Confirmar um pagamento sem cartao

Um pagamento de cartao criado sem card e sem paymentMethodId nasce em requires_payment_method e so avanca quando recebe o token de uso unico do adquirente, gerado no navegador do portador. A confirmacao tem dois caminhos:

Quem confirmaRotaCredencial
A pagina do portador, pelo @minstrel/jsPOST /v1/public/payments/:id/confirmHeader Minstrel-Client-Secret
O seu servidorPOST /v1/payments/:id/confirmChave de API (payments:write)
cURL / Bash
curl -X POST https://api.minstrel.com.br/v1/payments/pay_01HQ.../confirm   -H "Authorization: Bearer $MINSTREL_API_KEY"   -H "Idempotency-Key: confirma-pedido-1234"   -H "Content-Type: application/json"   -d '{ "card": { "token": "3f9a...", "brand": "visa", "last4": "1111" }, "saveCard": false }'
  • card.token e o token de uso unico do adquirente; brand, bin e last4 sao opcionais. Nunca envie o numero do cartao: a API o recusa com 422 raw_card_data_rejected.
  • saveCard: true exige customerId no pagamento e e o consentimento do portador para guardar o cartao e cobra-lo depois. Sem ele, o token e de uso unico e o cartao nunca mais pode ser cobrado.
  • Aprovada a autorizacao, o pagamento segue o caminho de qualquer cartao (authorized ou captured, conforme captureMethod). Recusada por motivo reversivel, o pagamento volta para requires_payment_method (evento payment.attempt_declined) e aceita outro cartao no mesmo pagamento: gere outro token e confirme de novo, com outra Idempotency-Key. Recusa irreversivel, o fim das tentativas (padrao: 3 cartoes) ou o prazo vencido terminam failed (payment.failed); ai, crie outro pagamento. Veja Recusa e nova tentativa.
  • Um pagamento que nao esta mais em requires_payment_method (ja confirmado, encerrado, cancelado ou vencido) nao pode ser confirmado de novo.
  • A confirmacao pelo servidor nao autentica o portador. Nao ha ninguem na pagina para o desafio, entao o no de 3DS nao roda nela. Por isso o cartao de debito, que exige 3DS, so existe pelo SDK.

O passo a passo completo, com a pagina do portador, esta em Checkout transparente.

Capturar

Para pagamentos criados com captureMethod: "manual", que ficam authorized:

cURL / Bash
curl -X POST http://localhost:3333/v1/payments/pay_01HQ.../capture \
  -H "Authorization: Bearer $MINSTREL_API_KEY" \
  -H "Idempotency-Key: captura-pedido-1234" \
  -H "Content-Type: application/json" \
  -d '{ "amount": 12000 }'
  • Sem amount, captura o total autorizado.
  • Valor menor que o autorizado e captura parcial: o pagamento fica partially_captured e o restante nao pode ser capturado depois.
  • As duas emitem payment.captured; confira status e capturedAmount.
  • Num pagamento com split, a captura divide o valor entre os recebedores: a total leva as parcelas gravadas na autorizacao, e a parcial divide o valor capturado na mesma proporcao do autorizado (a parte da conta principal entra como mais um peso, e a soma fecha ao centavo). Cada parcela guarda o que foi capturado em capturedAmount, e o adquirente informa de novo o liquido. Se um recebedor foi movido para outra conta depois da autorizacao, a captura nao e enviada e responde split_not_supported.
  • Com o pagamento em revisao de fraude (fraudReview.status = "pending") a captura vale, mas passa a frente do provedor: a revisao fecha como merchant_decided.
HTTPcodeQuando
409payment_not_capturableO pagamento nao esta authorized, a autorizacao expirou ou nao ha autorizacao aprovada.
422validation_failedamount acima do valor autorizado.
402card_declinedO adquirente recusou a captura.
502connector_unsupported_operationO conector que autorizou nao faz captura.
502split_not_supportedPagamento dividido cujo recebedor nao esta mais registrado na conta que autorizou.

Prazo da pre-autorizacao

Uma autorizacao sem captura reserva o limite do portador, e a bandeira so deixa capturar dentro de um prazo. Assim que a autorizacao e aprovada sem captura, o pagamento ganha authorizationExpiresAt, calculado pela regra do adquirente e da bandeira:

AdquirenteBandeiraPrazo (dias corridos)
CieloMastercard7
CieloDemais bandeiras15
CieloBandeira desconhecida7
Outros adquirentesQualquer7

A regra da Cielo vem do changelog de julho de 2026. Onde a bandeira nao e conhecida, vale o prazo mais curto: errar para menos antecipa uma captura, errar para mais deixaria uma venda aprovada vencer.

  • Captura adiada no fluxo. O no Capturar em modo delayed agenda a captura (captureScheduledAt) e o worker a executa. Se o atraso pedido passar do prazo, a captura e marcada para 1 hora antes do vencimento. Veja Fluxos.
  • Aviso 24 horas antes. O worker aplica a configuracao Pre-autorizacao perto de vencer da conta do conector (Plugins, conta, Recursos): notify (padrao) so avisa, capture captura o valor autorizado e void cancela a autorizacao. Nos tres casos sai o evento payment.authorization_expiring, com o prazo em authorizationExpiresAt e a acao em expiryAction. Com o pagamento em revisao de fraude, capture vira notify: nunca se captura sozinho o que o antifraude ainda analisa.
  • Depois do prazo a captura nao e mais possivel: a API responde 409 payment_not_capturable, e actions.capture.reason mostra authorization_expired.

Analise de fraude da adquirente

Quando a conta usa o antifraude embutido da Cielo, a analise de fraude vai dentro da autorizacao e o pagamento ganha o que esta nesta secao. Ela so roda em cartao de credito, com o portador presente (initiator: "customer"), numa conta com o recurso ligado e numa rota que nao a dispensou (Fluxos). Fora disso, nada muda no pagamento.

Dados para a analise

Dois campos opcionais na criacao do pagamento (POST /v1/payments) alimentam a analise. Sem eles ela roda com o que o Minstrel ja sabe (o cliente do customerId, o valor, as parcelas e o cartao), mas com menos sinais.

items descreve o pedido (ate 100):

CampoTipoO que e
skutextoOpcional, ate 64. Codigo no seu catalogo.
nametextoObrigatorio, ate 255. Nome do produto.
quantityinteiroObrigatorio, maior que zero.
amountinteiroObrigatorio. Preco unitario, em centavos.

fraudAnalysis leva o resto:

CampoO que e
fingerprintSessionIdIdentificador da sessao do fingerprint do dispositivo, para quem roda o script do provedor por conta propria. Omitido, o Minstrel abre a sessao no checkout transparente.
shipping.methodPrazo da entrega: same_day, one_day, two_day, three_day, low_cost (economica), pickup (retirada), other ou none (sem entrega, como produto digital).
shipping.addressee, shipping.phoneQuem recebe, quando diferente do comprador (ate 120), e o telefone da entrega, com DDD (ate 20). O endereco de entrega vem do cadastro do cliente.
isGift, returnsAcceptedO pedido e um presente; a loja aceita devolucao.
merchantDefinedFieldsCampos livres para o provedor (Merchant Defined Data): { "id": 4, "value": "Call Center" }. id de 1 a 89, value de 1 a 255 caracteres, ate 100 campos, sem id repetido. Prevalecem sobre os padroes que o Minstrel preenche.
cURL / Bash
curl https://api.minstrel.com.br/v1/payments \
  -H "Authorization: Bearer $MINSTREL_API_KEY" \
  -H "Idempotency-Key: pedido-1234" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 14990,
    "customerId": "cus_01M5...",
    "externalId": "pedido-1234",
    "items": [{ "sku": "CAM-001", "name": "Camiseta preta", "quantity": 1, "amount": 14990 }],
    "fraudAnalysis": { "shipping": { "method": "two_day" } }
  }'

Nada aqui e dado de cartao: a barreira da API inspeciona estes campos como qualquer outro do corpo, e um numero de cartao num valor de merchantDefinedFields responde 422 raw_card_data_rejected. Os itens e o que voce enviou ficam no pagamento e aparecem no detalhe (orderItems e fraudAnalysis), o que ajuda a explicar uma analise skipped.

O nome, e-mail, documento e telefone do cliente tambem sao obrigatorios para a analise (e o nascimento, na ClearSale). Eles vem do cadastro do cliente: veja a tabela de dados do cliente. Faltando algum, a analise nao e enviada e a autorizacao segue (skipped).

O resultado da analise

Cada analise vira um item de antifraud no detalhe do pagamento, com origin: "acquirer" (as do no Antifraude do fluxo vem com origin: "flow_node") e o evento antifraud.assessment_completed. providerStatus diz o que o provedor respondeu:

providerStatusrecommendationSignificado
acceptapproveO provedor aprovou.
rejectdeclineO provedor recusou.
reviewreviewRevisao manual: a decisao sai no painel do provedor.
unfinishederrorA analise nao chegou a uma decisao (validacao do contrato ou erro interno do provedor).
provider_errorerrorO provedor falhou ao analisar.
abortederrorA analise foi interrompida antes de uma decisao.
unknownerrorO provedor devolveu uma situacao que o Minstrel nao reconhece, ou a Cielo nao devolveu o bloco. Duvida nao aprova.
skippederrorA analise nao foi enviada. Veja rawResponse.skippedReason e rawResponse.missingFields.

Alem disso o item traz score (de 0 a 100, quando o provedor o devolve), triggeredRules (os codigos de fator da Cybersource, como B, D, R), providerReference e rawResponse. O rawResponse guarda so o que explica a decisao (status, provider, skippedReason, missingFields, factorCodes, score): o corpo inteiro da Cielo ecoa dados do comprador e nao e guardado.

Recusa pelo antifraude

Quando o provedor recusa, a venda nao e cobrada: o pagamento termina failed, com o codigo proprio ANTIFRAUD_REJECT.

json
{
  "status": "failed",
  "decline": {
    "reason": "SUSPECTED_FRAUD",
    "reversibility": "IRREVERSIBLE",
    "retryAction": "DO_NOT_RETRY"
  },
  "attempts": [{ "connector": "cielo", "rawResponseCode": "ANTIFRAUD_REJECT" }]
}
  • E um codigo do Minstrel, fora da tabela ABECS e da tabela da Cielo (ela aparece em Codigos de recusa, entre os codigos proprios da Cielo). O emissor pode nem ter sido consultado.
  • E irreversivel e nao ha configuracao que mude isso. O pagamento nao e retentado nem tentado em outra conta: contornar a analise e o que ela existe para impedir. Peca outro meio de pagamento ou revise o pedido (e as regras no painel do provedor). Veja Retentativa.
  • Chega por tres caminhos, todos com o mesmo resultado: a Cielo aborta a venda antes do emissor (AnalyseFirst), cancela a autorizacao depois dele (AuthorizeFirst) ou aborta por fraude sem devolver o bloco da analise. O Merchant Advice Code do emissor nao e repassado, para nao sugerir retentativa.
  • Se o antifraude esta fora do ar, nao e recusa: a Cielo aborta a venda, o Minstrel trata como falha tecnica do conector (connector_unavailable, retentavel) e o cartao nao e punido por um problema do parceiro.
  • Recusa com a venda ainda autorizada. Se o veredito e reject mas a Cielo manteve a autorizacao (a conta analisa qualquer que seja o veredito, ou o cancelamento automatico dela falhou), o pagamento nao vira failed: fica authorized em revisao, e o Minstrel o cancela com o motivo de risco alto (Reason: "HighRisk", que a Cielo exige desde 17/04/2026). Termina voided, com a revisao rejected.
  • Capturada apesar da recusa. Se a Cielo ja capturou, o pagamento segue captured, a analise fica registrada como reject e o Minstrel nao estorna sozinho: a decisao de devolver e sua.

Revisao de fraude

O provedor pode nao decidir na hora (review): um analista decide depois, no painel do provedor (na Cybersource, o Enterprise Business Center, Aceitar ou Rejeitar). Enquanto isso o pagamento fica authorized, sem captura, mesmo com captureMethod: "automatic", e ganha fraudReview:

json
{ "id": "pay_01HQ...", "status": "authorized", "fraudReview": { "status": "pending" } }

fraudReview e null quando nao houve revisao.

fraudReview.statusSignificado
pendingA venda esta segura, esperando o veredito do provedor.
acceptedO provedor aceitou. A venda foi capturada (pelo adquirente ou pelo Minstrel) ou, com captura manual, segue authorized para voce capturar.
rejectedO provedor recusou e a autorizacao foi cancelada (voided).
merchant_decidedVoce capturou ou cancelou antes de o provedor decidir.

pending tambem aparece quando o provedor aceitou mas a captura que voce pediu ainda nao foi confirmada pela Cielo, e quando a analise terminou sem decisao (unfinished, unknown): em ambos a venda fica segura ate o Minstrel confirmar o desfecho.

Ciclo da revisao

A Cielo avisa que o antifraude mudou de status, mas nao diz para qual. Por isso um worker do Minstrel pergunta a Cielo, venda por venda, a cada FRAUD_REVIEW_POLL_INTERVAL_MINUTES (padrao 10, minimo 1) ate o provedor decidir. A decisao leva ate esse intervalo para aparecer; o aviso da Cielo ainda nao e usado para acelerar. O worker age conforme o que a Cielo informa:

O que a Cielo informaO que o Minstrel fazfraudReview
Ja capturou (aceitou e capturou como combinado)Registra a captura: captured (ou partially_captured), com payment.captured.accepted
Ja cancelou (recusou)Registra o cancelamento: voided, com payment.voided.rejected
Aceitou, ainda autorizada, captura automaticaCaptura pelo mesmo caminho do capture, com chave de idempotencia por pagamento.accepted
Aceitou, ainda autorizada, captura manualSo fecha a revisao. O pagamento segue authorized e a captura e sua.accepted
Recusou, ainda autorizadaCancela pelo mesmo caminho do void, com o motivo de risco alto.rejected
Sem decisaoSo anota a hora da consulta (fraudReviewCheckedAt) e espera o proximo ciclo.pending

Toda mudanca e condicionada a venda ainda estar authorized e pending. Se voce decidiu no meio, a sua decisao vale e o worker nao desfaz nem duplica nada.

  • Voce pode decidir antes. capture e void valem com a revisao pendente e a fecham como merchant_decided: voce passou a frente do provedor, e capturar pode cobrar uma venda que ele ainda recusaria.
  • O no Capturar espera. O no Capturar do fluxo, imediato ou adiado, nao captura enquanto a venda esta pending: a captura roda depois do aceite e nunca na recusa.
  • O vencimento nunca captura sozinho. A acao Pre-autorizacao perto de vencer capture vira notify enquanto a revisao esta pendente, porque capturar anularia a analise. void segue como configurado. A janela e a do prazo da pre-autorizacao (7 dias na Mastercard, 15 nas demais): peca ao analista que decida antes dela.
  • Captura manual. Na Cielo, a captura manual nao captura no aceite. O Minstrel so o enxerga se a consulta da venda devolver a analise atualizada, ponto que esta sendo validado com a Cielo (veja Antifraude da Cielo). A recusa aparece de qualquer forma, porque a Cielo cancela a venda.
  • Ao fim, o evento payment.fraud_review_resolved avisa o resultado.

Cancelar uma autorizacao

O cancelamento (void) desfaz uma autorizacao que ainda nao foi capturada. O limite do portador e liberado sem lancamento na fatura dele - por isso e a operacao certa para uma pre-autorizacao que nao vai virar venda. Estornar depois de capturar custa tarifa e aparece no extrato do cliente.

cURL / Bash
curl -X POST http://localhost:3333/v1/payments/pay_01HQ.../void \
  -H "Authorization: Bearer $MINSTREL_API_KEY" \
  -H "Idempotency-Key: cancela-pedido-1234" \
  -H "Content-Type: application/json" \
  -d '{ "reason": "Pedido cancelado antes do envio" }'

O pedido vai ao mesmo conector que autorizou - so ele conhece a transacao, e nao ha fallback. O pagamento fica voided e o evento payment.voided leva o motivo em data.object.voidReason. Nao coloque dado sensivel no motivo.

Com o pagamento em revisao de fraude, o cancelamento vale e fecha a revisao como merchant_decided; a decisao do provedor, se vier depois, nao muda nada.

Num pagamento com split, cancelar a autorizacao desfaz a venda inteira: o adquirente devolve a parte de cada recebedor sozinho, e o Minstrel nao manda divisao nenhuma. O restante de cada parcela fica registrado em refundedAmount, e o evento payment.voided leva as parcelas.

No Pix e no boleto aguardando pagamento, o mesmo endpoint cancela a cobranca no banco e o pagamento fica canceled, com payment.canceled. Veja Pix e boleto.

Em requires_payment_method (o cartao ainda nao foi digitado), o mesmo endpoint cancela o pagamento: ele fica canceled e a pagina do portador nao consegue mais confirma-lo. Nada chegou ao adquirente, entao nao ha limite a liberar.

HTTPcodeQuando
409payment_already_voidedA autorizacao ja foi cancelada.
409payment_not_voidableO pagamento nao esta authorized (nem requires_payment_method, nem Pix ou boleto aguardando). Se ja foi capturado, use o estorno.
402card_declinedO adquirente recusou o cancelamento.
502connector_unsupported_operationO conector que autorizou nao faz cancelamento.

Estornar

cURL / Bash
curl -X POST http://localhost:3333/v1/payments/pay_01HQ.../refund \
  -H "Authorization: Bearer $MINSTREL_API_KEY" \
  -H "Idempotency-Key: estorno-pedido-1234-1" \
  -H "Content-Type: application/json" \
  -d '{ "amount": 5000, "reason": "Devolucao parcial", "metadata": { "ticket": "SAC-991" } }'
  • Sem amount, estorna todo o saldo estornavel: capturado menos ja estornado.
  • Varios estornos parciais sao permitidos, ate o valor capturado. O pagamento passa a partially_refunded e, quando o saldo zera, a refunded, com os eventos payment.partially_refunded e payment.refunded.
  • O estorno vai ao conector que aprovou a venda. Se o adquirente recusar ou falhar, ele fica registrado em refunds no detalhe, com status: failed e o motivo em failureReason. Conector sem estorno recusa antes, sem registrar nada.
  • Pagamento em disputa nao e estornado. Com chargeback em andamento, o portador ja pediu o dinheiro ao emissor: estornar devolveria duas vezes. Responda a disputa.
  • Pagamento com split. O estorno total (nada devolvido antes e valor igual ao capturado) vai sem divisao: o adquirente desfaz tudo. O parcial divide o valor pelo que ainda resta em cada parcela, com a parte da conta principal como mais um peso, e o adquirente recebe so a parte dos recebedores - o resto sai da parte do lojista principal. A soma fecha ao centavo, e refundedAmount de cada parcela acumula os estornos. Na Cielo, so cabe um estorno parcial por transacao a cada 24 horas: o segundo dentro do prazo e recusado e fica failed.
  • Pix e estornado pela devolucao do PSP que recebeu. Boleto nao tem estorno automatico: a resposta e 409 com a orientacao de devolver por Pix ou TED e registrar a devolucao.
HTTPcodeQuando
409payment_not_refundableNada foi capturado (use o cancelamento), o pagamento ja foi estornado integralmente, esta em disputa (disputed, charged_back ou disputa aberta) ou e boleto.
422validation_failedamount acima do saldo estornavel.
402card_declinedO adquirente recusou o estorno.
502connector_unsupported_operationO conector que aprovou nao faz estorno.
502split_not_supportedEstorno parcial de pagamento dividido cujo recebedor nao esta mais registrado na conta que autorizou. Nada e enviado nem gravado: corrija o cadastro e tente de novo.

Idempotencia nas operacoes

Captura, cancelamento, estorno e a decisao de revisao manual aceitam o header Idempotency-Key, como a criacao do pagamento. Use sempre: a repeticao de uma chamada perdida por timeout devolve a resposta original em vez de capturar ou estornar duas vezes. A mesma chave com corpo diferente responde 409 idempotency_key_reused. Resposta de erro nao fica memorizada: depois de uma falha, a mesma chave pode ser usada de novo. Veja o catalogo de erros.

Eventos

EventoQuando acontece
payment.createdPagamento criado e aceito para processamento.
payment.authorizedAutorizado pelo emissor, ainda sem captura.
payment.capturedCapturado, total ou parcialmente. E o que confirma a venda.
payment.failedRecusado e encerrado. Traz a classificacao ABECS em data.object.decline. No checkout transparente so sai quando o pagamento acabou de fato, e data.object.checkout.endedBy diz por que (irreversible, attempt_limit, expired ou not_issuer_decline).
payment.attempt_declinedCheckout transparente: cartao recusado por motivo reversivel; o pagamento voltou para requires_payment_method e o portador pode tentar outro cartao. Traz data.object.decline e data.object.checkout (attemptsUsed, attemptsMax, attemptsRemaining). Nao cancele o pedido neste evento.
payment.checkout_not_configuredCheckout transparente: a conta do conector esta mal configurada (credencial ausente ou invalida, recurso nao habilitado) e a tokenizacao nao abriu. O portador recebeu checkout_not_configured; o motivo completo, para voce corrigir, vem em data.object.error. Um por motivo e por pagamento.
payment.requires_actionAguardando o portador (autenticacao 3DS), o pagamento de um Pix ou boleto (com o nextAction) ou uma pausa do fluxo.
payment.voidedAutorizacao cancelada.
payment.authorization_expiringPre-autorizacao perto do fim do prazo de captura, com authorizationExpiresAt e expiryAction (notify, capture ou void).
payment.canceledPix ou boleto vencido ou cancelado sem pagamento, ou pagamento do checkout transparente que ninguem pagou ate o prazo (cancelado sozinho pelo Minstrel), com o motivo em data.object.cancellation.
payment.fraud_review_resolvedFim da revisao de fraude do adquirente, com o resultado em data.object.fraudReview.status.
payment.partially_refundedEstorno parcial concluido.
payment.refundedEstornado integralmente.

Os mesmos dados chegam por webhook, assinados.

As opções são independentes e podem ser alteradas a qualquer momento no rodapé. Sua escolha vale por até 180 dias.

Necessários Sempre ativos

Lembram sua escolha de privacidade e permitem as funções essenciais.

Ler a política de cookies