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:
methodType | Como funciona |
|---|---|
card | Cartao de credito, pelo token do cofre ou pelo checkout transparente. Aprovado ou recusado na hora. |
debit_card | Cartao de debito, so pelo checkout transparente: captura automatica e autenticacao 3DS obrigatoria. |
pix | Cobranca Pix: nasce requires_action com o QR Code em nextAction; o banco confirma depois. |
boleto | Boleto registrado: nasce requires_action com a linha digitavel; o banco confirma depois. |
wallet | Carteira digital, vinda de link de pagamento. |
bank_transfer | Transferencia, 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
| Status | Significado |
|---|---|
requires_payment_method | Pagamento 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. |
pending | Criado, ainda nao processado. |
processing | Em processamento no fluxo de roteamento. |
requires_action | Aguardando 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). |
authorized | Aprovado e reservado no cartao, sem captura. Com fraudReview.status = "pending", a venda esta segura na revisao de fraude do adquirente, mesmo com captura automatica. |
captured | Capturado: a venda esta confirmada. |
partially_captured | Capturado em parte. |
failed | Recusado 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. |
canceled | Cancelado antes da autorizacao: pagamento que esperava o cartao e foi cancelado ou venceu, ou Pix e boleto vencidos ou cancelados sem pagamento. |
voided | Autorizacao cancelada antes da captura. |
partially_refunded | Estornado em parte. |
refunded | Estornado integralmente. |
disputed | Em contestacao. |
charged_back | Chargeback 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 "http://localhost:3333/v1/payments?status=failed&declineReason=INSUFFICIENT_FUNDS&createdAfter=2026-10-01T03:00:00Z&limit=50" \
-H "Authorization: Bearer $MINSTREL_API_KEY"
| Parametro | Exemplo | Efeito |
|---|---|---|
status | captured,authorized | Um ou mais status, separados por virgula. |
customerId | cus_01HQ... | Pagamentos de um cliente. |
externalId | pedido-1234 | O seu identificador do pedido, exato. |
declineReason | INSUFFICIENT_FUNDS | Motivo canonico da ultima recusa. |
connectorAccountId | ca_01HQ... | Pagamentos com ao menos uma tentativa na conta, inclusive os que cairam para outra. |
connector | cielo | Todas as contas de um conector, pelo slug. |
brand | visa,mastercard | Bandeira do cartao. |
methodType | pix,boleto | Meio de pagamento: card, debit_card, pix, boleto, wallet, bank_transfer. |
initiator | merchant | customer (CIT, cliente presente) ou merchant (MIT). |
amountMin, amountMax | 10000 | Faixa de valor, em centavos. |
hasFallback | true | So pagamentos com mais de uma tentativa (fallback ou retentativa). |
createdAfter, createdBefore | ISO 8601 | Periodo de criacao, com os extremos incluidos. |
search | 4242 | Busca livre, descrita abaixo. |
limit | 50 | De 1 a 100. Padrao 25. |
startingAfter | pay_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
txiddo 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):
{
"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 "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):
{
"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_backevoided. A taxa mede a decisao do emissor, nao o que aconteceu com a venda depois. approvalRatevem 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 enull.capturedVolumesoma o valor capturado, em centavos;averageTickete a media por pagamento capturado.recoverede 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) eretry(aprovado de primeira, numa fatura cuja cobranca anterior tinha sido recusada).refundsconta 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:
| Campo | O que traz |
|---|---|
nextAction | O 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. |
threeDs | Autenticacao 3DS ou Data Only: status, eci e version. null quando o pagamento nao passou por ela. Veja Autenticacao 3DS. |
methodDetails | Pix e boleto: a cobranca emitida, com o historico (txid, endToEndId do Pix pago, vencimento, linha digitavel). Continua depois de pago ou vencido. |
attempts | Cada tentativa: conta de conector, desfecho (outcome), motivo (trigger), codigo bruto do emissor, Merchant Advice Code, classificacao ABECS, NSU, TID, codigo de autorizacao e latencia. |
routing | Resumo do roteamento: tentativas, se houve fallback, se ele salvou a venda (recovered), quem decidiu (decidedBy) e por que parou (stopReason). |
flowRuns | Execucoes do fluxo, com a versao e cada passo (steps): porta de saida, explicacao da decisao e configuracao relevante do no. |
antifraud | Analises 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. |
fraudReview | Revisao de fraude do adquirente: { status } com pending, accepted, rejected ou merchant_decided. null quando nao houve revisao. |
fraudReviewCheckedAt | Quando o Minstrel perguntou ao adquirente pela ultima vez como a revisao estava. |
fraudAnalysis | O que voce enviou para a analise (fingerprintSessionId, shipping, isGift, returnsAccepted, merchantDefinedFields), sem o endereco do script do navegador. Ajuda a explicar uma analise skipped. |
orderItems | Os items do pedido enviados na criacao, ou null. |
operations | Capturas, 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. |
refunds | Estornos, inclusive os recusados (status: failed, com failureReason). |
splits | Parcelas 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. |
disputes | Contestacoes. |
events | Linha do tempo de eventos do pagamento, com a situacao das entregas de webhook de cada um. |
actions | O 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
outcome | Significado |
|---|---|
approved | O emissor aprovou. |
requires_action | Aprovacao pendente de acao do portador; no Pix e no boleto, cobranca emitida aguardando o pagamento. |
declined | O emissor recusou. Ha codigo de resposta e classificacao. |
technical_failure | O conector falhou (timeout, erro do parceiro). Sem codigo; o erro vem em error. |
pending | Ainda sem resposta. |
expired | Pix ou boleto que venceu sem pagamento. Nao e recusa. |
canceled | Pix 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:
- A pausa. No no, o pagamento fica
requires_actionenextActiontraztype: "three_ds", com o provedor (cielo_mpiou, no sandbox,minstrel_sandbox), o ambiente, o modo (challenge,frictionlessoudata_only) e o prazo (expiresAt). Quem o consome e o SDK; o seu servidor nao precisa fazer nada. - 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 headerMinstrel-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.
{
"id": "pay_01M5...",
"methodType": "debit_card",
"threeDs": { "status": "authenticated", "eci": "05", "version": "2.2.0" }
}
threeDs.status | Significado |
|---|---|
pending | O portador ainda nao concluiu: o navegador esta rodando o 3DS. |
authenticated | O emissor autenticou o portador. |
data_only | Os dados foram enviados ao emissor sem autenticar o portador (Visa e Mastercard). |
not_authenticated | O emissor negou a autenticacao ou o portador nao concluiu o desafio. |
unavailable | O 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:
| Valor | Significado |
|---|---|
approved | A ultima tentativa aprovou. |
requires_action | Aprovacao pendente de acao do portador. |
in_progress | A ultima tentativa ainda nao terminou. |
charge_expired | O Pix ou o boleto venceu sem pagamento. |
charge_canceled | O Pix ou o boleto foi cancelado antes do pagamento. |
irreversible_decline | Recusa irreversivel: o fallback para sempre, independentemente da configuracao. |
fallback_disabled | O no de rota estava com o fallback desligado para esse tipo de falha. |
max_attempts | O limite de tentativas do no foi atingido com candidatos sobrando. |
candidates_exhausted | Todos os candidatos foram tentados. |
card_single_acquirer | Cartao: o token so vale na adquirente que o gerou; a nova tentativa e da retentativa (ABECS). |
single_connector | Roteamento direto, sem fluxo publicado: so havia uma conta. |
unknown | Nao 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.
reason | Significado |
|---|---|
not_authorized | O pagamento nao esta authorized (captura e cancelamento). |
no_authorization | Nao ha tentativa aprovada com id da transacao no adquirente. |
authorization_expired | A autorizacao expirou (authorizationExpiresAt). |
connector_unsupported | O conector que aprovou nao faz a operacao. |
not_captured | Nada foi capturado: nao ha o que estornar. |
fully_refunded | Ja estornado integralmente. |
disputed | Pagamento em contestacao ou com chargeback. |
method_unsupported | O meio nao tem a operacao (boleto nao tem estorno). |
not_pending | Pix ou boleto que nao esta mais aguardando pagamento. |
already_canceled | Pix ou boleto ja cancelado. |
live_environment | Simulacao do banco: so existe no sandbox. |
not_issued | Simulacao: 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 parcela | O que traz |
|---|---|
amount, type, configuredValue | A parcela bruta calculada sobre o valor autorizado, e a regra que a gerou. |
commissionRateBps, commissionFixedAmount | Comissao do marketplace gravada na hora do pagamento. null: vale o acordo do recebedor no adquirente. |
netAmount, feeAmount | O que o recebedor recebe e o que o adquirente descontou (feeAmount = amount - netAmount), como ele informou. null e 0 ate la. |
capturedAmount | Quanto da parcela foi capturado. null antes da captura. |
refundedAmount | Quanto 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.refundedepayment.partially_refundedlevam as parcelas nodata.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 confirma | Rota | Credencial |
|---|---|---|
A pagina do portador, pelo @minstrel/js | POST /v1/public/payments/:id/confirm | Header Minstrel-Client-Secret |
| O seu servidor | POST /v1/payments/:id/confirm | Chave de API (payments:write) |
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.tokene o token de uso unico do adquirente;brand,binelast4sao opcionais. Nunca envie o numero do cartao: a API o recusa com422 raw_card_data_rejected.saveCard: trueexigecustomerIdno 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
(
authorizedoucaptured, conformecaptureMethod). Recusada por motivo reversivel, o pagamento volta pararequires_payment_method(eventopayment.attempt_declined) e aceita outro cartao no mesmo pagamento: gere outro token e confirme de novo, com outraIdempotency-Key. Recusa irreversivel, o fim das tentativas (padrao: 3 cartoes) ou o prazo vencido terminamfailed(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 -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_capturede o restante nao pode ser capturado depois. - As duas emitem
payment.captured; confirastatusecapturedAmount. - 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 respondesplit_not_supported. - Com o pagamento em revisao de fraude
(
fraudReview.status = "pending") a captura vale, mas passa a frente do provedor: a revisao fecha comomerchant_decided.
| HTTP | code | Quando |
|---|---|---|
409 | payment_not_capturable | O pagamento nao esta authorized, a autorizacao expirou ou nao ha autorizacao aprovada. |
422 | validation_failed | amount acima do valor autorizado. |
402 | card_declined | O adquirente recusou a captura. |
502 | connector_unsupported_operation | O conector que autorizou nao faz captura. |
502 | split_not_supported | Pagamento 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:
| Adquirente | Bandeira | Prazo (dias corridos) |
|---|---|---|
| Cielo | Mastercard | 7 |
| Cielo | Demais bandeiras | 15 |
| Cielo | Bandeira desconhecida | 7 |
| Outros adquirentes | Qualquer | 7 |
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
delayedagenda 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,capturecaptura o valor autorizado evoidcancela a autorizacao. Nos tres casos sai o eventopayment.authorization_expiring, com o prazo emauthorizationExpiresAte a acao emexpiryAction. Com o pagamento em revisao de fraude,captureviranotify: 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, eactions.capture.reasonmostraauthorization_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):
| Campo | Tipo | O que e |
|---|---|---|
sku | texto | Opcional, ate 64. Codigo no seu catalogo. |
name | texto | Obrigatorio, ate 255. Nome do produto. |
quantity | inteiro | Obrigatorio, maior que zero. |
amount | inteiro | Obrigatorio. Preco unitario, em centavos. |
fraudAnalysis leva o resto:
| Campo | O que e |
|---|---|
fingerprintSessionId | Identificador 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.method | Prazo 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.phone | Quem 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, returnsAccepted | O pedido e um presente; a loja aceita devolucao. |
merchantDefinedFields | Campos 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 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:
providerStatus | recommendation | Significado |
|---|---|---|
accept | approve | O provedor aprovou. |
reject | decline | O provedor recusou. |
review | review | Revisao manual: a decisao sai no painel do provedor. |
unfinished | error | A analise nao chegou a uma decisao (validacao do contrato ou erro interno do provedor). |
provider_error | error | O provedor falhou ao analisar. |
aborted | error | A analise foi interrompida antes de uma decisao. |
unknown | error | O provedor devolveu uma situacao que o Minstrel nao reconhece, ou a Cielo nao devolveu o bloco. Duvida nao aprova. |
skipped | error | A 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.
{
"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
rejectmas a Cielo manteve a autorizacao (a conta analisa qualquer que seja o veredito, ou o cancelamento automatico dela falhou), o pagamento nao virafailed: ficaauthorizedem revisao, e o Minstrel o cancela com o motivo de risco alto (Reason: "HighRisk", que a Cielo exige desde 17/04/2026). Terminavoided, com a revisaorejected. - Capturada apesar da recusa. Se a Cielo ja capturou, o pagamento segue
captured, a analise fica registrada comorejecte 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:
{ "id": "pay_01HQ...", "status": "authorized", "fraudReview": { "status": "pending" } }
fraudReview e null quando nao houve revisao.
fraudReview.status | Significado |
|---|---|
pending | A venda esta segura, esperando o veredito do provedor. |
accepted | O provedor aceitou. A venda foi capturada (pelo adquirente ou pelo Minstrel) ou, com captura manual, segue authorized para voce capturar. |
rejected | O provedor recusou e a autorizacao foi cancelada (voided). |
merchant_decided | Voce 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 informa | O que o Minstrel faz | fraudReview |
|---|---|---|
| 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 automatica | Captura pelo mesmo caminho do capture, com chave de idempotencia por pagamento. | accepted |
| Aceitou, ainda autorizada, captura manual | So fecha a revisao. O pagamento segue authorized e a captura e sua. | accepted |
| Recusou, ainda autorizada | Cancela pelo mesmo caminho do void, com o motivo de risco alto. | rejected |
| Sem decisao | So 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.
captureevoidvalem com a revisao pendente e a fecham comomerchant_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
captureviranotifyenquanto a revisao esta pendente, porque capturar anularia a analise.voidsegue 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_resolvedavisa 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 -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.
| HTTP | code | Quando |
|---|---|---|
409 | payment_already_voided | A autorizacao ja foi cancelada. |
409 | payment_not_voidable | O pagamento nao esta authorized (nem requires_payment_method, nem Pix ou boleto aguardando). Se ja foi capturado, use o estorno. |
402 | card_declined | O adquirente recusou o cancelamento. |
502 | connector_unsupported_operation | O conector que autorizou nao faz cancelamento. |
Estornar
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_refundede, quando o saldo zera, arefunded, com os eventospayment.partially_refundedepayment.refunded. - O estorno vai ao conector que aprovou a venda. Se o adquirente recusar ou
falhar, ele fica registrado em
refundsno detalhe, comstatus: failede o motivo emfailureReason. 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
refundedAmountde 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 ficafailed. - Pix e estornado pela devolucao do PSP que recebeu. Boleto nao tem
estorno automatico: a resposta e
409com a orientacao de devolver por Pix ou TED e registrar a devolucao.
| HTTP | code | Quando |
|---|---|---|
409 | payment_not_refundable | Nada foi capturado (use o cancelamento), o pagamento ja foi estornado integralmente, esta em disputa (disputed, charged_back ou disputa aberta) ou e boleto. |
422 | validation_failed | amount acima do saldo estornavel. |
402 | card_declined | O adquirente recusou o estorno. |
502 | connector_unsupported_operation | O conector que aprovou nao faz estorno. |
502 | split_not_supported | Estorno 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
| Evento | Quando acontece |
|---|---|
payment.created | Pagamento criado e aceito para processamento. |
payment.authorized | Autorizado pelo emissor, ainda sem captura. |
payment.captured | Capturado, total ou parcialmente. E o que confirma a venda. |
payment.failed | Recusado 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_declined | Checkout 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_configured | Checkout 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_action | Aguardando o portador (autenticacao 3DS), o pagamento de um Pix ou boleto (com o nextAction) ou uma pausa do fluxo. |
payment.voided | Autorizacao cancelada. |
payment.authorization_expiring | Pre-autorizacao perto do fim do prazo de captura, com authorizationExpiresAt e expiryAction (notify, capture ou void). |
payment.canceled | Pix 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_resolved | Fim da revisao de fraude do adquirente, com o resultado em data.object.fraudReview.status. |
payment.partially_refunded | Estorno parcial concluido. |
payment.refunded | Estornado integralmente. |
Os mesmos dados chegam por webhook, assinados.