# Consumir o corpus do legisla.bsb.br

> Playbook 04 · v0.2 · atualizado em 2026-08-18
> Como um agente lê o corpus já estruturado deste site — índice JSON, espelhos markdown por norma e âncoras por dispositivo — sem raspar HTML.
>
> Fonte: https://legisla.bsb.br/metodologia/04-consumir-o-corpus/
> Impressão digital: 58d3efad · histórico em https://legisla.bsb.br/metodologia.json
> Método aberto de projeto independente, sem vínculo com GDF
> ou CLDF. Descreve o que as normas dizem; não substitui orientação jurídica.

---
Diferente de um índice de links, este site **hospeda um corpus estruturado**:
normas distritais já segmentadas dispositivo a dispositivo, com situação e link
para a fonte oficial. Para os temas cobertos, é o caminho mais rápido.

**Cobertura atual:** saúde, educação e segurança pública — legislação
**distrital**. Consulte o [mapa de cobertura](/mapa/) para o estado exato.

## Descobrir o acervo

Um único pedido devolve o índice completo (metadados, sem o texto integral):

```
GET https://legisla.bsb.br/normas.json
```

```json
{
  "gerado_em": "2026-08-18",
  "total": 207,
  "temas": { "saude": 50, "educacao": 99, "seguranca": 60 },
  "normas": [
    {
      "id": "lei-5321-2014",
      "titulo": "Lei nº 5.321/2014",
      "tipo": "lei",
      "ano": 2014,
      "situacao": "alterada",
      "temas": ["saude"],
      "ementa": "Institui o Código de Saúde do Distrito Federal.",
      "dispositivos": 1058,
      "url": "https://legisla.bsb.br/normas/lei-5321-2014/",
      "markdown": "https://legisla.bsb.br/normas/lei-5321-2014.md",
      "fonte_url": "https://www.sinj.df.gov.br/sinj/Norma/76331/..."
    }
  ]
}
```

## Ler uma norma

Cada norma tem um **espelho markdown** — texto puro, sem HTML para raspar:

```
GET https://legisla.bsb.br/normas/<id>.md
```

O markdown traz os metadados no topo e os dispositivos com o rótulo oficial,
marcando os revogados. A página HTML equivalente é
`https://legisla.bsb.br/normas/<id>/`.

## Citar um dispositivo

Cada dispositivo tem **âncora estável** na página da norma:

```
https://legisla.bsb.br/normas/lei-5321-2014/#art-5_par-2_inc-2
```

O padrão do id acompanha a hierarquia: `art-5`, `art-5_par-2`,
`art-5_par-2_inc-2`, `art-1_par-unico`.

**Mas a citação de autoridade é a fonte oficial.** Use o `fonte_url` (SINJ-DF)
na resposta ao usuário; a âncora deste site serve para leitura e conferência.
Veja o [Playbook 03](/metodologia/03-regras-de-citacao/).

## Campos e vocabulário

| Campo | Valores |
|---|---|
| `tipo` | `lei`, `lei_complementar`, `lei_organica`, `decreto`, `portaria`, `resolucao`, `instrucao_normativa` |
| `situacao` (da norma) | `vigente`, `alterada`, `revogada`, `suspensa` |
| `vigente` (do dispositivo) | `true` / `false` — **um dispositivo revogado dentro de norma vigente tem `false`** |
| `temas` | `saude`, `educacao`, `seguranca` (uma norma pode ter mais de um) |

A distinção entre `situacao` da norma e `vigente` do dispositivo é o detalhe que
mais evita erro: o Código de Saúde está **alterado** (vigente), mas dezenas de
dispositivos dele estão revogados.

## Perguntar em linguagem natural (demonstração)

Existe uma API de pergunta-resposta com IA **100% local**, ligada apenas
durante demonstrações:

```
POST https://perguntar.legisla.bsb.br/perguntar
Content-Type: application/json
{"pergunta": "..."}
```

Responde em SSE: `status` → `fontes` → `delta`* → `fim`. Fora das
demonstrações, o endpoint fica offline por desenho — o site continua
funcionando normalmente. Não dependa dele; use `normas.json` e os espelhos `.md`.

## Identifique-se: o User-Agent padrão do Python é bloqueado

O site fica atrás de CDN, e a proteção contra bots barra assinaturas conhecidas.
Verificado em produção:

| User-Agent | Resposta |
|---|---|
| `Python-urllib/3.x` (padrão do `urllib`) | **403** |
| `curl/8.x` | 200 |
| `GPTBot`, `ClaudeBot` | 200 |
| Qualquer UA próprio identificado | 200 |

Ou seja: **defina um User-Agent**. Em Python:

```python
req = urllib.request.Request(url, headers={"User-Agent": "meu-agente/1.0 (+contato)"})
```

Um 403 aqui **não** significa que o recurso não existe — significa que você não
se identificou. Vale a mesma lição para as fontes oficiais: o Planalto derruba
a conexão com UA de robô, e ANVISA e ANEEL respondem 403 (ver os
[playbooks 02](/metodologia/02-normas-federais/) e
[06](/metodologia/06-infralegal-federal/)).

## Etiqueta

O site é estático e leve, mas seja educado: prefira `normas.json` (um pedido)
a varrer páginas HTML, e cacheie o que baixar. Todo o conteúdo é texto de norma
— **domínio público** (art. 8º, IV, Lei federal nº 9.610/1998).

---

## Histórico de versões

- **v0.2** (2026-08-18) — Documenta que o User-Agent padrão do Python leva 403 na CDN deste site: um 403 não significa recurso inexistente, significa cliente não identificado.
- **v0.1** (2026-08-18) — Publicação inicial: índice JSON, espelhos markdown por norma e âncoras por dispositivo.
