Consumir o corpus do legisla.bsb.br
Como um agente lê o corpus já estruturado deste site — índice JSON, espelhos markdown por norma e âncoras por dispositivo — sem raspar HTML.
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 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
{
"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.
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:
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 e 06).
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
Servimos apenas a versão corrente. Se você citou uma versão anterior deste método, é aqui que descobre o que mudou desde então — e em /metodologia.json há a mesma informação em JSON, com uma impressão digital do conteúdo para detectar mudança automaticamente.
- v0.2
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
Publicação inicial: índice JSON, espelhos markdown por norma e âncoras por dispositivo.