{"openapi":"3.1.0","servers":[{"url":"https://api.leivigente.com.br"}],"info":{"title":"Lei Vigente","version":"0.1.0","description":"API de legislação brasileira verificada (Planalto, STF, STJ). Leituras do corpus sem chave: 30 req/min por IP. /resolver, /parse e /resolver-texto exigem chave (free: 20 req/min e 1.000/mês; pro: 300 req/min e 50.000/mês). Servidor MCP (Streamable HTTP) em /mcp, com as mesmas regras."},"tags":[{"name":"Verificação","description":"Verifica se citações existem e estão vigentes"},{"name":"Corpus","description":"Navegação e busca no texto das leis e súmulas"},{"name":"Índice","description":"Índice alfabético remissivo (Vade Mecum)"},{"name":"Operacional","description":"Saúde e administração"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Chave de API (vg_live_...) ou ADMIN_TOKEN nas rotas /admin."}},"schemas":{"Diploma":{"type":"object","properties":{"sigla":{"type":"string"},"nome":{"type":"string"},"numero":{"type":"string"},"tipo":{"type":"string","enum":["constituicao","codigo","lei","lei_complementar","decreto_lei","decreto","medida_provisoria","emenda_constitucional"]},"fonte_url":{"type":"string"},"ingested_at":{"type":["string","null"]},"classificacao":{"type":"string","enum":["alteradora","mista","autonoma"]},"areas":{"type":"array","items":{"type":"string"},"description":"Áreas do direito a que o diploma serve (`areas.json`), na ordem de exibição do catálogo. Vazio quando o diploma ainda não foi classificado. Ex.: `[\"constitucional\"]`, `[\"consumidor\",\"civil\"]`. Um diploma pode pertencer a mais de uma — a CF a todas as que ela trata.","example":["civil","empresarial"]}},"required":["sigla","nome","numero","tipo","fonte_url","ingested_at","areas"]},"Erro":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_request","unauthorized","rate_limited","not_found","upstream_error","internal_error"]},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]},"Dispositivo":{"type":"object","properties":{"ref_key":{"type":"string"},"sigla":{"type":"string"},"artigo":{"type":"string"},"paragrafo":{"type":["string","null"]},"inciso":{"type":["string","null"]},"alinea":{"type":["string","null"]},"item":{"type":["string","null"]},"texto":{"type":"string","description":"Texto legal sem as anotações do Planalto. Na linha do artigo, caput + filhos rotulados (um por linha). Em dispositivo revogado: a redação revogada, quando o Planalto a mantém tachada; senão \"\". Vazio também em dispositivo vetado."},"caput_texto":{"type":["string","null"]},"revogado":{"type":"boolean"},"hierarquia":{"type":"string"},"ordem":{"type":"integer"},"anotacoes":{"type":"array","items":{"type":"string"},"description":"Anotações editoriais do Planalto retiradas de `texto`, na ordem em que aparecem, sem os parênteses.","example":["Incluído pela Emenda Constitucional nº 45, de 2004","Vide ADIN 3392"]},"alterado_por":{"type":["string","null"],"description":"Diploma da última anotação \"Redação dada / Incluído / Renumerado pela …\".","example":"Emenda Constitucional nº 45, de 2004"},"revogado_por":{"type":["string","null"],"description":"Diploma da anotação \"Revogado pela …\". Null quando não há (ex.: medida provisória rejeitada)."},"alterador":{"type":"boolean","description":"true quando o texto é um comando que altera outro diploma."},"comando":{"type":["string","null"],"description":"Trecho do comando antes do bloco entre aspas (null se não for alterador)."},"altera":{"type":"array","items":{"type":"string"},"description":"Alvos do comando (ref_keys, ou o diploma citado quando fora do corpus)."}},"required":["ref_key","sigla","artigo","paragrafo","inciso","alinea","item","texto","caput_texto","revogado","hierarquia","ordem","anotacoes","alterado_por","revogado_por","alterador","comando","altera"]},"IndiceExport":{"type":"object","properties":{"versao":{"type":"string","description":"Impressão digital do índice; é também o `ETag`. Mudou = baixe de novo.","example":"41872-1790000000000"},"total_termos":{"type":"integer"},"total_entradas":{"type":"integer"},"termos":{"type":"array","items":{"type":"object","properties":{"termo":{"type":"string","example":"Homicídio"},"chave":{"type":"string","example":"homicidio"},"entradas":{"type":"array","items":{"type":"object","properties":{"subtermo":{"type":["string","null"],"example":"qualificado"},"ref_key":{"type":"string","example":"CP.121.2"}},"required":["subtermo","ref_key"]}}},"required":["termo","chave","entradas"]}}},"required":["versao","total_termos","total_entradas","termos"]},"IndiceTermo":{"type":"object","properties":{"termo":{"type":"string","example":"Embargos de declaração"},"chave":{"type":"string","description":"`termo` sem acento e minúsculo: agrupa e ordena.","example":"embargos de declaracao"},"entradas":{"type":"integer","description":"Quantas entradas este termo tem."}},"required":["termo","chave","entradas"]},"IndiceEntrada":{"type":"object","properties":{"subtermo":{"type":["string","null"],"example":"cabimento"},"ref_key":{"type":"string","example":"CPC.1022"},"sigla":{"type":"string","example":"CPC"},"artigo":{"type":"string","example":"1022"}},"required":["subtermo","ref_key","sigla","artigo"]},"Sumula":{"type":"object","properties":{"ref_key":{"type":"string"},"tribunal":{"type":"string","enum":["STF","STJ"],"example":"STJ"},"numero":{"type":"integer"},"vinculante":{"type":"boolean"},"cancelada":{"type":"boolean"},"texto":{"type":"string"}},"required":["ref_key","tribunal","numero","vinculante","cancelada","texto"]},"ResumoVerificacao":{"type":"object","properties":{"total":{"type":"integer"},"por_status":{"type":"object","additionalProperties":{"type":"integer"}},"todas_confirmadas":{"type":"boolean"}},"required":["total","por_status","todas_confirmadas"]},"CitacaoExtraida":{"oneOf":[{"type":"object","properties":{"tipo":{"type":"string","enum":["dispositivo"]},"sigla":{"type":["string","null"]},"artigo":{"type":"string"},"paragrafo":{"type":["string","null"]},"inciso":{"type":["string","null"]},"alinea":{"type":["string","null"]},"item":{"type":["string","null"]},"caput":{"type":"boolean"},"rotulo":{"type":"string"},"offset":{"type":"integer"},"fim":{"type":"integer"},"diploma_inferido":{"type":"boolean"},"inferencia":{"type":"object","properties":{"origem":{"type":"string","enum":["anafora","mencao_anterior"]},"sigla":{"type":"string"},"offset_mencao":{"type":"integer"},"distancia":{"type":"integer"}},"required":["origem","sigla","offset_mencao","distancia"]}},"required":["tipo","sigla","artigo","paragrafo","inciso","alinea","item","caput","rotulo","offset","fim","diploma_inferido"]},{"type":"object","properties":{"tipo":{"type":"string","enum":["sumula"]},"tribunal":{"type":["string","null"]},"numero":{"type":"integer"},"vinculante":{"type":"boolean"},"rotulo":{"type":"string"},"offset":{"type":"integer"},"fim":{"type":"integer"}},"required":["tipo","tribunal","numero","vinculante","rotulo","offset","fim"]},{"type":"object","properties":{"tipo":{"type":"string","enum":["tema"]},"tribunal":{"type":["string","null"]},"numero":{"type":"integer"},"sistematica":{"type":["string","null"],"enum":["repercussao_geral","repetitivo","irdr","iac",null]},"rotulo":{"type":"string"},"offset":{"type":"integer"},"fim":{"type":"integer"}},"required":["tipo","tribunal","numero","sistematica","rotulo","offset","fim"]},{"type":"object","properties":{"tipo":{"type":"string","enum":["oj"]},"tribunal":{"type":["string","null"]},"orgao":{"type":["string","null"]},"numero":{"type":"integer"},"rotulo":{"type":"string"},"offset":{"type":"integer"},"fim":{"type":"integer"}},"required":["tipo","tribunal","orgao","numero","rotulo","offset","fim"]},{"type":"object","properties":{"tipo":{"type":"string","enum":["enunciado"]},"orgao":{"type":["string","null"]},"numero":{"type":"integer"},"rotulo":{"type":"string"},"offset":{"type":"integer"},"fim":{"type":"integer"}},"required":["tipo","orgao","numero","rotulo","offset","fim"]}]},"Resolucao":{"type":"object","properties":{"status":{"type":"string","enum":["verificado","verificado_parcial","verificado_inferido","revogado","cancelada","nao_encontrado","diploma_desconhecido","ambiguo","nao_suportado"]},"ref_key":{"type":"string"},"texto":{"type":"string"},"hierarquia":{"type":"string"},"revogado":{"type":"boolean"},"anotacoes":{"type":"array","items":{"type":"string"}},"alterado_por":{"type":["string","null"]},"revogado_por":{"type":["string","null"]},"cancelada":{"type":"boolean"},"vinculante":{"type":"boolean"},"alterador":{"type":"boolean"},"altera":{"type":"array","items":{"type":"string"}},"parcial":{"type":"object","properties":{"nivel":{"type":"string","enum":["paragrafo","inciso","alinea","item"]},"valor":{"type":"string"},"encontrado":{"type":"string"}},"required":["nivel","valor","encontrado"]},"sugestao":{"type":"array","items":{"type":"object","properties":{"ref_key":{"type":"string"},"artigo":{"type":"string"},"trecho":{"type":"string"}},"required":["ref_key","artigo","trecho"]}},"candidatos":{"type":"array","items":{"$ref":"#/components/schemas/Candidato"}},"total_candidatos":{"type":"integer","description":"ambiguo: candidatos antes do limite."},"candidatos_truncados":{"type":"boolean","description":"ambiguo: true quando a lista foi cortada pelo limite."},"contexto":{"type":"string"},"diploma_citado":{"$ref":"#/components/schemas/DiplomaCitado"},"mensagem":{"type":"string"}},"required":["status"]},"Candidato":{"type":"object","properties":{"ref_key":{"type":"string","example":"CPC.219"},"sigla":{"type":"string","example":"CPC"},"texto":{"type":"string","description":"Caput do dispositivo candidato, até ~600 caracteres."},"rank":{"type":"number","description":"Similaridade com o contexto da citação (0–1+)."},"pista_area":{"type":"string","description":"Expressão da pista de área que contribuiu para a posição."}},"required":["ref_key","sigla","texto","rank"]},"DiplomaCitado":{"type":"object","properties":{"tipo":{"type":"string","example":"lei"},"sigla":{"type":"string"},"numero":{"type":"string","example":"6830"},"ano":{"type":"integer","example":1980},"versao":{"type":"string","example":"1973"},"rotulo":{"type":"string","example":"Lei 6.830/80"}},"required":["tipo","rotulo"]},"CitacaoDispositivo":{"type":"object","properties":{"sigla":{"type":"string","minLength":1,"maxLength":20,"example":"CF"},"artigo":{"type":"string","minLength":1,"maxLength":12,"example":"5"},"paragrafo":{"type":["string","null"],"maxLength":12,"example":"1"},"inciso":{"type":["string","null"],"maxLength":12,"example":"LXXVIII"},"alinea":{"type":["string","null"],"maxLength":4,"example":"a"},"item":{"type":["string","null"],"maxLength":4},"caput":{"type":["boolean","null"],"description":"true para devolver só o caput do artigo, não o artigo inteiro."},"rotulo":{"type":["string","null"],"maxLength":500,"example":"a todos são assegurados a razoável duração do processo","description":"Frase que descreve o que a citação afirma (não a citação em si); usada para sugerir candidatos quando o dispositivo não existe. Tokens de citação (art., §, números, siglas) são ignorados."}},"required":["sigla","artigo"]},"CitacaoTema":{"type":"object","properties":{"tipo":{"type":"string","enum":["tema"]},"tribunal":{"type":["string","null"],"maxLength":20,"example":"STJ"},"numero":{"type":"integer","exclusiveMinimum":0},"sistematica":{"type":["string","null"],"enum":["repercussao_geral","repetitivo","irdr","iac",null],"example":"repercussao_geral"}},"required":["tipo","numero"]},"CitacaoOj":{"type":"object","properties":{"tipo":{"type":"string","enum":["oj"]},"tribunal":{"type":["string","null"],"maxLength":20,"example":"TST"},"orgao":{"type":["string","null"],"maxLength":20,"example":"SDI-1"},"numero":{"type":"integer","exclusiveMinimum":0}},"required":["tipo","numero"]},"CitacaoEnunciado":{"type":"object","properties":{"tipo":{"type":"string","enum":["enunciado"]},"orgao":{"type":["string","null"],"maxLength":80,"example":"FONAJE"},"numero":{"type":"integer","exclusiveMinimum":0}},"required":["tipo","numero"]},"CitacaoSumula":{"type":"object","properties":{"tribunal":{"type":"string","minLength":1,"maxLength":20,"example":"STJ","description":"Tribunal da súmula. STF e STJ são verificados; qualquer outro volta com status nao_suportado."},"numero":{"type":"integer","exclusiveMinimum":0,"example":7},"vinculante":{"type":["boolean","null"],"description":"Omitido: tenta a súmula comum e, no STF, a vinculante."}},"required":["tribunal","numero"]},"Health":{"type":"object","properties":{"status":{"type":"string","enum":["ok","degraded"]},"banco":{"type":"string","enum":["ok","erro"]},"agora":{"type":"string"},"diplomas":{"type":"array","items":{"type":"object","properties":{"sigla":{"type":"string"},"ingested_at":{"type":["string","null"]},"ultima_ingestao":{"type":["object","null"],"properties":{"id":{"type":"integer"},"fonte":{"type":"string"},"status":{"type":"string","enum":["ok","erro","sem_mudanca"]},"iniciado_em":{"type":"string"},"finalizado_em":{"type":["string","null"]},"erro":{"type":["string","null"]}},"required":["id","fonte","status","iniciado_em","finalizado_em","erro"]}},"required":["sigla","ingested_at","ultima_ingestao"]}},"sumulas":{"type":"array","items":{"type":"object","properties":{"fonte":{"type":"string"},"ultima_ingestao":{"type":["object","null"],"properties":{"id":{"type":"integer"},"fonte":{"type":"string"},"status":{"type":"string","enum":["ok","erro","sem_mudanca"]},"iniciado_em":{"type":"string"},"finalizado_em":{"type":["string","null"]},"erro":{"type":["string","null"]}},"required":["id","fonte","status","iniciado_em","finalizado_em","erro"]}},"required":["fonte","ultima_ingestao"]}}},"required":["status","banco","agora","diplomas","sumulas"]},"IngestRun":{"type":"object","properties":{"id":{"type":"integer"},"fonte":{"type":"string"},"sigla":{"type":["string","null"]},"status":{"type":"string","enum":["ok","erro","sem_mudanca"]},"iniciado_em":{"type":"string"},"finalizado_em":{"type":["string","null"]},"erro":{"type":["string","null"]}},"required":["id","fonte","sigla","status","iniciado_em","finalizado_em","erro"]}},"parameters":{}},"paths":{"/v1/diplomas":{"get":{"operationId":"listarDiplomas","tags":["Corpus"],"summary":"Lista os diplomas ativos","responses":{"200":{"description":"Diplomas com contagem de artigos e data da última ingestão","content":{"application/json":{"schema":{"type":"object","properties":{"diplomas":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/Diploma"},{"type":"object","properties":{"artigos":{"type":"integer"}},"required":["artigos"]}]}}},"required":["diplomas"]}}}}}}},"/v1/diplomas/{sigla}":{"get":{"operationId":"consultarDiploma","tags":["Corpus"],"summary":"Metadados e sumário hierárquico de um diploma","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":20,"example":"CPC"},"required":true,"name":"sigla","in":"path"}],"responses":{"200":{"description":"Diploma","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Diploma"},{"type":"object","properties":{"artigos":{"type":"integer"},"sumario":{"type":"array","items":{"type":"object","properties":{"hierarquia":{"type":"string"},"artigo_inicial":{"type":"string"},"artigo_final":{"type":"string"},"artigos":{"type":"integer"}},"required":["hierarquia","artigo_inicial","artigo_final","artigos"]}}},"required":["artigos","sumario"]}]}}}},"404":{"description":"Diploma desconhecido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}},"/v1/diplomas/{sigla}/export":{"get":{"operationId":"exportarDiploma","tags":["Corpus"],"summary":"Exporta um diploma inteiro (todos os dispositivos) para uso offline","description":"Metadados, sumário e todos os dispositivos do diploma em ordem de leitura, em uma única resposta (comprimida quando o cliente aceita gzip). Pensado para snapshots offline: um pedido por diploma. Cacheável por 24 h; `snapshot_at` é a data da última ingestão que alterou o diploma.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":20,"example":"CPC"},"required":true,"name":"sigla","in":"path"}],"responses":{"200":{"description":"Diploma completo","headers":{"Cache-Control":{"schema":{"type":"string","example":"public, max-age=86400"},"required":true}},"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Diploma"},{"type":"object","properties":{"artigos":{"type":"integer"},"sumario":{"type":"array","items":{"type":"object","properties":{"hierarquia":{"type":"string"},"artigo_inicial":{"type":"string"},"artigo_final":{"type":"string"},"artigos":{"type":"integer"}},"required":["hierarquia","artigo_inicial","artigo_final","artigos"]}},"snapshot_at":{"type":"string","example":"2026-08-27T13:35:42.282Z"},"dispositivos":{"type":"array","items":{"$ref":"#/components/schemas/Dispositivo"}}},"required":["artigos","sumario","snapshot_at","dispositivos"]}]}}}},"404":{"description":"Diploma desconhecido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}},"/v1/diplomas/{sigla}/artigos/{artigo}":{"get":{"operationId":"consultarArtigo","tags":["Corpus"],"summary":"Artigo completo com parágrafos, incisos, alíneas e itens","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":20,"example":"CPC"},"required":true,"name":"sigla","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":12,"example":"1003","description":"\"1003\", \"5\" ou \"5-A\""},"required":true,"description":"\"1003\", \"5\" ou \"5-A\"","name":"artigo","in":"path"}],"responses":{"200":{"description":"Artigo","content":{"application/json":{"schema":{"type":"object","properties":{"diploma":{"type":"object","properties":{"sigla":{"type":"string"},"nome":{"type":"string"}},"required":["sigla","nome"]},"ref_key":{"type":"string"},"artigo":{"type":"string"},"hierarquia":{"type":"string"},"revogado":{"type":"boolean"},"caput":{"type":["string","null"]},"texto":{"type":"string"},"anotacoes":{"type":"array","items":{"type":"string"}},"alterado_por":{"type":["string","null"]},"revogado_por":{"type":["string","null"]},"ordem":{"type":"integer","description":"Posição da linha do artigo na ordem de leitura do diploma (mesma escala de `dispositivos[].ordem`)."},"dispositivos":{"type":"array","items":{"$ref":"#/components/schemas/Dispositivo"}},"anterior":{"type":["string","null"]},"proximo":{"type":["string","null"]}},"required":["diploma","ref_key","artigo","hierarquia","revogado","caput","texto","anotacoes","alterado_por","revogado_por","ordem","dispositivos","anterior","proximo"]}}}},"404":{"description":"Diploma ou artigo desconhecido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}},"/v1/aliases":{"get":{"operationId":"listarAliases","tags":["Corpus"],"summary":"Apelidos e abreviações dos diplomas","description":"Tabela `sigla → apelidos` usada pelo resolvedor de citações (\"Código Civil\", \"CF/88\", \"Lei Maria da Penha\"…). Estática por versão da API; clientes offline a baixam junto com o acervo para reconhecer citações de diplomas novos sem atualizar o aplicativo. Cacheável por 24 h.","responses":{"200":{"description":"Apelidos por sigla","headers":{"Cache-Control":{"schema":{"type":"string","example":"public, max-age=86400"},"required":true}},"content":{"application/json":{"schema":{"type":"object","properties":{"aliases":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}},"example":{"CF":["Constituição Federal","CF/88"],"CC":["Código Civil"]}}},"required":["aliases"]}}}}}}},"/v1/areas":{"get":{"operationId":"listarAreas","tags":["Corpus"],"summary":"Áreas do direito e os diplomas de cada uma","description":"Ramos do direito (penal, civil, constitucional, tributário…) usados para filtrar o acervo. Devolve o catálogo (`slug` estável + rótulo pt-BR + ordem) e o mapa `sigla → [slug]`: um diploma pode pertencer a mais de uma área. Estático por versão da API, como `/v1/aliases` — clientes offline baixam uma vez e filtram sem rede. Cacheável por 7 dias.","responses":{"200":{"description":"Catálogo e mapa por diploma","headers":{"Cache-Control":{"schema":{"type":"string","example":"public, max-age=604800"},"required":true}},"content":{"application/json":{"schema":{"type":"object","properties":{"areas":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","example":"penal"},"label":{"type":"string","example":"Penal"},"ordem":{"type":"integer","description":"Ordem de exibição do catálogo.","example":50},"diplomas":{"type":"integer","description":"Quantos diplomas ativos estão nesta área (para a UI mostrar o tamanho do filtro).","example":23}},"required":["slug","label","ordem","diplomas"]}},"diplomas":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}},"description":"Sigla → slugs das áreas, na ordem do catálogo. Sigla ausente = sem área.","example":{"CDC":["consumidor","civil"],"CP":["penal"]}}},"required":["areas","diplomas"]}}}}}}},"/v1/dispositivos/{ref_key}":{"get":{"operationId":"consultarDispositivo","tags":["Corpus"],"summary":"Dispositivo por ref_key","parameters":[{"schema":{"type":"string","minLength":3,"example":"CPC.1003.5","description":"SIGLA.artigo seguido só dos níveis existentes: parágrafo (número ou `unico`), inciso (romano maiúsculo), alínea (minúscula), item. Ex.: `CF.5.LXXVIII`, `CF.5.1.IV.a.1`, `SUM.STJ.7`."},"required":true,"description":"SIGLA.artigo seguido só dos níveis existentes: parágrafo (número ou `unico`), inciso (romano maiúsculo), alínea (minúscula), item. Ex.: `CF.5.LXXVIII`, `CF.5.1.IV.a.1`, `SUM.STJ.7`.","name":"ref_key","in":"path"}],"responses":{"200":{"description":"Dispositivo","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Dispositivo"}}}},"404":{"description":"Não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}},"/v1/dispositivos/{ref_key}/versoes":{"get":{"operationId":"versoesDispositivo","tags":["Corpus"],"summary":"Redações anteriores de um dispositivo","parameters":[{"schema":{"type":"string","minLength":3,"example":"CPC.1003.5","description":"SIGLA.artigo seguido só dos níveis existentes: parágrafo (número ou `unico`), inciso (romano maiúsculo), alínea (minúscula), item. Ex.: `CF.5.LXXVIII`, `CF.5.1.IV.a.1`, `SUM.STJ.7`."},"required":true,"description":"SIGLA.artigo seguido só dos níveis existentes: parágrafo (número ou `unico`), inciso (romano maiúsculo), alínea (minúscula), item. Ex.: `CF.5.LXXVIII`, `CF.5.1.IV.a.1`, `SUM.STJ.7`.","name":"ref_key","in":"path"}],"responses":{"200":{"description":"Versões, da mais recente para a mais antiga","content":{"application/json":{"schema":{"type":"object","properties":{"ref_key":{"type":"string"},"texto_atual":{"type":"string"},"versoes":{"type":"array","items":{"type":"object","properties":{"texto":{"type":"string"},"alterado_por":{"type":["string","null"]},"detectado_em":{"type":"string"},"ingest_run_id":{"type":"integer"}},"required":["texto","alterado_por","detectado_em","ingest_run_id"]}}},"required":["ref_key","texto_atual","versoes"]}}}},"404":{"description":"Não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}},"/v1/indice/export":{"get":{"operationId":"exportarIndice","tags":["Índice"],"summary":"Índice remissivo inteiro, para uso offline","description":"Todos os termos com suas entradas, ordenados pela `chave`, numa resposta só (o app guarda o índice no aparelho). Mande o `ETag` recebido em `If-None-Match`: sem mudança, a resposta é `304` sem corpo.","parameters":[{"schema":{"type":"string","description":"ETag de uma exportação anterior."},"required":false,"description":"ETag de uma exportação anterior.","name":"if-none-match","in":"header"}],"responses":{"200":{"description":"Índice completo","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndiceExport"}}}},"304":{"description":"Índice igual ao do `If-None-Match`"}}}},"/v1/indice/termos":{"get":{"operationId":"listarIndiceTermos","tags":["Índice"],"summary":"Termos do índice alfabético remissivo","description":"Lista os assuntos do índice (Vade Mecum), ordenados alfabeticamente pela `chave` (sem acento, minúscula). Cada termo traz quantas entradas agrupa. Use `q` para filtrar por trecho do termo. Busque as entradas de um termo em `GET /v1/indice/termos/{chave}`.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":60,"description":"Filtra termos que contenham este trecho (sem acento).","example":"prescri"},"required":false,"description":"Filtra termos que contenham este trecho (sem acento).","name":"q","in":"query"},{"schema":{"type":"integer","minimum":1,"default":1,"example":1},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50,"example":50},"required":false,"name":"page_size","in":"query"}],"responses":{"200":{"description":"Termos paginados","content":{"application/json":{"schema":{"type":"object","properties":{"page":{"type":"integer"},"page_size":{"type":"integer"},"total":{"type":"integer"},"items":{"type":"array","items":{"$ref":"#/components/schemas/IndiceTermo"}}},"required":["page","page_size","total","items"]}}}}}}},"/v1/indice/termos/{chave}":{"get":{"operationId":"consultarIndiceTermo","tags":["Índice"],"summary":"Entradas de um termo do índice","description":"Devolve as entradas de um termo (pela `chave` devolvida em `/v1/indice/termos`): o `subtermo` (quando houver) e o `ref_key` do dispositivo mais específico, que o app abre. O subtermo principal vem primeiro (`subtermo: null`).","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":80,"example":"embargos de declaracao","description":"A `chave` do termo."},"required":true,"description":"A `chave` do termo.","name":"chave","in":"path"}],"responses":{"200":{"description":"Termo e suas entradas","content":{"application/json":{"schema":{"type":"object","properties":{"termo":{"type":"string"},"chave":{"type":"string"},"entradas":{"type":"array","items":{"$ref":"#/components/schemas/IndiceEntrada"}}},"required":["termo","chave","entradas"]}}}},"404":{"description":"Termo não está no índice","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}},"/v1/sumulas":{"get":{"operationId":"listarSumulas","tags":["Corpus"],"summary":"Lista súmulas (paginado)","parameters":[{"schema":{"type":"string","enum":["STF","STJ"],"example":"STJ"},"required":false,"name":"tribunal","in":"query"},{"schema":{"type":"boolean"},"required":false,"name":"vinculante","in":"query"},{"schema":{"type":"boolean"},"required":false,"name":"cancelada","in":"query"},{"schema":{"type":"integer","minimum":1,"default":1,"example":1},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50,"example":50},"required":false,"name":"page_size","in":"query"}],"responses":{"200":{"description":"Súmulas","content":{"application/json":{"schema":{"type":"object","properties":{"page":{"type":"integer"},"page_size":{"type":"integer"},"total":{"type":"integer"},"items":{"type":"array","items":{"$ref":"#/components/schemas/Sumula"}}},"required":["page","page_size","total","items"]}}}}}}},"/v1/sumulas/{tribunal}/{numero}":{"get":{"operationId":"consultarSumula","tags":["Corpus"],"summary":"Súmula por tribunal e número","parameters":[{"schema":{"type":"string","enum":["STF","STJ"],"example":"STJ"},"required":true,"name":"tribunal","in":"path"},{"schema":{"type":"integer","exclusiveMinimum":0},"required":true,"name":"numero","in":"path"},{"schema":{"type":"boolean","description":"true para Súmula Vinculante do STF"},"required":false,"description":"true para Súmula Vinculante do STF","name":"vinculante","in":"query"}],"responses":{"200":{"description":"Súmula","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Sumula"}}}},"404":{"description":"Não encontrada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}},"/v1/busca":{"get":{"operationId":"buscar","tags":["Corpus"],"summary":"Busca textual em dispositivos e súmulas","description":"Full-text search (tsvector 'portuguese', sintaxe websearch: aspas para frase, - para excluir).","parameters":[{"schema":{"type":"string","minLength":2,"maxLength":300,"example":"razoável duração do processo"},"required":true,"name":"q","in":"query"},{"schema":{"type":"string","example":"CF,CPC","description":"Lista de siglas separadas por vírgula"},"required":false,"description":"Lista de siglas separadas por vírgula","name":"siglas","in":"query"},{"schema":{"type":"string","enum":["todos","dispositivos","sumulas"],"default":"todos"},"required":false,"name":"tipo","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":50,"default":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","enum":["true","false"],"default":"true","description":"false remove dispositivos alteradores dos resultados."},"required":false,"description":"false remove dispositivos alteradores dos resultados.","name":"incluir_alteradores","in":"query"}],"responses":{"200":{"description":"Resultados ordenados por relevância, com trecho destacado (<b>)","content":{"application/json":{"schema":{"type":"object","properties":{"q":{"type":"string"},"resultados":{"type":"array","items":{"type":"object","properties":{"tipo":{"type":"string","enum":["dispositivo","sumula"]},"ref_key":{"type":"string"},"sigla":{"type":["string","null"]},"artigo":{"type":["string","null"]},"tribunal":{"type":["string","null"],"enum":["STF","STJ",null],"example":"STJ"},"numero":{"type":["integer","null"]},"vinculante":{"type":["boolean","null"]},"inativo":{"type":"boolean","description":"revogado (dispositivo) ou cancelada (súmula)"},"alterador":{"type":"boolean","description":"dispositivo cujo texto altera outro diploma"},"trecho":{"type":"string"},"rank":{"type":"number"}},"required":["tipo","ref_key","sigla","artigo","tribunal","numero","vinculante","inativo","alterador","trecho","rank"]}}},"required":["q","resultados"]}}}}}}},"/v1/alteracoes":{"get":{"operationId":"listarAlteracoes","tags":["Corpus"],"summary":"Feed de alterações detectadas pelas ingestões (paginado)","description":"Cada item traz o estado atual do dispositivo (revogado, alterado_por, revogado_por) para montar um digest sem chamadas extras.","parameters":[{"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}],"example":"2026-01-01"},"required":false,"name":"desde","in":"query"},{"schema":{"type":"string","example":"CF,CPC","description":"Lista de siglas separadas por vírgula"},"required":false,"description":"Lista de siglas separadas por vírgula","name":"siglas","in":"query"},{"schema":{"type":"string","example":"dispositivo_alterado,dispositivo_revogado"},"required":false,"name":"tipos","in":"query"},{"schema":{"type":"integer","minimum":1,"default":1,"example":1},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50,"example":50},"required":false,"name":"page_size","in":"query"}],"responses":{"200":{"description":"Alterações, da mais recente para a mais antiga","content":{"application/json":{"schema":{"type":"object","properties":{"page":{"type":"integer"},"page_size":{"type":"integer"},"total":{"type":"integer"},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"tipo":{"type":"string","enum":["dispositivo_alterado","dispositivo_incluido","dispositivo_revogado","sumula_incluida","sumula_cancelada"]},"ref_key":{"type":"string"},"sigla":{"type":["string","null"]},"detectado_em":{"type":"string"},"ingest_run_id":{"type":"integer"},"revogado":{"type":["boolean","null"],"description":"Estado atual do dispositivo; null em itens de súmula."},"alterado_por":{"type":["string","null"],"description":"Diploma da última anotação \"Redação dada / Incluído pela …\" do dispositivo, hoje."},"revogado_por":{"type":["string","null"],"description":"Diploma da anotação \"Revogado pela …\" do dispositivo, hoje."}},"required":["id","tipo","ref_key","sigla","detectado_em","ingest_run_id","revogado","alterado_por","revogado_por"]}}},"required":["page","page_size","total","items"]}}}}}}},"/v1/consulta":{"get":{"operationId":"consultarCitacao","tags":["Corpus"],"summary":"Consulta rápida de uma citação digitada (sem chave)","description":"Para caixas de busca: interpreta até 200 caracteres (ex.: \"art. 5º, LXXVIII, da CF\" ou \"Súmula 7 do STJ\") e devolve até 3 citações com o texto oficial e o status, no mesmo formato de /resolver-texto. Não exige chave (limite de leitura por IP). Para conferir textos inteiros, use /resolver-texto.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":200,"example":"art. 5º, LXXVIII, da CF"},"required":true,"name":"q","in":"query"}],"responses":{"200":{"description":"Citações reconhecidas com sua resolução (lista vazia quando nada foi reconhecido)","content":{"application/json":{"schema":{"type":"object","properties":{"resumo":{"$ref":"#/components/schemas/ResumoVerificacao"},"citacoes":{"type":"array","items":{"type":"object","properties":{"citacao":{"$ref":"#/components/schemas/CitacaoExtraida"},"resolucao":{"$ref":"#/components/schemas/Resolucao"}},"required":["citacao","resolucao"]}}},"required":["resumo","citacoes"]}}}},"400":{"description":"Consulta vazia ou longa demais","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}},"/v1/resolver":{"post":{"operationId":"resolverCitacoes","tags":["Verificação"],"summary":"Verifica citações estruturadas","description":"Até 100 citações por chamada. A resposta mantém a ordem. Status: verificado, verificado_parcial, verificado_inferido, revogado, cancelada, nao_encontrado, diploma_desconhecido, ambiguo, nao_suportado. Súmula de tribunal fora de STF/STJ e citações do tipo tema, oj ou enunciado voltam como nao_suportado.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"citacoes":{"type":"array","items":{"anyOf":[{"$ref":"#/components/schemas/CitacaoDispositivo"},{"$ref":"#/components/schemas/CitacaoTema"},{"$ref":"#/components/schemas/CitacaoOj"},{"$ref":"#/components/schemas/CitacaoEnunciado"},{"$ref":"#/components/schemas/CitacaoSumula"}]},"minItems":1,"maxItems":100}},"required":["citacoes"]}}}},"responses":{"200":{"description":"Uma resolução por citação, na mesma ordem","content":{"application/json":{"schema":{"type":"object","properties":{"resultados":{"type":"array","items":{"$ref":"#/components/schemas/Resolucao"}}},"required":["resultados"]}}}},"400":{"description":"Corpo inválido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}},"/v1/parse":{"post":{"operationId":"extrairCitacoes","tags":["Verificação"],"summary":"Extrai citações de texto livre","description":"Regex + tabela de apelidos (src/config/aliases.json). Sem IA. Devolve o offset de cada citação.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"texto":{"type":"string","minLength":1,"maxLength":20000}},"required":["texto"]}}}},"responses":{"200":{"description":"Citações encontradas, em ordem de aparição","content":{"application/json":{"schema":{"type":"object","properties":{"citacoes":{"type":"array","items":{"$ref":"#/components/schemas/CitacaoExtraida"}}},"required":["citacoes"]}}}},"400":{"description":"Corpo inválido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}},"/v1/resolver-texto":{"post":{"operationId":"resolverTexto","tags":["Verificação"],"summary":"Extrai e verifica citações de texto livre (/parse + /resolver)","description":"Para sugestões em nao_encontrado, usa como rótulo a frase ao redor da citação (sem a citação em si).","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"texto":{"type":"string","minLength":1,"maxLength":20000},"max_candidatos":{"type":"integer","minimum":0,"maximum":25,"default":10,"description":"Candidatos por citação ambígua (0 devolve só total_candidatos). Padrão 10."}},"required":["texto"]}}}},"responses":{"200":{"description":"Cada citação extraída com sua resolução","content":{"application/json":{"schema":{"type":"object","properties":{"resumo":{"$ref":"#/components/schemas/ResumoVerificacao"},"citacoes":{"type":"array","items":{"type":"object","properties":{"citacao":{"$ref":"#/components/schemas/CitacaoExtraida"},"resolucao":{"$ref":"#/components/schemas/Resolucao"}},"required":["citacao","resolucao"]}}},"required":["resumo","citacoes"]}}}},"400":{"description":"Corpo inválido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}},"/v1/health":{"get":{"operationId":"health","tags":["Operacional"],"summary":"Estado do banco e data da última ingestão por diploma","responses":{"200":{"description":"Saudável","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}},"503":{"description":"Banco indisponível","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}}}}},"/v1/admin/ingest-runs":{"get":{"operationId":"listarIngestRuns","tags":["Operacional"],"summary":"Últimas execuções de ingestão (requer ADMIN_TOKEN)","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":500,"default":50},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Execuções, da mais recente para a mais antiga","content":{"application/json":{"schema":{"type":"object","properties":{"runs":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/IngestRun"},{"type":"object","properties":{"relatorio":{"type":"object","additionalProperties":{}}},"required":["relatorio"]}]}}},"required":["runs"]}}}},"401":{"description":"Sem ADMIN_TOKEN","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}}},"webhooks":{}}