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;descriptionnão é contrato. Adescriptioncarrega 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_installmentchega comunexpected_error_prepaying_installment_v2. Use-a para diagnóstico, nunca para decidir fluxo.- O item tem três campos:
code,titleedescription. A coluna "Retentar?" das tabelas abaixo é desta documentação, não do payload: nenhum item deerrors[]trazretryable. - 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_operationna 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_foundsai na antecipação e na recompra;invalid_loan_state, na recompra e na renegociação. Otypedo evento diz de qual chamada veio.
1. Cessão (loan.invalid)
loan.invalid)code | Significado | Retentar? |
|---|---|---|
fund_not_found | O iorq-fund-id da chamada não corresponde a um fundo provisionado | não |
fund_not_supported | O 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_key | não |
banker_not_found | O bancarizador informado não está cadastrado para o fundo | não |
duplicated_originator_proposal_code | O 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 dela | não |
unexpected_error_processing_operation | Falha da IORQ ao processar a operação; a description é o próprio literal do código | sim |
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)
installment.settlement_invalid)code | Significado | Retentar? |
|---|---|---|
installment_not_found | A parcela do POST /installment/settle não existe na operação | não |
invalid_installment_state | A parcela já está liquidada ou em estado que não admite baixa | não |
settlement_conciliation_error | O valor pago não conciliou com a parcela; ela fica marcada para conciliação manual pela IORQ | não |
unexpected_error_settling_installment | Falha da IORQ ao aplicar a baixa | sim |
Divergência de valor na liquidação sai como settlement_conciliation_error; value_mismatch é da recompra.
3. Antecipação (prepayment.invalid)
prepayment.invalid)code | Significado | Retentar? |
|---|---|---|
loan_not_found | Uma das operações do pedido não foi encontrada; a description traz os códigos de originador e bancarizador usados | não |
all_loans_must_belong_to_same_customer_person | As operações do pedido são de tomadores diferentes | não |
empty_prepayment_installments | O pedido não lista parcela nenhuma | não |
prepayment_installments_not_found | Uma ou mais parcelas do pedido não existem; a description lista os identificadores | não |
prepayment_installments_ambiguous | Um código de parcela casou com mais de uma parcela na operação | não |
duplicate_installment_codes | O mesmo código de parcela aparece duas vezes no pedido | não |
prepayment_amount_unresolved | Não foi possível determinar o valor de antecipação de uma parcela | não |
total_prepayment_amount_mismatch | O total informado difere da soma das parcelas | não |
prepayment_amount_below_installment_values | O valor de antecipação é menor que o valor das parcelas cobertas | não |
installments_not_prepayable | Uma ou mais parcelas não estão em estado antecipável; a description lista quais | não |
unexpected_error_prepaying_installment | Falha da IORQ ao processar o pedido; a description é unexpected_error_prepaying_installment_v2 | sim |
4. Recompra (repurchase.invalid)
repurchase.invalid)code | Significado | Retentar? |
|---|---|---|
loan_not_found | A operação do POST /loan/repurchase não foi encontrada | não |
invalid_loan_state | A operação não está em estado recomprável (já em baixa, renegociação ou recompra) | não |
value_mismatch | O 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_repurchasing | Falha da IORQ ao processar a recompra | sim |
5. Renegociação (renegotiation.invalid)
renegotiation.invalid)code | Significado | Retentar? |
|---|---|---|
renegotiation_already_processed | O 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ção | não |
renegotiation_loans_not_found | Operações listadas em renegotiated_loans[] não foram encontradas; a description diz quais | não |
duplicated_loans_in_base | Mais de uma operação na base para o mesmo código; a IORQ precisa desambiguar | não |
no_loans_to_renegotiate | Nenhuma das operações listadas pode ser renegociada | não |
loans_from_different_customers | As operações antigas são de tomadores diferentes | não |
invalid_loan_state | Uma operação antiga não está em estado renegociável | não |
unexpected_error_renegotiating | Falha da IORQ ao processar a renegociação | sim |
credit_vehicle_not_found está reservado no catálogo e hoje não é emitido em nenhuma entrega.
6. Elegibilidade e covenant (E0xx)
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:
code | title | Onde chega |
|---|---|---|
E023 | Renegociação Expirada | renegotiation.invalid, quando a renegociação pré-aprovada expira sem assinatura |
E024 | Documento de Renegociação Inválido | renegotiation.invalid, quando o documento da renegociação é reprovado na validação de lastro |
E026 | Renegociação Reprovada em Covenant | loan.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 emite | Forma |
|---|---|
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 adescriptiondo item carrega, e não o objeto:"reason": "loan_not_found for originator=OP-001 banker=None". E0xxemerrors[](lote de renegociação,E026):reasoné o objeto{"E026": {"title": ..., "description": ...}}.reason_text(a forma serializada dosE0xx, inclusiveE023eE024, e as confirmações de sucesso):reasoné a mesma string. UmE0xxque 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
Updated about 1 month ago
