Minstrel
Navegar na documentação

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.

json
{
  "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.

TipoHTTPSignificadoO que fazer
invalid_request_error400, 422Requisicao malformada ou campo invalidoCorrija o payload. Nao retente igual.
authentication_error401Credencial ausente, invalida ou revogadaVerifique a chave.
authorization_error403Credencial valida, sem permissaoVerifique os escopos da chave.
not_found_error404Recurso inexistente no seu escopoConfira o id e o ambiente.
conflict_error409Conflito de estado ou de idempotenciaVeja a secao de idempotencia.
rate_limit_error429Limite de requisicoes excedidoAguarde meta.retryAfterSeconds.
card_error402Recusa do emissorConsulte decline.retryAction.
connector_error502Falha do adquirente (timeout, 5xx)Pode ser retentado.
flow_error422Problema no fluxo de roteamentoVerifique o fluxo publicado.
api_error500Falha interna nossaRetente 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

json
{
  "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

json
{
  "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

json
{
  "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

json
{
  "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

json
{
  "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:

codeQuandoO que fazer
client_secret_invalidO 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_confirmableO pagamento nao esta em requires_payment_method: ja confirmado, recusado ou cancelado.Consulte o pagamento; para cobrar de novo, crie outro.
payment_expired410. 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_pending409. 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_required422. 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_account422. 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_ambiguous422. Ha mais de uma conta que tokeniza e o pagamento nao disse qual.Informe tokenizationAccountId ao criar o pagamento.
checkout_not_configured422, 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:

SituacaoComo apareceO que fazer
O antifraude recusou a vendaNao 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 arconnector_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 Cieloconnector_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

json
{
  "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.

AspectoComo e
Tipo e HTTPconnector_error, 502. Nao retentavel: repetir sem mexer no cadastro cai no mesmo lugar.
meta.blockedUma entrada por conta pulada, com gaps[].code: account_without_split, recipient_not_registered ou recipient_in_other_account (com o recipientId).
Roteamento diretoA chamada responde o erro e o pagamento fecha failed, com payment.failed (error.code = "split_not_supported").
Com fluxo publicadoO 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 parcialMesmo 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.

CieloO que a mensagem dizO que fazer
326 Merchant blockedUm 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 negativeAs 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 negativeA comissao (percentual mais tarifa fixa) passa da parcela de um recebedor.Confira os valores e as comissoes.
298O SubordinateMerchantId nao existe no ambiente da conta (sandbox e producao tem cadastros separados).Confira o id do recebedor e o ambiente.
193O valor da parcela de um recebedor precisa ser maior que zero.Corrija a divisao.
194A Cielo exige o estabelecimento (SubordinateMerchantId) em toda parcela.Confira o cadastro do recebedor.
ReasonCode 37A Cielo abortou a venda por erro no split transacional.Confira os recebedores e os valores.
ReasonCode 38O Merchant ID da conta nao esta habilitado para o Split.Confirme a contratacao e a habilitacao com a Cielo.
ReasonCode 39O Split da Cielo exige o soft descriptor.Informe o soft descriptor na venda.
ReasonCode 40 e 41O 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 104A 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

ts
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.

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