{"openapi":"3.1.0","info":{"title":"Vexday API","description":"Inteligência de vulnerabilidades verificada do Vexday. A API pública read-only vive sob /api/v1 e exige uma chave gratuita (gere no painel). CVEs enriquecidas, catálogo KEV de exploração ativa, exploits públicos com o selo VexDay Proof e grupos de ameaça. Fontes abertas e verificáveis — credite o Vexday ao redistribuir. Docs: https://vexday.io/pt/api","version":"1.0.0"},"paths":{"/admin/me":{"get":{"tags":["admin"],"summary":"Admin Me","operationId":"admin_me_admin_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/jobs":{"get":{"tags":["admin"],"summary":"Admin Jobs","description":"Semáforo de todos os jobs: último run + falhas 24h + status calculado.","operationId":"admin_jobs_admin_jobs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/jobs/{job}/runs":{"get":{"tags":["admin"],"summary":"Admin Job Runs","description":"Histórico de execuções de um job (mais recentes primeiro).","operationId":"admin_job_runs_admin_jobs__job__runs_get","parameters":[{"name":"job","in":"path","required":true,"schema":{"type":"string","title":"Job"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/infra":{"get":{"tags":["admin"],"summary":"Admin Infra","operationId":"admin_infra_admin_infra_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/morgue/queue":{"get":{"tags":["admin"],"summary":"Morgue Queue","description":"A fila de triagem: leads brutos (RSS/EDGAR/ransomware) por status.","operationId":"morgue_queue_admin_morgue_queue_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"new","title":"Status"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":300,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/morgue/lead/{lead_id}/discard":{"post":{"tags":["admin"],"summary":"Morgue Discard","operationId":"morgue_discard_admin_morgue_lead__lead_id__discard_post","parameters":[{"name":"lead_id","in":"path","required":true,"schema":{"type":"string","title":"Lead Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscardBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/morgue/lead/{lead_id}/restore":{"post":{"tags":["admin"],"summary":"Morgue Restore","description":"Arrependimento: devolve um lead descartado para a fila.","operationId":"morgue_restore_admin_morgue_lead__lead_id__restore_post","parameters":[{"name":"lead_id","in":"path","required":true,"schema":{"type":"string","title":"Lead Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/morgue/promote":{"post":{"tags":["admin"],"summary":"Morgue Promote","description":"Cria o incidente como RASCUNHO a partir da sua leitura do lead.\n\nNasce claimed + unverified + published=FALSE — o método: boato entra\ncomo alegação, nunca como fato, e nada vai ao ar sem o seu veredito.","operationId":"morgue_promote_admin_morgue_promote_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoteBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/morgue/incidents":{"get":{"tags":["admin"],"summary":"Morgue Incidents","description":"Todos os incidentes (rascunhos incluídos) para a mesa de curadoria.","operationId":"morgue_incidents_admin_morgue_incidents_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"all","title":"State"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":300,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/morgue/incident/{bid}":{"post":{"tags":["admin"],"summary":"Morgue Incident Update","description":"Curadoria do incidente: selo, veredito, números, análise e publicação.\n\nSó os campos enviados mudam. Publicar/despublicar é auditado à parte.","operationId":"morgue_incident_update_admin_morgue_incident__bid__post","parameters":[{"name":"bid","in":"path","required":true,"schema":{"type":"string","title":"Bid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/kpis":{"get":{"tags":["admin"],"summary":"Admin Kpis","description":"Os números que importam para o negócio, em uma chamada.\n\nFunil: lead (Raio-X) -> conta -> ativação (stack, alertas, HIBP).\nEngajamento: sessões ativas + DAU/WAU/MAU (via last_seen_at).\nConteúdo: boletins sem falha, incidentes publicados, CVE profundo.","operationId":"admin_kpis_admin_kpis_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":7,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/costs":{"get":{"tags":["admin"],"summary":"Admin Costs","description":"Painel de custos de IA: gasto por dia, por job e por modelo (medição\nprópria), o total oficial da Anthropic (reconciliação) e o retorno do\nfunil (leads/contas) para julgar custo × valor gerado.","operationId":"admin_costs_admin_costs_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":180,"minimum":7,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api-keys":{"get":{"tags":["admin"],"summary":"Admin Api Keys","description":"Gestão e observabilidade das chaves da API pública: quem consome,\nquanto, quais endpoints, taxa de erro e as chaves individuais com o nome\ndo dono. Tudo resiliente às migrações 46/47 faltarem (retorna vazio).","operationId":"admin_api_keys_admin_api_keys_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":180,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api-keys/{key_id}/revoke":{"post":{"tags":["admin"],"summary":"Admin Revoke Api Key","description":"Revoga uma chave (ação de admin, p/ conter abuso). Auditado.","operationId":"admin_revoke_api_key_admin_api_keys__key_id__revoke_post","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/leads":{"get":{"tags":["admin"],"summary":"Admin Leads","operationId":"admin_leads_admin_leads_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":365,"minimum":1},{"type":"null"}],"title":"Days"}},{"name":"has_account","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Account"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":10,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/leads.csv":{"get":{"tags":["admin"],"summary":"Admin Leads Csv","description":"Exporta a base filtrada em CSV (Excel pt-BR: ';' + BOM UTF-8).\nCada export fica registrado no audit_log — é dado pessoal saindo.","operationId":"admin_leads_csv_admin_leads_csv_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":365,"minimum":1},{"type":"null"}],"title":"Days"}},{"name":"has_account","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Account"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users":{"get":{"tags":["admin"],"summary":"Admin Users","operationId":"admin_users_admin_users_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"all","title":"State"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":10,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{uid}":{"get":{"tags":["admin"],"summary":"Admin User Detail","operationId":"admin_user_detail_admin_users__uid__get","parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"integer","title":"Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Admin User Update","description":"Desativar/reativar e conceder/remover admin — com trava anti-lockout:\nvocê não desativa a si mesmo nem remove o próprio acesso admin.","operationId":"admin_user_update_admin_users__uid__post","parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"integer","title":"Uid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{uid}/revoke-sessions":{"post":{"tags":["admin"],"summary":"Admin User Revoke","operationId":"admin_user_revoke_admin_users__uid__revoke_sessions_post","parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"integer","title":"Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/google/start":{"get":{"tags":["auth"],"summary":"Google Start","operationId":"google_start_auth_google_start_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"pt","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/google/callback":{"get":{"tags":["auth"],"summary":"Google Callback","operationId":"google_callback_auth_google_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cve/{cve_id}":{"get":{"tags":["public-api"],"summary":"Detalhe de uma CVE","description":"Retorna o registro completo de uma CVE: severidade, EPSS, KEV,\nexploração, PoCs, conteúdo profundo (quando disponível) e o Vexday Score.","operationId":"api_cve_api_v1_cve__cve_id__get","parameters":[{"name":"cve_id","in":"path","required":true,"schema":{"type":"string","title":"Cve Id"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"en","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cve":{"get":{"tags":["public-api"],"summary":"Buscar CVEs","description":"Busca paginada por CVEs. Filtros: texto, severidade, vendor, produto,\nCWE, no catálogo KEV, com PoC público. Ordenação por risco (padrão).","operationId":"api_search_api_v1_cve_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Severity"}},{"name":"vendor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vendor"}},{"name":"product","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product"}},{"name":"cwe","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cwe"}},{"name":"in_kev","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"In Kev"}},{"name":"has_poc","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Poc"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"risk","title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/kev":{"get":{"tags":["public-api"],"summary":"Catálogo KEV (exploração ativa)","description":"As CVEs sob exploração ativa confirmada (CISA KEV), ordenadas por risco.\nO recorte mais valioso: o que atacantes usam de verdade, agora.","operationId":"api_kev_api_v1_kev_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/exploits":{"get":{"tags":["public-api"],"summary":"Exploits públicos catalogados","description":"PoCs e exploits públicos (GitHub, Exploit-DB, Nuclei, Metasploit) com a\nCVE, o risco e o selo VexDay Proof (verificado em laboratório).","operationId":"api_exploits_api_v1_exploits_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"verified","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Verified"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"recent","title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/actors":{"get":{"tags":["public-api"],"summary":"Grupos de ameaça","description":"Grupos de ameaça (APTs e operações de ransomware) com origem, alvos e\ntécnicas MITRE ATT&CK. Filtros: tipo (apt|ransomware|crime), busca, foco BR.","operationId":"api_actors_api_v1_actors_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"actor_type","in":"query","required":false,"schema":{"type":"string","default":"","title":"Actor Type"}},{"name":"br_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Br Only"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":300,"minimum":1,"default":60,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/actor/{actor_id}":{"get":{"tags":["public-api"],"summary":"Detalhe de um grupo de ameaça","description":"Perfil completo de um grupo: aliases, país, setores-alvo, técnicas,\nCVEs exploradas e infraestrutura conhecida.","operationId":"api_actor_api_v1_actor__actor_id__get","parameters":[{"name":"actor_id","in":"path","required":true,"schema":{"type":"string","title":"Actor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/status":{"get":{"tags":["public-api"],"summary":"Status da sua chave","description":"Verifica a chave e mostra o uso do dia (para o consumidor monitorar o\npróprio consumo antes de bater no limite).","operationId":"api_status_api_v1_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/stats":{"get":{"summary":"Stats","operationId":"stats_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/stats/severity":{"get":{"summary":"Stats Severity","operationId":"stats_severity_stats_severity_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/stats/top-vendors":{"get":{"summary":"Top Vendors","operationId":"top_vendors_stats_top_vendors_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stats/top-cwes":{"get":{"summary":"Top Cwes","operationId":"top_cwes_stats_top_cwes_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tech/exposure":{"get":{"summary":"Tech Exposure","description":"Tecnologias ranqueadas por score de exposição (adoção real × risco).","operationId":"tech_exposure_tech_exposure_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":40,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tech/suggest":{"get":{"summary":"Tech Suggest","description":"Autocomplete de tecnologias conhecidas, ordenado por exposição.\nDefinido ANTES de /tech/{technology} para não ser capturado como tech.","operationId":"tech_suggest_tech_suggest_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":8,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tech/{technology}":{"get":{"summary":"Tech Detail","description":"Detalhe de uma tecnologia: métricas de exposição + CVEs do ecossistema.","operationId":"tech_detail_tech__technology__get","parameters":[{"name":"technology","in":"path","required":true,"schema":{"type":"string","title":"Technology"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/export/actor-data":{"get":{"summary":"Export Actor Data","description":"Dados factuais por ator para o enriquecimento de IA offline (Fase 5).\nEntrega só números/fatos reais; a IA interpreta sem inventar. Inclui\nai_summary atual (se houver) para o script pular os já feitos.","operationId":"export_actor_data_export_actor_data_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":600,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/intel/br":{"get":{"summary":"Intel Br","description":"Painel de inteligência Brasil: vítimas de ransomware, grupos ativos,\nsetores atingidos e as CVEs que esses grupos exploram (ponte vítima→ator→CVE).","operationId":"intel_br_intel_br_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":1825,"minimum":30,"default":365,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/actors":{"get":{"summary":"Actors","description":"Catálogo de atores de ameaça (índice). Filtros por tipo, busca e foco BR.","operationId":"actors_actors_get","parameters":[{"name":"actor_type","in":"query","required":false,"schema":{"type":"string","description":"apt|ransomware|crime","default":"","title":"Actor Type"},"description":"apt|ransomware|crime"},{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"busca por nome/alias","default":"","title":"Q"},"description":"busca por nome/alias"},{"name":"br_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Br Only"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":300,"minimum":1,"default":60,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/actor/{actor_id}":{"get":{"summary":"Actor Detail","description":"Perfil de um ator: dados + técnicas MITRE ATT&CK agrupadas por tática.","operationId":"actor_detail_actor__actor_id__get","parameters":[{"name":"actor_id","in":"path","required":true,"schema":{"type":"string","title":"Actor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vendors":{"get":{"summary":"Vendors","description":"Vendors com contagem — alimenta a página-índice e o sitemap.","operationId":"vendors_vendors_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":300,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vendor/{vendor}/stats":{"get":{"summary":"Vendor Stats","description":"Estatísticas agregadas de um vendor — base para insights e resumo de IA.","operationId":"vendor_stats_vendor__vendor__stats_get","parameters":[{"name":"vendor","in":"path","required":true,"schema":{"type":"string","title":"Vendor"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/export/enrich-data":{"get":{"summary":"Export Enrich Data","description":"Exporta dados agregados dos principais vendors/techs p/ o enrichment offline.\nInclui ai_summary atual (se houver) para o script offline pular os já feitos.","operationId":"export_enrich_data_export_enrich_data_get","parameters":[{"name":"vendors","in":"query","required":false,"schema":{"type":"integer","maximum":20000,"minimum":0,"default":150,"title":"Vendors"}},{"name":"techs","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":0,"default":150,"title":"Techs"}},{"name":"vendor_min","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Vendor Min"}},{"name":"tech_min","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Tech Min"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cwes":{"get":{"summary":"Cwes","description":"CWEs com contagem — alimenta a página-índice e o sitemap.","operationId":"cwes_cwes_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":400,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cwe/{cwe_id}/content":{"get":{"summary":"Cwe Content","description":"Conteúdo explicativo de um CWE no idioma pedido (o que é / exemplo /\ncomo mitigar). LAZY: se não existir e alguém abriu, enfileira a geração.\nResiliente à migração 48 faltar (retorna name en + enfileira nada).","operationId":"cwe_content_cwe__cwe_id__content_get","parameters":[{"name":"cwe_id","in":"path","required":true,"schema":{"type":"string","title":"Cwe Id"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"pt","title":"Lang"}},{"name":"lazy","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Lazy"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sitemap/cves/count":{"get":{"summary":"Sitemap Cves Count","description":"Quantos CVEs entram no sitemap filtrado — o índice usa para os chunks.","operationId":"sitemap_cves_count_sitemap_cves_count_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/sitemap/cves":{"get":{"summary":"Sitemap Cves","description":"IDs + data de atualização dos CVEs de VALOR, paginados, para os chunks\ndo sitemap. Filtra CVEs irrelevantes para preservar o crawl budget.","operationId":"sitemap_cves_sitemap_cves_get","parameters":[{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50000,"minimum":1,"default":40000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stats/timeline":{"get":{"summary":"Timeline","operationId":"timeline_stats_timeline_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stats/monthly":{"get":{"summary":"Monthly","description":"CVEs por mês (total, KEV, críticos) — alimenta o gráfico de tendência.","operationId":"monthly_stats_monthly_get","parameters":[{"name":"months","in":"query","required":false,"schema":{"type":"integer","maximum":120,"minimum":1,"default":24,"title":"Months"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stats/epss-buckets":{"get":{"summary":"Epss Buckets","description":"Distribuição de CVEs por faixa de probabilidade de exploração (EPSS).","operationId":"epss_buckets_stats_epss_buckets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/search":{"get":{"summary":"Search","operationId":"search_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Severity"}},{"name":"vendor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vendor"}},{"name":"product","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product"}},{"name":"cwe","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cwe"}},{"name":"in_kev","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"In Kev"}},{"name":"has_poc","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Poc"}},{"name":"epss_min","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Epss Min"}},{"name":"published_since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published Since"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"published_desc","title":"Sort"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exploits":{"get":{"summary":"Exploits","description":"Catálogo de exploração pública: PoCs (GitHub/Exploit-DB), templates\nNuclei e módulos Metasploit — unificados num índice pesquisável.\n\nAs duas tabelas têm formatos diferentes (cve_poc tem estrelas; cve_exploit\ntem rank), então normalizamos num UNION antes de filtrar. Busca entende\nID de CVE (mesma regra do site), nome do exploit, título da CVE e\ntecnologia afetada (vendor/produto).","operationId":"exploits_exploits_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"in_kev","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"In Kev"}},{"name":"verified","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Verified"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"recent","title":"Sort"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exploits/stats":{"get":{"summary":"Exploits Stats","description":"Contagem por fonte — alimenta os filtros da página.","operationId":"exploits_stats_exploits_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/exploit-timeline":{"get":{"summary":"Exploit Timeline","description":"Fila de prioridade: CVEs ordenadas pelo Vexday Risk Score (calculado em SQL).","operationId":"exploit_timeline_exploit_timeline_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"in_kev","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"In Kev"}},{"name":"has_poc","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Poc"}},{"name":"has_exploit","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Exploit"}},{"name":"epss_min","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Epss Min"}},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Severity"}},{"name":"band","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Band"}},{"name":"min_score","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":0,"default":31,"title":"Min Score"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/triage":{"get":{"summary":"Triage","description":"Sala de Triagem: visão 'agora' (chegadas + faixas de risco) e 'maturação' (EPSS point-in-time).","operationId":"triage_triage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/cve/{cve_id}":{"get":{"summary":"Get Cve","operationId":"get_cve_cve__cve_id__get","parameters":[{"name":"cve_id","in":"path","required":true,"schema":{"type":"string","title":"Cve Id"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"en","title":"Lang"}},{"name":"lazy","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Lazy"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/feed":{"get":{"summary":"Feed","description":"SSE: emite CVEs recém-ingeridos. Faz polling do banco por ingested_at.\nPara produção em escala, trocar polling por LISTEN/NOTIFY do Postgres.","operationId":"feed_feed_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/daily/latest":{"get":{"summary":"Daily Latest","description":"Boletim diário mais recente para o idioma.","operationId":"daily_latest_daily_latest_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"pt","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/daily":{"get":{"summary":"Daily Archive","description":"Lista (arquivo) de boletins: data + título + stats.","operationId":"daily_archive_daily_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"pt","title":"Lang"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":60,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/daily/{report_date}":{"get":{"summary":"Daily One","description":"Boletim de uma data específica (YYYY-MM-DD).","operationId":"daily_one_daily__report_date__get","parameters":[{"name":"report_date","in":"path","required":true,"schema":{"type":"string","title":"Report Date"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"pt","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/threat-map":{"get":{"summary":"Threat Map","description":"Snapshot do mapa de ameaças: camada ransomware (id=1) e malware (id=2).\nEnriquece os top_groups do snapshot com o link para o perfil do ator\n(casando por nome/alias) e as CVEs que o grupo explora — conectando o\nmapa de ransomware ao resto da inteligência.","operationId":"threat_map_threat_map_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/threat-stats":{"get":{"summary":"Threat Stats","description":"Snapshot pré-calculado dos KPIs do observatório (/panorama).","operationId":"threat_stats_threat_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/exposure":{"get":{"summary":"Exposure","description":"Prévia de exposição para a stack escolhida (usado no Passo 1).","operationId":"exposure_exposure_get","parameters":[{"name":"stack","in":"query","required":false,"schema":{"type":"string","description":"vendors separados por vírgula","default":"","title":"Stack"},"description":"vendors separados por vírgula"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/lead":{"post":{"summary":"Create Lead","description":"Captura o lead (Passo 1): salva, envia o RELATÓRIO ao lead e avisa o time.\nProtegido contra abuso: honeypot + rate limit por IP/e-mail + teto global.","operationId":"create_lead_lead_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/iocs":{"get":{"summary":"List Iocs","description":"Lista IOCs com filtros (página pesquisável). Fonte: abuse.ch.","operationId":"list_iocs_iocs_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"busca por valor, malware ou tag","default":"","title":"Q"},"description":"busca por valor, malware ou tag"},{"name":"source","in":"query","required":false,"schema":{"type":"string","description":"threatfox | urlhaus | malwarebazaar","default":"","title":"Source"},"description":"threatfox | urlhaus | malwarebazaar"},{"name":"ioc_type","in":"query","required":false,"schema":{"type":"string","description":"domain | ip:port | url | sha256_hash ...","default":"","title":"Ioc Type"},"description":"domain | ip:port | url | sha256_hash ..."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/iocs/stats":{"get":{"summary":"Iocs Stats","description":"Contadores pro cabeçalho da página de IOCs.","operationId":"iocs_stats_iocs_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/check-ip":{"get":{"summary":"Check Ip","description":"Reputação do IP (GreyNoise + IOCs) enriquecida com contexto\n(AbuseIPDB: score, ISP, tipo, país; IPInfo: ASN, cidade).","operationId":"check_ip_check_ip_get","parameters":[{"name":"ip","in":"query","required":true,"schema":{"type":"string","description":"IPv4/IPv6 público","title":"Ip"},"description":"IPv4/IPv6 público"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/request":{"post":{"summary":"Auth Request","description":"Passo 1 do login: gera o token mágico e envia o link por e-mail.","operationId":"auth_request_auth_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthRequestIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/verify":{"post":{"summary":"Auth Verify","description":"Passo 2: valida o token mágico e cria a sessão (cookie).","operationId":"auth_verify_auth_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthVerifyIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/me":{"get":{"summary":"Auth Me","description":"Quem está logado (via cookie). Retorna null se não logado.","operationId":"auth_me_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/logout":{"post":{"summary":"Auth Logout","operationId":"auth_logout_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/account/api-keys":{"get":{"summary":"List Api Keys","description":"Lista as chaves de API do usuário logado (sem revelar o secret —\nsó o prefixo, o nome, o uso e o status).","operationId":"list_api_keys_account_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Create Api Key","description":"Gera uma nova chave. O secret completo é retornado UMA vez aqui —\ndepois só o prefixo fica visível. Máximo de 5 chaves ativas por conta.","operationId":"create_api_key_account_api_keys_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/account/api-keys/{key_id}/revoke":{"post":{"summary":"Revoke Api Key","description":"Revoga uma chave do próprio usuário (irreversível).","operationId":"revoke_api_key_account_api_keys__key_id__revoke_post","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/panel/exposure":{"get":{"summary":"Panel Exposure","description":"Exposição + score do usuário logado. Grava snapshot no histórico\n(1x/dia) pra calcular a variação semanal.","operationId":"panel_exposure_panel_exposure_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/panel/whats-new":{"get":{"summary":"Panel Whats New","description":"A camada \"e daí pra MIM\": o que mudou na stack do usuário recentemente.\nRetorna as CVEs que afetam a stack dele E que ficaram mais perigosas nos\núltimos 30 dias — entraram no KEV, foram vistas pelo VulnCheck, ou ganharam\nexploit. É o que transforma o painel de 'foto' em 'o que preciso saber agora'.\nUsa 100% dados que já temos; nada de fonte nova.","operationId":"panel_whats_new_panel_whats_new_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/panel/stack":{"post":{"summary":"Panel Stack","description":"Atualiza a stack do usuário logado.","operationId":"panel_stack_panel_stack_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StackUpdateIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stack/catalog":{"get":{"summary":"Stack Catalog","description":"Catálogo de tecnologias pra seleção (categorias + produtos + rótulos).","operationId":"stack_catalog_stack_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/panel/alerts":{"post":{"summary":"Panel Alerts","description":"Liga/desliga os alertas por e-mail do usuário logado.","operationId":"panel_alerts_panel_alerts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertPrefIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/panel/hibp/optin":{"post":{"summary":"Panel Hibp Optin","description":"Liga/desliga o opt-in.\n- Desligar: só esconde (mantém os dados e a data — não reconsulta ao religar).\n- Ligar: só consulta o HIBP se nunca verificou antes; senão, reusa o que há.\nA manutenção (pegar vazamentos novos) é mensal via job.","operationId":"panel_hibp_optin_panel_hibp_optin_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HibpOptIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/panel/hibp":{"get":{"summary":"Panel Hibp","description":"Estado e resultado da verificação de vazamento do usuário logado.","operationId":"panel_hibp_panel_hibp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/cta":{"get":{"summary":"Get Cta","description":"Sorteia um CTA do banco: serviço ativo (por peso) + variação do idioma.\nctx entra no utm_campaign para rastrear de onde o CTA foi exibido.","operationId":"get_cta_cta_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"pt","title":"Lang"}},{"name":"ctx","in":"query","required":false,"schema":{"type":"string","default":"geral","title":"Ctx"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/live/pulse":{"get":{"summary":"Live Pulse","description":"Junta numa chamada: IOCs (total + por fonte), grupos ativos no BR,\nvítimas recentes no BR. Usado pelos painéis novos do /live.","operationId":"live_pulse_live_pulse_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/panel/detail":{"get":{"summary":"Panel Detail","description":"Detalhamento do painel do usuário: as CVEs reais que ameaçam a stack,\nos grupos que a miram, e o histórico do score. Tudo derivado da base.","operationId":"panel_detail_panel_detail_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/risk/calc":{"get":{"summary":"Risk Calc","description":"Calcula o Vexday Risk Score a partir dos fatores informados.\nMesma lógica de compute_risk — mostra por que CVSS sozinho engana.","operationId":"risk_calc_risk_calc_get","parameters":[{"name":"cvss","in":"query","required":false,"schema":{"type":"number","maximum":10,"minimum":0,"default":0,"title":"Cvss"}},{"name":"epss","in":"query","required":false,"schema":{"type":"number","maximum":1,"minimum":0,"default":0,"title":"Epss"}},{"name":"kev","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Kev"}},{"name":"poc","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Poc"}},{"name":"nuclei","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Nuclei"}},{"name":"metasploit","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Metasploit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/risk/from-cve/{cve_id}":{"get":{"summary":"Risk From Cve","description":"Preenche a calculadora com os fatores reais de um CVE da base.","operationId":"risk_from_cve_risk_from_cve__cve_id__get","parameters":[{"name":"cve_id","in":"path","required":true,"schema":{"type":"string","title":"Cve Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/check-domain":{"get":{"summary":"Check Domain","description":"Verifica um domínio/URL contra a base de IOCs (URLhaus, ThreatFox) e,\nao vivo, a API do URLhaus (abuse.ch). Uso não-comercial dos dados abuse.ch.","operationId":"check_domain_check_domain_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","description":"domínio ou URL","title":"Q"},"description":"domínio ou URL"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/breach/{bid}":{"get":{"summary":"Breach Detail","description":"Relatório completo de um incidente, em padrão CTI.\n\nSó devolve o que foi publicado — verificar antes de publicar vale para o\ndetalhe tanto quanto para a lista. A exceção é a pré-visualização: com a\nchave certa (BREACH_PREVIEW_KEY), o rascunho é visível para revisão. Sem\nisso, revisar relatório gerado exigiria ler JSON no terminal — e revisão\ndifícil é revisão que não acontece.","operationId":"breach_detail_breach__bid__get","parameters":[{"name":"bid","in":"path","required":true,"schema":{"type":"string","title":"Bid"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"pt","title":"Lang"}},{"name":"preview","in":"query","required":false,"schema":{"type":"string","default":"","title":"Preview"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/breaches":{"get":{"summary":"Breaches List","description":"Breach intelligence pelo ângulo da VERIFICAÇÃO.\n\nRetorna só o que foi publicado (published=TRUE) — verificar antes de\npublicar é regra, não preferência. Cada item carrega o selo de confiança\n(alegado/corroborado/confirmado) e o veredito da apuração. Só metadados:\nnunca o conteúdo vazado.","operationId":"breaches_list_breaches_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"pt","title":"Lang"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}},{"name":"verdict","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verdict"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":60,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sectors":{"get":{"summary":"Sectors List","description":"Lista de setores com vítimas de ransomware (índice da ferramenta).","operationId":"sectors_list_sectors_get","parameters":[{"name":"country","in":"query","required":false,"schema":{"type":"string","default":"BR","title":"Country"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sector/{slug}":{"get":{"summary":"Sector Detail","description":"Panorama de um setor: vítimas, grupos que mais o atacam, evolução.","operationId":"sector_detail_sector__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"country","in":"query","required":false,"schema":{"type":"string","default":"BR","title":"Country"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/expand-url":{"get":{"summary":"Expand Url","description":"Segue os redirecionamentos de um link e revela o destino final,\nmostrando a cadeia completa. Não executa nada — só segue Location.\nProtegido contra SSRF (recusa destinos internos).","operationId":"expand_url_expand_url_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","description":"link encurtado ou URL","title":"Q"},"description":"link encurtado ou URL"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/scam-check":{"get":{"summary":"Scam Check","description":"Verificador de golpes: combina idade do domínio (RDAP), HTTPS e\npresença em bases de ameaça para estimar o risco de ser um site golpista.\nFoco em e-commerce/serviços falsos (domínios novos são o maior sinal).","operationId":"scam_check_scam_check_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","description":"domínio ou URL de loja/serviço","title":"Q"},"description":"domínio ou URL de loja/serviço"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/analyze-phishing":{"post":{"summary":"Analyze Phishing","description":"Analisa o texto de um email em busca de sinais de phishing/golpe.\nHeurística própria (sem IA/API externa) + checagem dos links na base de IOCs.","operationId":"analyze_phishing_analyze_phishing_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_PhishIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/analyze-header":{"post":{"summary":"Analyze Header","description":"Analisa o cabeçalho de um email: autenticação (SPF/DKIM/DMARC),\ncoerência do remetente (spoofing) e a cadeia de servidores por onde passou,\ncruzando os IPs/domínios do caminho com a base de IOCs.","operationId":"analyze_header_analyze_header_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_HeaderIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/timebomb":{"get":{"summary":"Timebomb","description":"CVEs de alto risco de exploração iminente: EPSS elevado E com\nPoC/exploit público, mas ainda NÃO listadas no KEV (não confirmadas\ncomo exploradas ativamente). É o 'quase explodindo' — janela de\ncorreção antes de virar ataque real.","operationId":"timebomb_timebomb_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":40,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exposure/stack":{"post":{"summary":"Exposure Stack","description":"Recebe a stack do usuário e devolve o panorama de exposição:\npor tecnologia (CVEs, KEV, EPSS), as CVEs mais críticas, e os grupos\nde ameaça que exploram essas tecnologias. Sem login — versão pública.","operationId":"exposure_stack_exposure_stack_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_StackIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/infostealer/domain":{"get":{"summary":"Infostealer Domain","description":"Exposição AGREGADA de um domínio corporativo a infostealers.\n\nDevolve contagens, famílias de malware e estatística de força de senha —\nnunca credenciais. Cacheado 24h. Recusa e-mail pessoal (LGPD).","operationId":"infostealer_domain_infostealer_domain_get","parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string","description":"domínio corporativo","title":"Domain"},"description":"domínio corporativo"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/infostealer/panorama":{"get":{"summary":"Infostealer Panorama","description":"Panorama macro do Brasil (números de relatórios públicos, com fonte).\n\nA API por domínio não filtra por país; a estatística nacional vem de\nrelatórios citados (SOCRadar/Flashpoint/Verizon DBIR 2025-2026). Este\nendpoint centraliza esses números para o painel — atualizável sem deploy\nquando novos relatórios saírem (por ora, hardcoded com fonte).","operationId":"infostealer_panorama_infostealer_panorama_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AlertPrefIn":{"properties":{"alerts_on":{"type":"boolean","title":"Alerts On"}},"type":"object","required":["alerts_on"],"title":"AlertPrefIn"},"AuthRequestIn":{"properties":{"email":{"type":"string","title":"Email"},"lang":{"type":"string","title":"Lang","default":"pt"},"website":{"type":"string","title":"Website","default":""}},"type":"object","required":["email"],"title":"AuthRequestIn"},"AuthVerifyIn":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"AuthVerifyIn"},"DiscardBody":{"properties":{"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","title":"DiscardBody"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HibpOptIn":{"properties":{"optin":{"type":"boolean","title":"Optin"}},"type":"object","required":["optin"],"title":"HibpOptIn"},"IncidentPatch":{"properties":{"victim_claimed":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Victim Claimed"},"actor_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Name"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"sector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sector"},"data_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Data Types"},"claimed_records":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Claimed Records"},"claim_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Claim Date"},"confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confidence"},"verdict":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verdict"},"verified_records":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Verified Records"},"verdict_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verdict Date"},"note_pt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note Pt"},"analyst":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Analyst"},"published":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Published"}},"type":"object","title":"IncidentPatch"},"LeadIn":{"properties":{"email":{"type":"string","title":"Email"},"stack":{"items":{"type":"string"},"type":"array","title":"Stack","default":[]},"lang":{"type":"string","title":"Lang","default":"pt"},"website":{"type":"string","title":"Website","default":""}},"type":"object","required":["email"],"title":"LeadIn"},"PromoteBody":{"properties":{"id":{"type":"string","title":"Id"},"victim_claimed":{"type":"string","title":"Victim Claimed"},"lead_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lead Id"},"actor_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Name"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"sector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sector"},"data_types":{"items":{"type":"string"},"type":"array","title":"Data Types","default":[]},"claimed_records":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Claimed Records"},"claim_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Claim Date"}},"type":"object","required":["id","victim_claimed"],"title":"PromoteBody"},"StackUpdateIn":{"properties":{"stack":{"items":{"type":"string"},"type":"array","title":"Stack","default":[]}},"type":"object","title":"StackUpdateIn"},"UserPatch":{"properties":{"disabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Disabled"},"is_admin":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Admin"}},"type":"object","title":"UserPatch"},"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"},"_HeaderIn":{"properties":{"text":{"type":"string","title":"Text"}},"type":"object","required":["text"],"title":"_HeaderIn"},"_PhishIn":{"properties":{"text":{"type":"string","title":"Text"}},"type":"object","required":["text"],"title":"_PhishIn"},"_StackIn":{"properties":{"technologies":{"items":{"type":"string"},"type":"array","title":"Technologies"}},"type":"object","required":["technologies"],"title":"_StackIn"}}}}