Códigos de erro

O catálogo dos códigos que chegam em errors[].code quando uma chamada falha: o que cada um significa, de qual fluxo vem, se vale retentar, e como o mesmo motivo aparece no corpo v1.

As falhas operacionais entregues por webhook (loan.invalid, installment.settlement_invalid, prepayment.invalid, repurchase.invalid, renegotiation.invalid) trazem o motivo em data.errors[], com um item cujo code é deste catálogo. A reprovação por critério do fundo (E0xx) tem forma própria, descrita na seção 6. Programe contra o code; description é texto para gente ler e pode mudar sem aviso.

"errors": [
  {
    "code": "loan_not_found",
    "title": "Operação não encontrada",
    "description": "loan_not_found for originator=OP-001 banker=None"
  }
]

Quatro regras de leitura:

  • code é estável; description não é contrato. A description carrega o detalhe da ocorrência (qual código de parcela não bateu, qual valor divergiu). Nos códigos sem detalhe ela é o próprio literal do código ("description": "invalid_installment_state"), com uma exceção: unexpected_error_prepaying_installment chega com unexpected_error_prepaying_installment_v2. Use-a para diagnóstico, nunca para decidir fluxo.
  • O item tem três campos: code, title e description. A coluna "Retentar?" das tabelas abaixo é desta documentação, não do payload: nenhum item de errors[] traz retryable.
  • Só os unexpected_error_* valem uma nova tentativa da mesma chamada. São falhas da IORQ, não do pedido. A exceção é unexpected_error_processing_operation na recepção de arquivo (ver a seção 1), que carrega um erro do pedido. Nos demais códigos, a chamada falha de novo até você corrigir o que o código aponta.
  • Um código pode aparecer em mais de um fluxo. loan_not_found sai na antecipação e na recompra; invalid_loan_state, na recompra e na renegociação. O type do evento diz de qual chamada veio.

1. Cessão (loan.invalid)

codeSignificadoRetentar?
fund_not_foundO iorq-fund-id da chamada não corresponde a um fundo provisionadonão
fund_not_supportedO fundo existe, mas não é atendido pela esteira que recebeu a operação. Vem seguido de um segundo loan.invalid, com unexpected_error_processing_operation e a mesma idempotency_keynão
banker_not_foundO bancarizador informado não está cadastrado para o fundonão
duplicated_originator_proposal_codeO originator_proposal_code já pertence a outra operação. A description traz o código e o estado da operação existente, não o identificador delanão
unexpected_error_processing_operationFalha da IORQ ao processar a operação; a description é o próprio literal do códigosim

unexpected_error_processing_operation também sai, em loan.invalid, para erros do seu pedido na recepção de arquivo de lastro (POST /loan/files) e na atualização de dados da operação (PATCH /loan/operation-data): operação não encontrada, tipo de documento não permitido, payload inválido. Nesse caminho a description traz o texto da exceção, retentar a mesma chamada não resolve, e a operação não vai a invalid: o evento avisa que o arquivo ou o dado não foi aceito, e a operação segue no estado em que estava.

A reprovação na elegibilidade do fundo não usa este catálogo: ela chega com os códigos E0xx definidos na homologação do fundo. Ver a seção 6.

2. Liquidação (installment.settlement_invalid)

codeSignificadoRetentar?
installment_not_foundA parcela do POST /installment/settle não existe na operaçãonão
invalid_installment_stateA parcela já está liquidada ou em estado que não admite baixanão
settlement_conciliation_errorO valor pago não conciliou com a parcela; ela fica marcada para conciliação manual pela IORQnão
unexpected_error_settling_installmentFalha da IORQ ao aplicar a baixasim

Divergência de valor na liquidação sai como settlement_conciliation_error; value_mismatch é da recompra.

3. Antecipação (prepayment.invalid)

codeSignificadoRetentar?
loan_not_foundUma das operações do pedido não foi encontrada; a description traz os códigos de originador e bancarizador usadosnão
all_loans_must_belong_to_same_customer_personAs operações do pedido são de tomadores diferentesnão
empty_prepayment_installmentsO pedido não lista parcela nenhumanão
prepayment_installments_not_foundUma ou mais parcelas do pedido não existem; a description lista os identificadoresnão
prepayment_installments_ambiguousUm código de parcela casou com mais de uma parcela na operaçãonão
duplicate_installment_codesO mesmo código de parcela aparece duas vezes no pedidonão
prepayment_amount_unresolvedNão foi possível determinar o valor de antecipação de uma parcelanão
total_prepayment_amount_mismatchO total informado difere da soma das parcelasnão
prepayment_amount_below_installment_valuesO valor de antecipação é menor que o valor das parcelas cobertasnão
installments_not_prepayableUma ou mais parcelas não estão em estado antecipável; a description lista quaisnão
unexpected_error_prepaying_installmentFalha da IORQ ao processar o pedido; a description é unexpected_error_prepaying_installment_v2sim

4. Recompra (repurchase.invalid)

codeSignificadoRetentar?
loan_not_foundA operação do POST /loan/repurchase não foi encontradanão
invalid_loan_stateA operação não está em estado recomprável (já em baixa, renegociação ou recompra)não
value_mismatchO valor de recompra é menor que o valor na curva; a description traz os dois. Só nos fundos cuja recompra confere o valor (hoje, DIMO)não
unexpected_error_repurchasingFalha da IORQ ao processar a recomprasim

5. Renegociação (renegotiation.invalid)

codeSignificadoRetentar?
renegotiation_already_processedO mesmo pedido de renegociação já foi processado. Sai também quando a operação nova já existe e o reenvio chega sem os documentos que a primeira execução já consumiu da área de recepçãonão
renegotiation_loans_not_foundOperações listadas em renegotiated_loans[] não foram encontradas; a description diz quaisnão
duplicated_loans_in_baseMais de uma operação na base para o mesmo código; a IORQ precisa desambiguarnão
no_loans_to_renegotiateNenhuma das operações listadas pode ser renegociadanão
loans_from_different_customersAs operações antigas são de tomadores diferentesnão
invalid_loan_stateUma operação antiga não está em estado renegociávelnão
unexpected_error_renegotiatingFalha da IORQ ao processar a renegociaçãosim

credit_vehicle_not_found está reservado no catálogo e hoje não é emitido em nenhuma entrega.

6. Elegibilidade e covenant (E0xx)

Os códigos E0xx não pertencem ao catálogo operacional: são os critérios de elegibilidade e os covenants definidos por fundo na homologação, e o significado de cada um é o do regulamento daquele fundo. A numeração é compartilhada entre os serviços da IORQ e cresce com eles (já existe o E027); não a trate como uma faixa fechada. A lista dos critérios do seu fundo é a da homologação; ver Critérios de elegibilidade.

Três têm significado fixo em todos os fundos:

codetitleOnde chega
E023Renegociação Expiradarenegotiation.invalid, quando a renegociação pré-aprovada expira sem assinatura
E024Documento de Renegociação Inválidorenegotiation.invalid, quando o documento da renegociação é reprovado na validação de lastro
E026Renegociação Reprovada em Covenantloan.rejected, uma por operação do lote de renegociação reprovado em covenant

Os E0xx chegam de duas formas, conforme o ponto do fluxo em que a IORQ os emite:

Onde a IORQ emiteForma
Elegibilidade na entrada da cessão (loan.invalid)Mapa serializado em reason_text
Elegibilidade na entrada da renegociação (renegotiation.invalid)Mapa serializado em reason_text
Expiração da renegociação pré-aprovada, E023 (renegotiation.invalid)Mapa serializado em reason_text
Documento de renegociação reprovado, E024 (renegotiation.invalid)Mapa serializado em reason_text
Lote de renegociação: avaliação do lote, e aprovação ou recusa do lote pelo gestor, que repetem o resultado de validação gravado na operação (renegotiation.invalid)Itens em errors[]
Reprovação em covenant, E026 (loan.rejected)Itens em errors[]

Na forma serializada, reason_text é uma string JSON com um objeto {"E0xx": {"title", "description"}}, e errors chega nulo. Trate um reason_text que começa com { como JSON e leia os códigos de lá. Uma reprovação na elegibilidade da cessão chega assim:

"errors": null,
"reason_text": "{\"E006\": {\"title\": \"Prazo Acima do Limite\", \"description\": \"Prazo superior ao limite (36 meses)\"}}"

Na forma estruturada, cada critério é um item de errors[], com title e description vindos da regra:

"errors": [
  {
    "code": "E026",
    "title": "Renegociação Reprovada em Covenant",
    "description": "Renegociação reprovada na avaliação de covenants: ..."
  }
]

A forma serializada é um resquício do contrato v1, preservado para não mudar o corpo que os integradores v1 já recebem.

7. Como o mesmo motivo aparece no v1

No corpo legado o motivo vai em data.reason, e o tipo dele depende de onde o motivo estava no v2:

  • Código deste catálogo em errors[]: reason é a string que a description do item carrega, e não o objeto: "reason": "loan_not_found for originator=OP-001 banker=None".
  • E0xx em errors[] (lote de renegociação, E026): reason é o objeto {"E026": {"title": ..., "description": ...}}.
  • reason_text (a forma serializada dos E0xx, inclusive E023 e E024, e as confirmações de sucesso): reason é a mesma string. Um E0xx que chega assim no v1 é um JSON dentro de uma string, não um objeto.

Os textos v1 são estáveis por compatibilidade, não por contrato. Um integrador v1 que quiser o código sem parsear texto migra para o v2. O caminho inverso vale para o envelope v2 remontado a partir do v1, o caso de produção hoje: a IORQ só devolve um motivo em texto a errors[] quando reconhece o texto de um código deste catálogo, e o resto chega em reason_text (ver Catálogo de eventos). Ver também Contrato v1 (legado).

8. Próximos passos


Did this page help you?