{"openapi":"3.1.0","info":{"title":"Dados B3","description":"Dados fundamentalistas de companhias abertas brasileiras com metodologia 100% pública e invariantes de dado publicados. Fontes: CVM (dados abertos, ODbL) e B3 (COTAHIST fim-de-dia). Todo número carrega a conta CVM de origem; valor duvidoso carrega flag, nunca estimativa escondida.","version":"0.1.0"},"paths":{"/empresas/{ticker}/veredito":{"get":{"summary":"Veredito Json","description":"O veredito em FATO COMPARATIVO (Bloco 2, 23/09/2026): seis números em\ntrês perguntas, cada um com faixa numérica e comparação (setor, própria\nhistória, universo), mais a bandeira de confiança do RETRATO. Uma frase\nde topo de até 25 palavras, sem adjetivo de julgamento.\n\nABERTO, sem chave: é resumo, e a página da companhia — que já é aberta —\nmostra os mesmos números. Determinístico, sem IA. Ver dados_b3/veredito.py.","operationId":"veredito_json_empresas__ticker__veredito_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/empresas/{ticker}/indicadores/{nome}":{"get":{"summary":"Indicador Unico","description":"UM indicador de UMA companhia: a série ano a ano, onde o valor de hoje\nestá na história da própria empresa, a mediana do setor, a distribuição\nno universo, a metodologia e a citação pronta (Bloco 1, 23/09/2026).\n\nÉ o endereço estável por indicador que uma IA consegue citar. Lê pela\ncamada `dados_b3.leitura` — nada de SQL aqui. Mesma regra de chave das\ndemais rotas de dado.","operationId":"indicador_unico_empresas__ticker__indicadores__nome__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"nome","in":"path","required":true,"schema":{"type":"string","title":"Nome"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"summary":"Raiz","description":"A home, gerada no servidor (ver dados_b3/pagina_home.py). Idioma:\npreferência explícita (?lang=) vence; senão o Accept-Language; padrão PT.\n\n★ ERA UM TEMPLATE ESTÁTICO COM SCRIPT (web/landing.html, 49 KB), escrito\npara desenvolvedor, e 95% saíam sem clicar (10/09/2026). Agora a página é\ndado: a conta aberta de uma companhia real, o que chegou na CVM, quem\nacabou de entregar balanço — e a cache muda quando o banco muda.","operationId":"raiz__get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/info":{"get":{"summary":"Info","operationId":"info_info_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/assinar":{"get":{"summary":"Assinar","description":"Sem plano escolhido, MOSTRA os planos. Com plano, MOSTRA a confirmação — e NÃO cobra.\n\n★ GET SEM EFEITO (19/10/2026). Este GET criava uma sessão de checkout VIVA no Stripe e gravava o evento de funil a\ncada acesso; robôs que se passam por navegador (rajadas de 5 acessos no mesmo segundo) passavam pelo filtro de\nUser-Agent e abriam checkouts falsos. Agora o GET só mostra plano, preço e o que a pessoa recebe, com um\n<form method=\"post\">; quem cria a sessão e grava o evento é o POST (`assinar_confirmar`). Links antigos\n(`?plano=pro`, `?plano=pix&pacote=1m`) continuam respondendo 200 e levam à confirmação.\n\n(29/08/2026) Antes era um 307 direto para um formulário de cartão, e `plano` tinha default \"pro\": dezoito links\ndo site mandavam a pessoa de uma página de conteúdo para uma cobrança de R$ 49,90 sem passo intermediário. O\nfunil dizia: 41 \"checkout aberto\" no Pro e ZERO tentativas de cartão.","operationId":"assinar_assinar_get","parameters":[{"name":"plano","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plano"}},{"name":"moeda","in":"query","required":false,"schema":{"type":"string","default":"brl","title":"Moeda"}},{"name":"pacote","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pacote"}},{"name":"voltou","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voltou"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chave-gratis":{"get":{"summary":"Chave Gratis Form","description":"O formulario da chave gratis — sem passar pelo checkout do Stripe.","operationId":"chave_gratis_form_chave_gratis_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"de","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"De"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Chave Gratis Criar","description":"Cria a chave e ja MOSTRA. Sem cartao, sem checkout, sem cadastro.","operationId":"chave_gratis_criar_chave_gratis_post","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portal":{"post":{"summary":"Portal Abrir","operationId":"portal_abrir_portal_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_portal_abrir_portal_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/saude":{"get":{"summary":"Saude","operationId":"saude_saude_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/empresas":{"get":{"summary":"Empresas","operationId":"empresas_empresas_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auditoria/dep_amort/{cd_cvm}/{ano}":{"get":{"summary":"Auditoria Dep Amort","description":"TODA linha candidata a D&A, com o rótulo e a DECISÃO — inclusive as\nexcluídas.\n\n★ SEM ISTO A REGRA NOVA NÃO ERA FALSIFICÁVEL DE FORA (30/08/2026).\nPublicávamos as contas que ENTRARAM no D&A (`onde_procurar`) e nada sobre\nas que ficaram de FORA. Um auditor querendo atacar a exclusão de custo de\ndívida — que mudou 232 EBITDAs — não tinha como ver o que foi excluído\nnem por quê.\n\nA regra casa NATUREZA do rótulo, não código: o mesmo `6.01.01.11` é\n\"Amortização do custo de transação\" na Suzano (sai) e \"amortização de\nstand\" na Cyrela (fica). Uma regra assim só se defende mostrando o rótulo\nque a acionou — e só se ATACA da mesma forma.\n\nO sexto auditor apontou AMOB3, BPAC11 e MDNE3 como alvos. Conferido: nas\nduas primeiras a regra NEM DISPARA (linha única, \"Depreciação e\namortização\"), então atacar ali não falsifica nada. Esta rota existe para\nele achar sozinho os casos onde ela dispara, em vez de depender de nós\npara indicar onde procurar.","operationId":"auditoria_dep_amort_auditoria_dep_amort__cd_cvm___ano__get","parameters":[{"name":"cd_cvm","in":"path","required":true,"schema":{"type":"integer","title":"Cd Cvm"}},{"name":"ano","in":"path","required":true,"schema":{"type":"integer","title":"Ano"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auditoria/universo":{"get":{"summary":"Auditoria Universo","description":"As CHAVES do universo sorteável, para o auditor ordenar por conta.\n\n★ OBJEÇÃO DO SEXTO AUDITOR EXTERNO, e ela procede (30/08/2026). Palavras\ndele, depois de conferir os 10 sample_score e ver que todos batiam:\n\n  \"isso prova que a chave 847231 reproduz os scores apresentados. NÃO\n   prova sozinho que esses são os 10 menores de todo o universo de\n   63.281, porque eu não recebi o universo completo para fazer a\n   ordenação independente.\"\n\nExato, e a distinção é fina: conferir o score de cada caso publicado\ndetecta CHAVE INVENTADA, mas não detecta OMISSÃO. Um caso com score menor\nque os publicados poderia ter sido deixado de fora, e nada no que ele\nrecebeu apontaria — a prova de que a amostra são \"os N menores\" dependia\nda nossa palavra.\n\nCom esta rota a auditoria fecha sem nós: baixe as chaves, calcule o score\nde TODAS, ordene, e compare as N primeiras com o que publicamos.\n\nSai só `cd_cvm|exercicio|indicador`, que é exatamente o que o hash come —\nnenhum valor. O dado continua atrás do gate comercial; o que abre aqui é a\nPOPULAÇÃO, sem a qual \"amostra aleatória\" é adjetivo nosso.","operationId":"auditoria_universo_auditoria_universo_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/auditoria/sementes":{"get":{"summary":"Auditoria Sementes","description":"Sementes pré-formadas — para o auditor cuja ferramenta não monta URL.","operationId":"auditoria_sementes_auditoria_sementes_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auditoria/historico":{"get":{"summary":"Auditoria Historico","description":"Histórico de auditorias — os erros ficam, e é esse o ponto.\n\n★ A INTUIÇÃO COMERCIAL PEDE O CONTRÁRIO DISTO. O reflexo é publicar\n\"nenhum erro encontrado\" e deixar os achados morrerem no chat de quem\nauditou. Só que a frase \"confia, a base é boa\" não vale nada vinda de quem\nvende a base; \"olha o histórico, inclusive o que achamos de errado e\nconsertamos\" vale, porque quem esconde erro não publica tabela de erros.\n\n★ A COLUNA `executor` É A MAIS IMPORTANTE DA PÁGINA. Auditoria que nós\nmesmos rodamos vale menos que a de terceiro, e somar as duas numa contagem\nsó inflaria o resultado exatamente onde a credibilidade se decide. Um\nrevisor externo já recusou usar o /desafio como amostra independente,\nchamando de auditoria circular — estava certo, e a separação aqui é\nconsequência daquela crítica.\n\n★ `conferidos` NÃO é o tamanho da amostra. Um revisor recebeu 75 casos e\nconseguiu refazer 5; registrar 75 seria a mentira confortável, e foi ele\nmesmo quem se recusou a cometê-la. As duas colunas existem separadas por\nisso.\n\nNenhuma contagem é escrita à mão: tudo sai do arquivo (TR06 proíbe, e já\nme pegou duas vezes escrevendo número dentro do próprio texto que explica\na regra).","operationId":"auditoria_historico_auditoria_historico_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auditoria":{"get":{"summary":"Auditoria Indice","description":"Porta de entrada da auditoria aleatória, em HTML e com links prontos.\n\n★ QUARTO REVISOR EXTERNO SEGUIDO QUE NÃO CONSEGUIU TESTAR AO VIVO\n(24/08/2026) — e pela quarta vez a causa era nossa, não a ferramenta dele.\nAntes foi o /mcp/ devolvendo 406 no navegador. Agora: o mecanismo de\nnavegação dele recusa URL com query string não indexada, então\n`/auditoria/random?seed=X&n=25` era inalcançável, mesmo com o site inteiro\nde pé. Ele foi rigoroso e relatou \"0 de 75 conferidos — inconclusivo por\nlimitação de acesso\", em vez de dizer que a base passou.\n\nO padrão já é claro o bastante para virar regra: quando três, quatro\nrevisores tropeçam no mesmo degrau, o degrau é nosso. Endpoint que só\nfunciona para quem chama do jeito que nós imaginamos não é público — é\npúblico para nós.\n\nConserto dele, adotado inteiro: caminho em vez de query\n(`/auditoria/random/184731/25`) e uma página com links clicáveis.","operationId":"auditoria_indice_auditoria_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/quando-o-balanco-existe":{"get":{"summary":"Quando O Balanco Existe","description":"O numero brasileiro do look-ahead: 101 dias em media, 161 acima de um ano.","operationId":"quando_o_balanco_existe_quando_o_balanco_existe_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/buscar":{"get":{"summary":"Buscar Acoes","description":"O buscador de acoes. ABERTO, como as paginas de empresa.","operationId":"buscar_acoes_buscar_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/buscar/fiis":{"get":{"summary":"Buscar Fiis","description":"O buscador de fundos imobiliarios. ABERTO.","operationId":"buscar_fiis_buscar_fiis_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/acoes/{ticker}/reapresentacoes":{"get":{"summary":"Pagina Reapresentacoes Empresa","description":"\"A companhia já reapresentou balanço? Em que anos?\" — respondido no\ntítulo, com a tabela ano/conta/antes/depois e o arquivo da CVM. ABERTA.\nVer dados_b3/pagina_reapresentacoes_empresa.py.","operationId":"pagina_reapresentacoes_empresa_acoes__ticker__reapresentacoes_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/fiis/{ticker}/dividendos":{"get":{"summary":"Fii Dividendos","description":"Assistentes de IA pedem /fiis/KNRI11/dividendos (a das ações existe). Os rendimentos do fundo já estão na seção\n`#rendimentos` da página do fundo, com a tabela e o aviso de que a B3 entrega só o último ano: uma segunda página com\na mesma tabela seria duplicata. 301 para ela (19/10/2026); fundo que não existe segue 404.","operationId":"fii_dividendos_fiis__ticker__dividendos_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/fiis/{ticker}/reapresentacoes":{"get":{"summary":"Pagina Reapresentacoes Fii","description":"\"O fundo já reapresentou informe? Em que competências?\" — a versão\nvigente de cada informe reenviado e, quando o build viu o reenvio, o antes\ne depois campo a campo. ABERTA. Ver dados_b3/pagina_reapresentacoes_fii.py.","operationId":"pagina_reapresentacoes_fii_fiis__ticker__reapresentacoes_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/acoes/{ticker}/{tema}":{"get":{"summary":"Resposta Da Companhia","description":"\"Quanto pagou de dividendos?\", \"o lucro cresceu?\", \"a dívida subiu?\" — a resposta numa frase, a tabela e o\ncaminho para conferir (17/10/2026). `.md` = texto simples para IA. Ver dados_b3/pagina_respostas.py.","operationId":"resposta_da_companhia_acoes__ticker___tema__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"tema","in":"path","required":true,"schema":{"type":"string","title":"Tema"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/acoes/{ticker}":{"get":{"summary":"Pagina Empresa","description":"A pagina publica de uma companhia. ABERTA — e a porta de entrada.\n`?ano=2025` recorta a tabela de proventos; `?ano=todos` mostra tudo.\n`?janela=1a` escolhe a janela do gráfico de cotação (1m…max).\nCódigo antigo (EMBR3) redireciona 301 para o atual, com `?de=`.","operationId":"pagina_empresa_acoes__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"ano","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ano"}},{"name":"janela","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Janela"}},{"name":"de","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"De"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hoje":{"get":{"summary":"Hoje","description":"O que mudou nos ultimos dias. ABERTA — o motivo de voltar.\n\nDois formatos pela MESMA URL, e o padrão é a PÁGINA: só quem pede\n`application/json` EXPLICITAMENTE recebe o JSON. É o contrário da regra do\n/fiis/{ticker} de propósito — lá a chave decide porque há gate comercial;\naqui não há gate nenhum, a página é aberta para todos, e o que o Accept\nescolhe é o formato, não o acesso. `*/*` e Accept ausente continuam\nrecebendo HTML: nenhum robô (GPTBot, ClaudeBot, curl) perde a página, que\né o defeito da família I-N19 que já nos custou quatro repetições.","operationId":"hoje_hoje_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/documento-reenviado":{"get":{"summary":"Documento Reenviado","description":"A data da CVM e a do ULTIMO reenvio, e o que isso envelheceu.","operationId":"documento_reenviado_documento_reenviado_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mudou-de-ticker":{"get":{"summary":"Mudou De Ticker","description":"As trocas de codigo de negociacao, datadas pelo proprio pregao.","operationId":"mudou_de_ticker_mudou_de_ticker_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/eventos-societarios":{"get":{"summary":"Eventos Societarios","description":"Split e grupamento conferidos contra o salto real do preco.","operationId":"eventos_societarios_eventos_societarios_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/o-que-erramos":{"get":{"summary":"O Que Erramos","description":"O registro datado dos defeitos que achamos em nós. ABERTA.","operationId":"o_que_erramos_o_que_erramos_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/procurar":{"get":{"summary":"Procurar","description":"Busca por código, nome ou CNPJ. ABERTA.\n\nCódigo exato leva DIRETO ao ativo, com 302 e não 301: o destino depende do\nque foi digitado, então a redireção é da consulta, não do endereço.\nMostrar uma lista de um item só para a pessoa clicar no que ela acabou de\ndigitar é uma tela a mais sem informação nenhuma.","operationId":"procurar_procurar_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/comparar/setor":{"get":{"summary":"Comparar Setor Indice","description":"O índice das comparações curadas por setor. ABERTA, no sitemap.","operationId":"comparar_setor_indice_comparar_setor_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/comparar/setor/{setor}":{"get":{"summary":"Comparar Setor Pagina","description":"As três companhias mais líquidas do setor, lado a lado: margem, ROIC,\ndívida e P/L no ano mais recente comum às três. ABERTA, no sitemap.","operationId":"comparar_setor_pagina_comparar_setor__setor__get","parameters":[{"name":"setor","in":"path","required":true,"schema":{"type":"string","title":"Setor"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/comparar/{cod_a}/{cod_b}":{"get":{"summary":"Comparar","description":"Duas companhias lado a lado. ABERTA — é página, não rota de dados.","operationId":"comparar_comparar__cod_a___cod_b__get","parameters":[{"name":"cod_a","in":"path","required":true,"schema":{"type":"string","title":"Cod A"}},{"name":"cod_b","in":"path","required":true,"schema":{"type":"string","title":"Cod B"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/recibo/{rid}":{"get":{"summary":"Recibo","description":"Recibo de pesquisa (roadmap de 22/09/2026, item 3). ARTEFATO, como a\namostra de auditoria: JSON por padrão (é o que se cita e confere), página\nlegível para quem pede `text/html`. Aberto, sem chave: quem recebe o link\nprecisa conseguir conferir. `noindex` e fora do sitemap.","operationId":"recibo_recibo__rid__get","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/small-caps":{"get":{"summary":"Small Caps","description":"A vitrine (Bloco 3): as companhias na janela de liquidez configurada,\ncada uma com o veredito. ABERTA. Ver dados_b3/pagina_vitrine.py.","operationId":"small_caps_small_caps_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vigia":{"get":{"summary":"Vigia","description":"Os últimos eventos (Bloco 4): lucro/prejuízo, faixa de margem e de\ndívida, reapresentação e bandeira, cada um com os dois números. ABERTA.\nVer dados_b3/vigia.py e dados_b3/pagina_vigia.py.","operationId":"vigia_vigia_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vigia/eventos":{"get":{"summary":"Vigia Eventos","description":"Os eventos do vigia em JSON, do mais recente ao mais antigo: tipo,\nperíodos anterior e novo, número antes e depois, faixas, data em que o\ndocumento que revela o evento foi recebido pela CVM, fonte e versão do\ndado. Filtros: `ticker`, `tipo`, `desde` (AAAA-MM-DD). `classe=fiis` dá o\nvigia dos fundos imobiliários e `classe=etfs` o dos ETFs, cada um com os\ntipos e o contador dele. ABERTO.","operationId":"vigia_eventos_vigia_eventos_get","parameters":[{"name":"ticker","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ticker"}},{"name":"tipo","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tipo"}},{"name":"desde","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Desde"}},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","default":500,"title":"Limite"}},{"name":"classe","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Classe"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vigia/semana/{semana}":{"get":{"summary":"Vigia Semana","description":"O que mudou numa semana ISO fechada (AAAA-WW): os eventos do vigia de\ncompanhias, FIIs e ETFs, o mesmo conteúdo do e-mail semanal. ABERTA.\nSemana sem evento ou fora da janela do sitemap sai com noindex.","operationId":"vigia_semana_vigia_semana__semana__get","parameters":[{"name":"semana","in":"path","required":true,"schema":{"type":"string","title":"Semana"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vigia/{ticker}":{"get":{"summary":"Vigia Do Papel","description":"Todos os eventos do vigia de UM papel — companhia ou fundo — com filtro\npor tipo; a página que o bloco \"acompanhar\" liga. ABERTA. Fora do sitemap\n(seriam 800 páginas finas); papel sem evento é noindex,follow. I-N102.","operationId":"vigia_do_papel_vigia__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/acompanhar":{"post":{"summary":"Acompanhar","description":"Pedido de acompanhamento de UMA companhia por e-mail (Bloco 4, lista de\nacompanhadas). Grava o pedido e manda a confirmação; sem confirmar, nada\né enviado e o pedido é apagado. A resposta NUNCA repete o e-mail. Robô\nnão pede; há um teto global por hora (a casa não guarda IP).","operationId":"acompanhar_acompanhar_post","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/carteira":{"get":{"summary":"Carteira","description":"A carteira guardada num link (roadmap de 22/09/2026, item 2):\n`/carteira?WEGE3=30&ITUB4=20`. Nada fica guardado do nosso lado.\n\nPágina ABERTA, como /comparar: é leitura de página, não rota de dado. O\nformulário manda `?lista=` e volta com 303 para o endereço canônico — é o\nendereço que a pessoa guarda. Ver dados_b3/pagina_carteira.py.","operationId":"carteira_carteira_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"lista","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lista"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/saiu-da-bolsa":{"get":{"summary":"Saiu Da Bolsa","description":"As companhias que saíram da bolsa, com nome e tamanho do buraco.\n\nA /o-que-nao-resolvemos admite o viés de sobrevivência em uma frase; esta\npágina mostra o buraco companhia por companhia, e diz por que só 11% dele\né reconstruível. Ver dados_b3/pagina_saiu_da_bolsa.py.","operationId":"saiu_da_bolsa_saiu_da_bolsa_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/quanto-rendeu/{ticker}":{"get":{"summary":"Quanto Rendeu","description":"Quanto viraram R$ 1.000 na ação há 1, 3, 5 e 10 anos, preço e com proventos, contra Ibovespa e Selic (10/10/2026).\nVer dados_b3/pagina_quanto_rendeu.py. Código antigo ou de outra classe vai para o código principal (301).","operationId":"quanto_rendeu_quanto_rendeu__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/perguntas":{"get":{"summary":"Perguntas Indice","description":"Índice das páginas de pergunta (dados_b3/pagina_perguntas.py).","operationId":"perguntas_indice_perguntas_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/perguntas/{slug}":{"get":{"summary":"Pergunta","description":"Uma pergunta que as pessoas fazem, respondida com o dado do banco na hora (09/10/2026). Ver\ndados_b3/pagina_perguntas.py.","operationId":"pergunta_perguntas__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/o-que-nao-resolvemos":{"get":{"summary":"O Que Nao Resolvemos","description":"Os limites do produto COM TAMANHO — vies de sobrevivencia em primeiro.","operationId":"o_que_nao_resolvemos_o_que_nao_resolvemos_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/covenants":{"get":{"summary":"Covenants","description":"A distribuicao das definicoes de EBITDA nas escrituras de debenture.","operationId":"covenants_covenants_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ler-csv-da-cvm":{"get":{"summary":"Ler Csv Da Cvm","description":"As armadilhas do arquivo da CVM, cada uma com a nossa contagem.","operationId":"ler_csv_da_cvm_ler_csv_da_cvm_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/issb-cvm-193":{"get":{"summary":"Issb Cvm 193","description":"A obrigacao que foi revogada, com data e numero de resolucao.\n\n★ Pagina de REGRA, nao de dado nosso — e ela diz isso. O formato vem da\nmedicao: o unico guia que as IAs buscam e o de imposto de renda de FII,\nque e exatamente regra com prazo.","operationId":"issb_cvm_193_issb_cvm_193_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/plano-de-contas-banco":{"get":{"summary":"Plano De Contas Banco","description":"O mapa que um raspador da CVM precisa e não existe em manual nenhum.","operationId":"plano_de_contas_banco_plano_de_contas_banco_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/qualidade":{"get":{"summary":"Qualidade","description":"Os limites da própria base, contados. Ver dados_b3/pagina_qualidade.py.\n\n★ A página mais desconfortável do site, de propósito: publica onde a nossa\nbase NÃO responde. Um auditor externo perguntou \"por que falta o ROIC\ndessa empresa?\" e a resposta estava só no código.","operationId":"qualidade_qualidade_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auditoria/random/{seed}/{n}":{"get":{"summary":"Auditoria Random Caminho","description":"A MESMA amostra da rota com query string, com a semente no caminho.\n\n★ `/auditoria/amostra` é o nome honesto, e `/random` fica como apelido.\nO revisor externo apontou que \"random\" descreve mal o que acontece: não há\naleatoriedade nenhuma aqui, e sim AMOSTRAGEM PSEUDOALEATÓRIA\nDETERMINÍSTICA — mesma semente + mesma população + mesmo esquema = mesma\namostra, sempre. Chamar de \"random\" convida o auditor a esperar variação\nonde a garantia é o oposto. As duas rotas seguem servindo o mesmo,\nporque quebrar a URL já divulgada seria trocar um defeito de nome por um\nlink morto.\n\nExiste porque query string não indexada é barreira real para as\nferramentas de navegação de quem audita. Delega para a mesma função:\nduas portas, um sorteio — e o TR24 exige que devolvam exatamente a mesma\namostra, senão passariam a existir \"duas versões\" da mesma semente, que é\npior que não ter a segunda porta.","operationId":"auditoria_random_caminho_auditoria_random__seed___n__get","parameters":[{"name":"seed","in":"path","required":true,"schema":{"type":"integer","title":"Seed"}},{"name":"n","in":"path","required":true,"schema":{"type":"integer","title":"N"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auditoria/random/{seed}":{"get":{"summary":"Auditoria Random Caminho","description":"A MESMA amostra da rota com query string, com a semente no caminho.\n\n★ `/auditoria/amostra` é o nome honesto, e `/random` fica como apelido.\nO revisor externo apontou que \"random\" descreve mal o que acontece: não há\naleatoriedade nenhuma aqui, e sim AMOSTRAGEM PSEUDOALEATÓRIA\nDETERMINÍSTICA — mesma semente + mesma população + mesmo esquema = mesma\namostra, sempre. Chamar de \"random\" convida o auditor a esperar variação\nonde a garantia é o oposto. As duas rotas seguem servindo o mesmo,\nporque quebrar a URL já divulgada seria trocar um defeito de nome por um\nlink morto.\n\nExiste porque query string não indexada é barreira real para as\nferramentas de navegação de quem audita. Delega para a mesma função:\nduas portas, um sorteio — e o TR24 exige que devolvam exatamente a mesma\namostra, senão passariam a existir \"duas versões\" da mesma semente, que é\npior que não ter a segunda porta.","operationId":"auditoria_random_caminho_auditoria_random__seed__get","parameters":[{"name":"seed","in":"path","required":true,"schema":{"type":"integer","title":"Seed"}},{"name":"n","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"N"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auditoria/amostra/{seed}/{n}":{"get":{"summary":"Auditoria Random Caminho","description":"A MESMA amostra da rota com query string, com a semente no caminho.\n\n★ `/auditoria/amostra` é o nome honesto, e `/random` fica como apelido.\nO revisor externo apontou que \"random\" descreve mal o que acontece: não há\naleatoriedade nenhuma aqui, e sim AMOSTRAGEM PSEUDOALEATÓRIA\nDETERMINÍSTICA — mesma semente + mesma população + mesmo esquema = mesma\namostra, sempre. Chamar de \"random\" convida o auditor a esperar variação\nonde a garantia é o oposto. As duas rotas seguem servindo o mesmo,\nporque quebrar a URL já divulgada seria trocar um defeito de nome por um\nlink morto.\n\nExiste porque query string não indexada é barreira real para as\nferramentas de navegação de quem audita. Delega para a mesma função:\nduas portas, um sorteio — e o TR24 exige que devolvam exatamente a mesma\namostra, senão passariam a existir \"duas versões\" da mesma semente, que é\npior que não ter a segunda porta.","operationId":"auditoria_random_caminho_auditoria_amostra__seed___n__get","parameters":[{"name":"seed","in":"path","required":true,"schema":{"type":"integer","title":"Seed"}},{"name":"n","in":"path","required":true,"schema":{"type":"integer","title":"N"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auditoria/amostra/{seed}":{"get":{"summary":"Auditoria Random Caminho","description":"A MESMA amostra da rota com query string, com a semente no caminho.\n\n★ `/auditoria/amostra` é o nome honesto, e `/random` fica como apelido.\nO revisor externo apontou que \"random\" descreve mal o que acontece: não há\naleatoriedade nenhuma aqui, e sim AMOSTRAGEM PSEUDOALEATÓRIA\nDETERMINÍSTICA — mesma semente + mesma população + mesmo esquema = mesma\namostra, sempre. Chamar de \"random\" convida o auditor a esperar variação\nonde a garantia é o oposto. As duas rotas seguem servindo o mesmo,\nporque quebrar a URL já divulgada seria trocar um defeito de nome por um\nlink morto.\n\nExiste porque query string não indexada é barreira real para as\nferramentas de navegação de quem audita. Delega para a mesma função:\nduas portas, um sorteio — e o TR24 exige que devolvam exatamente a mesma\namostra, senão passariam a existir \"duas versões\" da mesma semente, que é\npior que não ter a segunda porta.","operationId":"auditoria_random_caminho_auditoria_amostra__seed__get","parameters":[{"name":"seed","in":"path","required":true,"schema":{"type":"integer","title":"Seed"}},{"name":"n","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"N"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auditoria/random":{"get":{"summary":"Auditoria Random","description":"Amostra aleatória de auditoria — a SEMENTE é de quem audita, não nossa.\n\n★ A OBJEÇÃO QUE TRÊS REVISORES EXTERNOS REPETIRAM (24/08/2026): o\n/desafio prova que sabemos defender 23 casos ESCOLHIDOS POR NÓS. Não diz\nnada sobre a taxa de erro da base. Um deles foi direto: \"não pediria que\nvocês escolhessem os casos — eu escolheria 100 empresas aleatórias\".\nOutro recusou usar o /desafio como amostra, chamando de auditoria\ncircular. Estavam certos.\n\nAqui a escolha sai das nossas mãos. Você manda a semente, o sorteio é\ndeterminístico, e a mesma semente devolve sempre os mesmos casos — então\no resultado é reproduzível por terceiros e não dá para nós \"tentarmos de\nnovo\" até sair uma amostra boa. Cada caso vem com o número publicado, a\nconta CVM de onde ele saiu e o arquivo da CVM para refazer.\n\nSem semente NÃO sorteamos: devolvemos o cardápio. Semente escolhida pelo\nservidor destruiria a única propriedade que faz isto valer alguma coisa.\n\nAberto, sem chave — auditoria que exige cadastro não é auditoria.","operationId":"auditoria_random_auditoria_random_get","parameters":[{"name":"seed","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"}},{"name":"n","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"N"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/desafio":{"get":{"summary":"Desafio","description":"Os casos difíceis, abertos, com o número que publicamos AGORA.\n\nA /transparencia é lida; isto é EXECUTADO por outra pessoa. O arquivo\n`desafio/casos.json` traz a armadilha e a receita de cálculo; esta rota\nacrescenta o valor que a API está servindo neste momento, para o\nverificador comparar sem depender de chave.\n\nAberto de propósito, inclusive para ticker pago: auditoria que exige\ncadastro não é auditoria. O que sai aqui são três números que já estão no\narquivo público — não é o produto, é a prova.","operationId":"desafio_desafio_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dicionario":{"get":{"summary":"Dicionario","description":"Metodologia dos indicadores em JSON (para máquinas/agentes de IA):\nfórmula, contas CVM e a BASE do lucro de cada indicador. A página humana é\n/metodologia.","operationId":"dicionario_dicionario_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dump":{"get":{"summary":"Dump Indice","description":"O que dá para levar embora, e o tamanho de cada conjunto.","operationId":"dump_indice_dump_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dump/{conjunto}.csv":{"get":{"summary":"Dump Csv","description":"Um conjunto inteiro em CSV, numa requisição.\n\nTransmitido em blocos (StreamingResponse + fetchmany): 121 mil linhas de\nfatos não cabem confortavelmente na memória de um contêiner de 512 MB, e\nmontar a resposta inteira antes de enviar derrubaria o serviço no maior\nconjunto — justamente o que o assinante mais quer.","operationId":"dump_csv_dump__conjunto__csv_get","parameters":[{"name":"conjunto","in":"path","required":true,"schema":{"type":"string","title":"Conjunto"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/screener":{"get":{"summary":"Screener","description":"Filtra empresas por faixas de indicadores. Cada indicador aceita\n`<nome>_min` e/ou `<nome>_max` (ex.: ?roic_min=0.15&dl_ebitda_max=2).\nSem `ano`, usa o último ano com dados de cada empresa. Só considera\nvalores SEM flag (número que passou limpo pela bateria). Requer chave\n(é sobre todo o universo); parâmetros inválidos são recusados, não\nignorados.\n\nP/L: `pl_min`/`pl_max` (anual, da DFP) e `pl_ttm_min`/`pl_ttm_max` (12\nmeses, do ITR ou DFP mais recente). Com `as_of`, vale o documento mais\nrecente já recebido na data (e com preço já negociado nela); sem `as_of`, o\nmais recente. P/L de lucro zero/negativo (flag `pl_negativo`), acima de 200\n(`pl_extremo`) ou nulo nunca passa. Cada linha traz `multiplos` com\n`dt_receb` e `data_preco` do valor usado.\n\n`rigor` (só para P/L): `padrao` aceita o P/L com ajuste já feito ou ressalva\nleve (listada em `multiplos.<pl>.ressalvas`) e recusa ressalva impeditiva e\nflag desconhecida; `estrito` só aceita P/L sem nenhuma flag. Com filtro de\nP/L a resposta traz `fora_do_filtro`: quantas companhias ficaram de fora e\npor quê, com `resumo` em português simples.","operationId":"screener_screener_get","parameters":[{"name":"ano","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ano"}},{"name":"as_of","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Of"}},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limite"}},{"name":"recibo","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Recibo"}},{"name":"rigor","in":"query","required":false,"schema":{"type":"string","default":"padrao","title":"Rigor"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/empresas/{ticker}":{"get":{"summary":"Empresa Raiz","description":"O índice da companhia: quem ela é, o que existe sobre ela e onde está.\n\n★ A PORTA QUE FALTAVA (17/09/2026). Quem descobria\n`/empresas/WEGE3/indicadores` e tentava subir um nível recebia 404 — o\ngesto mais natural de quem explora uma API devolvia \"não existe\" para uma\ncompanhia que existe. Um agente que bate aqui conclui que a cobertura\nacabou; uma pessoa conclui que o endereço está errado.\n\nÉ rota de DADO: JSON para todo mundo, sempre, como o resto de\n`/empresas/` — não negocia formato pelo Accept (a regra é a chave, não o\nAccept). Por isso o índice diz, em vez de redirecionar, onde fica a\nPÁGINA legível da companhia.\n\nAberta de propósito: aqui não há número financeiro, só o mapa. Cada\nrecurso declara se exige chave, então quem chega sem chave descobre o\nque existe e o que precisa fazer para ler — em vez de bater num 401 sem\nsaber o que havia do outro lado.","operationId":"empresa_raiz_empresas__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/empresas/{ticker}/indicadores":{"get":{"summary":"Indicadores","operationId":"indicadores_empresas__ticker__indicadores_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/empresas/{ticker}/linhagem/{ano}/{indicador}":{"get":{"summary":"Linhagem Indicador","description":"A cadeia inteira de um número publicado, até a linha do arquivo da CVM.\n\nÉ o que separa AUDITÁVEL de REPRODUZÍVEL. `/indicadores` já dizia a fórmula\ne a conta de origem — dá para conferir se a conta certa foi usada. Aqui vem\no resto do caminho: a linha exata (código, a descrição que a própria empresa\nescreveu, valor, versão), o documento com a data em que ficou público, o\nlink para o ZIP bruto da CVM, e o antes/depois se aquela conta foi\nreapresentada. Ver metodologia/linhagem.md.\n\nElo que falta nunca é preenchido: insumo que a empresa não publicou vem com\n`rastreavel: false` e o motivo, e o que não deu para resolver vem em\n`avisos`. 98,1% dos indicadores publicados têm a cadeia completa.","operationId":"linhagem_indicador_empresas__ticker__linhagem__ano___indicador__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"ano","in":"path","required":true,"schema":{"type":"integer","title":"Ano"}},{"name":"indicador","in":"path","required":true,"schema":{"type":"string","title":"Indicador"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/empresas/{ticker}/trimestres":{"get":{"summary":"Trimestres","description":"Série TRIMESTRAL: contas da ITR + preço do trimestre + indicadores.\n\n★ O DADO JÁ EXISTIA E NINGUÉM CONSEGUIA PEDIR (06/09/2026). `fato_trimestral`\ne `multiplo_trimestral` estavam no banco desde sempre, mas separados: quem\nperguntasse \"como foi o 2T\" recebia a série ANUAL (até um ano defasada) ou\ncontas soltas sem preço. Esta rota junta os dois na granularidade em que a\ncompanhia de fato reporta durante o ano.\n\nO 4T não vem: a ITR publica 1T/2T/3T e o exercício fechado é da DFP. Dá para\nderivar `4T = DFP − 9M` — há quem derive — e nós não derivamos, porque um\nnúmero calculado por nós entrando na mesma lista de números reportados pela\nempresa apaga a fronteira que este banco existe para manter. Ver\n`dados_b3/serie_trimestral.py`.","operationId":"trimestres_empresas__ticker__trimestres_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/empresas/{ticker}/fatos":{"get":{"summary":"Fatos","description":"Contas padronizadas. Sem `as_of`: a versão mais recente de cada período.\n\n★ `as_of=AAAA-MM-DD` (18/10/2026): o balanço COMO ESTAVA naquela data — para cada período,\na maior versão cujo `dt_receb` é <= `as_of`, com `versao` e `dt_receb` em cada linha. A\nCVM publica só a versão mais recente de cada documento nos arquivos de contas; o valor de\numa versão que já foi substituída só existe para o que o build viu mudar (ver\n/empresas/{ticker}/versoes). Quando a versão vigente em `as_of` não tem valores guardados,\no período vem em `periodos` com `valores: \"nao_arquivados\"` e SEM linhas — nunca com os\nnúmeros da versão mais nova, que é o vazamento de informação futura que o `as_of` evita.","operationId":"fatos_empresas__ticker__fatos_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"trimestral","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Trimestral"}},{"name":"as_of","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Of"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/empresas/{ticker}/versoes":{"get":{"summary":"Versoes Do Balanco","description":"Cada documento (DFP anual e ITR trimestral) com TODAS as versões que a CVM recebeu, a\ndata de cada uma, o link do documento original e, onde guardamos os valores de duas\nversões, as contas-chave que mudaram (antes → depois). `reenviados=true` lista só os\ndocumentos com mais de uma versão.\n\n★ O QUE EXISTE PARA CADA COISA (18/10/2026). A lista de versões e as datas vêm da capa\ndos arquivos da CVM e cobrem todo o histórico. Os VALORES de uma versão anterior, não: a\nCVM publica só a versão mais recente nos arquivos de contas, então guardamos o que o\nbuild viu ser substituído. `versoes[].valores` diz, por versão: 'na_base' (a publicada\nhoje), 'arquivados' (guardados) ou 'nao_arquivados' (a versão existiu e o número dela não\nestá em arquivo nenhum da CVM). Ver dados_b3/versoes.py.","operationId":"versoes_do_balanco_empresas__ticker__versoes_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"reenviados","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Reenviados"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/empresas/{ticker}/multiplos":{"get":{"summary":"Multiplos","description":"P/L, P/VP, EV/EBITDA ponto-no-tempo (anuais e trimestrais) e a foto de hoje.\n\n★ `as_of=AAAA-MM-DD` (18/10/2026, pedido de cliente): em `trimestrais`, o lucro TTM, o LPA TTM e o P/L TTM como\nestavam NAQUELA data. Cada documento da identidade do TTM (a DFP do ano anterior e as ITR dos dois anos) entra com\na versão que valia em `as_of` (a maior versão com `dt_receb` <= `as_of`): a versão atual, ou uma anterior que o\nbuild arquivou. A linha traz `versoes_usadas` (categ_doc, dt_refer, versao, dt_receb, origem: base | arquivada |\nindisponivel | nao_publicado | sem_documento). Se a versão vigente existiu mas o número dela não foi guardado, NÃO usamos o da versão\nnova: `lucro_ttm`, `lpa_ttm` e `pl_ttm` saem nulos com `versao_original_indisponivel: true`. Trimestre cuja ITR ainda\nnão tinha sido recebida sai da lista (`trimestrais_ainda_nao_publicados`). Preço = 1º pregão a partir do recebimento\nda versão vigente da ITR; as ações são as da linha. `anuais` e `valuation` não mudam. as_of inválido: 422, como em\n/fatos. Sem `as_of` nada muda.\n\n★ POR CLASSE DE AÇÃO (18/10/2026). Com o ticker principal (PETR4) nada muda. Com outra classe da mesma companhia\n(PETR3, a PN ou a ON que não é a principal, a unit) o P/L e o P/VP usam o fechamento DAQUELA classe no mesmo\npregão que o principal usou; o LPA e o VPA são os da companhia. A resposta traz `classe_consultada` (qual classe,\nqual preço, de que dia) e, em cada linha, `preco_da_classe`, `data_preco_da_classe` e os valores do principal em\n`pl_principal`/`pvp_principal`. Unit: preço da unit ÷ ações da cesta. Valor de mercado, EV/EBITDA e FCF yield\ncontinuam da companhia, pelo preço do principal.","operationId":"multiplos_empresas__ticker__multiplos_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"as_of","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Of"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/empresas/{ticker}/dividendos":{"get":{"summary":"Dividendos","operationId":"dividendos_empresas__ticker__dividendos_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/empresas/{ticker}/precos":{"get":{"summary":"Precos Da Empresa","description":"A série DIÁRIA de preços da empresa numa chamada só: abertura, máxima, mínima,\nfechamento, preço médio, volume financeiro, quantidade e negócios, do COTAHIST da B3,\ndo mais antigo ao mais recente. `de`/`ate` (AAAA-MM-DD) recortam; `formato=csv` devolve\nCSV; `limite` (padrão 6.000, máximo 20.000) corta a partir do mais antigo.\n\nO preço NÃO é ajustado por desdobramento, grupamento ou bonificação: junto da série vão os\neventos do período (`eventos`, os mesmos de /empresas/{T}/eventos), para quem constrói o\najuste ter tudo aqui.\n\n★ POR QUE (04/10/2026). Um uso real (backtest de retorno total) contou que o caminho até a\nsérie diária completa foi o maior problema: o preço por papel só saía no dump de 876 mil\nlinhas (Pro) ou na tela. Uma chamada devolve 16 anos de um papel, o que cabe no limite\ndiário do plano grátis.\n\nSEM CHAVE, em papel fechado: devolve 200 com uma AMOSTRA dos últimos 30 pregões e um `aviso` no corpo (como ter a\nsérie inteira; onde está a resposta pronta), em vez de 401 — quem só lê página via \"erro 401\" e ia embora.","operationId":"precos_da_empresa_empresas__ticker__precos_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"de","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"De"}},{"name":"ate","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ate"}},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","default":6000,"title":"Limite"}},{"name":"formato","in":"query","required":false,"schema":{"type":"string","default":"json","title":"Formato"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/empresas/{ticker}/desempenho":{"get":{"summary":"Desempenho Da Empresa","description":"Desempenho do papel num período em POUCOS números, calculado aqui: retorno, retorno\nanualizado, drawdown máximo (com as datas do pico e do fundo) e volatilidade do comprar e\nmanter, e o mesmo para um cruzamento de médias móveis (padrão 21 × 100). Padrão: os últimos 5\nanos. ABERTO para todos os tickers, sem chave (degustação). O preço é AJUSTADO pelos eventos societários conferidos; devolve o retorno de PREÇO e, quando há proventos registrados, o retorno TOTAL (dividendos, JCP e rendimentos reinvestidos no data-ex); sem custos\n(`premissas` diz tudo na resposta). Medida do passado, não recomendação.\n\n★ POR QUE (04/10/2026). Em teste real, a IA que só lê URL (Claude) recebeu os 1.250 pregões\ncortados pela ferramenta de leitura dela, e a que não tem rede (Gemini) nem tentou. Quem só\nabre página precisa da resposta pronta e pequena; quem baixa a série (`/precos`) continua podendo\ncalcular o que quiser.","operationId":"desempenho_da_empresa_empresas__ticker__desempenho_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"de","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"De"}},{"name":"ate","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ate"}},{"name":"media_curta","in":"query","required":false,"schema":{"type":"integer","default":21,"title":"Media Curta"}},{"name":"media_longa","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Media Longa"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/empresas/{ticker}/eventos":{"get":{"summary":"Eventos Da Empresa","description":"Desdobramentos, grupamentos, bonificações e CISÕES da empresa, com DE ONDE vem cada\num (declarado pela B3 ou achado por nós) e O QUE O PREÇO DISSE (confirmou, não\ndistingue, discorda, não havia pregão). Eventos do mesmo dia formam UMA operação:\n`efeito_liquido_do_dia` é o multiplicador do grupo (0,01 × 100 = 1,0 no TIMS3).\n\n★ POR QUE (04/10/2026). Um uso real (backtest de retorno total, TIMS3 em 02/07/2025)\nleu \"inferido / não conferido\" na página e tratou como evento sem prova; a B3 o\ndeclarava, com data de aprovação, e o efeito líquido era 1×. Esta rota põe a fonte e\na situação em campos separados, e traz as cisões (ITUB4×XP, 2021) que o ajuste por\nfator não usa mas o pesquisador precisa ver.","operationId":"eventos_da_empresa_empresas__ticker__eventos_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/empresas/{ticker}/scores":{"get":{"summary":"Scores","description":"Scores fundamentalistas prontos, com a conta aberta: Piotroski F-Score\n(0-9, cada critério auditável) e o critério de Graham (P/L × P/VP ≤ 22,5).\nBanco não tem Piotroski (plano de contas próprio). WEGE3 gratuita.","operationId":"scores_empresas__ticker__scores_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/empresas/{ticker}/reapresentacoes":{"get":{"summary":"Reapresentacoes","description":"Quando a empresa REPUBLICA um balanço, o número muda — e aqui as duas\nversões ficam lado a lado. É o diferencial que nenhum concorrente entrega:\nreapresentação registrada, nunca corrigida em silêncio.","operationId":"reapresentacoes_empresas__ticker__reapresentacoes_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/reapresentacoes":{"get":{"summary":"Reapresentacoes Feed","description":"Feed do universo: as reapresentações mais recentes e de maior impacto —\num radar de balanços republicados. Requer chave (grátis ou Pro).\n\n★ NAVEGADOR RECEBE UMA PÁGINA PÚBLICA, e a razão é de aquisição\n(31/08/2026). Medimos quais páginas as IAs realmente buscam quando alguém\nlhes pergunta algo: a home, o /comparativo, /metodologia/multiplos,\n/ranking. Os 20 guias CONCEITUAIS somam 7 leituras em 30 dias — porque a\nIA já sabe o que é P/L e não precisa de nós para explicar.\n\nO que ela busca é fato específico que não responde sozinha. Reapresentação\né o nosso: 9.477 registros, 409 das 456 empresas, e nenhum concorrente\npublica. \"O balanço da Americanas de 2021 foi refeito?\" é uma pergunta\ncuja resposta exige citar alguém.\n\nO FEED por empresa continua fechado (é o produto). O que abre aqui é o\nAGREGADO — mesma régua do /ranking, que é público enquanto\n/empresas/{ticker}/scores é pago.","operationId":"reapresentacoes_feed_reapresentacoes_get","parameters":[{"name":"ano","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ano"}},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limite"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/llms.txt":{"get":{"summary":"Llms Txt","description":"Padrão llms.txt: resumo do serviço para agentes de IA que visitam o\ndomínio. É a 'porta de entrada' que ChatGPT/Claude/Perplexity leem.","operationId":"llms_txt_llms_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/8ed3004e95428c31a6816850f723aa11.txt":{"get":{"summary":"Indexnow Chave","operationId":"indexnow_chave_8ed3004e95428c31a6816850f723aa11_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/robots.txt":{"get":{"summary":"Robots Txt","operationId":"robots_txt_robots_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/sitemap.xml":{"get":{"summary":"Sitemap","operationId":"sitemap_sitemap_xml_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ranking":{"get":{"summary":"Ranking","description":"Rankings públicos da B3 — qualidade (Piotroski), dividendos (DY médio) e\nFórmula Mágica. Gerados do banco, atualizados no sync semanal, auditáveis.","operationId":"ranking_ranking_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/fiis":{"get":{"summary":"Fiis Hub","description":"Hub dos FIIs: fundos mais descontados (menor P/VP), maiores pagadores\n(DY 12m) e a mediana por segmento. Tudo ponto-no-tempo e auditável, do\ninforme mensal da CVM + COTAHIST. Não é recomendação.\n\n★ JSON PELA MESMA URL, REGRA DA CHAVE (16/09/2026). O conector público\nconsome o ranking por HTTP; o ranking de FII exige chave no MCP interno\n(`fiis_ranking`), então aqui é o mesmo: com chave, ou com `Accept:\napplication/json` explícito, devolve o dicionário da ferramenta — e sem\nchave válida devolve 401 em JSON com `como_resolver`, nunca a página.","operationId":"fiis_hub_fiis_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/fiis/screener":{"get":{"summary":"Fiis Screener","description":"Filtra FIIs por faixas de P/VP e DY 12m. Params (todos opcionais):\n`pvp_min`/`pvp_max`, `dy_min`/`dy_max` (frações, ex.: dy_min=0.10 = 10%),\n`segmento` (casa exato, sem caixa, no segmento CVM), `cotistas_min` (piso de\nliquidez; padrão 5000), `limite` (padrão 50, teto 200). Requer chave (é sobre\ntodo o universo). Só entra número LIMPO: um P/VP ou DY com flag não é tratado\ncomo valor filtrável — o fundo simplesmente não casa o filtro daquele campo.\nParâmetros inválidos são recusados, não ignorados. Não é recomendação.","operationId":"fiis_screener_fiis_screener_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/etfs":{"get":{"summary":"Etfs Hub","description":"Hub dos ETFs: mais negociados, maior patrimônio, maior deságio e ágio\nsobre a cota do mesmo dia, retorno de 12 meses pela cota, menor taxa\nefetiva, e a mediana por tipo. Descritivo, do informe diário do FNET, do\nbalancete, da CVM e do COTAHIST. Não é recomendação.","operationId":"etfs_hub_etfs_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/etfs/{ticker}":{"get":{"summary":"Etf Detalhe","description":"Um ETF, em dois formatos pela MESMA URL. Sem chave, a PÁGINA; com chave\n(ou Accept: application/json explícito), o JSON. BOVA11 é aberto nos dois.","operationId":"etf_detalhe_etfs__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bdrs":{"get":{"summary":"Bdrs Hub","description":"Todos os BDRs que negociaram no último ano, com tipo (DRN, DR1, DR2, DR3, DRE), último fechamento e liquidez\nmédia. `tipo=` filtra. Aberto, sem chave, em HTML ou JSON (Accept: application/json).","operationId":"bdrs_hub_bdrs_get","parameters":[{"name":"tipo","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tipo"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bdrs/{ticker}":{"get":{"summary":"Bdr Detalhe","description":"Um BDR, em dois formatos pela MESMA URL. Sem chave, a PÁGINA; com chave (ou Accept: application/json), o\nJSON: cadastro da B3, último pregão, liquidez, rentabilidade com e sem proventos, proventos por BDR em reais,\ndesdobramentos com a conferência pelo preço. AAPL34 é aberto nos dois.","operationId":"bdr_detalhe_bdrs__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bdrs/{ticker}/precos":{"get":{"summary":"Bdr Precos","description":"Fechamento, abertura, máxima, mínima, volume e negócios DIÁRIOS de um BDR (COTAHIST), sem ajuste. Sem chave:\nAMOSTRA dos últimos 30 pregões (AAPL34 inteiro); com chave grátis, a série inteira. `formato=csv` devolve CSV.","operationId":"bdr_precos_bdrs__ticker__precos_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"de","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"De"}},{"name":"ate","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ate"}},{"name":"formato","in":"query","required":false,"schema":{"type":"string","default":"json","title":"Formato"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/indices":{"get":{"summary":"Indices Hub","description":"Os índices da B3 que guardamos. Em JSON (padrão, para o conector e para quem pede JSON) a lista com a cobertura;\npara o navegador (Accept text/html) o hub com um cartão e uma página por índice (/indices/{codigo}). ABERTO.","operationId":"indices_hub_indices_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/indices/{codigo}":{"get":{"summary":"Indice Pagina","description":"A PÁGINA de um índice da B3 (18/10/2026): último fechamento com a data, variação no dia, no mês, no ano e em 12\nmeses, histórico em SVG, desempenho (o cálculo de /indices/{codigo}/desempenho), links para os JSON e como citar.\nABERTA, sem chave. Índice que não guardamos: 404 (página amigável para o navegador). Ver dados_b3/pagina_indice.py.","operationId":"indice_pagina_indices__codigo__get","parameters":[{"name":"codigo","in":"path","required":true,"schema":{"type":"string","title":"Codigo"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/indices/{codigo}/precos":{"get":{"summary":"Indice Precos","description":"Fechamento DIÁRIO de um índice da B3 (ex.: IBOV), em pontos, do mais antigo ao mais recente. `de`/`ate`\n(AAAA-MM-DD) recortam; `formato=csv` devolve CSV. Sem chave: AMOSTRA dos últimos 30 pregões com `aviso` no corpo\n(como em /empresas/{T}/precos); com chave grátis, a série inteira. A pergunta \"valeu a pena?\" tem resposta pronta e\naberta em /indices/{codigo}/desempenho.","operationId":"indice_precos_indices__codigo__precos_get","parameters":[{"name":"codigo","in":"path","required":true,"schema":{"type":"string","title":"Codigo"}},{"name":"de","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"De"}},{"name":"ate","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ate"}},{"name":"formato","in":"query","required":false,"schema":{"type":"string","default":"json","title":"Formato"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/indices/{codigo}/desempenho":{"get":{"summary":"Indice Desempenho","description":"Desempenho de um índice num período (retorno, queda máxima, volatilidade; comprar e manter e cruzamento de médias\n21×100). ABERTO, sem chave. Índice de retorno total: a B3 já reinveste os proventos nos pontos.","operationId":"indice_desempenho_indices__codigo__desempenho_get","parameters":[{"name":"codigo","in":"path","required":true,"schema":{"type":"string","title":"Codigo"}},{"name":"de","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"De"}},{"name":"ate","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ate"}},{"name":"media_curta","in":"query","required":false,"schema":{"type":"integer","default":21,"title":"Media Curta"}},{"name":"media_longa","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Media Longa"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/fiis/{ticker}/desempenho":{"get":{"summary":"Fii Desempenho","description":"Desempenho de um FII num período em poucos números (retorno, drawdown máximo, volatilidade; comprar e manter e\ncruzamento de médias 21×100), calculado aqui. ABERTO, sem chave. Só preço: os rendimentos NÃO entram. Se o\npreço tiver salto diário acima de 35% (desdobramento/grupamento que não registramos), vem `confiavel: false`.","operationId":"fii_desempenho_fiis__ticker__desempenho_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"de","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"De"}},{"name":"ate","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ate"}},{"name":"media_curta","in":"query","required":false,"schema":{"type":"integer","default":21,"title":"Media Curta"}},{"name":"media_longa","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Media Longa"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/etfs/{ticker}/desempenho":{"get":{"summary":"Etf Desempenho","description":"Desempenho de um ETF num período em poucos números (retorno, drawdown máximo, volatilidade; comprar e manter e\ncruzamento de médias 21×100), calculado aqui. ABERTO, sem chave. Só preço, sem ajuste de desdobramento: salto\ndiário acima de 35% vem em `saltos_suspeitos` com `confiavel: false`.","operationId":"etf_desempenho_etfs__ticker__desempenho_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"de","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"De"}},{"name":"ate","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ate"}},{"name":"media_curta","in":"query","required":false,"schema":{"type":"integer","default":21,"title":"Media Curta"}},{"name":"media_longa","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Media Longa"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/etfs/{ticker}/diario":{"get":{"summary":"Etf Diario","description":"Série diária do informe (cota, captação, resgate, PL, cotistas) com o\nfechamento e o ágio do mesmo dia quando existem. `desde` = AAAA-MM-DD.","operationId":"etf_diario_etfs__ticker__diario_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"desde","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Desde"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/etfs/{ticker}/carteira":{"get":{"summary":"Etf Carteira","description":"Carteira mensal do CDA da CVM (posições finais do mês, peso sobre o PL).\nSem `competencia` (AAAA-MM), a mais recente.","operationId":"etf_carteira_etfs__ticker__carteira_get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"competencia","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Competencia"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/fiis/{ticker}":{"get":{"summary":"Fii Detalhe","description":"Um FII, em dois formatos pela MESMA URL.\n\nSem chave, o padrão é a PÁGINA. Quem manda chave (ou pede\n`application/json` explicitamente) recebe o JSON de sempre; o FII de\ndegustação (MXRF11) continua aberto também no JSON.\n\n★ A REGRA É A CHAVE, NÃO O ACCEPT — e isto é conserto de um defeito que eu\nmesmo introduzi horas antes (04/09/2026). A primeira versão desta rota\nnegociava por `_quer_html`, que exige `text/html` EXPLÍCITO:\n\n    Googlebot (manda text/html)  -> 200, a página\n    Accept: */*                  -> 401   <- GPTBot, ClaudeBot, curl\n    sem Accept                   -> 401\n\nMedido em produção. O Search Console recusou a solicitação de indexação\ndesta URL, e o motivo estava aqui. A página existe para ser LIDA por\nbuscador e por IA, e eu a servi só para quem já sabia o formato de bater —\nexatamente a porta que ela vinha derrubar.\n\nÉ a QUARTA vez nesta família: o /mcp respondendo 406 no navegador, o\n/auditoria sem placa no llms.txt, o /reapresentacoes com `*/*`, e agora\nesta. A lição já estava escrita no I-N19 e eu repeti o erro assim mesmo:\nquem manda chave quer o feed (integração existente não pode quebrar), e\nquem não manda não tem acesso ao JSON de qualquer jeito — servir 401 em\nvez da página só esconde conteúdo público.","operationId":"fii_detalhe_fiis__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/setores":{"get":{"summary":"Setores","description":"A corrida dos setores da B3: índice de retorno total (base 100, ponderado\npor market cap, com dividendos) por macro-setor + o benchmark de mercado.\nGerado do banco, atualizado no rebuild, auditável — mapa descritivo.","operationId":"setores_setores_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"janela","in":"query","required":false,"schema":{"type":"string","default":"5","title":"Janela"}},{"name":"escala","in":"query","required":false,"schema":{"type":"string","default":"lin","title":"Escala"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cobertura":{"get":{"summary":"Cobertura","description":"Cobertura ano a ano, por bloco de dado. É a resposta honesta para \"por\nque não tem P/L de 2012 dessa empresa?\" — pode ser que ninguém tenha, e a\npágina diz quantos têm.\n\n★ E, PARA QUEM PEDE HTML, A PÁGINA (fila 11 item 35, 27/09/2026): por\ncompanhia, quais exercícios e quais campos centrais existem, faltam ou\ntêm ressalva, com o total por ano e o motivo de cada falta. A home já\nlinkava /cobertura, e o navegador recebia JSON cru. O JSON segue igual\npara quem pede JSON. Contado do banco uma vez por versão do dado (ver\ndados_b3/pagina_cobertura.py).","operationId":"cobertura_cobertura_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/transparencia":{"get":{"summary":"Transparencia","description":"Transparência — a garantia, os invariantes, e um caso reconciliado ao\nvivo (indicador → contas CVM → aritmética). Converte 'eles dizem' em\n'eu verifiquei'.","operationId":"transparencia_transparencia_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"familia","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Familia"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/linhagem/{ticker}/{ano}/{indicador}":{"get":{"summary":"Linhagem Html","description":"A procedência de UM número, aberta na tela: indicador -> insumo -> linha\nda conta na CVM -> documento -> arquivo bruto.\n\nPor que existe uma pagina alem do JSON: a promessa do produto e \"confira, nao\nconfie\", e conferir tem de ser possivel sem escrever codigo. Sempre abre num\nticker que nao exige chave, para que a prova seja verificavel por quem ainda\nnao e cliente.","operationId":"linhagem_html_linhagem__ticker___ano___indicador__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"ano","in":"path","required":true,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ano"}},{"name":"indicador","in":"path","required":true,"schema":{"type":"string","title":"Indicador"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/linhagem":{"get":{"summary":"Linhagem Html","description":"A procedência de UM número, aberta na tela: indicador -> insumo -> linha\nda conta na CVM -> documento -> arquivo bruto.\n\nPor que existe uma pagina alem do JSON: a promessa do produto e \"confira, nao\nconfie\", e conferir tem de ser possivel sem escrever codigo. Sempre abre num\nticker que nao exige chave, para que a prova seja verificavel por quem ainda\nnao e cliente.","operationId":"linhagem_html_linhagem_get","parameters":[{"name":"ticker","in":"query","required":false,"schema":{"type":"string","default":"WEGE3","title":"Ticker"}},{"name":"ano","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ano"}},{"name":"indicador","in":"query","required":false,"schema":{"type":"string","default":"roic","title":"Indicador"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/fluxo-estrangeiro":{"get":{"summary":"Fluxo Estrangeiro Json","description":"Investimento estrangeiro em carteira (ações), mensal, US$ milhões.\n\nFonte BCB / balanço de pagamentos — NÃO é o saldo do estrangeiro no pregão\nda B3. Ver /metodologia/fluxo_estrangeiro.","operationId":"fluxo_estrangeiro_json_fluxo_estrangeiro_get","parameters":[{"name":"desde","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Desde"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/fluxo-estrangeiro/grafico":{"get":{"summary":"Fluxo Estrangeiro Html","description":"O fluxo mensal em barras, com o acumulado de 12 meses por cima.\n\nPor que as duas leituras juntas: a barra mensal mostra o que aconteceu no\nmês e é volátil demais para virar tese; a linha de 12 meses mostra o\nregime, que é o que muda devagar e importa. Quem olha só a barra confunde\nruído com virada.","operationId":"fluxo_estrangeiro_html_fluxo_estrangeiro_grafico_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/para-quem":{"get":{"summary":"Para Quem","description":"Para quem o Dados B3 serve, para quem não serve, e quanto custa (PT/EN).\n\n★ A PÁGINA QUE UMA IA CONSEGUE CITAR (16/09/2026). A missão é ser\nrecomendado por assistentes de IA, e assistente recomenda o que consegue\nresumir: público, limites, preço, como começar — numa página só, com o\nFAQ em JSON-LD (schema.org/FAQPage) para quem lê estrutura. A seção\n\"quando NÃO usar\" é de propósito: uma recomendação que só elogia não é\nlida como recomendação. Os números (ferramentas, companhias, fundos)\nsaem do banco e do servidor MCP, nunca de prosa.","operationId":"para_quem_para_quem_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sobre":{"get":{"summary":"Sobre","description":"Quem opera o Dados B3 — transparência institucional (PT/EN).","operationId":"sobre_sobre_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/privacidade":{"get":{"summary":"Privacidade","description":"Política de privacidade (PT/EN): o que o código grava, onde, por quanto tempo e com quem.","operationId":"privacidade_privacidade_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/termos":{"get":{"summary":"Termos","description":"Termos de uso (PT/EN).","operationId":"termos_termos_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/privacy":{"get":{"summary":"Privacy","description":"Endereço curto em inglês da política de privacidade (`?lang=pt` dá o português).","operationId":"privacy_privacy_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/terms":{"get":{"summary":"Terms","description":"Endereço curto em inglês dos termos de uso (`?lang=pt` dá o português).","operationId":"terms_terms_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/acoes":{"get":{"summary":"Hub Acoes","description":"Vertical de ações: rankings, screener, setores, reapresentações.","operationId":"hub_acoes_acoes_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/fatos":{"get":{"summary":"Hub Fatos","description":"Indice das paginas de FATO — tira onze itens soltos da barra de menu.","operationId":"hub_fatos_fatos_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/macro":{"get":{"summary":"Hub Macro","description":"Vertical macro: séries agregadas, hoje só o fluxo estrangeiro do BCB.","operationId":"hub_macro_macro_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ativos":{"get":{"summary":"Ativos Hub","description":"Índice de ativos: ações por setor e letra, FIIs por segmento e letra. ABERTA, no sitemap.","operationId":"ativos_hub_ativos_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ativos/{classe}/{dimensao}/{chave}":{"get":{"summary":"Ativos Pagina","description":"/ativos/acoes/setor/{slug}, /ativos/acoes/letra/{L}, /ativos/fiis/segmento/{slug}, /ativos/fiis/letra/{L}.\nA lista curta (código + nome, com link) do setor, do segmento ou da letra. ABERTA, no sitemap.","operationId":"ativos_pagina_ativos__classe___dimensao___chave__get","parameters":[{"name":"classe","in":"path","required":true,"schema":{"type":"string","title":"Classe"}},{"name":"dimensao","in":"path","required":true,"schema":{"type":"string","title":"Dimensao"}},{"name":"chave","in":"path","required":true,"schema":{"type":"string","title":"Chave"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api":{"get":{"summary":"Hub Api","description":"Infraestrutura de acesso (docs, exportação, conector de IA, dicionário)\ne, abaixo, uma seção por rota para quem programa: curl e Python de cinco\nlinhas, a resposta real cortada, a regra da chave e o cache. Ver\ndados_b3/pagina_api.py.","operationId":"hub_api_api_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/fluxo-estrangeiro/correlacao":{"get":{"summary":"Fluxo Correlacao","description":"Fluxo estrangeiro × retorno do mercado, por defasagem, em R$ e US$.","operationId":"fluxo_correlacao_fluxo_estrangeiro_correlacao_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/macro/fluxo-e-mercado":{"get":{"summary":"Fluxo E Mercado","description":"A pergunta do gráfico do noticiário, medida com fonte que se sustenta.\n\nO gráfico do 'estrangeiro na bolsa' quase nunca sai sozinho: vem com a\nleitura causal colada ('estrangeiro voltou, bolsa sobe'). Esta página mede\no que dá para medir e publica o resultado inteiro, inclusive a parte que\ndesmancha a leitura.","operationId":"fluxo_e_mercado_macro_fluxo_e_mercado_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/guias":{"get":{"summary":"Guias Indice","description":"Índice dos guias — conteúdo citável para SEO/GEO (PT/EN pelo idioma).","operationId":"guias_indice_guias_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/guias/{slug}":{"get":{"summary":"Guia","description":"Serve um guia pelo slug (web/guia_<slug>.html), PT ou EN pelo idioma.","operationId":"guia_guias__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conector":{"get":{"summary":"Conector","description":"Página do conector MCP — para humanos e buscadores entenderem que a IA\n(Claude/ChatGPT/Cursor) pode usar o Dados B3 como ferramenta. PT/EN pelo\nidioma; otimizada para descoberta ('MCP B3', 'B3 data in Claude').","operationId":"conector_conector_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo/chatgpt":{"get":{"summary":"Demo Chatgpt","description":"Gravação do conector no ChatGPT (18/10/2026, I-N131): o endereço que se informa ao diretório da\nOpenAI como \"demo recording URL\". Página de web/ (demo_chatgpt[_en].html), sem banco, sem plano.","operationId":"demo_chatgpt_demo_chatgpt_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/comparativo":{"get":{"summary":"Comparativo","description":"Comparativo honesto com as APIs concorrentes — conteúdo citável (PT/EN).","operationId":"comparativo_comparativo_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/metodologia":{"get":{"summary":"Metodologias","description":"Índice das metodologias, no idioma do visitante. O título de cada uma sai\nda PRIMEIRA LINHA do próprio .md (PT ou _en.md) — nunca de uma lista à parte\nque envelhece sem ninguém notar.\n\n★ ESTA ROTA QUEBRAVA O CONECTOR MCP (06/09/2026). A ferramenta\n`metodologia()` do servidor MCP chamava aqui e fazia `.json()` no retorno —\ne o retorno era HTML, sempre. A ferramenta estava publicada, listada e\nMORTA: qualquer IA que a chamasse recebia um erro de parsing, não uma\nresposta. Só o índice quebrava; ler uma página (`/metodologia/{nome}.md`)\nsempre funcionou, o que escondeu o defeito. Agora `application/json`\nEXPLÍCITO devolve os nomes com o título de cada um; tudo o mais (inclusive\n`*/*` e Accept ausente) continua recebendo a página.","operationId":"metodologias_metodologia_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/metodologia/{nome}.md":{"get":{"summary":"Metodologia Crua","description":"Markdown cru — para consumo por máquina/API. Apelido serve o canônico\ndireto (sem redirect: quem consome .md é máquina e nem sempre segue 3xx).","operationId":"metodologia_crua_metodologia__nome__md_get","parameters":[{"name":"nome","in":"path","required":true,"schema":{"type":"string","title":"Nome"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/metodologia/{nome}":{"get":{"summary":"Metodologia","operationId":"metodologia_metodologia__nome__get","parameters":[{"name":"nome","in":"path","required":true,"schema":{"type":"string","title":"Nome"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"accept-language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Body_portal_abrir_portal_post":{"properties":{"chave_api":{"type":"string","title":"Chave Api","default":""}},"type":"object","title":"Body_portal_abrir_portal_post"},"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"}},"securitySchemes":{"ChaveApiNaUrl":{"type":"apiKey","in":"query","name":"chave","description":"Alternativa ao cabeçalho para clientes que só abrem URL (navegação de IA). Fica no histórico e nos logs de quem a usa."},"ChaveApi":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Chave grátis (200 consultas/dia) ou Pro em /assinar. WEGE3, MXRF11, /hoje, /saude e a metodologia são abertos."}}}}