# Benefícios do governo

<https://unifokal.com/docs/modulos/beneficios-gov>

## Benefícios do governo

O módulo `beneficios_gov` confere, na fonte oficial da CGU, se o titular verificado consta como **beneficiário de programa social federal**. Ele é **informacional** e não pede captura nova.

! **Este módulo não pode ser usado para negar serviço por condição socioeconômica.** Ele é informacional por construção: `passed` só assume `true` ou `null`, **nunca `false`**, então não existe desfecho em que constar num programa reprove a verificação. Discriminação por dado sensível é vedada pela LGPD no princípio da **não discriminação** (Lei 13.709/2018, Art. 6º, IX), e o próprio payload carrega essa finalidade escrita no campo `purpose`. Repare que o enquadramento é esse, e não o de dado sensível: constar num programa social **não** é dado sensível pelo rol do Art. 5º, II, e nós não o tratamos como tal.

**Venda pausada hoje.** Ele aparece na tabela de preços e no `GET /v1/capabilities` com preço e status `coming_soon`, e não pode ser ligado num flow enquanto a credencial da fonte não existir. O contrato abaixo é o que já está implementado.

**A cobertura é de quatro programas, e só quatro**: `novo_bolsa_familia`, `seguro_defeso`, `garantia_safra` e `peti`. São os que a fonte expõe por pessoa. BPC e Auxílio Emergencial **não** estão incluídos, e não os anunciamos. A lista viaja em `programs_covered` em toda resposta, justamente para você nunca ter que adivinhar o que foi olhado.

```
// beneficios_gov: consta em um programa (valores em CENTAVOS)
{ "module": "beneficios_gov", "passed": true, "outcome": "approved", "score": 95,
  "data": {
    "programs_covered": ["novo_bolsa_familia","seguro_defeso","garantia_safra","peti"],
    "partial": false, "programs_degraded": [],
    "benefits": {
      "has_any_benefit": true,
      "programs": ["novo_bolsa_familia"],
      "months_on_record": 12,
      "total_received_cents": 720000,     // CENTAVOS (o crédito usa reais; aqui é centavo)
      "records": [ { "program": "novo_bolsa_familia", "months_on_record": 12,
                     "total_cents": 720000,
                     "first_reference": "202509", "last_reference": "202608",  // AAAAMM
                     "history_truncated": false,
                     "amounts_unreadable": 0,
                     "payments": [ { "reference": "202509", "amount_cents": 60000 } ] } ],
      "raw": { "…": "a resposta do órgão, como ela veio" } },
    "purpose": "Confirmar, na fonte oficial da CGU, se o titular verificado consta como beneficiario de programa social federal. Informacional: nao reprova a verificacao e nao pode ser usado para negar servico por condicao socioeconomica (LGPD art. 6, IX)." } }

// PARCIAL: um dos programas da cobertura não respondeu. Lista vazia aqui NÃO é "nada consta".
// Repare que o desfecho continua "approved": a fonte respondeu, só que não sobre tudo.
{ "module": "beneficios_gov", "passed": true, "outcome": "approved", "score": 95,
  "data": {
    "programs_covered": ["novo_bolsa_familia","seguro_defeso","garantia_safra","peti"],
    "partial": true,
    "programs_degraded": ["peti"],       // ESTE não foi consultado nesta passagem
    "benefits": { "has_any_benefit": false, "programs": [], "months_on_record": 0,
                  "total_received_cents": 0, "records": [], "raw": null },
    "purpose": "…" } }
```

**O campo que carrega o módulo é `partial`.** Quando ele vem `true`, algum programa da cobertura **não respondeu**, e a lista vazia ao lado significa "não perguntei a esse", jamais "perguntei e não consta". `programs_degraded` nomeia quais. Ler `has_any_benefit: false` sem olhar `partial` é transformar uma falha de consulta em atestado negativo.

Dois números pedem cuidado. `total_received_cents` e `total_cents` podem estar **subestimados** quando `amounts_unreadable` é maior que zero: parcela cujo valor a fonte não publicou legível entra como zero na soma, e o contador ao lado declara quantas foram. E `months_on_record` só conta o histórico que recebemos: com `history_truncated: true`, ele é um piso e não o total. Quando a fonte não é consultada de forma nenhuma (credencial ausente, portão de identidade fechado), a chave `data` **não vem**, e isso é deliberado: nenhum payload deste módulo pode ser lido como "nada consta" quando nada foi perguntado.
