> ## Documentation Index
> Fetch the complete documentation index at: https://docs.unifokal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Análise de crédito

> Os módulos de crédito consultam dívidas, SCR, Boa Vista, protestos, CADIN e PGFN do CPF lido do documento, com o payload de cada um.

## Análise de crédito

Cinco módulos consultam a situação de crédito do **CPF lido do documento**: `credit_debts` (dívidas e negativações), `credit_scr` (SCR do Banco Central), `credit_boavista` (Boa Vista SCPC), `credit_protests` (protestos Cenprot) e `credit_cadin` (CADIN). Exigem Verificação de Identidade, Face Match e Liveness, pela mesma razão dos cadastrais: o CPF consultado vem do documento, e o documento tem que pertencer a quem está vivo na frente da câmera.

O sexto, `credit_pgfn` (Dívida Ativa da União), é de **empresa**: ele consulta o **CNPJ lido do documento societário** e por isso exige apenas o `cnpj_ocr` no flow, sem biometria, porque empresa não tem rosto. A fonte dele não é fornecedor: é o **dado aberto oficial** que a PGFN publica e atualiza **trimestralmente**, ingerido na nossa base. Cada resposta carimba a **competência publicada** do arquivo que respondeu, para você saber a que mês ela se refere.

**Venda pausada hoje**: os **cinco** de CPF aparecem na tabela de preços e no `GET /v1/capabilities` com preço e status `coming_soon`, e não podem ser ligados num flow enquanto a fonte não for liberada na conta do fornecedor. O `credit_pgfn` saiu dessa fila em 11 de setembro de 2026 e viaja como `available`. O estado vem do catálogo vivo, e esta página acompanha.

**Os cinco de CPF pedem finalidade, relação e consulente**, como a Lei 12.414/2011 manda para dado de crédito. A **finalidade** é do flow: ao montá-lo no painel você declara `credit_purpose`, `credit_risk_analysis` ou `credit_granting` (art. 7º). A **relação** com o titular vai em cada sessão, no campo `credit_relationship` do `POST /v1/verification-sessions`: `existing` ou `prospective` (art. 15). O **consulente** é a sua empresa, e por isso a conta precisa ter o CNPJ cadastrado e verificado. A consulta só sai com a identidade aprovada, e cada uma fica registrada com a finalidade, a relação e o consulente. O `credit_pgfn` não passa por esse portão.

```
// sessão num flow com módulo de crédito
{ "flow_id": "flow_...", "reference_id": "cliente-4821", "credit_relationship": "existing" }

// os 422 do portão, cada um com a prosa na página de erros:
//   credit_relationship_required       flow com crédito e a chamada sem credit_relationship
//   credit_relationship_not_supported  credit_relationship num flow sem módulo de crédito
//   credit_purpose_required            flow com crédito que não declara a finalidade
//   credit_requester_unverified       a conta ainda sem CNPJ cadastrado e verificado
```

São **informacionais**: ter dívida **não reprova a identidade** (o pass/fail é 100% biometria). Os cinco de CPF são **assíncronos** na fonte: o dossiê pode chegar num `verification.completed` posterior, quando a consulta conclui. Enquanto processa, o módulo aparece como `pending` **sem a chave** `data`; concluído, o `data` traz o dossiê do pacote. Se a fonte não concluir na janela, o módulo termina como indisponível e **não é cobrado**.

O `credit_pgfn` responde da **nossa base**, na mesma verificação, e não tem esses dois tempos. Em troca ele carrega a **competência** do arquivo do governo que respondeu, em `reference_period` e `updated_at`, mais a `coverage` por fonte. Quando a base está vencida ou incompleta, ele sai como `pending` com o motivo e **não é cobrado**: um **nada consta** só é emitido com a base inteira dentro do prazo. Achado positivo, ao contrário, é devolvido mesmo com cobertura incompleta, porque **consta** continua verdadeiro.

**Sem dossiê, a chave `data` não vem `null`: ela não existe.** Vale enquanto a fonte processa, quando ela não responde na janela e quando o documento não é encontrado. Um leitor que testa `check.data === null` não pega nenhum desses casos: teste a **presença** da chave, e ramifique por `outcome`.

Aqui o `data` **é** o dossiê da fonte, sem envelope nenhum: não há `flagged`, não há `matched_by`, não há bloco nosso em volta. Valem as mesmas duas regras da [consulta cadastral](https://docs.unifokal.com/modulos/cadastrais.md#modulos-cadastrais): tiramos só `pacoteUsado`, `saldo` e `consultaID`, e **o conjunto de chaves é o do pacote**, não uma lista fechada nossa. Todo dossiê traz o bloco comum `status`, `estado`, `cpf` e `nome`, e os dois primeiros enganam: `status` é o indicador de sucesso da **chamada** (nunca a situação do titular) e `estado` é o estágio do **processamento** (`"concluido"`; a primeira chamada da fonte real pode responder `"processando"`, que tratamos como indisponibilidade temporária). Os valores em dinheiro vêm em **reais com decimais**, e não em centavos como os saldos do topo do webhook.

As duas regras do parágrafo acima valem para os **cinco** de CPF, que repassam o dossiê do fornecedor. O `credit_pgfn` é a exceção nas duas: o payload dele é nosso, então não existe o bloco comum `status`, `estado`, `cpf` e `nome`, e o dinheiro sai em **centavos inteiros**, em `total_amount_cents`.

```
// credit_debts: dossiê concluído (informacional, não reprova)
{ "module": "credit_debts", "passed": true, "outcome": "approved", "score": 100,
  "data": { "score": 742, "classe": "B", "renda_presumida": 4200.5, "possui_debitos": true,
            "total_negativado": 1234.56,
            "negativacoes": [ { "credor": "BANCO EXEMPLO S.A.", "valor": 1234.56,
                                "data": "2026-03-10", "tipo": "Pendencia financeira" } ] } }

// credit_pgfn: Dívida Ativa da União do CNPJ, da NOSSA base do dado aberto da PGFN.
// Os três papéis vêm separados: corresponsável costuma ser dívida de OUTRA empresa.
// Valor em CENTAVOS aqui (só este módulo), e sem número de inscrição: a base agrega
// por documento e por papel. "reference_period" é o mês do arquivo publicado pelo governo,
// e é a MAIS ANTIGA entre as fontes que responderam: o carimbo é o do elo mais velho.
{ "module": "credit_pgfn", "passed": true, "outcome": "approved", "score": 100,
  "data": { "source": "pgfn_open_data", "document": "cnpj",
            "official_source": "Divida Ativa da Uniao, dado aberto oficial da PGFN",
            "reference_period": "202606", "updated_at": "2026-09-02T03:14:00.000Z",
            // uma entrada POR LIVRO da PGFN. "status" é um destes sete: "queried",
            // "disabled", "never_ingested", "ingestion_expired", "reference_period_expired",
            // "empty" (ingeriu e veio sem linha) e "absent" (o livro nem está na base).
            // SÓ "queried" conta como olhada: qualquer outro degrada a resposta para
            // pending, com o motivo, e a checagem não é cobrada. "ingested_at" é quando
            // NÓS ingerimos aquele livro, e não a competência dele: os dois são diferentes
            // e confundi-los é ler frescor de ingestão como frescor de dado.
            // A cobertura vem ORDENADA POR fonte, sempre, e nao na ordem de tamanho dos livros:
            // ordem estavel e o que permite comparar duas respostas sem reordenar.
            "coverage": [ { "source": "pgfn_fgts", "ledger": "FGTS", "status": "queried",
                             "reference_period": "202606",
                             "ingested_at": "2026-09-02T01:12:00.000Z", "records": 541698 },
                           { "source": "pgfn_prev", "ledger": "PREV", "status": "queried",
                             "reference_period": "202606",
                             "ingested_at": "2026-09-02T01:40:00.000Z", "records": 3606529 },
                           { "source": "pgfn_sida", "ledger": "SIDA", "status": "queried",
                             "reference_period": "202606",
                             "ingested_at": "2026-09-02T03:14:00.000Z", "records": 45553971 } ],
            // "statuses" conta a SITUACAO_INSCRICAO (INSCRITA, AJUIZADA, PARCELADA...) e
            // "status_types" conta o TIPO_SITUACAO_INSCRICAO ("Em cobranca", "Garantia",
            // "Suspenso por decisao judicial", "Em negociacao", "Beneficio Fiscal"). São
            // eixos diferentes: exigibilidade suspensa por juiz não é inadimplência, e
            // reportar as duas do mesmo jeito seria menos honesto. "ledgers" diz de quais
            // livros da PGFN as inscrições deste papel vieram.
            "principal": { "listed": true, "registration_count": 4, "total_amount_cents": 345000,
                           "filed_in_court_count": 1,
                           "statuses": { "INSCRITA": 3, "AJUIZADA": 1 },
                           "status_types": { "Em cobranca": 3, "Garantia": 1 },
                           "first_registration_date": "2019-04-18",
                           "last_registration_date": "2025-11-30",
                           "ufs": ["SP"], "ledgers": ["PREV", "SIDA"] },
            // co_responsible e joint_liable têm a MESMA forma do principal, zerados quando
            // "listed" é false: as duas datas vêm null, nunca ausentes e nunca com data sentinela.
            "co_responsible": { "listed": false, "registration_count": 0, "total_amount_cents": 0,
                                "filed_in_court_count": 0, "statuses": {}, "status_types": {},
                                "first_registration_date": null, "last_registration_date": null,
                                "ufs": [], "ledgers": [] },
            "joint_liable": { "listed": false, "registration_count": 0, "total_amount_cents": 0,
                           "filed_in_court_count": 0, "statuses": {}, "status_types": {},
                           "first_registration_date": null, "last_registration_date": null,
                           "ufs": [], "ledgers": [] } } }

// credit_scr: o retrato do SCR do Banco Central
{ "module": "credit_scr", "passed": true, "outcome": "approved", "score": 100,
  "data": { "status": 1, "estado": "concluido",       // sucesso da chamada / estágio do processamento
            "cpf": "12345678900", "nome": "TITULAR MOCK DA SILVA",
            "data_base": "31/07/2026",                // a competência do retrato
            "instituicoes": 3, "operacoes": 5,
            "carteira_credito_total": 18500.0,        // REAIS com decimais, não centavos
            "vencido_ate_90": 0, "prejuizo": 0 } }

// credit_protests: protestos em cartório (Cenprot)
{ "module": "credit_protests", "passed": true, "outcome": "approved", "score": 100,
  "data": { "status": 1, "estado": "concluido",
            "cpf": "12345678900", "nome": "TITULAR MOCK DA SILVA",
            "total_protestos": 1,
            "protestos": [ { "cartorio": "2º Tabelionato de Protesto", "uf": "SP",
                             "valor": 980.0, "data": "05/01/2026" } ] } }

// credit_cadin: pendências inscritas, com atualização de até 7 dias. "Dividas": [] é nada consta.
{ "module": "credit_cadin", "passed": true, "outcome": "approved", "score": 100,
  "data": { "status": 1, "estado": "concluido",
            "data": { "Resumo": { "CPF_CNPJ": "12345678900", "NomeDevedor": "TITULAR MOCK DA SILVA",
                                  "TipoPessoa": "Pessoa física", "TotalDividas": 1,
                                  "ValorTotalConsolidado": "63359.94" },
                      "Dividas": [ { "UF": "SP", "NumeroInscricao": "8026000123456",
                                     "DataInscricao": "15/03/2026", "Valor": "63359.94" } ] } } }

// credit_boavista: score e pendências da Boa Vista SCPC
{ "module": "credit_boavista", "passed": true, "outcome": "approved", "score": 100,
  "data": { "status": 1, "estado": "concluido",
            "cpf": "12345678900", "nome": "TITULAR MOCK DA SILVA",
            "score_boavista": 688, "possui_pendencias": false, "pendencias": [],
            "consultas_ultimos_90d": 2 } }

// ainda processando, ou fonte que não respondeu -> pending, e repare: NÃO existe a chave "data"
{ "module": "credit_scr", "passed": null, "outcome": "pending", "score": 0 }
```

Em sandbox o dossiê vem pronto (sem os dois tempos da fonte real): o desfecho segue o sufixo do documento, como no resto do ambiente de testes.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.