ITP - Possíveis Erros de Pagamento

Visão Geral

Esta página lista os erros que podem ocorrer durante a execução e liquidação de pagamentos Pix via ITP, com descrição das causas, se são retriáveis, e orientações de tratamento.


Erros no Consentimento (Criação — POST /payment-initiation)

CódigoTítuloCausaRetriável?
DATA_PAGAMENTO_INVALIDAData de pagamento inválidaA date está no passado ou fora do intervalo permitido✅ Corrija a data e tente novamente
BRAND_NAO_ENCONTRADAMarca não encontradabrandId inexistente ou com status INACTIVE❌ Selecione outra instituição
CPF_CNPJ_INVALIDOCPF/CNPJ inválidoDocumento do creditor com dígitos verificadores errados❌ Corrija o documento
PROXY_INVALIDOChave Pix inválidaproxy com formato incompatível com o localInstrument❌ Corrija a chave Pix
VALOR_INVALIDOValor inválidoamount com formato incorreto (mais de 2 casas decimais, vazio, etc.)❌ Corrija o valor
TIPO_PAGAMENTO_INVALIDOTipo de pagamento inválidoCampo type diferente de PIX❌ Use type: PIX

Erros no Callback (POST /payment-initiation/callback)

CenárioCausaComo Tratar
invalid_request_uricode expirado. O callback não foi chamado a tempoRedirecione o usuário para iniciar um novo consentimento
access_deniedUsuário rejeitou o consentimentoExiba mensagem ao usuário e ofereça a opção de tentar novamente
state não encontradostate não corresponde a nenhuma payment initiation ativaVerifique o armazenamento do state no fluxo
code já utilizadoTentativa de trocar o mesmo code duas vezesCada code é de uso único — trate idempotência no callback

Erros na Liquidação — Rejeições RJCT

Quando um pagamento é rejeitado pelo SPB ou pela detentora, o campo rejectionReason no webhook indica o motivo:

CódigoDescriçãoRetriável?Orientação
SALDO_INSUFICIENTESaldo insuficiente na conta do pagador✅ IntradiaNotifique o usuário para repor saldo e tente novamente
VALOR_INVALIDOValor fora do permitido pela detentoraVerifique limites da conta do usuário
CONTA_NAO_PERMITE_PAGAMENTOConta devedora não habilitada para pagamentos PixOriente o usuário a habilitar Pix na detentora
PAGAMENTO_DIVERGENTE_CONSENTIMENTODados do pagamento divergem do consentimento aprovadoCrie novo consentimento com os dados corretos
CONSENTIMENTO_INVALIDOConsentimento não está em status AUTHORISEDCrie novo consentimento
NAO_INFORMADOMotivo não informado pela detentora✅ ExtradiaAguarde e tente criar novo consentimento
FALHA_INFRAESTRUTURAFalha interna na detentora ou SPB✅ Após intervaloAguarde 30s–1min e tente novamente
LIMITE_PERIODO_VALOR_EXCEDIDOLimite de valor diário/semanal/mensal atingidoAguarde reset do período ou oriente o usuário
LIMITE_PERIODO_QUANTIDADE_EXCEDIDOLimite de quantidade de transações do período atingidoAguarde reset do período
CONTA_DESTINO_INVALIDAConta ou chave Pix do recebedor inválidaVerifique os dados do creditor e creditorAccount
CAMPO_INVALIDOCampo obrigatório ausente ou com valor inválidoRevise os dados enviados no pagamento
QRCODE_INVALIDOQR Code expirado ou inválidoSolicite novo QR Code ao recebedor

Janelas de Retry

O Open Finance Brasil define janelas de retry para pagamentos retriáveis:

JanelaDescrição
IntradiaMesmo dia. Tente novamente até o fim do horário de funcionamento do SPI (tipicamente 20h)
ExtradiaAté 7 dias corridos a partir da data original do pagamento

Pagamentos com rejeição definitiva (não retriáveis) não devem ser retentados. Crie um novo consentimento após corrigir a causa raiz.


Diagrama de Decisão de Retry

flowchart TD
    A["Pagamento RJCT\nrecebido via webhook"] --> B{rejectionReason\nretriável?}

    B -->|Sim\n(SALDO_INSUFICIENTE,\nFALHA_INFRAESTRUTURA,\nNAO_INFORMADO)| C{Dentro da\njanela de retry?}
    B -->|Não| D["❌ Encerrar tentativas\nNotificar usuário\nCriar novo consentimento\nse aplicável"]

    C -->|Intradia| E["⏳ Aguardar intervalo\n(30s–5min)\nCriar novo consentimento\ne tentar novamente"]
    C -->|Extradia| F["📅 Agendar retry\nem próximo dia útil"]
    C -->|Fora da janela| D

    style D fill:#f5c6c6,stroke:#c0392b,color:#333
    style E fill:#fef9c3,stroke:#f39c12,color:#333
    style F fill:#c6e2f5,stroke:#2980b9,color:#333

Pontos de Atenção

⚠️

Nunca retente com o mesmo consentimento: Como cada consentimento é de uso único, sempre crie uma nova payment initiation para retentar um pagamento. Retentar com consentimento CONSUMED retorna 422.

⚠️

Consentimento CONSUMED ≠ pagamento bem-sucedido: O consentimento vai para CONSUMED após o POST /pix, mesmo que o pagamento seja posteriormente rejeitado (RJCT). Monitore o status do pagamento via webhook.

⚠️

Evite comunicar RJCT de infraestrutura ao usuário final: Erros como FALHA_INFRAESTRUTURA são transitórios. Mostre ao usuário uma mensagem genérica ("Pagamento temporariamente indisponível, tentando novamente...") enquanto executa o retry em background.

⚠️

Log detalhado: Registre sempre o rejectionReason, endToEndId e paymentId em caso de rejeição para facilitar análise e suporte.