Comece aqui
Catálogo de erros
Todo erro da API do Minstrel, com o significado de cada tipo e código e o que fazer em cada caso.
Guia de integração · 10 min de leitura
Nesta página
Todo erro da API segue o mesmo envelope. Previsibilidade no formato de erro e o que permite escrever um unico tratador no seu codigo em vez de um por endpoint.
{
"error": {
"type": "card_error",
"code": "insufficient_funds",
"message": "Saldo ou limite insuficiente.",
"param": "amount",
"requestId": "req_01HQ8M5X7P2K3N4R5T6V7W8X9Y",
"docsUrl": "https://docs.minstrel.com.br/errors/insufficient_funds",
"meta": {}
}
}
Guarde o requestId. Com ele, o suporte localiza a requisicao exata, com o
corpo enviado e a resposta de cada conector acionado. Sem ele, a investigacao
comeca do zero.
Tipos
O type e a categoria estavel: trate por ele, nao pela mensagem.
| Tipo | HTTP | Significado | O que fazer |
|---|---|---|---|
invalid_request_error | 400, 422 | Requisicao malformada ou campo invalido | Corrija o payload. Nao retente igual. |
authentication_error | 401 | Credencial ausente, invalida ou revogada | Verifique a chave. |
authorization_error | 403 | Credencial valida, sem permissao | Verifique os escopos da chave. |
not_found_error | 404 | Recurso inexistente no seu escopo | Confira o id e o ambiente. |
conflict_error | 409 | Conflito de estado ou de idempotencia | Veja a secao de idempotencia. |
rate_limit_error | 429 | Limite de requisicoes excedido | Aguarde meta.retryAfterSeconds. |
card_error | 402 | Recusa do emissor | Consulte decline.retryAction. |
connector_error | 502 | Falha do adquirente (timeout, 5xx) | Pode ser retentado. |
flow_error | 422 | Problema no fluxo de roteamento | Verifique o fluxo publicado. |
api_error | 500 | Falha interna nossa | Retente e, se persistir, informe o requestId. |
Observe a distincao entre card_error e connector_error: o primeiro e uma
decisao do emissor (negocio), o segundo e uma falha tecnica. A diferenca muda
completamente o que vale fazer em seguida.
Recusa na criacao do pagamento nao e erro HTTP. POST /v1/payments
responde 201 com o pagamento em status: failed e o motivo em decline
(classificacao ABECS, com retryAction): o pagamento existe e tem historico.
O card_error (402) aparece nas operacoes sobre um pagamento existente -
captura, cancelamento e estorno recusados pelo adquirente.
Codigos mais comuns
Teste de produção encerrado
production_subscription_required (403, authorization_error) indica que
os 30 dias ou as 50 cobranças gratuitas terminaram, ou que a organização não
tem plano nem teste ativo. O proprietário deve contratar um plano no painel.
Sandbox, consultas e estornos de pagamentos existentes continuam disponíveis.
Repetir a criação com outra chave não libera saldo.
Conta já cadastrada
registration_identity_in_use (409, conflict_error) aparece quando o
CNPJ ou e-mail já pertence a um cadastro. Entre na conta existente ou procure
o suporte. Alterar os dados da conta anterior não reinicia o teste.
Dados de cartao recusados
{
"error": {
"type": "invalid_request_error",
"code": "raw_card_data_rejected",
"param": "card.number",
"meta": { "offendingPaths": ["card.number", "card.cvv"] }
}
}
A API nao aceita numero de cartao, CVV, trilha ou PIN. Tokenize o cartao e envie apenas o token. O erro lista os caminhos dos campos, nunca os valores - caso contrario ele mesmo vazaria o dado para os seus logs.
A checagem tambem pega cartao colado em campo de texto livre, como
description ou metadata.
Chave de idempotencia reutilizada
{
"error": {
"type": "conflict_error",
"code": "idempotency_key_reused",
"message": "Esta chave de idempotencia ja foi usada com um corpo de requisicao diferente. Gere uma nova chave para uma cobranca diferente."
}
}
Este erro esta protegendo voce do bug mais perigoso da categoria: reaproveitar uma chave entre cobrancas distintas faria a segunda ser silenciosamente ignorada, e o cliente nao seria cobrado. Gere uma chave por operacao.
Requisicao em andamento
{
"error": {
"type": "conflict_error",
"code": "idempotency_request_in_progress"
}
}
Duas requisicoes com a mesma chave chegaram ao mesmo tempo. Aguarde alguns segundos e consulte o pagamento - nao crie outro.
Devolvemos 409 em vez da resposta parcial de proposito: tratar como sucesso algo que ainda pode falhar seria pior.
Nenhum conector disponivel
{
"error": {
"type": "connector_error",
"code": "no_connector_available",
"meta": { "requested": ["ca_..."] }
}
}
Nenhuma conta de conector do fluxo esta habilitada e saudavel. Pode ser circuito aberto por falhas consecutivas: consulte o painel de conectores.
Fluxo nao publicado
{
"error": {
"type": "flow_error",
"code": "flow_not_published",
"message": "Ha mais de um conector habilitado e nenhum fluxo publicado. Publique um fluxo para definir o roteamento."
}
}
Com um unico conector habilitado, roteamos direto. Com mais de um, escolher por voce seria adivinhar a intencao em algo que move dinheiro.
Checkout transparente
Erros das rotas do checkout transparente, que o
@minstrel/js entrega como MinstrelError do tipo api:
code | Quando | O que fazer |
|---|---|---|
client_secret_invalid | O clientSecret nao confere com o pagamento (ou o pagamento nao existe: a resposta e a mesma). | Confira o par paymentId e clientSecret que o seu servidor entregou a pagina. |
payment_not_confirmable | O pagamento nao esta em requires_payment_method: ja confirmado, recusado ou cancelado. | Consulte o pagamento; para cobrar de novo, crie outro. |
payment_expired | 410. Passou o prazo de 24 horas (actionExpiresAt) sem o cartao. | Crie um pagamento novo. |
payment_expired (3DS) | 410. Na rota do resultado do 3DS: a janela de autenticacao (ate 15 minutos) terminou. O pagamento e encerrado como failed (payment.failed, erro three_ds_expired), e o status do 3DS vira expired. | Crie um pagamento novo. |
three_ds_not_pending | 409. O pagamento nao esta aguardando 3DS: ja foi decidido, cancelado ou encerrado, ou outra resposta de 3DS chegou antes. A mensagem traz o status atual. | Consulte o pagamento (retrievePayment); nao reenvie o resultado. |
hosted_checkout_required | 422. A integração exige uma coleta de cartão que está suspensa. Inclui Cielo/SOP/MPI, seu sandbox e links antigos. | Use checkout hospedado no parceiro. Assinatura por link real aguarda homologação; para testes sem cartão, use Minstrel Sandbox. |
no_tokenization_account | 422. Nenhuma conta permite simulação sem cartão, ou a conta informada não serve. | Use Minstrel Sandbox para simular, ou envie token do parceiro pelo servidor. |
tokenization_account_ambiguous | 422. Ha mais de uma conta que tokeniza e o pagamento nao disse qual. | Informe tokenizationAccountId ao criar o pagamento. |
checkout_not_configured | 422, nao retentavel. A conta que tokeniza tem um erro de configuracao (credencial ausente ou recusada, recurso nao habilitado no parceiro). A mensagem ao comprador e generica. | O motivo completo esta na linha do tempo do pagamento no painel (evento payment.checkout_not_configured). Corrija a conta. |
Uma recusa do emissor nao e erro HTTP. Na simulacao do checkout, uma recusa
reversivel devolve o pagamento em requires_payment_method com decline e
cardAttempts (o comprador tenta outro cartao com o mesmo clientSecret, ate
CHECKOUT_MAX_CARD_ATTEMPTS, padrao 3) e emite payment.attempt_declined;
recusa irreversivel, limite de tentativas ou prazo encerram o pagamento como
failed.
As rotas publicas (/v1/public/payments/...) tambem respondem 429
(rate_limit_error) com Retry-After: ha um teto por IP e, por pagamento, um
teto de sessoes de tokenizacao e de confirmacoes por hora.
Antifraude da adquirente
Com o antifraude embutido da Cielo ligado, tres situacoes tem cara diferente:
| Situacao | Como aparece | O que fazer |
|---|---|---|
| O antifraude recusou a venda | Nao e erro HTTP: o pagamento termina failed, com rawResponseCode: "ANTIFRAUD_REJECT" e decline.reason: "SUSPECTED_FRAUD". Recusa irreversivel, nunca retentada nem tentada em outra conta. | Nao retente. Revise o pedido ou peca outro meio de pagamento. Veja Transacoes. |
| O antifraude esta fora do ar | connector_unavailable (tipo connector_error), retentavel. A mensagem diz que o problema e do provedor, nao do cartao. | Retente com a mesma chave de idempotencia. |
| Antifraude nao habilitado na Cielo | connector_contract_violation (tipo connector_error), nao retentavel. A mensagem cita o Merchant ID e traz o texto original da Cielo (Antifraud not configured, codigo 167). | Confirme a contratacao e a habilitacao com a Cielo, ou desligue o recurso na conta. |
Split nao suportado
{
"error": {
"type": "connector_error",
"code": "split_not_supported",
"message": "Este pagamento tem split, mas nenhuma conta candidata consegue executa-lo no adquirente. Cielo - principal (cielo): a conta \"Cielo - principal\" (cielo) nao executa split: ligue o recurso de split na configuracao da conta (Plugins). Autorizar sem dividir liquidaria o valor inteiro para o lojista principal, por isso o pagamento nao foi autorizado. Ligue o split na conta e registre cada recebedor nela (connectorAccountId e externalRecipientId).",
"requestId": "req_01HQ...",
"meta": {
"blocked": [
{
"connectorAccountId": "ca_01HQ...",
"name": "Cielo - principal",
"connectorSlug": "cielo",
"gaps": [{ "code": "account_without_split" }]
}
]
}
}
}
Um pagamento com split so e autorizado numa conta que executa a divisao no adquirente e onde todos os recebedores estao registrados. Se nenhuma candidata serve, o pagamento nao e autorizado: autorizar sem dividir liquidaria o valor inteiro para o lojista principal.
| Aspecto | Como e |
|---|---|
| Tipo e HTTP | connector_error, 502. Nao retentavel: repetir sem mexer no cadastro cai no mesmo lugar. |
meta.blocked | Uma entrada por conta pulada, com gaps[].code: account_without_split, recipient_not_registered ou recipient_in_other_account (com o recipientId). |
| Roteamento direto | A chamada responde o erro e o pagamento fecha failed, com payment.failed (error.code = "split_not_supported"). |
| Com fluxo publicado | O erro sai pela porta error do no Rotear, com o motivo no passo da rota; o desfecho depende do que a porta liga. |
| Captura e estorno parcial | Mesmo codigo quando um recebedor foi movido para outra conta depois da autorizacao: a operacao nao e enviada ao adquirente. |
O que fazer: ligue o recurso Split de pagamento na conta (Plugins,
conta, Recursos) e registre cada recebedor nela, com connectorAccountId e
externalRecipientId. Na Cielo, o id e o SubordinateMerchantId do seller.
Split na Cielo
Quando a Cielo barra uma venda de Split, o motivo e de configuracao (do Split,
do recebedor ou do valor) e nunca do cartao. Por isso o Minstrel nao a trata
como recusa do emissor: devolve connector_contract_violation (tipo
connector_error), nao retentavel, sem fallback para outra conta, com a
explicacao em portugues e o texto original da Cielo entre parenteses.
| Cielo | O que a mensagem diz | O que fazer |
|---|---|---|
326 Merchant blocked | Um recebedor ainda nao foi aprovado no onboarding da Cielo (so transaciona com status 2). | Aguarde a analise do cadastro do seller no portal da Cielo. |
326 Master's net amount can not be negative | As tarifas do Split nao cabem na comissao do lojista principal: o liquido dele ficaria negativo. | Aumente a comissao dos recebedores ou reduza as tarifas. |
326 No one value can be negative | A comissao (percentual mais tarifa fixa) passa da parcela de um recebedor. | Confira os valores e as comissoes. |
| 298 | O SubordinateMerchantId nao existe no ambiente da conta (sandbox e producao tem cadastros separados). | Confira o id do recebedor e o ambiente. |
| 193 | O valor da parcela de um recebedor precisa ser maior que zero. | Corrija a divisao. |
| 194 | A Cielo exige o estabelecimento (SubordinateMerchantId) em toda parcela. | Confira o cadastro do recebedor. |
ReasonCode 37 | A Cielo abortou a venda por erro no split transacional. | Confira os recebedores e os valores. |
ReasonCode 38 | O Merchant ID da conta nao esta habilitado para o Split. | Confirme a contratacao e a habilitacao com a Cielo. |
ReasonCode 39 | O Split da Cielo exige o soft descriptor. | Informe o soft descriptor na venda. |
ReasonCode 40 e 41 | O Split exige a analise de fraude, ou o antifraude exigido nao esta configurado para o Merchant ID. | Ligue o Antifraude da Cielo e confirme a habilitacao. |
ReasonCode 104 | A Cielo nao encontrou o cadastro de facilitador de pagamento do split. | Confira os recebedores e o ambiente. |
Tambem sao erro tecnico nao retentavel as credenciais do Split: Client Secret
ausente com o split ligado, ou recusado pela Cielo, voltam
connector_credentials_invalid, com a instrucao de onde gerar ou conferir
(Conectores, Split da Cielo). E uma
divisao fora do contrato (soma acima do valor, recebedor repetido ou id fora do
formato GUID) volta connector_contract_violation antes de qualquer chamada
a Cielo.
Tratando erros
import { Minstrel, MinstrelApiError } from '@minstrel/sdk';
try {
const payment = await minstrel.payments.create({ amount: 14990 });
} catch (error) {
if (!(error instanceof MinstrelApiError)) throw error;
// Recusa do emissor: mostre a mensagem ao cliente.
if (error.isCardError) {
return mostrarAoCliente(error.message);
}
// Falha tecnica: pode ser retentada com a MESMA chave de idempotencia.
if (error.isRetryable) {
return agendarRetentativa();
}
// Erro de integracao: corrija o codigo.
logger.error({ code: error.code, requestId: error.requestId }, error.message);
throw error;
}
A regra geral: retente connector_error, rate_limit_error e api_error
usando a mesma chave de idempotencia. Nao retente invalid_request_error nem
card_error - no primeiro, a requisicao esta errada; no segundo, consulte
decline.retryAction, que diz o que fazer.