{"openapi":"3.1.0","info":{"title":"API de Dados Públicos — Portos, Hidrovias, Comércio Exterior, Leilões, Publicações Oficiais e Normas (ANTAQ · ONTL · Comex Stat)","description":"Cinco acervos públicos brasileiros num só lugar:\n\n- **Portos e hidrovias** — 15 painéis da **ANTAQ** e do **ONTL/Infra S.A.**, ~350 mil linhas\n  em 250 quadros, coletados diariamente. Os painéis de origem são aplicações Qlik Sense:\n  mostram números na tela, mas não oferecem os microdados para download. Esta API extrai,\n  normaliza e publica esses microdados.\n- **Comércio exterior** — o **Comex Stat** (MDIC/SECEX) inteiro, 1989→hoje, 141,8 milhões de\n  registros por produto, país, UF, via de transporte e unidade aduaneira, com cadência\n  mensal. Publicado aqui como base consultável e agregável, em vez de 8,7 GB de CSV.\n- **Leilões e audiências** — o histórico das licitações portuárias e das audiências públicas\n  da **ANTAQ**, com o **texto integral** de editais e minutas de contrato, cláusula a\n  cláusula, pesquisável. Ao contrário dos outros dois, este acervo é uma **cópia manual sem\n  atualização automática**: `/v1/leiloes/estado` diz de quando ele é.\n- **Publicações oficiais** — o que a **ANTAQ publicou**, ato a ato, com o **texto integral\n  extraído do PDF**: 21.091 acórdãos, resoluções, portarias, deliberações,\n  atas e termos de 2000 a 2026 —\n  88.972.433 caracteres que não são consultáveis em lugar nenhum, porque o\n  sistema de origem não tem API. Também é **cópia manual**, e termina em\n  2026-08-27: `/v1/publicacoes/estado` diz de quando ela é.\n- **Corpus normativo** — o que a **norma DIZ**, e não quanto/quantos:\n  50 documentos CURADOS e ancorados em artigo (Leis, Decretos,\n  25 Resoluções da ANTAQ, 8 Manuais de Fiscalização e\n  3 obras de terminologia), 2.530 trechos, com busca por\n  palavra e por semelhança semântica. Não é o mesmo acervo que **Publicações oficiais**: lá\n  está o que a ANTAQ publicou, inclusive o que nunca virou norma consolidada. Congelado em\n  2023 e **sem metadado de vigência** — ausência aqui não é ausência de norma.\n\nOs dois primeiros se cruzam de propósito: **98,5% de tudo que o Brasil exporta em peso sai pela água**, e\no Comex Stat é, na prática, uma base de transporte aquaviário que ninguém lê como tal.\n`/v1/comex/portos` liga a URF aduaneira à instalação portuária da ANTAQ, e\n`/v1/comex/reconciliacao` explica — decomposta — por que as duas fontes dão números\ndiferentes para a mesma carga.\n\n### Acesso\n\nLivre, **sem credencial e sem cadastro**. Há limites de uso para conter abuso — veja\n`GET /v1/limites`, que informa sua cota em tempo real. Uma chave opcional (`X-API-Key`)\nmultiplica os limites para quem precisa de volume; ela muda o limite, nunca o conteúdo.\n\n### Como navegar\n\n**Painéis** (ANTAQ · ONTL):\n\n1. `GET /v1/paineis` — que painéis existem.\n2. `GET /v1/paineis/{painel}` — quadros, colunas, filtros sugeridos e **notas de curadoria**.\n3. `GET /v1/paineis/{painel}/quadros/{quadro}/dados` — as linhas (JSON ou `formato=csv`).\n4. `GET /v1/paineis/{painel}/quadros/{quadro}/agregar` — a conta feita no servidor.\n\n**Uma empresa, pelo CNPJ** (transversal):\n\n1. `GET /v1/empresa?termo=` — o dossiê: onde aquele CNPJ (ou nome) aparece em todos os acervos.\n2. `GET /v1/empresas/frota?cnpj=` — as embarcações que ela opera hoje.\n3. `GET /v1/empresas/outorgas?cnpj=` — as outorgas de navegação e há quanto tempo ela é\n   autorizada pela ANTAQ.\n\nAs duas últimas saem em `formato=csv` para alimentar planilha. Duas coisas que elas dizem e\nque quase toda leitura do painel original erra: `idade_media_das_embarcacoes` **não sai do\npainel** — ele não publica ano de construção em quadro nenhum. Sai do cadastro de\nembarcações da ANTAQ (47.555 embarcações,\n29.922 com ano), ligado ao painel pelo **nome** da embarcação, e essa\nligação é deste repositório: cobre 96,1% das linhas de frota\nvigente, e o que não resolve **aparece** em `nao_entraram`, balde a balde, em vez de sumir\ndo denominador. A média nacional por tipo de outorga continua vindo junto, nomeada como do\n**setor** — ela erra por até 9x contra a idade real de uma operadora de travessia. E\n`tempo_de_outorga` é a **união** dos períodos, porque somar as linhas conta duas\nvezes o tempo de outorgas simultâneas — em 740 das\n1.893 empresas outorgadas, e no extremo do acervo dá\n467,7 anos onde o real são 19,3. E cada outorga\ntraz a **sua** travessia em `linha_da_outorga`, que também não sai do painel: vem do cadastro\ninterno de outorgas da ANTAQ (811 vínculos,\n730 termos), é preenchida quando o termo cobre uma travessia só\n(a regra, em 654 deles) e vem `null` quando cobre mais de uma — com\n`linha_da_outorga_estado` dizendo sempre qual é o caso. Sai só o NOME da travessia; o código\n(`AQ 037 002`) vem ao lado, em campo próprio, porque é ele que separa travessias homônimas.\nDo mesmo cadastro vem o **número do ato**, que o painel também não publica:\n`numero_do_termo_de_autorizacao` em 2.425 dos\n2.476 termos, e `instrumento_de_outorga` — o ato de cada publicação —\ncom o tipo colado ao número, porque a origem guarda 'Termo nº 4' e 'Aditamento nº 4' no mesmo\ncampo.\n\n**Comércio exterior** (Comex Stat):\n\n1. `GET /v1/comex/codigos` — sem parâmetro, o mapa das três bases; com `termo`, o código de X\n   **ordenado por valor comerciado** (escolher a NCM errada de soja erra por um fator de 20).\n2. `GET /v1/comex/consulta` — a soma no grão pedido. `periodo` e `agrupar_por` são\n   obrigatórios; `formato=csv` exporta o recorte inteiro.\n3. `GET /v1/comex/portos` — a ponte URF → porto.\n4. `GET /v1/comex/reconciliacao` — por que o número difere do da ANTAQ.\n\n**Leilões e audiências** (ANTAQ):\n\n1. `GET /v1/leiloes` — a lista de processos (`formato=csv` baixa o catálogo inteiro).\n2. `GET /v1/leiloes/{cod}` — um processo: documentos, comunicados, cronograma e prazos.\n3. `GET /v1/leiloes/documentos/{cod}` — o texto integral de um documento, em Markdown.\n4. `GET /v1/leiloes/busca?termo=` — procura dentro das cláusulas.\n\n**Publicações oficiais** (ANTAQ · sistema Sophia):\n\n1. `GET /v1/publicacoes` — a lista de atos; recorte por `especie`, `familia`, `ano`,\n   `criterio_ano`, `vigencia` (`formato=csv` baixa o catálogo, nunca o texto).\n2. `GET /v1/publicacoes?documento=Resolução 1274` — um ato pela CITAÇÃO.\n3. `GET /v1/publicacoes/{codigo_registro}` — um ato pelo id interno do Sophia.\n4. `GET /v1/publicacoes/busca?termo=` — procura no texto integral e devolve trechos citáveis.\n\n**Corpus normativo** (o que a norma DIZ):\n\n1. `GET /v1/normas` — o catálogo dos 50 documentos, com a contagem por tipo.\n2. `GET /v1/normas?documento=Lei 12.815` — um documento pela CITAÇÃO (a citação tem barra e\n   por isso não cabe num segmento de caminho).\n3. `GET /v1/normas/{slug}` — o documento em ORDEM DE LEITURA, trecho a trecho.\n4. `GET /v1/normas/busca?termo=` — procura no texto e devolve trechos com **citação\n   canônica** do dispositivo. `modo=lexical|semantica|hibrida`.\n\nDuas coisas antes de citar. O **rótulo de artigo da origem erra o dispositivo** em parte dos\ntrechos, então a citação só nomeia artigo quando o próprio texto ABRE o dispositivo — nos\ndemais ela sai no grão do documento, com `artigo` nulo, em vez de nomear o artigo errado. E\n**íntegro não é fiel**: em dois documentos a extração do PDF comeu letras, e todo trecho deles\nvem com `texto_com_defeito_de_extracao`. Não há metadado de vigência em lugar nenhum deste\ncorpus.\n\nTrês coisas antes de usar. A **espécie é inferência nossa**, tirada do título: a origem não\npublica esse campo, e `autor`/`esfera`/`tipo_material` são **recusados** como filtro porque\nnão classificam nada. A **data de publicação é nula em 3.492\nregistros** — 100% das Ementas de Acórdão —, então o recorte temporal usa `data_efetiva` por\npadrão e a resposta diz quantos cada critério devolveria. E **\"Em vigor\" é a situação\ndeclarada pelo cadastro, não a garantia de que o texto está atual**:\n98 atos constam \"Em vigor\" dizendo no próprio cabeçalho\nque foram alterados.\n\nDuas coisas antes de usar: o **tipo declarado pela origem discorda do nome do processo em 1 a\ncada 5 registros** (a resposta filtrada por tipo conta e lista os divergentes, em vez de\nescolher calado), e a **maioria dos documentos não tem texto pesquisável** — a ANTAQ não o\npublicou em cláusulas. Por isso toda busca volta com `cobertura_da_busca`: sem esse bloco,\n\"não achei\" se lê como \"a ANTAQ não tratou do assunto\".\n\nPara baixar tudo de uma vez, prefira `GET /v1/dicionario` (catálogo inteiro) e\n`formato=csv` (quadro ou recorte inteiro em streaming) — uma requisição em vez de milhares.\n\n### Honestidade sobre o dado\n\nCada painel traz `notas` com as ressalvas reais da fonte: defasagem, rótulo errado no painel\noriginal, valores sentinela, colunas que só existem como snapshot. Quando uma extração fica\nparcial, a resposta vem com `truncado`, `linhas_origem` e `aviso_truncamento` — o total nunca\né apresentado como se fosse completo.\n\n### Limites de uso\n\nCota medida em **unidades**, não em requisições — consulta custa 2, agregação 5, dossiê 10,\nexportação CSV 60. As rotas `/v1/comex/*` custam 20, e a exportação CSV delas custa **240**:\nelas somam sobre 141,8 milhões de linhas, e um CSV do Comex é um arquivo grande por\nconstrução. As rotas `/v1/leiloes*` custam 4, e 20 na de documento, que é a que move bytes.\nAs rotas `/v1/publicacoes*` custam 6 — a busca varre um índice construído sobre\n88.972.433 caracteres —, 20 na do ato inteiro, e a exportação do catálogo\npaga as 60 da tabela: são 21.091 linhas, e o arquivo tem quase 6 MiB.\nFrota e outorgas por CNPJ custam 8 — inclusive em CSV, que ali é um arquivo de dezenas de\nlinhas e não teria por que pagar o preço de uma exportação em massa.\nAs rotas `/v1/normas*` custam 4, com ou sem `modo=semantica`: o embedding da pergunta custa\nfrações de centavo por hora de cota saturada, e quem fixa o preço é a varredura do índice.\nNão há exportação CSV nesse acervo, em interface nenhuma.\n\nAs respostas de dados são cacheáveis e servidas de uma borda de CDN, então elas trazem apenas\na **política** (`RateLimit-Policy`), não a sua cota: um número por cliente guardado num cache\ncompartilhado seria devolvido a outro, congelado. A cota vai em `GET /v1/limites` (fonte\nautoritativa, nunca cacheada) e nos `429`/`503`, junto com `Retry-After` — que deve ser\nrespeitado. Requisição servida da borda não consome cota.\n\nUse `If-Modified-Since` (com o `Last-Modified` da resposta) ou `If-None-Match` (com o `ETag`):\no `304` é instantâneo.\n\n### Os mesmos dados via MCP\n\nEste acervo também é servido como **servidor MCP** para agentes de IA, com as mesmas funções\ne exatamente os mesmos números (as duas interfaces compartilham o mesmo núcleo).","contact":{"name":"Dados Públicos Aquaviários","url":"https://www.gov.br/antaq"},"license":{"name":"Dados públicos (Lei 12.527/2011) — cite a fonte","url":"https://www.gov.br/antaq"},"version":"1.0.0"},"paths":{"/v1/paineis":{"get":{"tags":["Avançado — acesso genérico"],"summary":"Lista os painéis disponíveis","description":"Ponto de partida: todos os painéis do acervo, com descrição, data da última coleta e\nvolume (quadros e linhas). O campo `painel` é o identificador usado nas demais rotas.","operationId":"listar_paineis_v1_paineis_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/paineis/{painel}":{"get":{"tags":["Avançado — acesso genérico"],"summary":"Estrutura de um painel","description":"Quadros de um painel (tabelas e gráficos), com colunas, filtros e campos de busca\nsugeridos, além das **notas de curadoria** — ressalvas reais da fonte (defasagem,\ncódigos, rótulos errados no painel original) que mudam a leitura do dado.","operationId":"estrutura_v1_paineis__painel__get","parameters":[{"name":"painel","in":"path","required":true,"schema":{"type":"string","title":"Painel"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/paineis/{painel}/quadros":{"get":{"tags":["Avançado — acesso genérico"],"summary":"Quadros de um painel","operationId":"listar_quadros_v1_paineis__painel__quadros_get","parameters":[{"name":"painel","in":"path","required":true,"schema":{"type":"string","title":"Painel"}},{"name":"incluir_ruido","in":"query","required":false,"schema":{"type":"boolean","description":"Inclui os quadros curados como ruído (gráficos redundantes, duplicatas e widgets de texto do Qlik). Eles seguem acessíveis pelo id mesmo quando ocultos.","default":false,"title":"Incluir Ruido"},"description":"Inclui os quadros curados como ruído (gráficos redundantes, duplicatas e widgets de texto do Qlik). Eles seguem acessíveis pelo id mesmo quando ocultos."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/paineis/{painel}/indicadores":{"get":{"tags":["Avançado — acesso genérico"],"summary":"Indicadores-resumo (KPIs) de um painel","description":"KPIs que o painel exibe no topo (nº de TUPs, multas aplicadas, movimentação total...).\nPainel sem KPI responde 200 com `indicadores: []` e um aviso — não é erro.","operationId":"indicadores_v1_paineis__painel__indicadores_get","parameters":[{"name":"painel","in":"path","required":true,"schema":{"type":"string","title":"Painel"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/dicionario":{"get":{"tags":["Avançado — acesso genérico"],"summary":"Catálogo completo em uma resposta","description":"Todo o acervo — painéis, quadros, colunas e notas — num único documento (~100 KB).\nFeito para ETL, catálogos de dados e agentes: baixe uma vez em vez de percorrer rota a\nrota.","operationId":"dicionario_v1_dicionario_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/paineis/{painel}/quadros/{quadro}":{"get":{"tags":["Avançado — acesso genérico"],"summary":"Metadados de um quadro","operationId":"quadro_v1_paineis__painel__quadros__quadro__get","parameters":[{"name":"painel","in":"path","required":true,"schema":{"type":"string","title":"Painel"}},{"name":"quadro","in":"path","required":true,"schema":{"type":"string","title":"Quadro"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/paineis/{painel}/quadros/{quadro}/dados":{"get":{"tags":["Avançado — acesso genérico"],"summary":"Linhas de um quadro (JSON ou CSV)","description":"Linhas de um quadro, com filtro de igualdade, busca textual, ordenação, projeção de\ncolunas e paginação.\n\nPara baixar tudo, use `formato=csv` — uma requisição em vez de milhares, e é o caminho\nque a API prefere que você tome.","operationId":"dados_v1_paineis__painel__quadros__quadro__dados_get","parameters":[{"name":"painel","in":"path","required":true,"schema":{"type":"string","title":"Painel"}},{"name":"quadro","in":"path","required":true,"schema":{"type":"string","title":"Quadro"}},{"name":"filtro","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"description":"Repetível: `filtro=UF=SP&filtro=Ano=2024` (igualdade exata).","default":[],"title":"Filtro"},"description":"Repetível: `filtro=UF=SP&filtro=Ano=2024` (igualdade exata)."},{"name":"filtros","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Alternativa em JSON: `filtros={\"UF\":\"SP\"}` — use quando o nome da coluna tiver `=`, `&` ou `#`.","title":"Filtros"},"description":"Alternativa em JSON: `filtros={\"UF\":\"SP\"}` — use quando o nome da coluna tiver `=`, `&` ou `#`."},{"name":"termo","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"description":"Busca textual parcial nas colunas de busca do quadro (nome, CNPJ, nº de processo).","title":"Termo"},"description":"Busca textual parcial nas colunas de busca do quadro (nome, CNPJ, nº de processo)."},{"name":"ordenar_por","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"description":"Coluna para ordenar (numérica ou textual).","title":"Ordenar Por"},"description":"Coluna para ordenar (numérica ou textual)."},{"name":"ordem","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","default":"asc","title":"Ordem"}},{"name":"coluna","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"maxItems":300,"description":"Repetível: `coluna=Ano&coluna=UF` projeta só essas colunas (vale também no CSV). Omitido, devolve a linha inteira.","default":[],"title":"Coluna"},"description":"Repetível: `coluna=Ano&coluna=UF` projeta só essas colunas (vale também no CSV). Omitido, devolve a linha inteira."},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limite"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":200000,"minimum":0,"default":0,"title":"Offset"}},{"name":"formato","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","description":"`csv` exporta o quadro inteiro em streaming (ignora limite/offset).","default":"json","title":"Formato"},"description":"`csv` exporta o quadro inteiro em streaming (ignora limite/offset)."}],"responses":{"200":{"description":"Linhas do quadro. Com `formato=csv` o corpo é o arquivo CSV completo, em streaming.","content":{"application/json":{"schema":{}},"text/csv":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/paineis/{painel}/quadros/{quadro}/valores":{"get":{"tags":["Avançado — acesso genérico"],"summary":"Valores distintos de uma coluna","description":"Descoberta de dimensões: os valores que a coluna realmente assume, com contagem —\npara montar filtros sem inventar valores.","operationId":"valores_v1_paineis__painel__quadros__quadro__valores_get","parameters":[{"name":"painel","in":"path","required":true,"schema":{"type":"string","title":"Painel"}},{"name":"quadro","in":"path","required":true,"schema":{"type":"string","title":"Quadro"}},{"name":"campo","in":"query","required":true,"schema":{"type":"string","maxLength":300,"description":"Nome da coluna (parâmetro, não caminho: há colunas com '/' no nome).","title":"Campo"},"description":"Nome da coluna (parâmetro, não caminho: há colunas com '/' no nome)."},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":20000,"minimum":1,"default":500,"title":"Limite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/paineis/{painel}/quadros/{quadro}/agregar":{"get":{"tags":["Avançado — acesso genérico"],"summary":"Agrega no servidor (contagem, soma, média, mín, máx)","description":"Faz a conta no banco e devolve só o resultado — sem baixar as linhas.\nEx.: soma de `Valor da Multa` por `Ano` na Fiscalização.\n\n`recorte` aplica um agrupamento curado **por este servidor** — a ANTAQ não publica nenhum.\nEle existe porque `Perfil da Carga = 'Granel Sólido'` **não** quer dizer mineral: a própria\nmetodologia da ANTAQ classifica trigo e soja como granel sólido, e em Fortaleza o perfil\nsozinho supera o recorte em 2,4x a 3,2x. Por padrão FILTRA às mercadorias de dentro; com\n`agrupar_por=recorte` (ou `recorte_balde`) devolve a **partição inteira**, em que somar os\ngrupos reproduz o total do quadro e o balde `nao-catalogado` mostra a mercadoria que a fonte\npassou a publicar e a curadoria ainda não classificou. A convenção volta inteira no payload:\ndefinição, lista aplicada, itens de fronteira e as magnitudes medidas.\n\n`n_grupos` é o total REAL de grupos do recorte e `grupos_retornados` quantos couberam em\n`limite`: quando diferem, a lista está cortada (e vem um `aviso`). Não há paginação de\ngrupos — restrinja com filtros.\n\nPara **quantos X distintos no total**, use `/valores?campo=X` (`n_valores`), que responde\nem uma chamada. `contagem_distinta` responde quantos X distintos **por dimensão**, e somar\nesses valores NÃO dá o total (um X presente em dois grupos conta duas vezes). `n_grupos`\ntambém não substitui: ele conta o grupo de célula vazia ou ausente, que `n_valores` e\n`contagem_distinta` descartam.","operationId":"agregar_v1_paineis__painel__quadros__quadro__agregar_get","parameters":[{"name":"painel","in":"path","required":true,"schema":{"type":"string","title":"Painel"}},{"name":"quadro","in":"path","required":true,"schema":{"type":"string","title":"Quadro"}},{"name":"agrupar_por","in":"query","required":true,"schema":{"type":"array","items":{"type":"string"},"description":"Repetível: `agrupar_por=Ano&agrupar_por=UF`.","title":"Agrupar Por"},"description":"Repetível: `agrupar_por=Ano&agrupar_por=UF`."},{"name":"operacao","in":"query","required":false,"schema":{"type":"string","pattern":"^(contagem|contagem_distinta|soma|media|min|max)$","default":"contagem","title":"Operacao"}},{"name":"medida","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"description":"A coluna medida — obrigatória para soma/media/min/max (numérica) e para contagem_distinta (qualquer coluna).","title":"Medida"},"description":"A coluna medida — obrigatória para soma/media/min/max (numérica) e para contagem_distinta (qualquer coluna)."},{"name":"filtro","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"description":"Repetível: `filtro=UF=SP`.","default":[],"title":"Filtro"},"description":"Repetível: `filtro=UF=SP`."},{"name":"filtros","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Alternativa em JSON.","title":"Filtros"},"description":"Alternativa em JSON."},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Máximo de grupos.","default":100,"title":"Limite"},"description":"Máximo de grupos."},{"name":"recorte","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"description":"Curadoria DESTE SERVIDOR sobre a coluna de mercadoria (ex.: `granel_solido_mineral`). Não é categoria da ANTAQ, e a convenção inteira volta no bloco `recorte`.","title":"Recorte"},"description":"Curadoria DESTE SERVIDOR sobre a coluna de mercadoria (ex.: `granel_solido_mineral`). Não é categoria da ANTAQ, e a convenção inteira volta no bloco `recorte`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/empresas/dossie":{"get":{"tags":["Transversal"],"summary":"Dossiê de uma empresa em todos os painéis","description":"Cruza um CNPJ ou razão social por todos os painéis que identificam empresas —\nfiscalização, outorgas, contratos de porto público, terminais privados, publicações,\nadministração portuária e movimentação do Estatístico Aquaviário — numa chamada só.\n\nCNPJ casa pelos dígitos (ignora pontuação); nome casa por **palavra inteira**, para\n'Vale' não trazer 'Valente'.","operationId":"dossie_v1_empresas_dossie_get","parameters":[{"name":"termo","in":"query","required":true,"schema":{"type":"string","minLength":3,"maxLength":200,"description":"CNPJ (com ou sem pontuação) ou razão social.","title":"Termo"},"description":"CNPJ (com ou sem pontuação) ou razão social."},{"name":"limite_por_fonte","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limite Por Fonte"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/empresas/frota":{"get":{"tags":["Transversal"],"summary":"Frota de embarcações de uma empresa, por CNPJ (JSON ou CSV)","description":"Lista as embarcações que a empresa opera hoje, a partir do CNPJ.\n\nO padrão é a frota VIGENTE: `vigente_em` é hoje e `incluir_historico=False`. Passe\n`incluir_historico=true` para trazer também as passagens já encerradas, ou\n`vigente_em=AAAA-MM-DD` para reproduzir o recorte de uma data passada.\n\n`idade_media_das_embarcacoes` NÃO vem do painel (que não publica ano de construção):\nvem do cadastro de embarcações da ANTAQ, ligado pelo NOME da embarcação. Cite-a sempre\njunto de `embarcacoes_na_conta` e `embarcacoes_na_frota` — o que não resolveu está em\n`nao_entraram`, com o motivo, em vez de ter sumido do denominador. Cada embarcação leva\n`ano_construcao`, `idade_anos` e `idade_resolucao`, e o CSV também. Se a média vier\n`null`, `por_que_null` diz qual dos três casos é; nunca significa frota sem idade.\n\nRebocadores entram por padrão; use `excluir_tipos=rebocador` para tirá-los. `por_tipo`\né medido antes do filtro e as excluídas são contadas à parte.","operationId":"frota_da_empresa_v1_empresas_frota_get","parameters":[{"name":"cnpj","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":32,"description":"Com ou sem pontuação. Zeros à esquerda não precisam ser omitidos nem preservados — a rota normaliza.","title":"Cnpj"},"description":"Com ou sem pontuação. Zeros à esquerda não precisam ser omitidos nem preservados — a rota normaliza."},{"name":"vigente_em","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Data ISO (padrão: hoje).","title":"Vigente Em"},"description":"Data ISO (padrão: hoje)."},{"name":"papel","in":"query","required":false,"schema":{"type":"string","pattern":"^(operadora|proprietaria|qualquer)$","default":"operadora","title":"Papel"}},{"name":"excluir_tipos","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"description":"Repetível. Ex.: `excluir_tipos=rebocador`. Padrão: não exclui nada.","default":[],"title":"Excluir Tipos"},"description":"Repetível. Ex.: `excluir_tipos=rebocador`. Padrão: não exclui nada."},{"name":"incluir_historico","in":"query","required":false,"schema":{"type":"boolean","description":"True traz também as passagens encerradas.","default":false,"title":"Incluir Historico"},"description":"True traz também as passagens encerradas."},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":2000,"title":"Limite"}},{"name":"formato","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","default":"json","title":"Formato"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"text/csv":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/empresas/outorgas":{"get":{"tags":["Transversal"],"summary":"Outorgas de navegação e tempo de outorga, por CNPJ (JSON ou CSV)","description":"Outorgas de navegação da empresa e há quanto tempo ela é autorizada pela ANTAQ.\n\n`tempo_de_outorga` é a **união** dos períodos outorgados. Somar as linhas conta duas\nvezes o tempo coberto por outorgas simultâneas — a resposta traz\n`soma_simples_das_linhas` ao lado só para tornar a diferença visível.\n\nVigência sai da DATA de extinção, não do campo `Outorga Vigente` da origem, que diz\n'Sim' em todas as linhas do acervo e mente em mais de mil. `termos_vigentes` destaca as\nque estão em vigor, e é uma LISTA: uma empresa pode ter várias ao mesmo tempo.\n\n`n_outorgas` conta **termos** — (processo, tipo de navegação) —, não publicações no DOU:\no quadro republica o mesmo termo a cada renovação. O grão de registro sai ao lado, em\n`n_registros_de_outorga`.\n\nCada item traz `numero_do_processo` (sempre) e `numero_do_processo_formatado` como NUP —\n`null` nos processos de 15 dígitos, cuja largura admite duas leituras do ano, ambas\npresentes no acervo. E o NÚMERO DO ATO, que o painel não publica em quadro nenhum e vem\ndo cadastro interno da ANTAQ: `numero_do_termo_de_autorizacao` é o número da autorização\n(\"Termo nº 2456\") e não muda entre as publicações do mesmo termo;\n`instrumento_de_outorga` é o ato daquela publicação (\"Aditamento nº 4\"), com o tipo\ncolado ao número porque os dois moram no mesmo campo da origem; `resolucao_da_outorga`\ntraz a Resolução com o ano, ou nada — sem o ano ela não aponta para ato nenhum. O número\ndo termo **não é chave**: o mesmo processo com dois tipos de navegação compartilha o\ninstrumento, então identifique por (`numero_do_processo`, `tipo_navegacao`).\n`instrumento_estado` e `termo_de_autorizacao_estado` dizem sempre por que um vazio está\nvazio — inclusive `ambiguo_na_origem`, quando a origem tem dois atos na mesma data. E `linha_da_outorga`, a travessia **daquele termo**, que vem do\ncadastro interno de outorgas da ANTAQ e não do painel — cite-a como tal. Vem só o NOME:\na origem publica código e nome colados (\"AQ 037 002 Palestina do Pará (PA) / Ananás\n(TO)\") e o código sai ao lado, em `linha_da_outorga_codigo` — ele é o que distingue\ntravessias homônimas, que existem. Ela é `null`\nquando o termo cobre mais de uma travessia (`linhas_da_outorga` traz sempre a lista, e\n`codigos_da_outorga` é paralela a ela) ou\nquando não há vínculo; `linha_da_outorga_estado` diz sempre qual dos casos, e é ele que\nimpede um vazio de ser lido como \"esta outorga não tem linha\". Para contar as linhas da\nEMPRESA use o bloco `linhas_de_travessia`, que sai uma vez e é outro grão — lá `codigos`\né paralela a `linhas`, e `separacao` diz se o código pôde ser separado do nome.\n\nNo CSV as colunas saem juntas (`linha_da_outorga`, `linha_da_outorga_codigo`,\n`linha_da_outorga_estado`, `linhas_da_outorga`, `codigos_da_outorga`), pela mesma razão\nque `idade_resolucao` acompanha `idade_anos` na\nfrota: o arquivo é o que a planilha lê, e célula vazia sozinha não diz por quê.","operationId":"outorgas_da_empresa_v1_empresas_outorgas_get","parameters":[{"name":"cnpj","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":32,"title":"Cnpj"}},{"name":"vigente_em","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Data ISO (padrão: hoje).","title":"Vigente Em"},"description":"Data ISO (padrão: hoje)."},{"name":"formato","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","default":"json","title":"Formato"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"text/csv":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/comex/consulta":{"get":{"tags":["Comércio exterior"],"summary":"Quanto o Brasil exportou/importou, somado num grão (JSON ou CSV)","description":"Agrega o comércio exterior no grão pedido. **Não devolve linha crua** — são 141\nmilhões — e a única operação é a soma, porque o grão publicado pela origem já vem\nagregado.\n\nNo JSON, acima de `limite` a resposta traz `grupos_omitidos` com a contagem e a soma do\nque ficou de fora: mostrado + omitido = `total`. No CSV **não há truncamento**: um recorte\nacima do teto é recusado com 422 e a contagem exata, porque um CSV cortado no limite abre\nnormalmente e não tem como avisar que está incompleto.","operationId":"comex_consulta_v1_comex_consulta_get","parameters":[{"name":"periodo","in":"query","required":true,"schema":{"type":"string","maxLength":40,"description":"Obrigatório. `2025`, `2025-03`, `2020:2025` ou `2024-01:2024-06`.","title":"Periodo"},"description":"Obrigatório. `2025`, `2025-03`, `2020:2025` ou `2024-01:2024-06`."},{"name":"agrupar_por","in":"query","required":true,"schema":{"type":"array","items":{"type":"string"},"description":"Obrigatório, repetível: `agrupar_por=ncm&agrupar_por=pais`.","title":"Agrupar Por"},"description":"Obrigatório, repetível: `agrupar_por=ncm&agrupar_por=pais`."},{"name":"base","in":"query","required":false,"schema":{"type":"string","pattern":"^(ncm|municipio|nbm)$","default":"ncm","title":"Base"}},{"name":"fluxo","in":"query","required":false,"schema":{"type":"string","maxLength":20,"default":"exportacao","title":"Fluxo"}},{"name":"filtro","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"description":"Repetível: `filtro=via=aquaviaria&filtro=sh4=1201`.","default":[],"title":"Filtro"},"description":"Repetível: `filtro=via=aquaviaria&filtro=sh4=1201`."},{"name":"filtros","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Alternativa em JSON: `filtros={\"pais\":\"160\"}`.","title":"Filtros"},"description":"Alternativa em JSON: `filtros={\"pais\":\"160\"}`."},{"name":"metrica","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"description":"Repetível. Padrão: `vl_fob` e `kg_liquido`. `vl_frete`/`vl_seguro` só na importação.","default":[],"title":"Metrica"},"description":"Repetível. Padrão: `vl_fob` e `kg_liquido`. `vl_frete`/`vl_seguro` só na importação."},{"name":"ordenar_por","in":"query","required":false,"schema":{"type":"string","maxLength":40,"default":"","title":"Ordenar Por"}},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Máximo de grupos (ignorado no CSV).","default":50,"title":"Limite"},"description":"Máximo de grupos (ignorado no CSV)."},{"name":"formato","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","default":"json","title":"Formato"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"text/csv":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/comex/codigos":{"get":{"tags":["Comércio exterior"],"summary":"Qual é o código de X, e o que cada base aceita","description":"Sem nenhum parâmetro devolve o **mapa** das três bases — dimensões, métricas, o que\ncada uma não tem e a cobertura em anos.\n\nA busca ordena por **valor comerciado**, não por relevância textual: `soja` casa com\ndezenas de NCM e a certa responde por 79,8% do valor. Quando a busca desce da escada\n(léxica → parcial → substring → aproximada), a resposta diz em `aviso_busca` qual degrau\nrespondeu.","operationId":"comex_codigos_rota_v1_comex_codigos_get","parameters":[{"name":"termo","in":"query","required":false,"schema":{"type":"string","maxLength":200,"description":"Busca por descrição.","default":"","title":"Termo"},"description":"Busca por descrição."},{"name":"dimensao","in":"query","required":false,"schema":{"type":"string","maxLength":20,"description":"ncm, sh6, sh4, sh2, secao, pais, bloco, uf, mun, urf, porto, via, unid, nbm. Sem `termo`, lista o vocabulário inteiro se ele for pequeno.","default":"","title":"Dimensao"},"description":"ncm, sh6, sh4, sh2, secao, pais, bloco, uf, mun, urf, porto, via, unid, nbm. Sem `termo`, lista o vocabulário inteiro se ele for pequeno."},{"name":"nbm_ncm","in":"query","required":false,"schema":{"type":"string","maxLength":10,"description":"NCM de 8 dígitos ou NBM de 10: atravessa a fronteira de 1997.","default":"","title":"Nbm Ncm"},"description":"NCM de 8 dígitos ou NBM de 10: atravessa a fronteira de 1997."},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":20,"title":"Limite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/comex/portos":{"get":{"tags":["Comércio exterior"],"summary":"Que URFs são este porto (a ponte URF → porto)","description":"O Comex publica por **URF** — jurisdição aduaneira —, a ANTAQ publica por instalação\nportuária, e ninguém publica a ligação. Esta é a curadoria deste repositório.\n\nEla é uma **partição**: toda URF pertence a exatamente um balde, inclusive os que dizem\nque aquilo não é porto (`nao-porto:offshore`, `nao-porto:desembaraco-interior`,\n`nao-porto:nao-mapeado`). É essa propriedade que faz somar por porto devolver o total\naquaviário sem vazamento e sem duplicação — e é por isso que os baldes aparecem no\nresultado em vez de sumir.","operationId":"comex_portos_rota_v1_comex_portos_get","parameters":[{"name":"porto","in":"query","required":false,"schema":{"type":"string","maxLength":80,"description":"Nome ou porto_id (`porto:santos`).","default":"","title":"Porto"},"description":"Nome ou porto_id (`porto:santos`)."},{"name":"urf","in":"query","required":false,"schema":{"type":"string","maxLength":10,"description":"Código de 7 dígitos da unidade da Receita.","default":"","title":"Urf"},"description":"Código de 7 dígitos da unidade da Receita."},{"name":"cobertura","in":"query","required":false,"schema":{"type":"boolean","description":"Em vez da travessia, quanto da curadoria está feito, medido em % do FOB aquaviário.","default":false,"title":"Cobertura"},"description":"Em vez da travessia, quanto da curadoria está feito, medido em % do FOB aquaviário."},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/comex/reconciliacao":{"get":{"tags":["Comércio exterior"],"summary":"Por que a tonelagem do Comex difere da movimentação da ANTAQ","description":"A resposta é a diferença **decomposta**, e ela **não fecha** — isso é resultado, não\npendência.\n\nComponentes com `toneladas: null` existem de propósito: peso bruto contra peso líquido e\ntransbordo contado duas vezes são estruturalmente não quantificáveis com o que as duas\nfontes publicam. No grão do produto a resposta é um **intervalo**, não um número, porque o\nquadro de detalhe da ANTAQ cobre só carga não conteinerizada e o de contêiner não tem\ncoluna de navegação para separar cabotagem.","operationId":"comex_reconciliacao_v1_comex_reconciliacao_get","parameters":[{"name":"ano","in":"query","required":false,"schema":{"type":"integer","maximum":2100,"minimum":1997,"description":"Padrão: o último ano fechado.","default":0,"title":"Ano"},"description":"Padrão: o último ano fechado."},{"name":"porto","in":"query","required":false,"schema":{"type":"string","maxLength":80,"default":"","title":"Porto"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/comex/estado":{"get":{"tags":["Comércio exterior"],"summary":"O que o acervo do Comex está servindo, e de quando","description":"Cobertura por base e fluxo, arquivos conferidos contra a conferência oficial do MDIC,\ne quando cada um entrou. A cadência da origem é mensal (3º ao 7º dia corrido).","operationId":"comex_estado_v1_comex_estado_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/leiloes/busca":{"get":{"tags":["Leilões e audiências"],"summary":"Procura no TEXTO das cláusulas de editais e contratos","description":"Procura cláusula a cláusula, não documento a documento: o que volta é o trecho, com o\ndocumento e o processo de onde ele saiu.\n\n**A resposta traz sempre `cobertura_da_busca`, e ele é a parte que não se pode pular.**\nA maioria dos documentos deste acervo não tem texto em cláusulas — a ANTAQ não publicou —,\ne para a busca eles são invisíveis. Sem esse bloco, \"não achei\" se lê como \"a ANTAQ não\ntratou do assunto\", que é o modo de errar mais caro daqui.\n\n**`formato=csv` é recusado, e a recusa é a decisão.** O corpus tem 27 MB; servi-lo em massa\ntransformaria o egresso desta API em fatura. O `csv` está no vocabulário aceito justamente\npara que a resposta possa dizer isso e apontar o que existe — recusá-lo como parâmetro\ndesconhecido daria um 400 genérico, que se lê como \"esta API não exporta nada\".","operationId":"leiloes_busca_v1_leiloes_busca_get","parameters":[{"name":"termo","in":"query","required":false,"schema":{"type":"string","maxLength":200,"description":"Obrigatório. Busca em português sem acento: `licitacao` e `licitação` devolvem o mesmo. Aceita a sintaxe de `websearch`: aspas para expressão exata, `-` para excluir.","default":"","title":"Termo"},"description":"Obrigatório. Busca em português sem acento: `licitacao` e `licitação` devolvem o mesmo. Aceita a sintaxe de `websearch`: aspas para expressão exata, `-` para excluir."},{"name":"tipo","in":"query","required":false,"schema":{"type":"string","maxLength":30,"description":"leilao, audiencia_publica, consulta_publica, tomada_de_subsidio.","default":"","title":"Tipo"},"description":"leilao, audiencia_publica, consulta_publica, tomada_de_subsidio."},{"name":"criterio_tipo","in":"query","required":false,"schema":{"type":"string","maxLength":20,"description":"Como o filtro por tipo é resolvido: `concordantes` (padrão), `declarado` ou `nome`.","default":"concordantes","title":"Criterio Tipo"},"description":"Como o filtro por tipo é resolvido: `concordantes` (padrão), `declarado` ou `nome`."},{"name":"participacao","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Estreita a um processo.","default":0,"title":"Participacao"},"description":"Estreita a um processo."},{"name":"instalacao","in":"query","required":false,"schema":{"type":"string","maxLength":20,"description":"Código do terminal no nome (STS10, RDJ07…).","default":"","title":"Instalacao"},"description":"Código do terminal no nome (STS10, RDJ07…)."},{"name":"categoria","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Categoria do documento; veja /v1/leiloes/estado.","default":0,"title":"Categoria"},"description":"Categoria do documento; veja /v1/leiloes/estado."},{"name":"incluir_testes","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Incluir Testes"}},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limite"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"formato","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","description":"Só `json`. `csv` existe no vocabulário para ser RECUSADO com o motivo e com o que existe no lugar — ver abaixo.","default":"json","title":"Formato"},"description":"Só `json`. `csv` existe no vocabulário para ser RECUSADO com o motivo e com o que existe no lugar — ver abaixo."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/leiloes/estado":{"get":{"tags":["Leilões e audiências"],"summary":"De onde este acervo veio, quando foi copiado e o que a origem publica vazio","description":"Procedência da cópia: host e schema de origem, se o TLS foi verificado, as contagens\nmedidas **na origem** (é contra elas que a carga reconcilia), as datas máximas de lá e as\ncolunas que a origem publica 100% vazias.\n\nA lista de colunas vazias é medida a cada carga e **some sozinha** no dia em que a origem\ncomeçar a preencher — ao contrário de um comentário no código.","operationId":"leiloes_estado_v1_leiloes_estado_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/leiloes/documentos/{cod}":{"get":{"tags":["Leilões e audiências"],"summary":"Um documento: metadados e o texto integral em Markdown","description":"O texto vem **remontado a partir das cláusulas** publicadas pela ANTAQ, não extraído de\nPDF. Acima de 120 mil caracteres o documento sai **paginado por item**, nunca cortado: um\nedital truncado abre normalmente, parece completo, e a cláusula que faltava é justamente a\nque ninguém procurou.\n\n**Documento sem arquivo responde 200, não 404**, com `conteudo_binario` dizendo o estado, o\nmotivo e onde o arquivo deveria estar. O 404 diria \"este documento não existe\" quando o\ntexto integral costuma estar bem ali, no campo `texto`.\n\n**`formato=csv` é recusado com o motivo**, e não com um 400 de parâmetro desconhecido: o\ntexto de um edital não é tabela, e a recusa nomeia o que existe no lugar.","operationId":"leiloes_documento_v1_leiloes_documentos__cod__get","parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"integer","title":"Cod"}},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Itens por página, quando o documento sai paginado.","default":100,"title":"Limite"},"description":"Itens por página, quando o documento sai paginado."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"formato","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","description":"Só `json`. `csv` é RECUSADO com o motivo — ver abaixo.","default":"json","title":"Formato"},"description":"Só `json`. `csv` é RECUSADO com o motivo — ver abaixo."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/leiloes/{cod}":{"get":{"tags":["Leilões e audiências"],"summary":"Um processo inteiro: documentos, comunicados, cronograma e prazos","description":"Abre um processo pelo `cod_participacao`: a lista de documentos (com quais têm texto), os\ncomunicados, o cronograma e as contagens de participação social.\n\nO cronograma **não tem data de início e fim**, e a ausência é deliberada: o campo de datas\nda origem é inválido em todas as linhas (terminam no ano 1). A data útil está na descrição\ndo evento, como texto livre. Publicar o parse daquele campo daria um intervalo que ordena\nantes de tudo e se lê como cronograma real.\n\nAs contribuições saem **só como contagem**: nome, CPF/CNPJ, e-mail, telefone, endereço e o\nteor de cada uma são dado restrito, não foram copiados e não existem neste banco. A\ndistribuição por UF publica os baldes `--` (UF não declarada) e `--suprimido` (célula\npequena demais), que **aparecem** para a soma por estado continuar fechando com o total.","operationId":"leiloes_processo_v1_leiloes__cod__get","parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"integer","title":"Cod"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/leiloes":{"get":{"tags":["Leilões e audiências"],"summary":"Lista os processos (JSON ou CSV)","description":"A lista dos processos, com recorte por tipo, situação, ano, instalação e nome.\n\n**O tipo declarado pela origem discorda do nome do processo em 1 de cada 5 registros**, e\nisso vem da fonte — não há campo em base nenhuma que resolva. Por isso `tipo` anda com\n`criterio_tipo`, e toda resposta filtrada por tipo traz quantos cada critério devolveria e\n**lista os divergentes**: mostrado + divergentes = universo.\n\n**O CSV não filtra por tipo, e recusa em vez de filtrar.** Num arquivo não há onde pôr o\nbloco dos divergentes — o CSV sairia sem 1 em cada 5 processos, completo e somável. Em\ntroca ele traz as três colunas (`tipo_declarado`, `tipo_pelo_nome`, `tipo_concordancia`):\no corte é de quem lê, e a divergência fica visível.\n\nO texto dos documentos **não** sai em CSV; o único CSV é esta lista.","operationId":"leiloes_catalogo_v1_leiloes_get","parameters":[{"name":"termo","in":"query","required":false,"schema":{"type":"string","maxLength":200,"description":"Procura no NOME do processo. Para procurar no TEXTO dos documentos use /v1/leiloes/busca.","default":"","title":"Termo"},"description":"Procura no NOME do processo. Para procurar no TEXTO dos documentos use /v1/leiloes/busca."},{"name":"tipo","in":"query","required":false,"schema":{"type":"string","maxLength":30,"description":"leilao, audiencia_publica, consulta_publica, tomada_de_subsidio. **Não aceito no CSV** — veja abaixo.","default":"","title":"Tipo"},"description":"leilao, audiencia_publica, consulta_publica, tomada_de_subsidio. **Não aceito no CSV** — veja abaixo."},{"name":"criterio_tipo","in":"query","required":false,"schema":{"type":"string","maxLength":20,"description":"`concordantes` (padrão, só onde a origem e o nome dizem o mesmo), `declarado` (o campo da origem) ou `nome` (inferência deste servidor).","default":"concordantes","title":"Criterio Tipo"},"description":"`concordantes` (padrão, só onde a origem e o nome dizem o mesmo), `declarado` (o campo da origem) ou `nome` (inferência deste servidor)."},{"name":"situacao","in":"query","required":false,"schema":{"type":"string","maxLength":40,"description":"agendada, em_andamento, encerrada, indeterminada_por_data_sentinela, sem_datas.","default":"","title":"Situacao"},"description":"agendada, em_andamento, encerrada, indeterminada_por_data_sentinela, sem_datas."},{"name":"ano","in":"query","required":false,"schema":{"type":"integer","maximum":2100,"minimum":0,"description":"Ano de início publicado.","default":0,"title":"Ano"},"description":"Ano de início publicado."},{"name":"instalacao","in":"query","required":false,"schema":{"type":"string","maxLength":20,"description":"Código do terminal no nome (STS10, RDJ07…).","default":"","title":"Instalacao"},"description":"Código do terminal no nome (STS10, RDJ07…)."},{"name":"incluir_testes","in":"query","required":false,"schema":{"type":"boolean","description":"Registros de teste da equipe do sistema ficam fora por padrão; o resultado sempre diz quantos excluiu.","default":false,"title":"Incluir Testes"},"description":"Registros de teste da equipe do sistema ficam fora por padrão; o resultado sempre diz quantos excluiu."},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limite"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"formato","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","default":"json","title":"Formato"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"text/csv":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/publicacoes/busca":{"get":{"tags":["Publicações oficiais"],"summary":"Procura no TEXTO INTEGRAL dos atos e devolve trechos citáveis","description":"Procura trecho a trecho, não ato a ato: o que volta é o trecho com a citação do ato de\nonde ele saiu, o intervalo de caracteres e o estado da extração daquele pedaço.\n\n**A resposta traz sempre `cobertura_da_busca`.** 90 atos deste acervo não têm texto\nnenhum — a extração do PDF falhou ou o download não veio — e para a busca eles são\nINVISÍVEIS. Sem esse bloco, \"não achei\" se lê como \"a ANTAQ não decidiu isso\".\n\n**E traz sempre `casamento_literal`.** A busca casa por radical: `Pecém`, `peças` e `peça`\nreduzem todas a `pec`. O bloco refaz a conta por `ILIKE`, palavra a palavra, e **só alerta\nquando alguma palavra não aparece literalmente em acerto nenhum** — alerta que dispara\nsempre é papel de parede, e papel de parede não é lido.\n\n**`formato=csv` é recusado, e a recusa é a decisão.** São 79,7 milhões de caracteres;\nservi-los em massa transforma o egresso desta API em fatura. O `csv` está no vocabulário\naceito justamente para que a resposta possa dizer isso e apontar o que existe — recusá-lo\ncomo parâmetro desconhecido daria um 400 genérico, que se lê como \"esta API não exporta\nnada\".","operationId":"publicacoes_busca_v1_publicacoes_busca_get","parameters":[{"name":"termo","in":"query","required":false,"schema":{"type":"string","maxLength":200,"description":"Obrigatório. Busca em português sem acento: `licitacao` e `licitação` devolvem o mesmo. Casa por RADICAL — a resposta traz `casamento_literal`, que refaz a conta palavra a palavra e alerta quando alguma não aparece literalmente.","default":"","title":"Termo"},"description":"Obrigatório. Busca em português sem acento: `licitacao` e `licitação` devolvem o mesmo. Casa por RADICAL — a resposta traz `casamento_literal`, que refaz a conta palavra a palavra e alerta quando alguma não aparece literalmente."},{"name":"modo","in":"query","required":false,"schema":{"type":"string","maxLength":20,"description":"`lexical` (padrão, determinístico, não depende de infraestrutura), `semantica` (índice vetorial) ou `hibrida` (as duas, fundidas por RRF). Sem índice vetorial configurado a busca CAI para lexical e diz que caiu.","default":"lexical","title":"Modo"},"description":"`lexical` (padrão, determinístico, não depende de infraestrutura), `semantica` (índice vetorial) ou `hibrida` (as duas, fundidas por RRF). Sem índice vetorial configurado a busca CAI para lexical e diz que caiu."},{"name":"especie","in":"query","required":false,"schema":{"type":"string","maxLength":60,"description":"A espécie exata, como o Sophia a escreve: 'Resolução', 'Acórdão', 'Portaria de Pessoal DG'. Veja a lista em /v1/publicacoes/estado.","default":"","title":"Especie"},"description":"A espécie exata, como o Sophia a escreve: 'Resolução', 'Acórdão', 'Portaria de Pessoal DG'. Veja a lista em /v1/publicacoes/estado."},{"name":"familia","in":"query","required":false,"schema":{"type":"string","maxLength":40,"description":"O vocabulário fechado acima das espécies: `acordao`, `resolucao`, `portaria_de_pessoal`… É por ele que se responde 'quem foi exonerado'.","default":"","title":"Familia"},"description":"O vocabulário fechado acima das espécies: `acordao`, `resolucao`, `portaria_de_pessoal`… É por ele que se responde 'quem foi exonerado'."},{"name":"ano","in":"query","required":false,"schema":{"type":"integer","maximum":2100,"minimum":0,"default":0,"title":"Ano"}},{"name":"criterio_ano","in":"query","required":false,"schema":{"type":"string","maxLength":20,"description":"Que data governa `ano`/`de`/`ate`. `data_efetiva` (padrão) é a publicação, ou a assinatura quando ela falta — a data de publicação é NULA em 14,4% do acervo.","default":"data_efetiva","title":"Criterio Ano"},"description":"Que data governa `ano`/`de`/`ate`. `data_efetiva` (padrão) é a publicação, ou a assinatura quando ela falta — a data de publicação é NULA em 14,4% do acervo."},{"name":"de","in":"query","required":false,"schema":{"type":"string","maxLength":10,"description":"AAAA-MM-DD, inclusive.","default":"","title":"De"},"description":"AAAA-MM-DD, inclusive."},{"name":"ate","in":"query","required":false,"schema":{"type":"string","maxLength":10,"description":"AAAA-MM-DD, inclusive.","default":"","title":"Ate"},"description":"AAAA-MM-DD, inclusive."},{"name":"vigencia","in":"query","required":false,"schema":{"type":"string","maxLength":40,"description":"em_vigor, revogado, nao_declarada, tornado_sem_efeito, nulo, sem_eficacia. É a situação DECLARADA pelo cadastro — não afirma que o texto está atual.","default":"","title":"Vigencia"},"description":"em_vigor, revogado, nao_declarada, tornado_sem_efeito, nulo, sem_eficacia. É a situação DECLARADA pelo cadastro — não afirma que o texto está atual."},{"name":"com_nota_de_alteracao","in":"query","required":false,"schema":{"type":"boolean","description":"Só os atos cujo próprio cabeçalho diz que foram alterados ou revogados.","default":false,"title":"Com Nota De Alteracao"},"description":"Só os atos cujo próprio cabeçalho diz que foram alterados ou revogados."},{"name":"autor","in":"query","required":false,"schema":{"type":"string","maxLength":120,"description":"**Recusado**, e a recusa é a resposta. Está no contrato para ser ALCANÇÁVEL: o núcleo devolve `filtro_degenerado` citando quantos registros esta coluna coloca num valor só, medido no acervo de hoje — a mesma conta que `/v1/publicacoes/estado` publica em `colunas_que_nao_classificam_nada`. Fora do contrato isto morreria no `parametro_desconhecido` genérico, que se lê como 'escrevi o nome errado' e convida a tentar de novo, em vez de dizer que o campo não classifica nada.","default":"","title":"Autor"},"description":"**Recusado**, e a recusa é a resposta. Está no contrato para ser ALCANÇÁVEL: o núcleo devolve `filtro_degenerado` citando quantos registros esta coluna coloca num valor só, medido no acervo de hoje — a mesma conta que `/v1/publicacoes/estado` publica em `colunas_que_nao_classificam_nada`. Fora do contrato isto morreria no `parametro_desconhecido` genérico, que se lê como 'escrevi o nome errado' e convida a tentar de novo, em vez de dizer que o campo não classifica nada."},{"name":"esfera","in":"query","required":false,"schema":{"type":"string","maxLength":120,"description":"**Recusado** com a medição, como `autor`.","default":"","title":"Esfera"},"description":"**Recusado** com a medição, como `autor`."},{"name":"tipo_material","in":"query","required":false,"schema":{"type":"string","maxLength":120,"description":"**Recusado** com a medição, como `autor` — é a coluna mais degenerada das três.","default":"","title":"Tipo Material"},"description":"**Recusado** com a medição, como `autor` — é a coluna mais degenerada das três."},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limite"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"formato","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","description":"Só `json`. `csv` existe no vocabulário para ser RECUSADO com o motivo e com o que existe no lugar — ver abaixo.","default":"json","title":"Formato"},"description":"Só `json`. `csv` existe no vocabulário para ser RECUSADO com o motivo e com o que existe no lugar — ver abaixo."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/publicacoes/estado":{"get":{"tags":["Publicações oficiais"],"summary":"De onde este acervo veio, quando foi copiado e o que ele NÃO responde","description":"Procedência da cópia, o teto da cobertura, as distribuições por espécie, família,\nvigência e identidade, e a lista do que este acervo não responde.\n\nAs distribuições são medidas a cada chamada e **mudam sozinhas** com a próxima carga — ao\ncontrário de um comentário no código. `colunas_que_nao_classificam_nada` é a medição que\nfundamenta a recusa de `autor`, `esfera` e `tipo_material` como filtro.","operationId":"publicacoes_estado_v1_publicacoes_estado_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/publicacoes/{codigo_registro}":{"get":{"tags":["Publicações oficiais"],"summary":"Um ato inteiro, com o texto integral extraído do PDF","description":"O ato inteiro: identificação, datas, vigência declarada, estado da extração e o texto.\n\n**`identificacao` diz se aquele rótulo identifica o ato**, e o estado vai do pior caso\npara o melhor. A numeração da Resolução reiniciou em 2021 e 45 números servem duas\nresoluções diferentes — a nº 50 existe em 2002 **e** em 2021.\n\n**A Ementa de Acórdão tem o MESMO número e o mesmo ano do acórdão**, e é o resumo (mediana\nde 1.097 caracteres contra 2.176). Quando o ato é um dos dois, a resposta traz o par e diz\nqual é qual: servir a ementa como \"o texto do acórdão\" entrega resumo como fundamentação,\ne o resumo é completo, bem formado e citável.\n\n**'Em vigor' não afirma que o texto está atual.** A situação é declarada pelo cadastro da\nbiblioteca; 94 atos constam 'Em vigor' e dizem no próprio cabeçalho que foram alterados.\nQuando é o caso, `vigencia` nomeia os atos que a nota cita e escreve o conflito.\n\n**`formato=csv` é recusado com o motivo**, e não com um 400 de parâmetro desconhecido: o\ntexto de um ato não é tabela, e a recusa nomeia o que existe no lugar.","operationId":"publicacoes_documento_v1_publicacoes__codigo_registro__get","parameters":[{"name":"codigo_registro","in":"path","required":true,"schema":{"type":"string","maxLength":12,"pattern":"^[0-9]+$","description":"O id INTERNO do Sophia, como aparece no catálogo — não o número do ato. Para citar pelo nome ('Resolução 1274') use `/v1/publicacoes?documento=Resolução 1274`.","title":"Codigo Registro"},"description":"O id INTERNO do Sophia, como aparece no catálogo — não o número do ato. Para citar pelo nome ('Resolução 1274') use `/v1/publicacoes?documento=Resolução 1274`."},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Trechos por página, quando o documento sai paginado. Estes tetos são os de TRECHO de um ato, e não os da busca: aqui os 500 são pedaços do mesmo ato.","default":100,"title":"Limite"},"description":"Trechos por página, quando o documento sai paginado. Estes tetos são os de TRECHO de um ato, e não os da busca: aqui os 500 são pedaços do mesmo ato."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"formato","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","description":"Só `json`. `csv` é RECUSADO com o motivo — ver abaixo.","default":"json","title":"Formato"},"description":"Só `json`. `csv` é RECUSADO com o motivo — ver abaixo."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/publicacoes":{"get":{"tags":["Publicações oficiais"],"summary":"Lista os atos publicados (JSON ou CSV)","description":"A lista dos atos, com recorte por espécie, família, data, vigência e título.\n\n**A espécie é INFERÊNCIA deste servidor, tirada do título** — a origem não publica esse\ncampo (`tipo_material` diz 'Legislação' em 18.381 de 18.381). 13 títulos não têm chave\nnenhuma e ficam num balde que **aparece** no resultado em vez de sumir da soma.\n\n**A data de publicação é nula em 2.639 registros (14,4%), e a nulidade não é aleatória**:\nsão 100% das Ementas de Acórdão e 35,8% das Portarias DG. Um recorte por data de\npublicação sumiria com todas elas em silêncio — por isso o padrão é `data_efetiva`, e o\nbloco `data` diz quantos CADA critério devolveria.\n\n**`autor`, `esfera` e `tipo_material` são recusados como filtro**, com a medição junto:\nnão classificam nada, e filtrar por eles devolveria o acervo inteiro com cara de recorte.\n\n**O CSV exporta a LISTA, nunca o texto** — 28 colunas, com as três de estado\n(`identidade_estado`, `par_estado`, `alteracao_declarada_no_texto`) em toda linha, porque\no arquivo É o que a planilha soma e não há onde pôr a frase que as explica. Acima de\n25.000 linhas a chamada é RECUSADA com a contagem, nunca cortada: um CSV cortado no teto\nabre normalmente no Excel e não tem onde avisar que está incompleto.","operationId":"publicacoes_catalogo_v1_publicacoes_get","parameters":[{"name":"termo","in":"query","required":false,"schema":{"type":"string","maxLength":200,"description":"Procura no TÍTULO e no assunto. Para procurar no TEXTO dos atos use /v1/publicacoes/busca.","default":"","title":"Termo"},"description":"Procura no TÍTULO e no assunto. Para procurar no TEXTO dos atos use /v1/publicacoes/busca."},{"name":"documento","in":"query","required":false,"schema":{"type":"string","maxLength":120,"description":"A CITAÇÃO de UM ato — 'Resolução 1274', 'Acórdão 504/2025'. Quando presente, a resposta é o ato inteiro, como em /v1/publicacoes/{codigo_registro}. Dígitos soltos são RECUSADOS: 694 atos têm um id do Sophia que também é número de ato.","default":"","title":"Documento"},"description":"A CITAÇÃO de UM ato — 'Resolução 1274', 'Acórdão 504/2025'. Quando presente, a resposta é o ato inteiro, como em /v1/publicacoes/{codigo_registro}. Dígitos soltos são RECUSADOS: 694 atos têm um id do Sophia que também é número de ato."},{"name":"especie","in":"query","required":false,"schema":{"type":"string","maxLength":60,"description":"A espécie exata, como o Sophia a escreve. Veja a lista em /v1/publicacoes/estado.","default":"","title":"Especie"},"description":"A espécie exata, como o Sophia a escreve. Veja a lista em /v1/publicacoes/estado."},{"name":"familia","in":"query","required":false,"schema":{"type":"string","maxLength":40,"description":"O vocabulário fechado acima das espécies: `acordao`, `resolucao`, `portaria_de_pessoal`…","default":"","title":"Familia"},"description":"O vocabulário fechado acima das espécies: `acordao`, `resolucao`, `portaria_de_pessoal`…"},{"name":"ano","in":"query","required":false,"schema":{"type":"integer","maximum":2100,"minimum":0,"default":0,"title":"Ano"}},{"name":"criterio_ano","in":"query","required":false,"schema":{"type":"string","maxLength":20,"description":"Que data governa `ano`/`de`/`ate`. A resposta diz quantos CADA critério devolveria — 'publicadas em 2025' tem mais de uma resposta certa.","default":"data_efetiva","title":"Criterio Ano"},"description":"Que data governa `ano`/`de`/`ate`. A resposta diz quantos CADA critério devolveria — 'publicadas em 2025' tem mais de uma resposta certa."},{"name":"de","in":"query","required":false,"schema":{"type":"string","maxLength":10,"description":"AAAA-MM-DD, inclusive.","default":"","title":"De"},"description":"AAAA-MM-DD, inclusive."},{"name":"ate","in":"query","required":false,"schema":{"type":"string","maxLength":10,"description":"AAAA-MM-DD, inclusive.","default":"","title":"Ate"},"description":"AAAA-MM-DD, inclusive."},{"name":"vigencia","in":"query","required":false,"schema":{"type":"string","maxLength":40,"description":"em_vigor, revogado, nao_declarada, tornado_sem_efeito, nulo, sem_eficacia.","default":"","title":"Vigencia"},"description":"em_vigor, revogado, nao_declarada, tornado_sem_efeito, nulo, sem_eficacia."},{"name":"com_nota_de_alteracao","in":"query","required":false,"schema":{"type":"boolean","description":"Só os atos cujo próprio cabeçalho diz que foram alterados ou revogados.","default":false,"title":"Com Nota De Alteracao"},"description":"Só os atos cujo próprio cabeçalho diz que foram alterados ou revogados."},{"name":"autor","in":"query","required":false,"schema":{"type":"string","maxLength":120,"description":"**Recusado**, e a recusa é a resposta. Está no contrato para ser ALCANÇÁVEL: o núcleo devolve `filtro_degenerado` citando quantos registros esta coluna coloca num valor só, medido no acervo de hoje — a mesma conta que `/v1/publicacoes/estado` publica em `colunas_que_nao_classificam_nada`. Fora do contrato isto morreria no `parametro_desconhecido` genérico, que se lê como 'escrevi o nome errado' e convida a tentar de novo, em vez de dizer que o campo não classifica nada.","default":"","title":"Autor"},"description":"**Recusado**, e a recusa é a resposta. Está no contrato para ser ALCANÇÁVEL: o núcleo devolve `filtro_degenerado` citando quantos registros esta coluna coloca num valor só, medido no acervo de hoje — a mesma conta que `/v1/publicacoes/estado` publica em `colunas_que_nao_classificam_nada`. Fora do contrato isto morreria no `parametro_desconhecido` genérico, que se lê como 'escrevi o nome errado' e convida a tentar de novo, em vez de dizer que o campo não classifica nada."},{"name":"esfera","in":"query","required":false,"schema":{"type":"string","maxLength":120,"description":"**Recusado** com a medição, como `autor`.","default":"","title":"Esfera"},"description":"**Recusado** com a medição, como `autor`."},{"name":"tipo_material","in":"query","required":false,"schema":{"type":"string","maxLength":120,"description":"**Recusado** com a medição, como `autor` — é a coluna mais degenerada das três.","default":"","title":"Tipo Material"},"description":"**Recusado** com a medição, como `autor` — é a coluna mais degenerada das três."},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limite"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"formato","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","default":"json","title":"Formato"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"text/csv":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/normas/busca":{"get":{"tags":["Corpus normativo"],"summary":"Procura no TEXTO das normas e devolve trechos com citação canônica","description":"Procura trecho a trecho, não documento a documento: o que volta é o trecho com a\n**citação canônica** do dispositivo de onde ele saiu.\n\n**O ARTIGO exige cuidado, e a resposta o declara.** O rótulo de artigo da base de origem\nerra o dispositivo em parte dos trechos, então a citação só nomeia artigo quando o próprio\ntexto ABRE o dispositivo — remissão ('nos termos do art. 5º da Lei X') e preâmbulo não\ncontam, e nesses casos a citação sai no grão do DOCUMENTO com `artigo` nulo. O breadcrumb\nsegue a mesma regra, para não contradizer a citação.\n\n**ÍNTEGRO não é FIEL.** Em dois documentos (Res. Normativa 7/2016 e Res. 3.259/2014, as do\nprocedimento sancionador) a extração do PDF comeu letras — 'instalaçes', 'contraditrio'. A\nsupressão é irregular, então TODO trecho desses dois vem com\n`texto_com_defeito_de_extracao`: serve para achar e ler o dispositivo, não para transcrever.\n\n**O corpus é uma SELEÇÃO, e a resposta traz sempre `cobertura`.** Ausência aqui NÃO é\nausência de norma; não há metadado de VIGÊNCIA — nada aqui diz se a norma foi revogada — e\nnada é posterior a 2023. Para o que a ANTAQ PUBLICOU (acórdãos, portarias, deliberações,\ncom situação declarada de vigência) a rota é `/v1/publicacoes/busca`.\n\n**`formato=csv` não existe aqui**, e a ausência é decisão, não esquecimento: este acervo\nnão exporta em nenhuma das duas interfaces. O texto de norma sai citável, com o\ndispositivo e a ressalva de extração coladas nele — o que uma linha de planilha não tem\nonde carregar. Um `formato` no contrato responderia `parametro_desconhecido` com a lista\ndo que vale, que é o que ele responde hoje.","operationId":"normas_busca_v1_normas_busca_get","parameters":[{"name":"termo","in":"query","required":false,"schema":{"type":"string","maxLength":200,"description":"Obrigatório. A busca lexical liga os termos por **AND**: frase longa devolve pouco por efeito da conjunção, não do corpus — para exaustividade, termo CURTO.","default":"","title":"Termo"},"description":"Obrigatório. A busca lexical liga os termos por **AND**: frase longa devolve pouco por efeito da conjunção, não do corpus — para exaustividade, termo CURTO."},{"name":"modo","in":"query","required":false,"schema":{"type":"string","maxLength":20,"description":"`lexical` (padrão, full-text do Postgres, cobre o corpus INTEIRO e é determinístico), `semantica` (índice vetorial) ou `hibrida` (as duas). Sem índice vetorial configurado a busca CAI para lexical e diz que caiu, em `busca_semantica` e `modo_efetivo`.","default":"lexical","title":"Modo"},"description":"`lexical` (padrão, full-text do Postgres, cobre o corpus INTEIRO e é determinístico), `semantica` (índice vetorial) ou `hibrida` (as duas). Sem índice vetorial configurado a busca CAI para lexical e diz que caiu, em `busca_semantica` e `modo_efetivo`."},{"name":"tipo_documento","in":"query","required":false,"schema":{"type":"string","maxLength":40,"description":"lei | decreto | resolucao | resolucao_normativa | portaria | manual | dicionario | glossario. Fora do vocabulário é RECUSADO com a lista, nunca devolvido como zero.","default":"","title":"Tipo Documento"},"description":"lei | decreto | resolucao | resolucao_normativa | portaria | manual | dicionario | glossario. Fora do vocabulário é RECUSADO com a lista, nunca devolvido como zero."},{"name":"numero","in":"query","required":false,"schema":{"type":"string","maxLength":20,"description":"O número do ato ('12815', '62').","default":"","title":"Numero"},"description":"O número do ato ('12815', '62')."},{"name":"ano","in":"query","required":false,"schema":{"type":"integer","maximum":2100,"minimum":0,"default":0,"title":"Ano"}},{"name":"tema","in":"query","required":false,"schema":{"type":"string","maxLength":40,"description":"portuario | navegacao | regulatorio | termos. Vocabulário fechado, como `tipo_documento`.","default":"","title":"Tema"},"description":"portuario | navegacao | regulatorio | termos. Vocabulário fechado, como `tipo_documento`."},{"name":"documento","in":"query","required":false,"schema":{"type":"string","maxLength":120,"description":"Procura DENTRO de um documento só — 'Resolução 62/2021', 'Lei 12.815' ou o slug. Para LER o documento em ordem, sem procurar, use /v1/normas/{slug}.","default":"","title":"Documento"},"description":"Procura DENTRO de um documento só — 'Resolução 62/2021', 'Lei 12.815' ou o slug. Para LER o documento em ordem, sem procurar, use /v1/normas/{slug}."},{"name":"artigo","in":"query","required":false,"schema":{"type":"string","maxLength":20,"description":"Recorta o dispositivo ('5', 'art. 5º'). Leia a ressalva sobre o rótulo de artigo abaixo antes de confiar neste recorte para exaustividade.","default":"","title":"Artigo"},"description":"Recorta o dispositivo ('5', 'art. 5º'). Leia a ressalva sobre o rótulo de artigo abaixo antes de confiar neste recorte para exaustividade."},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"default":8,"title":"Limite"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/normas/{slug}":{"get":{"tags":["Corpus normativo"],"summary":"Um documento inteiro, em ordem de leitura","description":"O documento em ordem, trecho a trecho, com a citação de cada um.\n\n**MANUAIS não têm articulado próprio**: eles REPRODUZEM o dispositivo da resolução que\ntipifica (sob 'NORMA:') e comentam. Neles `artigo` é sempre nulo e o artigo reproduzido\nsai em `dispositivo_comentado` — é dispositivo de OUTRA norma, e o corpus não diz de qual.\nPara achá-la, procure o caput em `/v1/normas/busca`. As Ordens de Serviço da SFC são\nexceção: têm articulado próprio e citam artigo normalmente.\n\n**Para procurar DENTRO deste documento**, e não lê-lo em ordem, use\n`/v1/normas/busca?termo=…&documento=<slug>`.","operationId":"normas_documento_v1_normas__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","maxLength":60,"pattern":"^[a-z0-9_]{2,60}$","description":"O identificador do documento, como o catálogo o publica: `lei_12815_2013`, `resolucao_62_2021`, `glosario`. Para citar pelo nome use `/v1/normas?documento=Lei 12.815`.","title":"Slug"},"description":"O identificador do documento, como o catálogo o publica: `lei_12815_2013`, `resolucao_62_2021`, `glosario`. Para citar pelo nome use `/v1/normas?documento=Lei 12.815`."},{"name":"artigo","in":"query","required":false,"schema":{"type":"string","maxLength":20,"description":"Recorta UM dispositivo do documento ('5', 'art. 5º').","default":"","title":"Artigo"},"description":"Recorta UM dispositivo do documento ('5', 'art. 5º')."},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"description":"Trechos por página. O documento sai em ORDEM DE LEITURA, não por relevância.","default":8,"title":"Limite"},"description":"Trechos por página. O documento sai em ORDEM DE LEITURA, não por relevância."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/normas":{"get":{"tags":["Corpus normativo"],"summary":"O catálogo do corpus — ou um documento, pela CITAÇÃO","description":"Os documentos que este corpus tem, com a contagem por tipo e a cobertura declarada.\n\n**O catálogo é a resposta a \"o que existe aqui\", e existe para ser consultado ANTES de\nconcluir que algo não está regulado.** São 50 documentos curados — Leis, Decretos,\nResoluções da ANTAQ, Manuais de Fiscalização e obras de terminologia —, não a base\nnormativa completa da agência.\n\n**Com `documento`, a resposta é o documento inteiro** e não o catálogo. A visão efetiva\nsai declarada no campo `visao` de toda resposta: quem lê o payload nunca precisa deduzir\no que aconteceu a partir do caminho que chamou.\n\n**Para o que a ANTAQ PUBLICOU**, e não para o articulado curado, a rota é\n`/v1/publicacoes` — 18.381 atos até 2025-08-04, com situação declarada de vigência. Aqui\nsão 50 documentos congelados em 2023 e ancorados em artigo. A escolha errada NÃO dá erro:\nprocurar um acórdão aqui devolve lista vazia, que se lê como \"não houve\".","operationId":"normas_catalogo_v1_normas_get","parameters":[{"name":"documento","in":"query","required":false,"schema":{"type":"string","maxLength":120,"description":"A CITAÇÃO de UM documento — 'Resolução 62/2021', 'Lei 12.815', 'LESTA'. Quando presente, a resposta é o documento inteiro, como em /v1/normas/{slug}. É por aqui que se cita pelo nome: a citação tem barra e não cabe num segmento de caminho.","default":"","title":"Documento"},"description":"A CITAÇÃO de UM documento — 'Resolução 62/2021', 'Lei 12.815', 'LESTA'. Quando presente, a resposta é o documento inteiro, como em /v1/normas/{slug}. É por aqui que se cita pelo nome: a citação tem barra e não cabe num segmento de caminho."},{"name":"tipo_documento","in":"query","required":false,"schema":{"type":"string","maxLength":40,"description":"lei | decreto | resolucao | resolucao_normativa | portaria | manual | dicionario | glossario.","default":"","title":"Tipo Documento"},"description":"lei | decreto | resolucao | resolucao_normativa | portaria | manual | dicionario | glossario."},{"name":"ano","in":"query","required":false,"schema":{"type":"integer","maximum":2100,"minimum":0,"default":0,"title":"Ano"}},{"name":"tema","in":"query","required":false,"schema":{"type":"string","maxLength":40,"description":"portuario | navegacao | regulatorio | termos.","default":"","title":"Tema"},"description":"portuario | navegacao | regulatorio | termos."},{"name":"artigo","in":"query","required":false,"schema":{"type":"string","maxLength":20,"description":"Só com `documento`: recorta UM dispositivo dele.","default":"","title":"Artigo"},"description":"Só com `documento`: recorta UM dispositivo dele."},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"description":"Só com `documento` — o catálogo são 50 documentos e sai INTEIRO, sem paginação.","default":8,"title":"Limite"},"description":"Só com `documento` — o catálogo são 50 documentos e sai INTEIRO, sem paginação."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/movimentacao":{"get":{"tags":["Movimentação e desempenho"],"summary":"Quanto se movimentou e transportou (JSON ou CSV)","description":"Movimentação portuária e transporte, sem precisar saber o nome do quadro.\n\n**Dois painéis respondem esta pergunta com números diferentes** — o Estatístico\nAquaviário (ANTAQ) e o de Movimentação Portuária (ONTL/Infra S.A.). O roteador escolhe\npelo que você pediu: dimensão exclusiva de um painel manda nele, período anterior a 2021\nmanda no ONTL. `fonte` declara sempre qual serviu, com as dimensões que o quadro tem, as\nque foram agrupadas e as que foram **somadas** (não filtradas) para chegar ao total.\n\n`medida=movimentacao_portuaria` conta a carga em cada passagem por instalação;\n`medida=transporte` conta a viagem uma vez e **exige `navegacao`**, porque as três\nfamílias se sobrepõem em vias interiores e somá-las duplica dezenas de Mt — a recusa diz\nquantas.\n\nO ano corrente é parcial e os dois painéis discordam nele; `ano_parcial` mede os dois na\nhora e avisa quando a razão passa de 1,05.","operationId":"movimentacao_rota_v1_movimentacao_get","parameters":[{"name":"ano","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Um ano só. Alternativa a `de`/`ate`.","title":"Ano"},"description":"Um ano só. Alternativa a `de`/`ate`."},{"name":"de","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"De"}},{"name":"ate","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ate"}},{"name":"agrupar_por","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"description":"Repetível: `agrupar_por=ano&agrupar_por=uf`.","default":[],"title":"Agrupar Por"},"description":"Repetível: `agrupar_por=ano&agrupar_por=uf`."},{"name":"medida","in":"query","required":false,"schema":{"type":"string","description":"`movimentacao_portuaria` (padrão) ou `transporte`.","default":"movimentacao_portuaria","title":"Medida"},"description":"`movimentacao_portuaria` (padrão) ou `transporte`."},{"name":"navegacao","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Obrigatório com `medida=transporte`.","title":"Navegacao"},"description":"Obrigatório com `medida=transporte`."},{"name":"fonte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Força o painel. Padrão: o roteador escolhe.","title":"Fonte"},"description":"Força o painel. Padrão: o roteador escolhe."},{"name":"recorte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Recorte de mercadoria do EA.","title":"Recorte"},"description":"Recorte de mercadoria do EA."},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":200,"title":"Limite"}},{"name":"formato","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","default":"json","title":"Formato"}},{"name":"filtro","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"description":"Repetível: `filtro=uf=SP`.","default":[],"title":"Filtro"},"description":"Repetível: `filtro=uf=SP`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"text/csv":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/instalacoes":{"get":{"tags":["Movimentação e desempenho"],"summary":"Procura uma instalação portuária pelo nome","description":"Lista as instalações do acervo, para achar a grafia que a origem usa.\n\nÉ o que transforma \"não achei\" em conserto: `Tubarao` não casa `Terminal de Tubarão` por\nigualdade, e uma resposta vazia sem esta rota manda concluir que o terminal parou.","operationId":"instalacoes_rota_v1_instalacoes_get","parameters":[{"name":"termo","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Trecho do nome.","title":"Termo"},"description":"Trecho do nome."},{"name":"uf","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uf"}},{"name":"ano","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ano"}},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/instalacoes/{nome}":{"get":{"tags":["Movimentação e desempenho"],"summary":"Perfil de uma instalação: série, carga, desempenho e berços","description":"Tudo o que o acervo publica sobre uma instalação, num payload só.\n\nCada bloco é independente: o que a fonte não publica sai em `blocos_ausentes`, nomeado,\nem vez de sumir. Nome ambíguo é recusado com a lista de candidatos — escolher um deles\nresponderia sobre outro terminal com a mesma cara de acerto.","operationId":"instalacao_rota_v1_instalacoes__nome__get","parameters":[{"name":"nome","in":"path","required":true,"schema":{"type":"string","title":"Nome"}},{"name":"ano","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ano"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/acidentes":{"get":{"tags":["Acidentes e hidrovias"],"summary":"Acidentes aquaviários, vítimas fatais, feridos e desaparecidos (JSON ou CSV)","description":"Série histórica de acidentes, com vítimas, por um recorte de cada vez.\n\nA ANTAQ publica cada recorte em seu próprio quadro e **não cruza dois** — pedir natureza\ne UF juntos é recusado, porque combinar aqui contaria o mesmo acidente mais de uma vez.\n\nO export do Qlik parte caracteres acentuados: a origem publica `Naufrágio` e\n`Naufr  Ágio` como naturezas diferentes. O filtro casa as duas e diz quais absorveu; erro\nde digitação da origem (`Abalroamento`/`Abalrroamento`) continua separado, porque juntá-los\nseria decidir que a fonte se enganou.","operationId":"acidentes_rota_v1_acidentes_get","parameters":[{"name":"ano","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ano"}},{"name":"de","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"De"}},{"name":"ate","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ate"}},{"name":"agrupar_por","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"`natureza`, `embarcacao`, `uf`, `atividade`, `distrito_naval`, `navegacao` — ou nada, para a série anual.","title":"Agrupar Por"},"description":"`natureza`, `embarcacao`, `uf`, `atividade`, `distrito_naval`, `navegacao` — ou nada, para a série anual."},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limite"}},{"name":"formato","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","default":"json","title":"Formato"}},{"name":"filtro","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"description":"Repetível: `filtro=natureza=Naufrágio`.","default":[],"title":"Filtro"},"description":"Repetível: `filtro=natureza=Naufrágio`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"text/csv":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/acidentes/valores":{"get":{"tags":["Acidentes e hidrovias"],"summary":"Os valores que uma dimensão de acidente aceita","description":"As grafias exatas da origem, inclusive as variantes que o filtro absorve.","operationId":"acidentes_valores_rota_v1_acidentes_valores_get","parameters":[{"name":"dimensao","in":"query","required":true,"schema":{"type":"string","description":"Ex.: `natureza`.","title":"Dimensao"},"description":"Ex.: `natureza`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/hidrovias":{"get":{"tags":["Acidentes e hidrovias"],"summary":"Extensão navegável por rio ou região hidrográfica","description":"Os ~62 mil km de vias interiores navegáveis, por rio ou por região hidrográfica.\n\n**Há duas colunas chamadas \"Extensão\" no painel, e uma delas não é km.** Esta rota serve\na família coerente — a soma por rio e a soma por região fecham entre si com 6 km de\ndiferença. A outra família aparece nomeada em `medida_divergente_na_origem`, com a razão\nmedida, e não é servida como quilometragem: as duas discordam por até 77.880x no mesmo\nrio, e usam os mesmos dez nomes de região.","operationId":"hidrovias_rota_v1_hidrovias_get","parameters":[{"name":"por","in":"query","required":false,"schema":{"type":"string","description":"`rio` (padrão) ou `regiao_hidrografica`.","default":"rio","title":"Por"},"description":"`rio` (padrão) ou `regiao_hidrografica`."},{"name":"termo","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Trecho do nome.","title":"Termo"},"description":"Trecho do nome."},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":300,"title":"Limite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/hidrovias/eclusas":{"get":{"tags":["Acidentes e hidrovias"],"summary":"As eclusas do acervo, com status operacional","description":"Quadro pequeno e sem armadilha: eclusa, UF e situação.","operationId":"eclusas_rota_v1_hidrovias_eclusas_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/hidrovias/carga":{"get":{"tags":["Acidentes e hidrovias"],"summary":"Carga transportada em vias interiores (JSON ou CSV)","description":"Toneladas transportadas em vias interiores, do Estatístico Aquaviário.\n\n**Os quadros desta família não somam o mesmo total.** Perfil, mercadoria e tipo de\nnavegação dão o total canônico; por rio dá ~1,26x e por hidrovia ~1,41x, porque a mesma\ncarga é contada uma vez por via percorrida; por UF dá ~0,37x, porque aqueles quadros\ncobrem só a `Navegação Interior`. `grao_da_contagem` mede o fator no recorte da chamada e\no traz ao lado do total canônico — e no CSV ele vai em coluna.","operationId":"hidrovias_carga_rota_v1_hidrovias_carga_get","parameters":[{"name":"ano","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ano"}},{"name":"de","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"De"}},{"name":"ate","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ate"}},{"name":"agrupar_por","in":"query","required":false,"schema":{"type":"string","description":"`ano`, `rio`, `hidrovia`, `regiao_hidrografica`, `mercadoria`, `perfil`, `navegacao_na_via`, `uf_origem`, `uf_destino`.","default":"ano","title":"Agrupar Por"},"description":"`ano`, `rio`, `hidrovia`, `regiao_hidrografica`, `mercadoria`, `perfil`, `navegacao_na_via`, `uf_origem`, `uf_destino`."},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":300,"title":"Limite"}},{"name":"formato","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","default":"json","title":"Formato"}},{"name":"filtro","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"description":"Repetível: `filtro=rio=Madeira`.","default":[],"title":"Filtro"},"description":"Repetível: `filtro=rio=Madeira`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"text/csv":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/hidrovias/tku":{"get":{"tags":["Acidentes e hidrovias"],"summary":"Tonelada-quilômetro útil por hidrovia","description":"TKU pesa carga E distância — e a origem só o publica para dois tipos de navegação.\n\nNão há TKU de longo curso em via interior, que é a maior fatia da carga. `cobertura` diz\nisso e quantifica; esta rota não estima o que falta.","operationId":"tku_rota_v1_hidrovias_tku_get","parameters":[{"name":"ano","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ano"}},{"name":"de","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"De"}},{"name":"ate","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ate"}},{"name":"navegacao","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"`interior` ou `cabotagem`.","title":"Navegacao"},"description":"`interior` ou `cabotagem`."},{"name":"hidrovia","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hidrovia"}},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":300,"title":"Limite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/fiscalizacao":{"get":{"tags":["Fiscalização e multas"],"summary":"Processos sancionadores agregados","description":"Quantos processos, de quem, por quê e quanto de multa — desde 2014.\n\n**A linha é uma infração julgada, não um processo**: 19.708 linhas para 17.505 processos.\n`registros` e `processos` saem sempre lado a lado.\n\n**`Valor da Multa` tem três ausências com significados diferentes** — arquivado sem\nirregularidade, julgado sem multa, e multado. `estados_do_valor_da_multa` conta as três\nno recorte da chamada; nenhuma delas é multa de valor zero.\n\n**A `Base de Dados` é 710 registros mais curta que os contadores do próprio painel**, e a\nmesma falta aparece no valor (R$ 3,8 mi) e nas infrações julgadas. `cobertura_da_base`\nmede as três na hora.","operationId":"fiscalizacao_rota_v1_fiscalizacao_get","parameters":[{"name":"ano","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ano"}},{"name":"de","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"De"}},{"name":"ate","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ate"}},{"name":"agrupar_por","in":"query","required":false,"schema":{"type":"string","description":"`ano`, `area`, `tipo_fiscalizacao`, `situacao`, `unidade`, `infracao`, `tipo_infracao`, `tipo_decisao`, `empresa`.","default":"ano","title":"Agrupar Por"},"description":"`ano`, `area`, `tipo_fiscalizacao`, `situacao`, `unidade`, `infracao`, `tipo_infracao`, `tipo_decisao`, `empresa`."},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limite"}},{"name":"filtro","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"description":"Repetível: `filtro=unidade=GREST`, `filtro=com_multa=true`.","default":[],"title":"Filtro"},"description":"Repetível: `filtro=unidade=GREST`, `filtro=com_multa=true`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/fiscalizacao/processos":{"get":{"tags":["Fiscalização e multas"],"summary":"Processos sancionadores linha a linha (JSON ou CSV)","description":"O detalhe: processo, empresa, infração, decisão e valor.\n\nO documento da parte sai mascarado quando é **CPF de pessoa natural** (a coluna que a\norigem chama de CNPJ traz os três tipos), e o CPF **não é aceito como filtro**. O\nregistro continua servido, com nome, infração e valor — o que esta API recusa é ser um\níndice de CPF pesquisável, que é ato diferente de publicar um painel.\n\nCada linha traz `multa_estado`, e o CSV também: no arquivo, uma célula de multa vazia\nsem o motivo ao lado entra na `SOMA()` como zero.","operationId":"fiscalizacao_processos_rota_v1_fiscalizacao_processos_get","parameters":[{"name":"ano","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ano"}},{"name":"de","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"De"}},{"name":"ate","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ate"}},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":25000,"minimum":1,"default":500,"title":"Limite"}},{"name":"formato","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","default":"json","title":"Formato"}},{"name":"filtro","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"description":"Repetível: `filtro=documento=02709449000159`, `filtro=empresa=TRANSPETRO`.","default":[],"title":"Filtro"},"description":"Repetível: `filtro=documento=02709449000159`, `filtro=empresa=TRANSPETRO`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"text/csv":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/fiscalizacao/valores":{"get":{"tags":["Fiscalização e multas"],"summary":"Os valores que um campo da fiscalização aceita","description":"As grafias exatas da origem. `documento` é recusado, pela mesma razão da máscara.","operationId":"fiscalizacao_valores_rota_v1_fiscalizacao_valores_get","parameters":[{"name":"campo","in":"query","required":true,"schema":{"type":"string","description":"Ex.: `situacao`, `unidade`.","title":"Campo"},"description":"Ex.: `situacao`, `unidade`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/fiscalizacao/normas":{"get":{"tags":["Fiscalização e multas"],"summary":"O que cada código de infração significa","description":"A ponte entre `Res. nº 3274/2014 32 XXXVIII` e o texto da norma.","operationId":"fiscalizacao_normas_rota_v1_fiscalizacao_normas_get","parameters":[{"name":"infracao","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Trecho do código.","title":"Infracao"},"description":"Trecho do código."},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/multas":{"get":{"tags":["Fiscalização e multas"],"summary":"Cobrança das multas: CADIN, arrecadação, AGU e parcelamentos","description":"As séries anuais de cobrança — painel diferente, grão diferente.\n\nNão se junta com `/v1/fiscalizacao` por ano: uma multa aplicada em 2018 pode ser\narrecadada em 2024 ou nunca, e a diferença entre as duas séries **não é inadimplência**.\n\n`colunas_que_nao_distinguem` avisa quando duas colunas da origem trazem o mesmo número em\ntodas as linhas — hoje é o caso de parcelamentos realizados e pagos, e compará-las daria\n100% de adimplência em todo ano.","operationId":"multas_rota_v1_multas_get","parameters":[{"name":"de","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"De"}},{"name":"ate","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ate"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/terminais":{"get":{"tags":["Terminais e tarifas"],"summary":"Terminais privados: TUP, ETC, IP4 e registros (JSON ou CSV)","description":"Os terminais privados com CNPJ, município, outorga e investimento declarado.\n\n**A situação operacional não se cruza com o terminal**: o painel publica quantos estão em\noperação, e o quadro de detalhe não tem a coluna. Esta rota não responde se um terminal\nespecífico está operando — e dizer \"não\" seria pior que dizer que não sabe.\n\n`Montante de Investimento` é `'-'` em 466 dos 666 e `Número TLO` falta em 435. Cada linha\ntraz `investimento_estado` e `tlo_estado`, e o CSV também: `'-'` não é zero.","operationId":"terminais_rota_v1_terminais_get","parameters":[{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":1000,"title":"Limite"}},{"name":"formato","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","default":"json","title":"Formato"}},{"name":"filtro","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"description":"Repetível: `filtro=uf=PA`, `filtro=tipo=Terminal de uso privado`, `filtro=terminal=Miritituba`.","default":[],"title":"Filtro"},"description":"Repetível: `filtro=uf=PA`, `filtro=tipo=Terminal de uso privado`, `filtro=terminal=Miritituba`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"text/csv":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/arrendamentos":{"get":{"tags":["Terminais e tarifas"],"summary":"Contratos nos portos públicos (JSON ou CSV)","description":"Arrendamentos, passagens, transições, usos temporários e concessões.\n\n**A vigência sai da DATA de expiração, não do quadro de situação do painel** — que\nclassifica 491 dos 559 contratos e discorda desta conta. Os contadores da origem viajam\nno bloco `vigencia`, nomeados, para quem quiser conferir.\n\nO código do contrato **não é chave** (535 códigos para 559 linhas), e o perfil de carga\nexiste só como distribuição agregada: o detalhe não tem a coluna.","operationId":"arrendamentos_rota_v1_arrendamentos_get","parameters":[{"name":"vigencia","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"`vigente` ou `expirado`.","title":"Vigencia"},"description":"`vigente` ou `expirado`."},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":1000,"title":"Limite"}},{"name":"formato","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","default":"json","title":"Formato"}},{"name":"filtro","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"description":"Repetível: `filtro=porto=Santos`, `filtro=tipo=Arrendamento`.","default":[],"title":"Filtro"},"description":"Repetível: `filtro=porto=Santos`, `filtro=tipo=Arrendamento`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"text/csv":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tarifas":{"get":{"tags":["Terminais e tarifas"],"summary":"Tarifas-teto aprovadas, como distribuição","description":"A distribuição de valores por (porto, forma de incidência) — **nunca \"a tarifa\"**.\n\nA hierarquia que desambiguaria os valores (Tabela → Nível → Modalidade → Submodalidade)\nestá em quatro quadros separados, sem chave de junção. Medido: 5.565 dos 36.820 pares\ntêm mais de um valor, um deles com 18 linhas de R$ 300 a R$ 2.613,27. Escolher um\nacertaria uma vez em seis e pareceria certo nas seis.\n\nA captura é 26,6% do que o contador do próprio painel enxerga — `cobertura_da_captura`\nmede. E teto **não é preço cobrado**.","operationId":"tarifas_rota_v1_tarifas_get","parameters":[{"name":"porto","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Porto organizado.","title":"Porto"},"description":"Porto organizado."},{"name":"forma","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Trecho da forma de incidência.","title":"Forma"},"description":"Trecho da forma de incidência."},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tarifas/homologacoes":{"get":{"tags":["Terminais e tarifas"],"summary":"Reajustes e revisões tarifárias homologadas","description":"Os processos homologados, com IRT, investimentos e receita tarifária anual.\n\nAs datas vêm no grão do MÊS (`AAAA-MM`); completá-las com um dia inventaria precisão.","operationId":"homologacoes_rota_v1_tarifas_homologacoes_get","parameters":[{"name":"porto","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Porto"}},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/portos":{"get":{"tags":["Terminais e tarifas"],"summary":"Os portos organizados e suas autoridades portuárias","description":"Porto organizado, autoridade portuária, CNPJ, tipo de exploração e migração da RN 61/2021.","operationId":"portos_rota_v1_portos_get","parameters":[{"name":"uf","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uf"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/status":{"get":{"tags":["Serviço"],"summary":"Frescor dos dados e última coleta","description":"Frescor de cada painel. Separa a **última tentativa** de coleta do **run que está\nsendo servido**: a origem Qlik fica atrás de um desafio da Cloudflare que não resolve\nsempre, então uma tentativa pode falhar sem que a API fique sem aquele painel — ela segue\nservindo a última coleta bem-sucedida, e `defasagem_horas` diz de quando ela é.","operationId":"status_v1_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/limites":{"get":{"tags":["Serviço"],"summary":"Limites de uso e sua cota atual","description":"Quanto você ainda pode consumir agora. A cota é medida em **unidades**, não em\nrequisições: uma listagem custa 2, uma agregação 5, uma rota amigável de painel 6, o\ndossiê 10 e uma exportação CSV 60.","operationId":"limites_v1_limites_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}},"tags":[{"name":"Movimentação e desempenho","description":"Quanto se movimentou e transportou, por instalação, mercadoria, perfil de carga, navegação e UF — e o desempenho operacional de cada instalação. Dois painéis respondem esta pergunta com números diferentes; a resposta declara sempre qual serviu."},{"name":"Fiscalização e multas","description":"Processos sancionadores da ANTAQ desde 2014 — empresa, infração, decisão e valor da multa — e as séries de cobrança (CADIN, arrecadação, AGU, parcelamentos)."},{"name":"Terminais e tarifas","description":"Terminais privados (TUP, ETC, IP4), contratos de arrendamento nos portos públicos, tarifas-teto aprovadas e homologações tarifárias."},{"name":"Acidentes e hidrovias","description":"Acidentes aquaviários com vítimas, por natureza, embarcação, UF e navegação; e as vias interiores: quilometragem navegável, eclusas, carga transportada e TKU."},{"name":"Transversal","description":"Consultas que cruzam vários painéis."},{"name":"Comércio exterior","description":"Comex Stat (MDIC/SECEX), 1989→hoje: quanto o Brasil exportou e importou, por produto, país, UF, via de transporte e porto — e a ponte entre a URF aduaneira e a instalação portuária da ANTAQ."},{"name":"Leilões e audiências","description":"Leilões, audiências e consultas públicas da ANTAQ: o processo, seus documentos e o TEXTO INTEGRAL de editais e minutas de contrato, cláusula a cláusula. Cópia manual de uma base da ANTAQ, sem atualização automática — `/v1/leiloes/estado` diz de quando."},{"name":"Publicações oficiais","description":"Acórdãos, resoluções, portarias e deliberações da ANTAQ, com o TEXTO INTEGRAL do PDF — busca por palavra e por semelhança semântica. A ESPÉCIE do ato é inferência nossa tirada do título: a origem não publica esse campo. Cópia manual do sistema Sophia, sem atualização automática — `/v1/publicacoes/estado` diz de quando, e o teto da cópia sai em toda resposta, porque não achar aqui não é não existir na ANTAQ. Para o ARTICULADO curado e ancorado em artigo — o que a norma DIZ — a etiqueta é `Corpus normativo`: o par de referências é o que impede a escolha errada, e uma seta só orienta quem já abriu a rota certa."},{"name":"Corpus normativo","description":"O que a NORMA DIZ — e não quanto/quantos. 50 documentos CURADOS e ancorados em artigo: Leis, Decretos, 25 Resoluções da ANTAQ, 8 Manuais de Fiscalização e 3 obras de terminologia, com busca por palavra e por semelhança semântica. Não confundir com `Publicações oficiais`, que serve o que a ANTAQ PUBLICOU, inclusive o que nunca virou norma consolidada — procurar a LESTA lá devolve uma resposta completa, bem formada e de outra pergunta. Corpus congelado em 2023 e SEM metadado de vigência: ausência aqui não é ausência de norma."},{"name":"Serviço","description":"Saúde, frescor dos dados e limites de uso."},{"name":"Avançado — acesso genérico","description":"Acesso cru a qualquer quadro de qualquer painel: catálogo, linhas, valores de campo e agregação livre. Exige conhecer o título do quadro e o nome exato das colunas. Para as perguntas comuns, prefira as seções acima — elas escolhem o quadro certo e declaram o que a fonte não responde."}]}