{"openapi":"3.1.0","info":{"title":"Xponda","version":"0.1.0"},"paths":{"/monedas":{"get":{"summary":"Monedas","description":"La lista de países con su equivalencia. Pública: son tipos de cambio, no datos nuestros.","operationId":"monedas_monedas_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ipc/mapa":{"get":{"summary":"Ipc Mapa","description":"El mapa del IPC de la portada. Es PÚBLICO en su estructura (qué divisiones hay y cuánto\npesan en la canasta) y CENSURADO en el número: la variación de una división solo viaja si el\nusuario tiene el índice que la mide, o el pack. Como el filtro es acá, no se salta por consola.","operationId":"ipc_mapa_ipc_mapa_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/terminal":{"get":{"summary":"Terminal","description":"Titulares del panel de la portada. Muestra la variación MENSUAL de la división del IPC que\nmide cada índice: es dato PÚBLICO del INE (el gancho citable), no lo propietario. El detalle —el\n$/m² por barrio, la canasta, el precio por categoría— se desbloquea entrando al panel. Por eso\neste endpoint es abierto: expone el número agregado, nunca los precios.","operationId":"terminal_terminal_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/portada/comparacion":{"get":{"summary":"Portada Comparacion","description":"El IPC oficial del INE (último mes publicado) contra nuestra variación a la fecha.\n\nEl INE es público y va siempre. NUESTRA cifra es producto: al que no tiene el índice (o el\nplan) no se le manda el número —solo la fecha y la ventana, para que el candado diga qué\nhay detrás—. Mismo corte en el servidor que los precios de los mapas (`_censurar`).","operationId":"portada_comparacion_portada_comparacion_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/portada/cifras":{"get":{"summary":"Portada Cifras","description":"Público a propósito: es el titular de cada índice, no su detalle.","operationId":"portada_cifras_portada_cifras_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"summary":"Home","description":"La portada: la aprobada el 28-sep-2026 (docs/diseno/portada, docs/producto.md §8).\n\nBarra de cuatro áreas, \"Datos y precios, hoy.\", un solo buscador y el botón a /ejemplos. La\nanterior (mapa del mundo, carrusel de industrias, \"lo importante de hoy\") queda en\nstatic/index.html, sin ruta, por si hay que volver: basta con restaurar este cuerpo desde git\n(commit 9a15f9a y anteriores).\n\nDesde el 29-sep-2026 la portada es el TABLERO por capas (tablero.py + static/tablero.html,\nreferencia LarrainVial): el título y el buscador arriba y, debajo, Mercados · Del mundo a la\ngóndola · Precios reales · Divisas · Inflación, cada capa con su país. La portada minimalista\nqueda en static/portada-nueva.html: para volver, cambiar la línea de abajo.","operationId":"home__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/portada-nueva":{"get":{"summary":"Portada Nueva","description":"Fue la vista previa de la portada nueva; desde que es la portada (28-sep-2026) redirige a \"/\".","operationId":"portada_nueva_portada_nueva_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ejemplos":{"get":{"summary":"Pagina Ejemplos","description":"Ejemplos reales de paneles: el botón \"Ver ejemplos de paneles\" de la portada lleva acá.\n\nDesde el 29-sep-2026 se arman con los datos del momento (paneles.py, rearmados cada hora):\nel gráfico, las tres lecturas y la fecha. El panel que no se puede armar, no sale.","operationId":"pagina_ejemplos_ejemplos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/buscar/datos":{"get":{"summary":"Buscar Datos","operationId":"buscar_datos_buscar_datos_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"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"}}}}}}},"/buscar":{"get":{"summary":"Pagina Buscar","description":"La página de resultados: cuando lo buscado no apunta a una sola cosa. Va con `noindex`\n(una página por cada cosa que alguien escribió es lo que Google castiga), pero sus enlaces\nsí se siguen.","operationId":"pagina_buscar_buscar_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"literal","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Literal"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cinta":{"get":{"summary":"Cinta Datos","description":"La cinta de la barra de arriba: todas las variaciones que publicamos, cada una con el enlace\na su mapa o gráfico (cinta.py). Pública y cacheada: la medición Xponda va siempre con candado.","operationId":"cinta_datos_cinta_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/cuenta":{"get":{"summary":"Pagina Cuenta","description":"Tu ficha y tu configuración (30-sep-2026): la rueda de la barra lleva acá.","operationId":"pagina_cuenta_cuenta_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mis-indicadores":{"get":{"summary":"Pagina Mis Indicadores","operationId":"pagina_mis_indicadores_mis_indicadores_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mis-indicadores/datos":{"get":{"summary":"Mis Indicadores Datos","operationId":"mis_indicadores_datos_mis_indicadores_datos_get","parameters":[{"name":"corto","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Corto"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mis-indicadores/agregar":{"post":{"summary":"Mis Indicadores Agregar","operationId":"mis_indicadores_agregar_mis_indicadores_agregar_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndAgregarIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mis-indicadores/quitar":{"post":{"summary":"Mis Indicadores Quitar","operationId":"mis_indicadores_quitar_mis_indicadores_quitar_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndIdIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mis-indicadores/umbral":{"post":{"summary":"Mis Indicadores Umbral","operationId":"mis_indicadores_umbral_mis_indicadores_umbral_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndIdIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mis-indicadores/alerta":{"post":{"summary":"Mis Indicadores Alerta","description":"Cómo avisa un indicador: %, solo al subir o bajar, o al cruzar un valor. Es del plan.","operationId":"mis_indicadores_alerta_mis_indicadores_alerta_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndAlertaIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mis-indicadores/posicion":{"post":{"summary":"Mis Indicadores Posicion","description":"Lo que uno tiene en un indicador (m² y arriendo de su propiedad, acciones, monedas…), para\nsaber su patrimonio real a precio de hoy. Se guarda cifrado (30-sep-2026).","operationId":"mis_indicadores_posicion_mis_indicadores_posicion_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mis-indicadores/prefs":{"post":{"summary":"Mis Indicadores Prefs","operationId":"mis_indicadores_prefs_mis_indicadores_prefs_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndPrefsIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mis-indicadores/baja":{"get":{"summary":"Mis Indicadores Baja","description":"El enlace de cada correo: apaga las alertas sin pedir entrar. Va firmado.","operationId":"mis_indicadores_baja_mis_indicadores_baja_get","parameters":[{"name":"t","in":"query","required":false,"schema":{"type":"string","default":"","title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/indicadores/revisar":{"post":{"summary":"Admin Indicadores Revisar","description":"Corre la revisión a mano. Por defecto NO manda nada (enviar=0): muestra qué correos saldrían.","operationId":"admin_indicadores_revisar_admin_indicadores_revisar_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"enviar","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Enviar"}},{"name":"uid","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/arriendos":{"get":{"summary":"Pagina Arriendos","description":"El mapa, más la lista de comunas enlazada al pie.\n\nLa lista no es decoración: sin un enlace desde una página que Google ya rastrea, las cien\npáginas por comuna dependerían solo del sitemap, y una URL huérfana se rastrea tarde y con\npoca prioridad. Si el snapshot no está, la página sale igual sin el bloque.","operationId":"pagina_arriendos_arriendos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/alimentos":{"get":{"summary":"Pagina Alimentos","operationId":"pagina_alimentos_alimentos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/combustible":{"get":{"summary":"Pagina Combustible","description":"El mapa, más la lista de comunas enlazada al pie: igual que /arriendos, para que las\ntrescientas fichas de /bencina no cuelguen solo del sitemap.","operationId":"pagina_combustible_combustible_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/farmacia":{"get":{"summary":"Pagina Farmacia","operationId":"pagina_farmacia_farmacia_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ferreteria":{"get":{"summary":"Pagina Ferreteria","operationId":"pagina_ferreteria_ferreteria_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/commodities":{"get":{"summary":"Pagina Commodities","description":"El tablero, más la lista de materias primas enlazada al pie: igual que /arriendos y\n/combustible, para que las 75 fichas no cuelguen solo del sitemap.","operationId":"pagina_commodities_commodities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/panel.js":{"get":{"summary":"Panel Js","description":"Sin Cache-Control el navegador lo guardaba por heurística y podía quedarse semanas con una\nversión vieja: al cambiarle los colores, la barra siguió saliendo oscura en fondo claro aunque\nel servidor ya servía la nueva. Cinco minutos alcanza para no pedirlo en cada página y poco\npara que un arreglo llegue el mismo día.","operationId":"panel_js_panel_js_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/maqueta.js":{"get":{"summary":"Maqueta Js","description":"La maqueta compartida de los paneles: hero de tres tarjetas, tarjeta premium y filtros\ndeslizables. Vive en un solo archivo por lo mismo que la barra y el pie: cinco copias del\nmismo CSS divergen a la primera corrección.","operationId":"maqueta_js_maqueta_js_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tema.js":{"get":{"summary":"Tema Js","description":"El interruptor claro/oscuro. Va en el <head> de todas las páginas.\n\nSe cachea corto y se revalida por detrás. Con una hora de caché dura, un arreglo de\npaleta tardaba hasta una hora en llegar y mientras tanto el visitante veía media página\ncon los colores viejos —pasó con la rampa del mapa de calor, que quedó con tres tramos\nnuevos y cuatro antiguos—. Cinco minutos más `stale-while-revalidate` mantiene la carga\ninstantánea y arregla eso.","operationId":"tema_js_tema_js_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/paypal.js":{"get":{"summary":"Paypal Js","operationId":"paypal_js_paypal_js_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/analitica.js":{"get":{"summary":"Analitica Js","description":"El contexto que se le pega a cada evento (idioma, país). Va en el <head> de cada página,\njusto después de la etiqueta de GA4: envuelve `window.ev` una sola vez en vez de repetir el\nparámetro en los quince archivos que disparan eventos.","operationId":"analitica_js_analitica_js_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/i18n.js":{"get":{"summary":"I18N Js","description":"El selector de idioma. Misma caché corta que el resto: una traducción mal escrita tiene\nque poder arreglarse el mismo día, no dentro de una hora.","operationId":"i18n_js_i18n_js_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/traducciones/{cod}.json":{"get":{"summary":"Traducciones Archivo","description":"Las páginas ya traducidas. Las genera `traducciones.py` a mano y se sirven como estático:\nen producción no se llama a ningún traductor (ver el comentario de arriba de /i18n.js).\n\n`no-cache` NO significa \"no guardar\": el navegador guarda la copia y la REVALIDA con su\nETag en cada visita; si no cambió, el servidor responde 304 sin cuerpo. Antes era\n`max-age=86400` con la premisa de que \"el archivo solo cambia cuando alguien corre el\nscript\" — dejó de ser cierto cuando se empezó a traducir a mano página por página, y la\ncopia vieja de un día hacía caer las frases nuevas al traductor automático (así salió\n\"institutes add prices\" y \"é o média geométrica\", 21-sep-2026).\nSi no existe el idioma, 404 y la página se queda con el diccionario curado.","operationId":"traducciones_archivo_traducciones__cod__json_get","parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string","title":"Cod"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/moneda.js":{"get":{"summary":"Moneda Js","operationId":"moneda_js_moneda_js_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/archivo/estado":{"get":{"summary":"Admin Archivo Estado","description":"Qué días alcanzó a archivar el histórico y con cuántas filas.\n\nExiste porque no había NINGUNA forma de mirar la base de producción: el contenedor no trae\n`sqlite3` y el volumen de Fly no se puede montar desde afuera. Sin esto, saber si el\nguardado nocturno corrió era adivinar mirando logs que rotan en minutos.","operationId":"admin_archivo_estado_admin_archivo_estado_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/archivo/correr":{"post":{"summary":"Admin Archivo Correr","description":"Dispara el guardado a mano, para rellenar un día que se perdió por un reinicio.","operationId":"admin_archivo_correr_admin_archivo_correr_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"fecha","in":"query","required":false,"schema":{"type":"string","default":"","title":"Fecha"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mercados/ticker":{"get":{"summary":"Mercados Ticker","description":"Contenido de una franja. `tipo` sale de FRANJAS; cualquier otra cosa cae a mercados.\n\nSe llama `/mercados/ticker` y no `/ticker` porque ya existe otro ticker en la casa: el de\ndesviaciones de precio del monitoreo, que consume `/panel-meta`.","operationId":"mercados_ticker_mercados_ticker_get","parameters":[{"name":"tipo","in":"query","required":false,"schema":{"type":"string","default":"mercados","title":"Tipo"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mundo.json":{"get":{"summary":"Mundo Geometria","description":"La geometría del mapa: 174 países como rutas SVG ya proyectadas, indexadas por ISO3.\n\nSe sirve ya proyectada y no como coordenadas para que el navegador no tenga que hacer\nmatemática de mapas: inyecta las rutas en un <svg viewBox> y el escalado lo hace el SVG\nsolo. Son 126 KB que no cambian nunca, así que se cachean por un mes.","operationId":"mundo_geometria_mundo_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mundo/nombres":{"get":{"summary":"Mundo Nombres","description":"Solo los nombres de los países del mapa, indexados por ISO3. Unos 4 KB.\n\nExiste por el teléfono. Ahí el mapa se reemplaza por una lista, y la lista necesita los\nnombres pero no la geometría: bajar los 121 KB de `mundo.json` para leer un campo de texto\nde cada país es gastar el dato del visitante en 117 KB de rutas SVG que nadie va a dibujar.\n\nSale del mismo archivo que el mapa, no de una copia: una segunda lista de nombres a mano se\ndesincroniza con la geometría en cuanto alguien agregue un país. Se lee una vez y queda en\nmemoria; el archivo no cambia entre despliegues.","operationId":"mundo_nombres_mundo_nombres_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mundo/datos":{"get":{"summary":"Mundo Datos","description":"PIB, población, inflación y PIB per cápita de todos los países, del Banco Mundial.\n\nAbierto y sin registro a propósito: es lo más commodity que tiene el sitio y su trabajo no\nes ser exclusivo, es que el mapa no mienta. Ver el comentario de cabecera de `mundo.py`.","operationId":"mundo_datos_mundo_datos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/pais/{iso3}":{"get":{"summary":"Pagina Pais","description":"La ficha de un país, servida entera desde el servidor.\n\nEs donde aterriza el clic en el mapa. Va renderizada acá y no en el navegador por lo mismo\nque las comunas: son ~196 páginas que pueden rankear para \"PIB de Brasil\" o \"quién gobierna\nPerú\", y una página que se arma con JavaScript no rankea para nada.","operationId":"pagina_pais_pais__iso3__get","parameters":[{"name":"iso3","in":"path","required":true,"schema":{"type":"string","title":"Iso3"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tema.css":{"get":{"summary":"Tema Css","operationId":"tema_css_tema_css_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/panel-meta":{"get":{"summary":"Panel Meta","description":"Alimenta el componente compartido de los paneles: lista de productos (para el selector) +\nla barra de variaciones (macro + categorías) que trae el monitoreo, cacheada 5 min.","operationId":"panel_meta_panel_meta_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/lab":{"get":{"summary":"Lab Pagina","description":"Laboratorio: los índices que vienen, antes de lanzarlos. Interno.","operationId":"lab_pagina_lab_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/lab/datos":{"get":{"summary":"Lab Datos","operationId":"lab_datos_lab_datos_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/robots.txt":{"get":{"summary":"Robots","operationId":"robots_robots_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/feed/merchant.xml":{"get":{"summary":"Feed Merchant","description":"El feed de producto para Google Merchant Center.\n\nEl precio NO está escrito acá: se lee del plan vivo de PayPal, igual que /precios. Si el feed\ndijera un número y el checkout otro, Google lo ve como precio discrepante y desaprueba el\nartículo —y con razón—. Si PayPal no contesta, se devuelve un feed SIN artículos en vez de uno\ncon un precio inventado: Merchant Center avisa \"sin productos\", que es un problema visible y\narreglable; un precio falso es una suspensión.","operationId":"feed_merchant_feed_merchant_xml_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/sitemap.xml":{"get":{"summary":"Sitemap","description":"El índice que apunta a los tres sitemaps por familia.\n\nLa dirección no cambia: lo que ya está declarado en robots.txt y entregado a Search Console\nsigue sirviendo, porque un índice de sitemaps se entrega en el mismo lugar que un sitemap y\nGoogle baja los hijos solo.","operationId":"sitemap_sitemap_xml_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/sitemap-{grupo}.xml":{"get":{"summary":"Sitemap Familia","description":"Una familia. Nombre desconocido es 404 y no una lista vacía: un sitemap vacío le dice a\nGoogle que no tenemos páginas, que es peor que no existir.","operationId":"sitemap_familia_sitemap__grupo__xml_get","parameters":[{"name":"grupo","in":"path","required":true,"schema":{"type":"string","title":"Grupo"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/briefs":{"get":{"summary":"Api Briefs","description":"El calendario de informes. Autentica con la llave del analista.","operationId":"api_briefs_api_briefs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/briefs/hoy":{"get":{"summary":"Api Briefs Hoy","description":"Qué toca escribir hoy y qué de eso ya está hecho.\n\nEs la única pregunta que el agente necesita hacer para trabajar solo: pide esto, ve\nqué falta, pide el brief de cada uno y escribe. Lo \"ya hecho\" se mide contra la semana\ncorrida, no contra el día: un informe del lunes entregado el martes sigue siendo el\ninforme de esa semana, y volver a pedirlo sería duplicarlo.","operationId":"api_briefs_hoy_api_briefs_hoy_get","parameters":[{"name":"dia","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Dia"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/agenda":{"get":{"summary":"Admin Agenda","description":"La semana completa con su estado, para el panel de revisión.\n\nVa con la llave de administración y no con la del analista: quien revisa entra desde\nel teléfono con el mismo enlace de siempre, y no tiene por qué andar cargando dos\nllaves distintas para ver una tabla.","operationId":"admin_agenda_admin_agenda_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/brief/{bid}":{"get":{"summary":"Api Brief","description":"Todo lo que el agente necesita para escribir ESE informe.","operationId":"api_brief_api_brief__bid__get","parameters":[{"name":"bid","in":"path","required":true,"schema":{"type":"string","title":"Bid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/analisis/ingesta":{"post":{"summary":"Analisis Ingesta","description":"Recibe un informe. Autentica con X-Indx-Key, la misma que usa el nodo del treemap:\nasí el agente puede publicar solo, sin credenciales de administración.","operationId":"analisis_ingesta_analisis_ingesta_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalisisIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/analisis":{"get":{"summary":"Pagina Analisis","operationId":"pagina_analisis_analisis_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/analisis":{"get":{"summary":"Api Analisis Lista","description":"La lista. El adelanto de cada uno se recorta según lo que le toque a este lector.\n\n`mercado` filtra por plaza (us, cl, br, gl). Se devuelve además el conteo por mercado,\npara que la página pueda ofrecer solo las pestañas que tienen algo adentro: una pestaña\nvacía es peor que no tenerla.","operationId":"api_analisis_lista_api_analisis_get","parameters":[{"name":"limite","in":"query","required":false,"schema":{"type":"integer","default":40,"title":"Limite"}},{"name":"mercado","in":"query","required":false,"schema":{"type":"string","default":"","title":"Mercado"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analisis/{slug}":{"get":{"summary":"Api Analisis Uno","description":"El informe para ESTE lector. El recorte del muro lo hace `para_lector`, en el servidor.\n\nLleva CORS abierto a propósito, y es seguro: **sin cookie esta respuesta es la versión\npública** —el adelanto, si el informe es de suscriptores—, y con `Allow-Origin: *` el\nnavegador ni siquiera manda la cookie. Está para que el traductor de Google pueda leer el\ninforme: su proxy (`xponda-com.translate.goog`) ejecuta nuestro JavaScript pero no deja\npasar la llamada relativa a la API, así que la página la pide en absoluto y esto la habilita.","operationId":"api_analisis_uno_api_analisis__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/revision-analisis":{"get":{"summary":"Pagina Revision Analisis","operationId":"pagina_revision_analisis_revision_analisis_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/analisis":{"get":{"summary":"Admin Analisis","operationId":"admin_analisis_admin_analisis_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/analisis/pegar":{"post":{"summary":"Admin Analisis Pegar","description":"Recibe el informe pegado tal cual sale del agente y lo parte en título, bajada y cuerpo.\n\nExiste porque no todo agente puede hacer una petición HTTP: si el de Grok vive dentro de\nla aplicación de chat, lo único que produce es texto. Copiarlo y pegarlo tiene que ser un\ncamino de primera clase, no un parche.\n\nVa declarada ANTES de /admin/analisis/{aid}: FastAPI resuelve por orden y el comodín\nintenta leer \"pegar\" como un número entero. Es la tercera vez que me pasa en este\narchivo — la ruta concreta siempre va primero.\n\nFormato esperado (y si no viene así, se deduce):\n    # Título\n    Bajada en una línea\n    (línea en blanco)\n    cuerpo…","operationId":"admin_analisis_pegar_admin_analisis_pegar_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalisisPegadoIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/analisis/{aid}":{"post":{"summary":"Admin Analisis Revisar","operationId":"admin_analisis_revisar_admin_analisis__aid__post","parameters":[{"name":"aid","in":"path","required":true,"schema":{"type":"integer","title":"Aid"}},{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionAnalisisIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/analisis/{aid}/avisar":{"post":{"summary":"Admin Analisis Avisar","description":"Avisa a los suscriptores que hay un informe nuevo, con su enlace.\n\n**Ojo con el límite de Meta:** WhatsApp solo deja mandar texto libre dentro de las 24\nhoras siguientes a que la persona te escribió. Un aviso a toda la cartera cae fuera de\nesa ventana y exige una PLANTILLA APROBADA. Mientras no exista, esto corre en modo\nprueba: arma la lista y el texto, los deja registrados, y no manda nada. Así el flujo\nqueda probado de punta a punta y el día que la plantilla exista solo hay que apagar\n`prueba` y enchufar el envío.","operationId":"admin_analisis_avisar_admin_analisis__aid__avisar_post","parameters":[{"name":"aid","in":"path","required":true,"schema":{"type":"integer","title":"Aid"}},{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"prueba","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Prueba"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/analisis/{slug}":{"get":{"summary":"Pagina Analisis Uno","description":"La misma página sirve el detalle; el JS lo pide por su slug.\n\nVa DESPUÉS de /analisis/ingesta y de las demás: FastAPI resuelve por orden de\ndeclaración y un comodín antes se las come. Ya me pasó con /noticias.","operationId":"pagina_analisis_uno_analisis__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/consulta/sugeridas":{"get":{"summary":"Consulta Sugeridas","description":"Preguntas de arranque del índice. Públicas: una caja vacía no invita a escribir, y\nverlas es parte de entender qué se puede preguntar antes de suscribirse.","operationId":"consulta_sugeridas_consulta_sugeridas_get","parameters":[{"name":"producto","in":"query","required":false,"schema":{"type":"string","default":"","title":"Producto"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/consulta":{"post":{"summary":"Consulta","operationId":"consulta_consulta_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsultaIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/resumen/escribir":{"get":{"summary":"Resumen Escribir","operationId":"resumen_escribir_resumen_escribir_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/resumen":{"get":{"summary":"Admin Resumen Lista","description":"Lo que necesita el editor: la fecha de hoy en Chile, el resumen de la fecha pedida (para\ncorregirlo) y la lista de los anteriores.","operationId":"admin_resumen_lista_admin_resumen_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"fecha","in":"query","required":false,"schema":{"type":"string","default":"","title":"Fecha"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Admin Resumen Guardar","description":"Publica o corrige el resumen de una fecha. Queda en línea al instante: lo escribe el\ndueño, así que no pasa por una cola de revisión como las notas de los agentes.","operationId":"admin_resumen_guardar_admin_resumen_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResumenIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/resumen/vista":{"post":{"summary":"Admin Resumen Vista","description":"La vista previa la arma el MISMO código que publica. Si el editor tuviera su propio\nformateador en JavaScript, tarde o temprano mostraría una cosa y publicaría otra.","operationId":"admin_resumen_vista_admin_resumen_vista_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResumenIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/resumen/{fecha}":{"delete":{"summary":"Admin Resumen Borrar","operationId":"admin_resumen_borrar_admin_resumen__fecha__delete","parameters":[{"name":"fecha","in":"path","required":true,"schema":{"type":"string","title":"Fecha"}},{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/resumen":{"get":{"summary":"Resumen Ultimo","description":"El último resumen publicado, con el archivo al pie. Mientras no haya ninguno, se manda\na la portada en vez de mostrar una página vacía que Google podría indexar.","operationId":"resumen_ultimo_resumen_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/resumen/{fecha}":{"get":{"summary":"Resumen De","operationId":"resumen_de_resumen__fecha__get","parameters":[{"name":"fecha","in":"path","required":true,"schema":{"type":"string","title":"Fecha"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hoy":{"get":{"summary":"Pagina Hoy","operationId":"pagina_hoy_hoy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/fuentes":{"get":{"summary":"Pagina Fuentes","description":"De dónde sale cada número. Es el respaldo del sitio: en un sitio de datos la confianza\nno viene de quién firma sino de que el método se pueda auditar.","operationId":"pagina_fuentes_fuentes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/noticias":{"get":{"summary":"Pagina Blog","description":"El archivo: todos los resúmenes, día por día.","operationId":"pagina_blog_noticias_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/noticia":{"get":{"summary":"Api Noticia","operationId":"api_noticia_api_noticia_get","parameters":[{"name":"slug","in":"query","required":false,"schema":{"type":"string","default":"","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/noticias/archivo":{"get":{"summary":"Api Archivo","description":"El blog: todo lo publicado, agrupado por día.","operationId":"api_archivo_api_noticias_archivo_get","parameters":[{"name":"limite","in":"query","required":false,"schema":{"type":"integer","default":120,"title":"Limite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/idiomas":{"get":{"summary":"Idiomas Traduccion","description":"Los idiomas a los que se puede traducir. La lista la arma el servidor y no el HTML: así\nagregar uno no obliga a editar cada página que muestra el botón.","operationId":"idiomas_traduccion_idiomas_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/traducir":{"get":{"summary":"Traducir Publico","description":"Traduce un texto. Público y gratis, como las noticias.\n\nNació para pasar al español los titulares en inglés de Bloomberg o Reuters —no los tocamos,\nreescribir el titular ajeno es meterse con su contenido: el lector aprieta el botón y se lo\ntraducimos—, y ahora hace también el camino de vuelta: nuestros informes y las fichas van\ndel español al idioma del lector. Por eso `de` y `a` son parámetros y el default sigue\nsiendo en→es, que es lo que piden los botones que ya existían.\n\nMotor: MyMemory y Google Translate, sin llave ni costo. La traducción queda guardada por\nhash del texto MÁS el par de idiomas: si la clave no incluyera los idiomas, el primero que\npidiera un texto al portugués se lo dejaría en portugués a todo el que lo pidiera en inglés.","operationId":"traducir_publico_traducir_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"de","in":"query","required":false,"schema":{"type":"string","default":"en","title":"De"}},{"name":"a","in":"query","required":false,"schema":{"type":"string","default":"es","title":"A"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/traducir/lote":{"post":{"summary":"Traducir Lote","description":"Traduce muchos textos cortos de una vez: es lo que pide una página entera.\n\nSin esto, cambiar el idioma de la portada serían ochenta peticiones. Acá van todas juntas,\ny lo que ya estaba traducido sale de la caché sin tocar el traductor. La caché es por texto\n(no por página), así que el segundo visitante que elija portugués no gasta nada.\n\nVa contra el traductor UNA sola vez por lote: los textos se pegan con un separador que\nningún traductor toca y se cortan de vuelta. Mandarlos uno por uno tardaba medio minuto.","operationId":"traducir_lote_traducir_lote_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoteTrad"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/noticias/hoy":{"get":{"summary":"Noticias Hoy","description":"El muro del día. Público, sin cookie: es lo que queremos que Google indexe.","operationId":"noticias_hoy_noticias_hoy_get","parameters":[{"name":"dia","in":"query","required":false,"schema":{"type":"string","default":"","title":"Dia"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/noticias/titulares":{"get":{"summary":"Noticias Titulares","description":"Lo justo para la banda: titular, sector y variación.\n\nCon `producto` devuelve primero las de ESE sector y después el resto del día. No se\nfiltra a secas: si hoy no hubo noticia de alimentos, una banda vacía en /alimentos es\npeor que una banda con el resto — el visitante igual quiere ver que el sitio está vivo.","operationId":"noticias_titulares_noticias_titulares_get","parameters":[{"name":"producto","in":"query","required":false,"schema":{"type":"string","default":"","title":"Producto"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/noticias/{slug}":{"get":{"summary":"Pagina Nota","description":"La página de una nota, ya escrita en el HTML que sale del servidor.\n\nVa al FINAL a propósito: FastAPI resuelve por orden de declaración, así que una ruta con\ncomodín declarada antes se come /noticias/hoy y /noticias/titulares. Ya me pasó.\n\nAntes esto devolvía `nota.html` pelado y el navegador iba a buscar el texto. El resultado\nera que las ciento veinte notas compartían el título \"Nota · Xponda\", no tenían\ncanonical ni descripción, y lo único que había en el HTML era \"Cargando la nota…\". Para\nGoogle eran ciento veinte páginas idénticas y vacías. Ahora el artículo, el título y las\netiquetas viajan armados; el JavaScript sigue ahí para el traductor y la métrica, pero al\nver `data-ssr` no vuelve a dibujar nada.","operationId":"pagina_nota_noticias__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/diagnostico-noticias":{"get":{"summary":"Admin Diag Noticias","description":"Qué recibe EL SERVIDOR de Google News. Local traía 431 artículos y en Fly llegaron 24:\nhay que ver si el feed responde distinto desde una IP de datacenter, y con qué cuerpo.","operationId":"admin_diag_noticias_admin_diagnostico_noticias_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"sector","in":"query","required":false,"schema":{"type":"string","default":"ipc-alimentos","title":"Sector"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/diagnostico-feeds":{"get":{"summary":"Admin Diag Feeds","description":"¿Los medios sirven su PROPIO RSS a una IP de datacenter? Google News desde Fly\nresponde vacío 5 de cada 6 veces; si los feeds propios responden, nos saltamos Google\nentero y la recolección se queda en el servidor, que es donde tiene que estar.","operationId":"admin_diag_feeds_admin_diagnostico_feeds_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"urls","in":"query","required":false,"schema":{"type":"string","default":"","title":"Urls"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/firma":{"post":{"summary":"Admin Firma","description":"Reemplaza la firma de las notas ya revisadas. Las primeras salieron con un nombre\npropio; la nota la firma el medio, no la persona que apretó el botón.","operationId":"admin_firma_admin_firma_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"nombre","in":"query","required":false,"schema":{"type":"string","default":"el equipo Xponda","title":"Nombre"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/corrida":{"post":{"summary":"Admin Corrida","description":"Dispara la corrida a mano. Sirve para no perder un día si el reloj falló, y para\nprobar en producción sin esperar a las 20:00. Corre en segundo plano: tarda ~8 minutos\nentre la recolección y las 24 llamadas al redactor, y una petición HTTP no aguanta eso.","operationId":"admin_corrida_admin_corrida_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"familias","in":"query","required":false,"schema":{"type":"string","default":"ipc,gics","title":"Familias"}},{"name":"rehacer","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Rehacer"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/revision":{"get":{"summary":"Pagina Revision","description":"El panel de revisión. La meta del spec §6.5 son 12 resúmenes en menos de 10 minutos,\no sea 50 segundos cada uno: por eso es una sola pantalla, con teclado y avance automático.","operationId":"pagina_revision_revision_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/revision":{"get":{"summary":"Admin Revision","operationId":"admin_revision_admin_revision_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/revision/{nid}":{"post":{"summary":"Admin Revisar","operationId":"admin_revisar_admin_revision__nid__post","parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"integer","title":"Nid"}},{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/indices":{"get":{"summary":"Pagina Indices","description":"El catálogo de índices, que antes eran siete secciones al fondo de la portada.","operationId":"pagina_indices_indices_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ia/datos":{"get":{"summary":"Ia Datos","description":"El índice del día. Abierto: son precios de lista que cada proveedor ya publica; lo\nnuestro es la canasta, la clasificación por origen y —sobre todo— la serie.","operationId":"ia_datos_ia_datos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ia/mercado":{"get":{"summary":"Ia Mercado","description":"Volumen y facturación estimada: van con CANDADO, como los precios de los mapas.\n\nEl corte es del servidor. Al que no tiene plan no se le manda ni un número — solo el\naviso de que está bloqueado — así que no hay nada que sacar desde la consola. Es la\nmisma regla de `_censurar()`: la UI solo dibuja el candado, no lo impone.\n\n`private, no-store`: la respuesta cambia según quién pide. Con la caché pública del resto\nde /ia, un proxy podría servirle a un visitante gratis la copia de un suscriptor.","operationId":"ia_mercado_ia_mercado_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ia/serie":{"get":{"summary":"Ia Serie","description":"La serie histórica del índice. Es el activo de verdad: la foto de hoy la saca\ncualquiera pidiendo el mismo JSON, pero nadie la está guardando.","operationId":"ia_serie_ia_serie_get","parameters":[{"name":"dias","in":"query","required":false,"schema":{"type":"integer","default":180,"title":"Dias"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ia":{"get":{"summary":"Pagina Ia","operationId":"pagina_ia_ia_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ia/empresas":{"get":{"summary":"Pagina Ia Empresas","description":"La puerta de la serie de videos «Cómo funciona la IA» (29-oct-2026): asesoría para implementar\nIA en empresas. El formulario va a /empresas/contacto con interes=\"asesoria-ia\".","operationId":"pagina_ia_empresas_ia_empresas_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ia/evolucion":{"get":{"summary":"Pagina Ia Evolucion","description":"La historia de la IA (origen, laboratorios, modelos, qué viene), enlazada desde \"Cambios en\nlas industrias con la IA\". La sección \"La potencia, al día\" la escribe el robot diario de\n`ia_evolucion.py` y va servida en el HTML (el buscador la ve). Si el robot aún no corrió, la\npágina sale igual, sin esa sección.","operationId":"pagina_ia_evolucion_ia_evolucion_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/ia/evolucion/refrescar":{"post":{"summary":"Admin Ia Evolucion Refrescar","description":"Corre el robot a mano (baja Epoch AI y OpenRouter) sin esperar el turno de las 12 h.","operationId":"admin_ia_evolucion_refrescar_admin_ia_evolucion_refrescar_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/ia/evolucion/probar-aviso":{"post":{"summary":"Admin Ia Evolucion Probar Aviso","description":"Manda UN correo de prueba al dueño por el mismo camino del aviso real (Brevo, o SMTP).","operationId":"admin_ia_evolucion_probar_aviso_admin_ia_evolucion_probar_aviso_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/para-que-sirve":{"get":{"summary":"Pagina Para Que Sirve","description":"Para qué sirve el producto y para quién, con las preguntas frecuentes.\n\nEs la página que le habla a quien nunca oyó de Xponda —y a los buscadores y asistentes que\nresumen qué hacemos—. No confundir con `/como-funciona`, que explica el MÉTODO (cómo se\nconstruye cada serie). Si el contenido se empieza a parecer, hay que fusionarlas: dos\npáginas compitiendo por la misma búsqueda se estorban entre ellas.\n\n**La cobertura no va escrita en el HTML.** Los números de comunas y barrios se rellenan acá\ndesde la misma caché que alimenta la barra de captura de la portada. Escritos a mano quedan\nviejos sin que nadie se entere, y una cifra falsa sobre nuestra propia cobertura en la página\nque explica qué hacemos es el peor lugar donde tenerla.","operationId":"pagina_para_que_sirve_para_que_sirve_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/salidas-a-bolsa":{"get":{"summary":"Pagina Salidas A Bolsa","description":"Las empresas que van a salir a bolsa, en dos capas que NO se mezclan.\n\nEs la distinción que hace toda la página: una empresa que ya presentó su S-1 o su F-1 a la\nSEC tiene estados auditados y públicos, y se puede mirar con las mismas líneas que BASF o\nNVIDIA. Una que todavía no presentó —Anthropic, SpaceX, Stripe— **no tiene estados de\nningún tipo**, y lo único que circula son valorizaciones de rondas contadas por la prensa.\n\nPonerlas juntas con la misma pinta sería el peor error posible acá: el lector supondría que\nla cifra de una es del mismo tipo que la de la otra. Por eso la segunda capa no lleva ni un\nnúmero sin fuente, dice en su propia tarjeta por qué está vacía, y lo único que promete es\navisar el día que aparezca el registro en EDGAR, que sí es verificable.","operationId":"pagina_salidas_a_bolsa_salidas_a_bolsa_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/etfs/opi":{"get":{"summary":"Etfs Opi","description":"El panorama de salidas a bolsa que arma el nodo. **ABIERTO** (30-sep-2026).\n\nEstuvo unas horas detrás del plan y se reabrió: **quién presentó un S-1 lo publica la SEC\ngratis**, así que cobrar la lista no genera un peso y manda al visitante a buscarla a otra\nparte. Es la misma regla que ya rige para el combustible de Chile y para el mapa de ETFs —\nlo que cualquiera encuentra gratis va abierto— y además esta página nace para que la\nencuentren: con tres números y ocho rectángulos borrosos no la indexa nadie.\n\n**Lo que sí se paga es la ficha de cada empresa** (`/salidas-a-bolsa/<cik>`): su referencia,\nsu sitio y sus ejecutivos leídos del registro. La lista es la puerta; la ficha es el producto.\n\nEl sector y el \"ya cotiza\" de cada registro van en la lista abierta porque salen del código\nSIC de la propia SEC: esconder un dato que el regulador publica no protege nada.","operationId":"etfs_opi_etfs_opi_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/salidas-a-bolsa/{cik}":{"get":{"summary":"Pagina Opi Ficha","description":"La ficha de una empresa por salir a bolsa (30-sep-2026): referencia, sitio y ejecutivos,\ndel registro de la SEC. Ver opi_ficha.py. Sin plan, el nombre y el candado.","operationId":"pagina_opi_ficha_salidas_a_bolsa__cik__get","parameters":[{"name":"cik","in":"path","required":true,"schema":{"type":"string","title":"Cik"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/lecturas":{"get":{"summary":"Pagina Lecturas","description":"Lecturas gratuitas para aprender a leer un balance, empezando por las 48 cartas de\nBuffett a sus accionistas.\n\n**Todo va enlazado, nada rehospedado.** Son textos de otros publicados gratis en su propio\nsitio: copiarlos acá sería quedarse con el trabajo ajeno, y además la copia envejece —si\nBerkshire corrige una cifra, el enlace abre la versión corregida—. Es el mismo criterio con\nel que las memorias de la CMF se enlazan en vez de rehospedarse.","operationId":"pagina_lecturas_lecturas_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/lecturas/buffett":{"get":{"summary":"Pagina Lecturas Buffett","description":"Las cartas de Buffett contadas en español: texto propio, no traducción.\n\n**La diferencia importa y está dicha en la página.** Una traducción de la carta sería obra\nderivada y ese derecho es de Berkshire —su propio índice avisa que el material va con\npermiso—. Lo que se publica acá son las cifras (que son hechos), lo que pasó ese año y las\nideas contadas con nuestras palabras, más corto y distinto del original, con el enlace a la\ncarta para que el lector vaya a la fuente.","operationId":"pagina_lecturas_buffett_lecturas_buffett_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/como-funciona":{"get":{"summary":"Pagina Como Funciona","description":"Cómo se usa el producto y cómo se construye cada serie de precios.\n\nNo confundir con `/como-trabajamos`, que es la metodología EDITORIAL de las notas. Son dos\npáginas distintas a propósito; si el contenido se empieza a parecer, hay que fusionarlas en\nvez de dejarlas compitiendo por la misma búsqueda.","operationId":"pagina_como_funciona_como_funciona_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/patrimonio":{"get":{"summary":"Pagina Patrimonio","operationId":"pagina_patrimonio_patrimonio_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/patrimonio/mercados":{"get":{"summary":"Patrimonio Mercados","description":"Contra qué países se puede comparar un negocio. Solo los que tienen balances empujados:\nofrecer un mercado sin fichas sería un selector que no compara nada.","operationId":"patrimonio_mercados_patrimonio_mercados_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/patrimonio/lugares":{"get":{"summary":"Patrimonio Lugares","description":"Región → comuna → barrio, para que el cliente elija dónde está su propiedad en vez de\nescribirlo y fallar por una tilde. Solo nombres y cuántos avisos: NINGÚN precio viaja acá,\nque es lo que se paga.","operationId":"patrimonio_lugares_patrimonio_lugares_get","parameters":[{"name":"region","in":"query","required":false,"schema":{"type":"string","default":"","title":"Region"}},{"name":"comuna","in":"query","required":false,"schema":{"type":"string","default":"","title":"Comuna"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/patrimonio/industrias":{"get":{"summary":"Patrimonio Industrias","description":"Las industrias con las que un negocio se puede comparar: solo las que juntan suficientes\nempresas para que la mediana signifique algo (ver MIN_EMPRESAS en patrimonio.py).","operationId":"patrimonio_industrias_patrimonio_industrias_get","parameters":[{"name":"idioma","in":"query","required":false,"schema":{"type":"string","default":"es","title":"Idioma"}},{"name":"mercado","in":"query","required":false,"schema":{"type":"string","default":"","title":"Mercado"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/patrimonio/empresas":{"get":{"summary":"Patrimonio Empresas","description":"Las empresas contra las que un negocio se puede comparar, una por una.\n\nExiste porque \"mi supermercado contra Walmart\" es una pregunta más concreta —y mucho más\nfácil de contestar— que \"contra la mediana del comercio minorista\". La mediana sigue estando;\nesto agrega la otra forma de preguntarlo.\n\nSe devuelven ordenadas por tamaño: quien busca una referencia conocida la va a encontrar\narriba, y quien sabe el nombre lo escribe en el buscador del selector.","operationId":"patrimonio_empresas_patrimonio_empresas_get","parameters":[{"name":"mercado","in":"query","required":false,"schema":{"type":"string","default":"","title":"Mercado"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/patrimonio/calcular":{"post":{"summary":"Patrimonio Calcular","description":"Calcula la ficha. Guardar es OPCIONAL y requiere sesión: se puede usar entera sin dejar\nun solo monto en nuestro servidor.","operationId":"patrimonio_calcular_patrimonio_calcular_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FichaIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/patrimonio/ejemplo":{"get":{"summary":"Patrimonio Ejemplo Datos","description":"Los números con que se llena el formulario al tocar «Autocompletar con un ejemplo».","operationId":"patrimonio_ejemplo_datos_patrimonio_ejemplo_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Patrimonio Ejemplo","description":"La ficha del ejemplo, sin plan y sin cuenta. NO recibe datos: calcula los de acá.\n\nReusa `patrimonio_calcular` por su puerta de diagnóstico en vez de duplicar las cien\nlíneas del ensamblado —dos copias del mismo cálculo terminan dando dos resultados\ndistintos—. La clave no sale del servidor: se la pasa a su propia función.","operationId":"patrimonio_ejemplo_patrimonio_ejemplo_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/patrimonio/mio":{"get":{"summary":"Patrimonio Mio","operationId":"patrimonio_mio_patrimonio_mio_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"delete":{"summary":"Patrimonio Borrar","operationId":"patrimonio_borrar_patrimonio_mio_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/empresas":{"get":{"summary":"Pagina Empresas","description":"Las cifras van puestas desde el servidor, como en la portada: quien evalúa comprar data\nmira primero cuánta hay, y no puede quedar esperando a que la escriba el JavaScript.\n\n`noindex, follow` desde el 20-oct-2026: la tabla de empresas la escribe el JavaScript, así\nque lo que el buscador lee son 63 palabras y cero empresas, y encima compite por la misma\nbúsqueda con /empresa, que sirve 7.883 palabras y 1.888 fichas enlazadas. Teniendo dos\npáginas para lo mismo, la que vale es la que tiene el contenido.\n\n`follow` y no `noindex, nofollow`: la página no se indexa, pero sus enlaces se siguen\nusando. Cortarlos también sería castigar a las fichas por un problema de esta página.","operationId":"pagina_empresas_empresas_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/empresas/contacto":{"post":{"summary":"Empresas Contacto","description":"Recibe el lead. Se GUARDA primero y se avisa después: si el correo falla —ya pasó una\nsemana entera por una clave de aplicación— el contacto igual queda. Devolver un error\nporque no salió el mail sería perder al cliente por un problema nuestro.","operationId":"empresas_contacto_empresas_contacto_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactoB2B"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/trafico":{"get":{"summary":"Admin Trafico","description":"El panel: visitas por tipo de página cruzadas con registros y pagos.\n\nEs la vista que faltaba para decidir qué construir. Hoy hay 2.558 URLs publicadas y no\nsabemos cuáles traen gente ni cuáles convierten; con esto, la próxima decisión de producto\nsale de una tabla y no de una hipótesis.","operationId":"admin_trafico_admin_trafico_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"dias","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Dias"}},{"name":"tipo","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tipo"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/no-contar":{"get":{"summary":"Admin No Contar","description":"Deja (o saca) la cookie que excluye MIS visitas de las estadísticas.\n\nHay que abrirlo una vez en cada navegador y en cada dispositivo desde el que se revise el\nsitio: la cookie vive en el navegador, no en la cuenta. Dura dos años.\n\nVa por cookie y no por IP a propósito: la IP de la casa cambia, la del celular cambia con\ncada antena, y filtrar por IP habría dejado fuera de las estadísticas a cualquier vecino\nque comparta salida. La cookie identifica al navegador, que es lo que se quiere.","operationId":"admin_no_contar_admin_no_contar_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"quitar","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Quitar"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/contactos":{"get":{"summary":"Admin Contactos","operationId":"admin_contactos_admin_contactos_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/entrar":{"get":{"summary":"Pagina Entrar","description":"La puerta única: WhatsApp, Google o correo, los tres en la misma página.\n\nAntes cada página tenía su propio recuadro de ingreso (o no lo tenía), y el botón \"Ingresar\"\nde la barra mandaba a /arriendos?entrar=1 —el mapa de arriendos— para que la gente entrara.\nCon `?volver=` se vuelve a donde estaba después de entrar.","operationId":"pagina_entrar_entrar_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/precios":{"get":{"summary":"Pagina Precios","description":"Los planes, que hasta ahora vivían al fondo de la portada.\n\nTienen página propia por dos razones: la portada quedó mínima, y \"indx precios\" es algo que\nla gente escribe en Google —un ancla dentro de la home no puede rankear para eso, una URL\nsí—. El pago no pasa por acá: sigue en `/etfs?sub=todos` y `/arriendos?entrar=1`.","operationId":"pagina_precios_precios_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/quienes-somos":{"get":{"summary":"Quienes Somos","description":"Visión y misión de Xponda (8-oct-2026, palabras del fundador).","operationId":"quienes_somos_quienes_somos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/como-trabajamos":{"get":{"summary":"Pagina Metodo","operationId":"pagina_metodo_como_trabajamos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/aviso-legal":{"get":{"summary":"Pagina Aviso","operationId":"pagina_aviso_aviso_legal_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/privacidad":{"get":{"summary":"Privacidad","operationId":"privacidad_privacidad_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/og/hoy.png":{"get":{"summary":"Og Hoy","description":"Si algo falla —falta la fuente, falta Pillow— se sirve el logo antes que romper el link.","operationId":"og_hoy_og_hoy_png_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/og/{cod}.png":{"get":{"summary":"Og Indice","operationId":"og_indice_og__cod__png_get","parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string","title":"Cod"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/og.png":{"get":{"summary":"Og Imagen","description":"Imagen de los links compartidos (WhatsApp, X, LinkedIn). Es el mismo archivo para todo el\nsitio: sin ella, el link se ve como un link muerto justo en el canal donde más se comparte.","operationId":"og_imagen_og_png_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/empresa":{"get":{"summary":"Pagina Empresas Indice","description":"El índice de las empresas con balance. Es el enlace de entrada a las 1.800: sin él\ndependerían solo del sitemap, y una URL huérfana se rastrea tarde y con poca prioridad.","operationId":"pagina_empresas_indice_empresa_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/empresa/{ticker}/cerrados":{"get":{"summary":"Empresa Cerrados","description":"Las cifras con candado de la ficha pública, solo para quien tiene el plan (30-sep-2026).\nMisma regla que /etfs/empresa: el corte se hace acá, no en el navegador.","operationId":"empresa_cerrados_empresa__ticker__cerrados_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"}}}}}}},"/empresa/sector/{slug}":{"get":{"summary":"Pagina Empresa Sector","description":"Las empresas de un sector. Existe porque el catálogo de 1.859 enlaces en una sola página\nno lo rastrea nadie: Search Console lo tiene como \"descubierta, actualmente sin indexar\", y\npor eso las fichas salen sin página de referencia aunque el enlace exista.","operationId":"pagina_empresa_sector_empresa_sector__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/empresa/{ticker}":{"get":{"summary":"Pagina Empresa","description":"Balance, resultados, flujo e indicadores de UNA empresa, servidos en el HTML.\n\nTodo esto ya lo mostrábamos dentro del mapa de /etfs, que es una aplicación: un buscador ve\nahí un contenedor vacío que llena el JavaScript. Acá el mismo dato viaja servido.","operationId":"pagina_empresa_empresa__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"}}}}}}},"/industrias.js":{"get":{"summary":"Industrias Js","description":"El giro del carrusel de industrias. Ruta propia porque acá no hay StaticFiles montado.","operationId":"industrias_js_industrias_js_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/lista.js":{"get":{"summary":"Lista Js","description":"La vista de lista de los mapas de ladrillos. Ruta propia porque acá no hay StaticFiles.","operationId":"lista_js_lista_js_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/gondola.js":{"get":{"summary":"Gondola Js","description":"\"Del mundo a la góndola\" en la ficha de cada materia prima (29-sep-2026).","operationId":"gondola_js_gondola_js_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/seguir.js":{"get":{"summary":"Seguir Js","description":"El botón \"Seguir este dato\" (29-sep-2026). Lo carga /barra.js solo en las páginas de un\ndato que se puede vigilar. Ruta propia porque acá no hay StaticFiles montado.","operationId":"seguir_js_seguir_js_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/pais.js":{"get":{"summary":"Pais Js","description":"El selector de país de las páginas chilenas. Misma razón que /barra.js para tener ruta\npropia: acá no hay StaticFiles montado.","operationId":"pais_js_pais_js_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/barra.js":{"get":{"summary":"Barra Js","description":"La barra de arriba compartida. Acá no hay StaticFiles montado: cada archivo estático\nlleva su ruta declarada a mano, y un .js nuevo en la carpeta no se sirve solo.","operationId":"barra_js_barra_js_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/logo-claro.png":{"get":{"summary":"Logo","description":"El logotipo, en sus tres formas. Acá no hay `StaticFiles` montado: cada archivo estático\ntiene su ruta, así que un PNG nuevo en la carpeta NO se sirve solo. Ya pasó.\n\n- `logo.png`       el logotipo recortado, sobre blanco. Es el que declara el schema.\n- `logo-512.png`   cuadrado, para quien recorta a cuadrado (fichas, perfiles).\n- `logo-claro.png` fondo transparente y el negro pasado a blanco: el sitio es oscuro y la\n                   mitad negra del logotipo desaparecería sobre el fondo.","operationId":"logo_logo_claro_png_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/logo-512.png":{"get":{"summary":"Logo","description":"El logotipo, en sus tres formas. Acá no hay `StaticFiles` montado: cada archivo estático\ntiene su ruta, así que un PNG nuevo en la carpeta NO se sirve solo. Ya pasó.\n\n- `logo.png`       el logotipo recortado, sobre blanco. Es el que declara el schema.\n- `logo-512.png`   cuadrado, para quien recorta a cuadrado (fichas, perfiles).\n- `logo-claro.png` fondo transparente y el negro pasado a blanco: el sitio es oscuro y la\n                   mitad negra del logotipo desaparecería sobre el fondo.","operationId":"logo_logo_512_png_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/logo.png":{"get":{"summary":"Logo","description":"El logotipo, en sus tres formas. Acá no hay `StaticFiles` montado: cada archivo estático\ntiene su ruta, así que un PNG nuevo en la carpeta NO se sirve solo. Ya pasó.\n\n- `logo.png`       el logotipo recortado, sobre blanco. Es el que declara el schema.\n- `logo-512.png`   cuadrado, para quien recorta a cuadrado (fichas, perfiles).\n- `logo-claro.png` fondo transparente y el negro pasado a blanco: el sitio es oscuro y la\n                   mitad negra del logotipo desaparecería sobre el fondo.","operationId":"logo_logo_png_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/logo":{"get":{"summary":"Admin Logo Estado","operationId":"admin_logo_estado_admin_logo_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Admin Logo Subir","operationId":"admin_logo_subir_admin_logo_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogoIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Admin Logo Borrar","operationId":"admin_logo_borrar_admin_logo_delete","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"variante","in":"query","required":false,"schema":{"type":"string","default":"normal","title":"Variante"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/img/{nombre}":{"get":{"summary":"Imagen","description":"Las fotos de la portada (casos de uso). Sin `StaticFiles`, cada estático necesita ruta;\nesta sirve solo lo que calce con el patrón, así no se puede pedir nada fuera de static/img.","operationId":"imagen_img__nombre__get","parameters":[{"name":"nombre","in":"path","required":true,"schema":{"type":"string","title":"Nombre"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/favicon.ico":{"get":{"summary":"Favicon","description":"El ícono de la marca. Antes era un SVG dibujado a mano —tres barras de colores— que no se\nparecía a nada nuestro; ahora es la X del logo.\n\nEl archivo lleva SEIS tamaños adentro (16 a 256): el navegador elige el que necesita en cada\nlugar —pestaña, marcador, atajo del escritorio— y ninguno se ve reescalado.\n\n**Fondo blanco y no transparente**: el glifo es negro, y sobre la barra de pestañas oscura de\nChrome o Safari un logo negro sin fondo sencillamente no se ve.","operationId":"favicon_favicon_ico_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/apple-touch-icon.png":{"get":{"summary":"Apple Touch Icon","description":"El ícono que usa iOS al guardar la página en la pantalla de inicio. No hace falta declararlo\nen el <head> de las veinte páginas: iOS lo busca solo en esta ruta exacta. Va sin esquinas\nredondeadas propias y con más aire, porque el sistema le aplica su propia máscara encima.","operationId":"apple_touch_icon_apple_touch_icon_png_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/pulso":{"get":{"summary":"Pulso","description":"Cobertura real del monitoreo para la portada. Son conteos, nunca precios: es público.\nSirve lo que hay al tiro y, si está vencido, dispara el refresco en segundo plano (la portada\nno puede quedarse esperando al monitoreo).","operationId":"pulso_pulso_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth":{"get":{"summary":"Auth","operationId":"auth_auth_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/wa/numero":{"get":{"summary":"Wa Numero","operationId":"wa_numero_wa_numero_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/yo":{"get":{"summary":"Yo","operationId":"yo_yo_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/wa/iniciar":{"post":{"summary":"Wa Iniciar","description":"Genera el código de autorización que el usuario NOS envía por WhatsApp (recibir es gratis).","operationId":"wa_iniciar_wa_iniciar_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/wa/estado":{"get":{"summary":"Wa Estado","operationId":"wa_estado_wa_estado_get","parameters":[{"name":"codigo","in":"query","required":false,"schema":{"type":"string","default":"","title":"Codigo"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/wa/completar":{"post":{"summary":"Wa Completar","description":"Ya confirmado el código: abre la sesión (cookie firmada, 30 días).","operationId":"wa_completar_wa_completar_post","parameters":[{"name":"codigo","in":"query","required":false,"schema":{"type":"string","default":"","title":"Codigo"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/paypal/estado":{"get":{"summary":"Paypal Estado","description":"Lo que el navegador necesita para dibujar el botón. El client_id es público —va en el\n<script src> del SDK—; el secreto no sale nunca de acá.","operationId":"paypal_estado_paypal_estado_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/paypal/error":{"post":{"summary":"Paypal Error","description":"El navegador avisa cuando PayPal rechaza un pago. Sin esto el error se queda en la pantalla\ndel cliente y nosotros nunca nos enteramos de por qué no compró.","operationId":"paypal_error_paypal_error_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PPErrorIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/paypal/activar":{"post":{"summary":"Paypal Activar","description":"Canjea una suscripción de PayPal por acceso.\n\nEl navegador manda el `subscriptionID` que le dio PayPal, pero eso NO es prueba de pago:\ncualquiera puede llamar acá con un id inventado. Así que se le pregunta a PayPal desde el\nservidor y solo se abre la cuenta si confirma que está activa y es de nuestro plan.","operationId":"paypal_activar_paypal_activar_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayPalIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/paypal/crear-plan":{"post":{"summary":"Admin Paypal Crear Plan","description":"Crea un plan de suscripción en la cuenta de PayPal conectada (la que podemos verificar).","operationId":"admin_paypal_crear_plan_admin_paypal_crear_plan_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"nombre","in":"query","required":false,"schema":{"type":"string","default":"","title":"Nombre"}},{"name":"precio_usd","in":"query","required":false,"schema":{"type":"number","default":0,"title":"Precio Usd"}},{"name":"dias_prueba","in":"query","required":false,"schema":{"type":"integer","default":14,"title":"Dias Prueba"}},{"name":"descripcion","in":"query","required":false,"schema":{"type":"string","default":"","title":"Descripcion"}},{"name":"producto_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Producto Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/paypal/probar-suscripcion":{"post":{"summary":"Admin Paypal Probar Sub","description":"Diagnóstico: ¿PayPal acepta crear una suscripción de este plan? No cobra a nadie.","operationId":"admin_paypal_probar_sub_admin_paypal_probar_suscripcion_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/paypal/planes":{"get":{"summary":"Admin Paypal Planes","description":"Qué planes existen en la cuenta de PayPal conectada.","operationId":"admin_paypal_planes_admin_paypal_planes_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/paypal/ping":{"get":{"summary":"Admin Paypal Ping","description":"¿Sirven las credenciales y existe el plan? Sin cobrar ni crear nada.","operationId":"admin_paypal_ping_admin_paypal_ping_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/email/estado":{"get":{"summary":"Email Estado","description":"Si el correo no sirve, la página no ofrece el botón: es peor prometer un correo que no llega\nque no ofrecerlo.\n\nNo basta con que EXISTAN los secretos: con una contraseña vencida o que no es de aplicación,\nGmail responde 535 y el visitante escribe su correo, aprieta, y recibe un error. Así que se\ncomprueba de verdad —conectando y autenticando, sin mandar nada— y se guarda el resultado un\nrato, porque abrir una sesión SMTP en cada carga de página sería absurdo.","operationId":"email_estado_email_estado_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/email/iniciar":{"post":{"summary":"Email Iniciar","description":"Manda el enlace de acceso. Responde lo mismo exista o no la cuenta: si dijera 'ese correo no\nestá registrado', cualquiera podría averiguar quién es cliente probando direcciones.","operationId":"email_iniciar_email_iniciar_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/email/entrar":{"get":{"summary":"Email Entrar","description":"El clic en el enlace: canjea el token, abre la sesión y deja al visitante donde iba.","operationId":"email_entrar_email_entrar_get","parameters":[{"name":"t","in":"query","required":false,"schema":{"type":"string","default":"","title":"T"}},{"name":"volver","in":"query","required":false,"schema":{"type":"string","default":"/","title":"Volver"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/google/estado":{"get":{"summary":"Google Estado","operationId":"google_estado_auth_google_estado_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/google/login":{"get":{"summary":"Google Login","operationId":"google_login_auth_google_login_get","parameters":[{"name":"volver","in":"query","required":false,"schema":{"type":"string","default":"/","title":"Volver"}}],"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":{"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"}}}}}}},"/logout":{"get":{"summary":"Logout","operationId":"logout_logout_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/wa/mensaje":{"post":{"summary":"Wa Mensaje","description":"Alguien le escribió al WhatsApp de Xponda algo que no es un código (una duda, un reclamo).\nEl monitoreo, que recibe el webhook de Meta, nos lo reenvía con la key. Queda guardado y el\npanel de ops lo muestra como alerta hasta que alguien lo marque atendido.","operationId":"wa_mensaje_wa_mensaje_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MensajeIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/mensajes":{"get":{"summary":"Admin Mensajes","description":"Mensajes que llegaron al WhatsApp de Xponda (para el panel de ops): los no atendidos son la alerta.","operationId":"admin_mensajes_admin_mensajes_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"n","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"N"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/mensajes/{mid}/atendido":{"post":{"summary":"Admin Mensaje Atendido","description":"Marca un mensaje como atendido: deja de contar como alerta en el panel.","operationId":"admin_mensaje_atendido_admin_mensajes__mid__atendido_post","parameters":[{"name":"mid","in":"path","required":true,"schema":{"type":"integer","title":"Mid"}},{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/wa/entrante":{"post":{"summary":"Wa Entrante","description":"El monitoreo recibió en SU número un código IDX-XXXXXX y nos lo reenvía (con la key).","operationId":"wa_entrante_wa_entrante_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelayIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/wa/webhook":{"get":{"summary":"Wa Webhook Verify","description":"Verificación de Meta, por si Xponda llega a tener su propio número de WhatsApp.","operationId":"wa_webhook_verify_wa_webhook_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Wa Webhook","description":"Mensajes entrantes de Meta (camino directo, alternativo al relay).","operationId":"wa_webhook_wa_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/arriendos/treemap":{"get":{"summary":"Arriendos Treemap","operationId":"arriendos_treemap_arriendos_treemap_get","parameters":[{"name":"tipo","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tipo"}},{"name":"subtipo","in":"query","required":false,"schema":{"type":"string","default":"","title":"Subtipo"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/alimentos/canasta":{"get":{"summary":"Alimentos Canasta","description":"Categorías de la canasta con su precio por unidad. Sin suscripción vigente: solo estructura.","operationId":"alimentos_canasta_alimentos_canasta_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/arriendos/ipc":{"get":{"summary":"Arriendos Ipc","operationId":"arriendos_ipc_arriendos_ipc_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/combustible/data":{"get":{"summary":"Combustible Data","description":"Bombas de bencina (mapa + treemap por marca) del combustible pedido. Sin suscripción vigente:\nse ve la estructura (dónde y cuántas) pero NO los precios (censura en el servidor).","operationId":"combustible_data_combustible_data_get","parameters":[{"name":"fuel","in":"query","required":false,"schema":{"type":"string","default":"93","title":"Fuel"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/catalogo/canasta":{"get":{"summary":"Catalogo Canasta","description":"Categorías del canal (farmacia/ferretería) con precio, descuento y variación. Sin suscripción\nvigente: solo la estructura (censura en el servidor).","operationId":"catalogo_canasta_catalogo_canasta_get","parameters":[{"name":"canal","in":"query","required":false,"schema":{"type":"string","default":"farmacia","title":"Canal"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/commodities/datos":{"get":{"summary":"Commodities Datos","description":"Las 30 materias primas con precio y variaciones. ABIERTO: sin sesión y sin candado.","operationId":"commodities_datos_commodities_datos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/commodities/serie":{"get":{"summary":"Commodities Serie","description":"La serie larga de una materia prima (mensual, hasta diez años), para el gráfico de la ficha.","operationId":"commodities_serie_commodities_serie_get","parameters":[{"name":"cod","in":"query","required":false,"schema":{"type":"string","default":"","title":"Cod"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/commodities/indices":{"get":{"summary":"Commodities Indices","description":"Los índices Xponda (Desayuno, Panadería, Proteína, Alimento animal, Aceites, Alimentos\nglobal). ABIERTOS a propósito: son el número con nombre propio que queremos que se cite, y\nsus componentes son precios públicos igual. Lo que se vende es la lectura chilena.","operationId":"commodities_indices_commodities_indices_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/commodities/cadenas":{"get":{"summary":"Commodities Cadenas","description":"Las cadenas de transformación: de dónde sale lo que compras, eslabón por eslabón.\n\nLa cadena entera del mundo va abierta; el último tramo —el producto chileno que medimos—\nviaja con nombre y SIN número mientras no haya suscripción.","operationId":"commodities_cadenas_commodities_cadenas_get","parameters":[{"name":"pais","in":"query","required":false,"schema":{"type":"string","default":"CL","title":"Pais"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/commodities/chile":{"get":{"summary":"Commodities Chile","description":"Lo que vale plata: el precio en pesos con el efecto dólar separado y el traspaso a la\ngóndola chilena. Sin suscripción vigente viaja la ESTRUCTURA —qué se compara con qué— y\nningún número: la censura es del servidor, no de la interfaz.","operationId":"commodities_chile_commodities_chile_get","parameters":[{"name":"moneda","in":"query","required":false,"schema":{"type":"string","default":"CLP","title":"Moneda"}},{"name":"pais","in":"query","required":false,"schema":{"type":"string","default":"CL","title":"Pais"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/divisas/{par}":{"get":{"summary":"Pagina Par","description":"El tipo de cambio de UN par, en su propia URL.\n\nLa lista de pares sale del export de Google Trends de Chile: de cincuenta consultas, siete\neran conversión de moneda y eran las únicas PLANAS de la lista —demanda de base todos los\ndías, que es lo que se quiere para una landing—. Ver la cabecera de paginas_divisas.py.\n\n`clp-usd` redirige a `usd-clp` con 301: es la misma información y dos consultas distintas,\ny dos páginas habrían competido entre ellas.","operationId":"pagina_par_divisas__par__get","parameters":[{"name":"par","in":"path","required":true,"schema":{"type":"string","title":"Par"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/indx":{"get":{"summary":"Pagina Indx","description":"La portada de los siete índices propios.\n\nTienen dirección propia y no una sección dentro de /commodities porque son la única cifra\ndel sitio que no existe en ninguna otra parte: es lo que puede ser citado, y lo que se cita\nnecesita una URL que se pueda enlazar.","operationId":"pagina_indx_indx_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/indx/{slug}":{"get":{"summary":"Pagina Indx Uno","operationId":"pagina_indx_uno_indx__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/commodities/{slug}":{"get":{"summary":"Pagina Commodity","description":"El precio de UNA materia prima, en su propia URL y con el número en el HTML.\n\nEs la página que puede rankear para \"precio del cobre hoy\", que es como se busca de verdad.\nHasta ahora las 95 cotizaciones vivían dentro de /commodities: una grilla de 95 cosas no\nrankea para ninguna de ellas.","operationId":"pagina_commodity_commodities__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/commodities/refrescar":{"post":{"summary":"Admin Commodities Refrescar","description":"Fuerza un refresco a mano. `largo=1` rehace también las series de diez años y las del\nFMI, que es lo que toma un minuto; sin eso solo se actualiza el precio de hoy.","operationId":"admin_commodities_refrescar_admin_commodities_refrescar_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"largo","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Largo"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/suscribir":{"post":{"summary":"Suscribir","description":"Suscripción mensual. El plan está fijado en UF y se cobra en pesos a la UF del día.","operationId":"suscribir_suscribir_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pago/mercadopago":{"get":{"summary":"Pago Webhook","operationId":"pago_webhook_pago_mercadopago_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Pago Webhook","operationId":"pago_webhook_pago_mercadopago_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/px.js":{"get":{"summary":"Pixel Js","description":"Píxel de Meta servido según config: se prende o se cambia desde el panel, sin desplegar.\nSin ID configurado devuelve JS vacío, así que la página no carga nada de Facebook.","operationId":"pixel_js_px_js_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/etfs":{"get":{"summary":"Pagina Etfs","operationId":"pagina_etfs_etfs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/etfs/push":{"post":{"summary":"Etfs Push","description":"Recibe el snapshot del treemap desde el nodo local. Autenticado con la misma INDX_KEY.","operationId":"etfs_push_etfs_push_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/etfs/datos":{"get":{"summary":"Etfs Datos","description":"El mapa completo si está suscrito; solo la estructura si no.","operationId":"etfs_datos_etfs_datos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/etfs/lista":{"get":{"summary":"Etfs Lista","description":"Qué índices seguimos, con su precio y su variación. **Es público, a propósito.**\n\nEl comentario anterior decía que el precio solo viajaba con suscripción y no era cierto: la\ncensura nunca se aplicó. En vez de agregarla se deja abierto, que es lo coherente con el resto\nde la sección —el mapa del S&P 500 empresa por empresa ya es abierto— y con la estrategia: el\nnivel del índice es un dato de mercado que publica cualquier sitio, y regalarlo es lo que hace\nentrar a la gente. Lo escaso, y lo que se paga, son las FICHAS: balance, resultados y hechos\nesenciales traducidos al español.","operationId":"etfs_lista_etfs_lista_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/etfs/composicion":{"get":{"summary":"Etfs Composicion","description":"Los papeles de un ETF, ya normalizados al formato del mapa por el nodo que empuja.","operationId":"etfs_composicion_etfs_composicion_get","parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string","default":"spy","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/etfs/precios":{"post":{"summary":"Etfs Precios Push","description":"Series de precio por ticker, empujadas desde el nodo (una fila cada una).","operationId":"etfs_precios_push_etfs_precios_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"get":{"summary":"Etfs Precios","description":"La serie de precios de un papel. **Abierta** (23-sep-2026).\n\nEl precio histórico es un dato público: lo publican la bolsa, Yahoo, Google y cualquier\ncorredora, y hasta la propia empresa. Cobrar por él solo mandaba al lector a buscarlo\nafuera. Se cobra lo que no está en ninguna de esas partes, no lo que está en todas.","operationId":"etfs_precios_etfs_precios_get","parameters":[{"name":"t","in":"query","required":false,"schema":{"type":"string","default":"","title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/etfs/traducir":{"get":{"summary":"Etfs Traducir","description":"Traduce al español la descripción en inglés de una empresa. La deja guardada, así que\ncada texto se traduce una sola vez para todos los suscriptores.","operationId":"etfs_traducir_etfs_traducir_get","parameters":[{"name":"t","in":"query","required":false,"schema":{"type":"string","default":"","title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/etfs/extras":{"post":{"summary":"Etfs Extras","description":"Alertas del mercado y series de los índices, empujadas por el nodo.","operationId":"etfs_extras_etfs_extras_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/etfs/historia":{"get":{"summary":"Etfs Historia","description":"Cómo cambió la composición del índice desde 1957.\n\nMismo criterio que el resto de la sección: la forma es pública —cuántas empresas\nentraron por época y de qué rubro— porque es lo que engancha. Los nombres de las\nempresas de cada camada son de suscriptores: eso no lo regala nadie más y es el\ntrabajo que hay detrás (cruzar la lista actual con los constituyentes históricos y\nresolver el rubro de las que ya salieron contra el SIC de la SEC).","operationId":"etfs_historia_etfs_historia_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/etfs/alertas":{"get":{"summary":"Etfs Alertas","description":"Las alertas del mercado. Cuántas hay es público (engancha); el detalle, de suscriptores.","operationId":"etfs_alertas_etfs_alertas_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/etfs/balance-sectores":{"get":{"summary":"Etfs Balance Sectores","description":"El estado de balance de los 11 sectores. Semáforo abierto, cifras de suscriptores.","operationId":"etfs_balance_sectores_etfs_balance_sectores_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/etfs/clasificacion-emisor":{"get":{"summary":"Etfs Clasificacion Emisor","description":"La clasificación de riesgo de un emisor: de qué agencia, qué categoría y de cuándo.\n\nVa abierta porque **no es nuestra**: es la opinión publicada de una agencia inscrita, y\nlo correcto con el trabajo de un tercero es citarlo con su nombre, su fecha y el enlace\na su informe. Cobrar por mostrar la nota de otro sería quedarse con algo que no nos\npertenece.","operationId":"etfs_clasificacion_emisor_etfs_clasificacion_emisor_get","parameters":[{"name":"t","in":"query","required":false,"schema":{"type":"string","default":"","title":"T"}},{"name":"mercado","in":"query","required":false,"schema":{"type":"string","default":"","title":"Mercado"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/barrer-clasificaciones":{"post":{"summary":"Admin Barrer Clasif","description":"Busca acciones de clasificación en los artículos que ya recolectamos.","operationId":"admin_barrer_clasif_admin_barrer_clasificaciones_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"dias","in":"query","required":false,"schema":{"type":"integer","default":90,"title":"Dias"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/clasificaciones":{"post":{"summary":"Admin Clasificaciones","description":"Carga clasificaciones de agencias. Body: {\"filas\": [...]}","operationId":"admin_clasificaciones_admin_clasificaciones_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/etfs/percentiles":{"get":{"summary":"Etfs Percentiles","description":"Los cortes de cada indicador dentro de cada sector, para colorear las fichas.\n\nSon solo cortes, no las cifras de ninguna empresa, así que van abiertos: sin la ficha\n—que sí es de suscriptores— no sirven para nada. Y que estén abiertos ayuda: alguien\npuede citar \"el margen mediano del sector tecnológico es 18,6%\" y eso es nuestro.","operationId":"etfs_percentiles_etfs_percentiles_get","parameters":[{"name":"mercado","in":"query","required":false,"schema":{"type":"string","default":"","title":"Mercado"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/etfs/mapa-industrias":{"get":{"summary":"Etfs Mapa Industrias","description":"El mapa de calor de cada industria. Puntaje y tendencia abiertos.","operationId":"etfs_mapa_industrias_etfs_mapa_industrias_get","parameters":[{"name":"mercado","in":"query","required":false,"schema":{"type":"string","default":"","title":"Mercado"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/mapa-industrias":{"get":{"summary":"Admin Mapa Industrias","operationId":"admin_mapa_industrias_admin_mapa_industrias_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/etfs/vencimientos":{"get":{"summary":"Etfs Vencimientos","description":"Cuándo vence la deuda de cada sector y a qué tasa la está pagando.","operationId":"etfs_vencimientos_etfs_vencimientos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/vencimientos":{"get":{"summary":"Admin Vencimientos","operationId":"admin_vencimientos_admin_vencimientos_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/indicadores":{"get":{"summary":"Admin Indicadores","description":"Lo mismo, completo, para el panel de revisión.","operationId":"admin_indicadores_admin_indicadores_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/etfs/indice":{"get":{"summary":"Etfs Indice","description":"La serie histórica de un índice, para comparar y calcular rendimientos.\n\n**En PUNTOS, no en dólares.** El panel mostraba la serie del fondo cotizado —el eje decía\n\"US$ 750\" para el S&P 500, que es el precio de SPY— cuando lo que el lector viene a ver es\nel nivel del índice. El nivel sale de la misma tabla `INDICE_REAL` que ya usa el tablero.\n\nSi ese índice no tiene historia publicada se cae al fondo y **se declara** (`unidad`), para\nque la página pueda rotular el eje con lo que de verdad está dibujando. Hoy pasa con Chile:\nel MSCI IPSA cotiza todos los días y Yahoo entrega un solo cierre.","operationId":"etfs_indice_etfs_indice_get","parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string","default":"spy","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/etfs/fichas":{"post":{"summary":"Etfs Fichas","description":"Recibe fichas de empresas (balance de la SEC + perfil) desde el nodo local, por lotes.\nUna fila por ticker: son ~6,6 MB entre las 503, y así la página pide solo la que abre.","operationId":"etfs_fichas_etfs_fichas_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/etfs/empresa":{"get":{"summary":"Etfs Empresa","description":"La ficha de una empresa. Abierta en lo que cualquiera encuentra gratis en otro sitio;\ncon candado en lo que solo está acá (ver `RATIOS_ABIERTOS` y `_ficha_abierta`).\n\n`mercado` no es decoración: **ECL es Ecolab en Nueva York y Engie Energía Chile en\nSantiago**. Sin decir de qué plaza se pide, el mismo ticker devolvería la empresa\nequivocada. Y NO hay caída a la fila sin prefijo cuando se pide un mercado: preferimos\nun 404 honesto antes que servir la empresa de otro país con el mismo símbolo.","operationId":"etfs_empresa_etfs_empresa_get","parameters":[{"name":"t","in":"query","required":false,"schema":{"type":"string","default":"","title":"T"}},{"name":"mercado","in":"query","required":false,"schema":{"type":"string","default":"","title":"Mercado"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/prueba":{"get":{"summary":"Prueba Pagina","operationId":"prueba_pagina_prueba_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/prueba/salir":{"get":{"summary":"Prueba Salir","description":"Apaga el modo prueba: el plan de $1.000 desaparece del sitio.","operationId":"prueba_salir_prueba_salir_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/prueba/crear":{"post":{"summary":"Prueba Crear","description":"Crea una suscripción de prueba. Devuelve el init_point para autorizarla.","operationId":"prueba_crear_prueba_crear_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"email","in":"query","required":false,"schema":{"type":"string","default":"","title":"Email"}},{"name":"monto","in":"query","required":false,"schema":{"type":"integer","default":1000,"title":"Monto"}},{"name":"frecuencia","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Frecuencia"}},{"name":"tipo","in":"query","required":false,"schema":{"type":"string","default":"months","title":"Tipo"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/prueba/estado":{"get":{"summary":"Prueba Estado","description":"Le pregunta a Mercado Pago cómo quedó la suscripción: si está autorizada y CUÁNDO cobra.","operationId":"prueba_estado_prueba_estado_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/prueba/pagos":{"get":{"summary":"Prueba Pagos","description":"Los cobros que Mercado Pago ya ejecutó de esa suscripción. Es la prueba definitiva:\nsi aparece más de uno, el cobro recurrente está funcionando.","operationId":"prueba_pagos_prueba_pagos_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/ficha":{"get":{"summary":"Admin Ficha","description":"La ficha cruda de una empresa, para diagnosticar sin necesitar una suscripción.\n\n`mercado` porque las fichas de afuera van con la plaza en la clave: ECL es Ecolab en\nNueva York y Engie Energía Chile en Santiago.","operationId":"admin_ficha_admin_ficha_get","parameters":[{"name":"t","in":"query","required":false,"schema":{"type":"string","default":"","title":"T"}},{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"mercado","in":"query","required":false,"schema":{"type":"string","default":"","title":"Mercado"}},{"name":"crudo","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Crudo"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/estado":{"get":{"summary":"Admin Estado","operationId":"admin_estado_admin_estado_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/correo/ping":{"get":{"summary":"Admin Correo Ping","description":"¿La contraseña de aplicación sirve? Conecta y autentica sin escribirle a nadie.\nCon `usuario` se prueba la misma clave contra otra dirección, para descubrir a qué cuenta\npertenece cuando la forma es correcta pero Google la rechaza.","operationId":"admin_correo_ping_admin_correo_ping_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"usuario","in":"query","required":false,"schema":{"type":"string","default":"","title":"Usuario"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/mp/cobros":{"get":{"summary":"Admin Mp Cobros","description":"Qué cobró de verdad Mercado Pago en los últimos días.\n\nUna suscripción activa en nuestra base puede venir de un pago o de una activación a mano\ndesde el panel, y desde adentro se ven iguales. Esto pregunta a MP: lo que aparece acá es\nplata que entró.","operationId":"admin_mp_cobros_admin_mp_cobros_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"dias","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Dias"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/mp/metodos":{"get":{"summary":"Admin Mp Metodos","description":"Qué puede cobrar ESTA cuenta de Mercado Pago: medios de pago y monedas.\nLe pregunta a MP en vez de suponer, que es la única forma de saberlo de verdad.","operationId":"admin_mp_metodos_admin_mp_metodos_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/mp/ping":{"get":{"summary":"Admin Mp Ping","description":"¿El token de Mercado Pago sirve? Pregunta por la cuenta dueña del token (no lo expone).","operationId":"admin_mp_ping_admin_mp_ping_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/usuarios":{"get":{"summary":"Admin Usuarios","description":"Listado de usuarios con lo que tiene pagado cada uno, para operar desde el panel de ops.","operationId":"admin_usuarios_admin_usuarios_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"producto","in":"query","required":false,"schema":{"type":"string","default":"","title":"Producto"}},{"name":"solo","in":"query","required":false,"schema":{"type":"string","default":"","title":"Solo"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","default":300,"title":"Limite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/desactivar":{"post":{"summary":"Admin Desactivar","description":"Quita el acceso a un producto, por teléfono O por correo (corta la cortesía o una cuenta\nque ya no corresponde). Simétrico con /admin/activar: al cliente que entró por correo también\nhay que poder cancelarlo.","operationId":"admin_desactivar_admin_desactivar_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"telefono","in":"query","required":false,"schema":{"type":"string","default":"","title":"Telefono"}},{"name":"email","in":"query","required":false,"schema":{"type":"string","default":"","title":"Email"}},{"name":"producto","in":"query","required":false,"schema":{"type":"string","default":"todos","title":"Producto"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/usuario":{"post":{"summary":"Admin Usuario","description":"Corrige los datos de una cuenta desde el panel: nombre, correo, empresa y teléfono.\n\nEl teléfono es la identidad con la que se entra por WhatsApp: un dígito mal tecleado deja al\ncliente sin poder entrar y sin forma de arreglarlo salvo abriéndole otra cuenta. Por eso se\npuede editar, pero se comprueba antes que no sea de otra cuenta. Solo se tocan los campos que\nllegan: lo que no venga, queda como estaba.","operationId":"admin_usuario_admin_usuario_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"uid","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Uid"}},{"name":"nombre","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nombre"}},{"name":"email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},{"name":"empresa","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Empresa"}},{"name":"telefono","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Telefono"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/refrescar":{"post":{"summary":"Admin Refrescar","description":"Fuerza el refresco de las series desde el monitoreo.","operationId":"admin_refrescar_admin_refrescar_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/plan":{"post":{"summary":"Admin Plan","description":"Cambia el precio, en pesos: al mes y al año adelantado. Por defecto toca EL plan (el que\nse ofrece); los códigos de índice suelto siguen aceptándose para las suscripciones vivas.\nSe puede mandar solo uno de los dos; el que no venga queda como estaba.","operationId":"admin_plan_admin_plan_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"producto","in":"query","required":false,"schema":{"type":"string","default":"todos","title":"Producto"}},{"name":"mensual","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Mensual"}},{"name":"anual","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Anual"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/pixel":{"post":{"summary":"Admin Pixel","description":"Fija el Pixel ID de Meta (solo dígitos). Vacío = apaga el píxel.","operationId":"admin_pixel_admin_pixel_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"pixel_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Pixel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/activar":{"post":{"summary":"Admin Activar","description":"Activa a mano una suscripción, por teléfono O por correo.\n\nEl correo no es un lujo: quien paga desde afuera no tiene WhatsApp chileno, entra con su\ncorreo y hay que poder abrirle la cuenta igual. Antes esto solo sabía de teléfonos y dejaba\nsin forma de activar justo al cliente internacional.","operationId":"admin_activar_admin_activar_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"telefono","in":"query","required":false,"schema":{"type":"string","default":"","title":"Telefono"}},{"name":"email","in":"query","required":false,"schema":{"type":"string","default":"","title":"Email"}},{"name":"meses","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Meses"}},{"name":"dias","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Dias"}},{"name":"producto","in":"query","required":false,"schema":{"type":"string","default":"todos","title":"Producto"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bencina":{"get":{"summary":"Pagina Bencina","description":"La portada del árbol: todas las comunas por región.\n\nSin ella las trescientas fichas cuelgan solo del sitemap, y una URL a la que no llega ningún\nenlace del propio sitio se rastrea tarde y mal.","operationId":"pagina_bencina_bencina_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/bencina/{comuna}":{"get":{"summary":"Pagina Bencina Comuna","description":"El precio de los combustibles de UNA comuna, en su propia URL y con los números en el HTML.\n\nEs la página que puede rankear para \"bencina en <comuna>\", que es como se busca de verdad.\nVa entera y sin candado: la CNE obliga a cada estación a informar su precio, es información\npública y cobrarla no tendría cómo defenderse.","operationId":"pagina_bencina_comuna_bencina__comuna__get","parameters":[{"name":"comuna","in":"path","required":true,"schema":{"type":"string","title":"Comuna"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/arriendos/{comuna}":{"get":{"summary":"Pagina Comuna","description":"El precio del arriendo de una comuna, en su propia URL y con el número en el HTML.\n\nEs la página que puede rankear para \"cuánto cuesta arrendar en <comuna>\", que es como la\ngente lo busca de verdad. Publica UNA cifra —la mediana de $/m², con su fecha y su\nmuestra— y deja cerrado lo que se paga: los barrios, la serie, la dispersión y el arriendo\nmensual. Si no hay número no hay nada que rankear ni nada que un motor de IA pueda citar.","operationId":"pagina_comuna_arriendos__comuna__get","parameters":[{"name":"comuna","in":"path","required":true,"schema":{"type":"string","title":"Comuna"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/arriendos/{comuna}/{barrio}":{"get":{"summary":"Pagina Barrio","description":"El arriendo de UN barrio, un escalón bajo la comuna.\n\nDentro de una misma comuna el metro cuadrado cambia bastante, y \"arriendo en Los Dominicos\"\nes como se busca de verdad. Publica la misma cifra que la comuna —la mediana de $/m², con su\nmuestra y su fecha— comparada contra su propia comuna en vez de contra la región.\n\nSolo los barrios con muestra: `indice_barrios` deja fuera los que no llegan a los treinta\navisos. Cuatrocientas páginas ciertas valen más que mil trescientas con cifras de cinco\navisos, que además es lo que Google castiga.","operationId":"pagina_barrio_arriendos__comuna___barrio__get","parameters":[{"name":"comuna","in":"path","required":true,"schema":{"type":"string","title":"Comuna"}},{"name":"barrio","in":"path","required":true,"schema":{"type":"string","title":"Barrio"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/paises":{"get":{"summary":"Pagina Paises","description":"El índice de países. Con `?pais=&producto=` redirige 301 a la ruta de esa combinación.\n\nLos enlaces con consulta andan dando vuelta —en la portada, en las cinco páginas chilenas y en\nlo que alguien haya compartido— y todos apuntaban a la misma página para un buscador. El 301\nlos junta en la dirección que sí tiene título y bajada propios, sin romper ninguno.","operationId":"pagina_paises_paises_get","parameters":[{"name":"pais","in":"query","required":false,"schema":{"type":"string","default":"","title":"Pais"}},{"name":"producto","in":"query","required":false,"schema":{"type":"string","default":"","title":"Producto"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/paises/catalogo":{"get":{"summary":"Paises Catalogo","description":"Qué países y productos hay (sin precios): arma los botones de la página.","operationId":"paises_catalogo_paises_catalogo_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/paises/datos":{"get":{"summary":"Paises Datos","operationId":"paises_datos_paises_datos_get","parameters":[{"name":"pais","in":"query","required":true,"schema":{"type":"string","title":"Pais"}},{"name":"producto","in":"query","required":true,"schema":{"type":"string","title":"Producto"}},{"name":"variante","in":"query","required":false,"schema":{"type":"string","default":"","title":"Variante"}},{"name":"moneda","in":"query","required":false,"schema":{"type":"string","default":"local","title":"Moneda"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/paises/portada":{"get":{"summary":"Paises Portada","description":"Para las tarjetas de la portada que rotan por país. Mismas cifras que ya se regalan en la\nportada chilena (niveles nacionales), una por país con su bandera. En memoria 10 minutos: es la\npágina con más tráfico y armar esto lee ~1 MB de caché (México solo son 600 KB).","operationId":"paises_portada_paises_portada_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/inflacion/historico":{"get":{"summary":"Inflacion Historico","description":"El botón \"Histórico\" de la capa de inflación (7-oct-2026): Chile, mes a mes, la cifra oficial\ncontra la de Xponda, por mes calendario. Lo oficial es público; lo nuestro va con el plan: sin plan\nviajan los meses medidos, nunca el número (mismo corte que /portada/comparacion).","operationId":"inflacion_historico_inflacion_historico_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/inflacion":{"get":{"summary":"Pagina Inflacion","operationId":"pagina_inflacion_inflacion_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/del-mundo-a-la-gondola":{"get":{"summary":"Pagina Gondola","operationId":"pagina_gondola_del_mundo_a_la_gondola_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ropa":{"get":{"summary":"Pagina Ropa","operationId":"pagina_ropa_ropa_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tecnologia":{"get":{"summary":"Pagina Tecnologia","operationId":"pagina_tecnologia_tecnologia_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/panorama":{"get":{"summary":"Pagina Panorama","operationId":"pagina_panorama_panorama_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/viajes":{"get":{"summary":"Pagina Viajes","operationId":"pagina_viajes_viajes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/portada/resumen":{"get":{"summary":"Resumen Hoy Json","description":"Lo que muestra el recuadro: el último resumen escrito y el último video (pueden ser de días distintos).","operationId":"resumen_hoy_json_portada_resumen_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/portada/resumen/videos":{"post":{"summary":"Resumen Videos Push","description":"El Mac empuja los cierres del canal (youtube_push.py), porque YouTube no le contesta al servidor.\nCuerpo: {\"videos\": [{\"fecha\": \"AAAA-MM-DD\", \"youtube\": \"<id>\", \"titulo\": \"…\"}]}. Header X-Indx-Key.","operationId":"resumen_videos_push_portada_resumen_videos_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/resumen/video":{"post":{"summary":"Admin Resumen Video","description":"Guarda el Short del día: POST /admin/resumen/video?key=…&fecha=AAAA-MM-DD&url=<enlace de YouTube>.","operationId":"admin_resumen_video_admin_resumen_video_post","parameters":[{"name":"fecha","in":"query","required":true,"schema":{"type":"string","title":"Fecha"}},{"name":"url","in":"query","required":true,"schema":{"type":"string","title":"Url"}},{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"titulo","in":"query","required":false,"schema":{"type":"string","default":"","title":"Titulo"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/maqueta/portada":{"get":{"summary":"Maqueta Portada","description":"Fue la maqueta de la portada en dos columnas; aprobada el 16-oct-2026, ya ES la portada.","operationId":"maqueta_portada_maqueta_portada_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/soluciones":{"get":{"summary":"Soluciones","description":"La pestaña \"Soluciones\" del menú (8-oct-2026): misión, visión y conectores de datos a la IA.\nVive acá y no en tablero.py porque este archivo es el que se despliega limpio.","operationId":"soluciones_soluciones_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/inflacion/mapa":{"get":{"summary":"Inflacion Mapa","description":"El IPC del país como mapa de divisiones (7-oct-2026): en cada cuadro el último dato oficial, el\nmes completo Xponda y el mes en curso Xponda, y arriba el IPC total estimado (promedio ponderado\npor los pesos oficiales) junto a lo que espera la encuesta del Banco Central. Por ahora Chile: el\nresto de los países se suma cuando tengamos sus divisiones (agentes por país, ~/mr-price/agentes).\n\nCandado: lo oficial y la expectativa son públicos; las cifras Xponda van con el plan (sin plan\nviaja el período medido, nunca el número). Alimentos y el resto con el plan de alimentos (el pack\nabre todo); vivienda con el de arriendos.","operationId":"inflacion_mapa_inflacion_mapa_get","parameters":[{"name":"pais","in":"query","required":false,"schema":{"type":"string","default":"CL","title":"Pais"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/paises/comparacion":{"get":{"summary":"Paises Comparacion","operationId":"paises_comparacion_paises_comparacion_get","parameters":[{"name":"pais","in":"query","required":true,"schema":{"type":"string","title":"Pais"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/paises/{iso2}/{producto}":{"get":{"summary":"Pagina Pais Producto","description":"Una combinación país+producto, con su propia dirección y su propio título.\n\nEs la MISMA página interactiva de /paises: no se duplica el mapa ni los datos, se le pone\ndirección y se le sirve el texto que un buscador puede leer. La semilla le dice al JavaScript\ndónde abrirse, así que no depende de la consulta.","operationId":"pagina_pais_producto_paises__iso2___producto__get","parameters":[{"name":"iso2","in":"path","required":true,"schema":{"type":"string","title":"Iso2"}},{"name":"producto","in":"path","required":true,"schema":{"type":"string","title":"Producto"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vigia/latido":{"post":{"summary":"Latido","operationId":"latido_vigia_latido_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/vigia/estado":{"get":{"summary":"Estado","operationId":"estado_vigia_estado_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"lectura","in":"query","required":false,"schema":{"type":"string","default":"","title":"Lectura"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portada/contador":{"get":{"summary":"Portada Contador","operationId":"portada_contador_portada_contador_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Portada Contador Push","operationId":"portada_contador_push_portada_contador_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/portada/chispas":{"get":{"summary":"Portada Chispas","description":"Lo que dibujan las tarjetas del carrusel de la portada, solo con datos que ya son públicos:\n\n- combustible: la mediana nacional de la bencina 95, día a día, del archivo propio. El\n  combustible de Chile es ABIERTO (SIN_CANDADO en api.py).\n- arriendos: la comuna más barata y la más cara (con 30 avisos o más), las mismas cifras que\n  publican las páginas /arriendos/<comuna>. La SERIE del arriendo NO sale: es de pago.\n\nEl S&P 500 y el cobre los pide la página a /tablero/serie y /tablero/materia, que ya son públicos.","operationId":"portada_chispas_portada_chispas_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/portada/cobertura":{"get":{"summary":"Portada Cobertura","description":"Precios de los últimos 7 días por país y capa (fuera de Chile), para la matriz de cobertura de\nops.sierra.plus/admin/mapa. Con X-Indx-Key: es interno, la portada no lo usa.","operationId":"portada_cobertura_portada_cobertura_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/portada/gif/{nombre}.{ext}":{"get":{"summary":"Portada Gif","description":"Los GIFs cortos de la portada (21-oct-2026): uno central y uno por industria, mudos y en bucle, con la pantalla\nreal de la IA respondiendo con Xponda. Fuente: ~/Marketing indxtoday.com/video-mundo/gifs.py.","operationId":"portada_gif_portada_gif__nombre___ext__get","parameters":[{"name":"nombre","in":"path","required":true,"schema":{"type":"string","title":"Nombre"}},{"name":"ext","in":"path","required":true,"schema":{"type":"string","title":"Ext"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portada/video-2.{ext}":{"get":{"summary":"Portada Video 2","description":"Segundo video largo de la portada (27-oct-2026): «¿Qué es Xponda?», versión 1280x720 del reel vertical. Se turna\ncon el primero en «Ver el video con sonido». Fuente: ~/Marketing indxtoday.com/semanal/2026-10-27-que-es-xponda.","operationId":"portada_video_2_portada_video_2__ext__get","parameters":[{"name":"ext","in":"path","required":true,"schema":{"type":"string","title":"Ext"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portada/video.{ext}":{"get":{"summary":"Portada Video","description":"El video de la portada (20-oct-2026): personas preguntándole a su IA con datos de Xponda. Responde por tramos\n(Range) como los tutoriales de /tu-ia: Safari no reproduce un MP4 que no los admita. Fuente:\n~/Marketing indxtoday.com/video-mundo (montaje.py + subtitulos.py), versión web de 1280x720.","operationId":"portada_video_portada_video__ext__get","parameters":[{"name":"ext","in":"path","required":true,"schema":{"type":"string","title":"Ext"}},{"name":"archivo","in":"query","required":false,"schema":{"type":"string","default":"portada-video","title":"Archivo"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/mcp-registry-auth":{"get":{"summary":"Mcp Registro Verificacion","operationId":"mcp_registro_verificacion__well_known_mcp_registry_auth_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/mcp/server-card.json":{"get":{"summary":"Mcp Tarjeta","operationId":"mcp_tarjeta__well_known_mcp_server_card_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/docs":{"get":{"summary":"Docs","operationId":"docs_docs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/planes":{"get":{"summary":"Pagina","operationId":"pagina_planes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/planes/datos":{"get":{"summary":"Datos","operationId":"datos_planes_datos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/planes/crear":{"post":{"summary":"Crear","description":"Crea en PayPal (cuenta real) los planes de Compras y Datos que falten, mensual y anual, sin prueba.\nEs idempotente: PayPal-Request-Id fijo por plan y período, y no repite los que ya están guardados.","operationId":"crear_admin_planes_crear_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/planes/activar":{"post":{"summary":"Activar","operationId":"activar_planes_activar_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/prueba-gratis/estado":{"get":{"summary":"Prueba Estado","description":"Qué caminos están disponibles, para que la ventana no ofrezca uno que no llega.","operationId":"prueba_estado_prueba_gratis_estado_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/prueba-gratis/correo":{"post":{"summary":"Prueba Correo","operationId":"prueba_correo_prueba_gratis_correo_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/prueba-gratis/confirmar":{"post":{"summary":"Prueba Confirmar","operationId":"prueba_confirmar_prueba_gratis_confirmar_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/prueba-gratis/whatsapp":{"post":{"summary":"Prueba Whatsapp","description":"El código IDX- que la persona nos manda desde su WhatsApp. Es el mismo del ingreso: al llegar,\n/wa/entrante lo verifica y llama a al_verificar_wa().","operationId":"prueba_whatsapp_prueba_gratis_whatsapp_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/prueba-gratis/leads":{"get":{"summary":"Leads","description":"La lista de interesados (correo o WhatsApp, de qué página vino, si activó). Con ADMIN_KEY u OPS_KEY.","operationId":"leads_admin_prueba_gratis_leads_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"formato","in":"query","required":false,"schema":{"type":"string","default":"json","title":"Formato"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/costo-de-vida":{"get":{"summary":"Costo Vida Pagina","operationId":"costo_vida_pagina_costo_de_vida_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/costo-de-vida/datos":{"get":{"summary":"Costo Vida Datos","operationId":"costo_vida_datos_costo_de_vida_datos_get","parameters":[{"name":"comuna","in":"query","required":false,"schema":{"type":"string","default":"","title":"Comuna"}},{"name":"m2","in":"query","required":false,"schema":{"type":"integer","default":60,"title":"M2"}},{"name":"litros","in":"query","required":false,"schema":{"type":"integer","default":60,"title":"Litros"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mis-flujos":{"get":{"summary":"Pagina","operationId":"pagina_mis_flujos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/flujos/datos":{"get":{"summary":"Flujos Datos","operationId":"flujos_datos_flujos_datos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/flujos":{"post":{"summary":"Crear","operationId":"crear_flujos_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/flujos/{fid}":{"post":{"summary":"Cambiar","operationId":"cambiar_flujos__fid__post","parameters":[{"name":"fid","in":"path","required":true,"schema":{"type":"integer","title":"Fid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Borrar","operationId":"borrar_flujos__fid__delete","parameters":[{"name":"fid","in":"path","required":true,"schema":{"type":"integer","title":"Fid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/flujos/{fid}/probar":{"post":{"summary":"Probar","operationId":"probar_flujos__fid__probar_post","parameters":[{"name":"fid","in":"path","required":true,"schema":{"type":"integer","title":"Fid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/flujos/{fid}/vista":{"get":{"summary":"Vista","operationId":"vista_flujos__fid__vista_get","parameters":[{"name":"fid","in":"path","required":true,"schema":{"type":"integer","title":"Fid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/flujos/baja/{token}":{"get":{"summary":"Baja","operationId":"baja_flujos_baja__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Baja Un Clic","operationId":"baja_un_clic_flujos_baja__token__post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/flujos":{"get":{"summary":"Admin Flujos","operationId":"admin_flujos_admin_flujos_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bonos/datos":{"get":{"summary":"Bonos Datos","operationId":"bonos_datos_bonos_datos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/bonos/serie":{"get":{"summary":"Bonos Serie","description":"La historia: de suscriptores. Sin plan no viaja ningún punto.","operationId":"bonos_serie_bonos_serie_get","parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string","default":"DGS10","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bonos":{"get":{"summary":"Pagina Bonos","operationId":"pagina_bonos_bonos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/liquidez/datos":{"get":{"summary":"Liquidez Datos","operationId":"liquidez_datos_liquidez_datos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/liquidez/serie":{"get":{"summary":"Liquidez Serie","description":"La historia: solo con plan. Sin plan no viaja ningún punto.","operationId":"liquidez_serie_liquidez_serie_get","parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string","default":"BASURA_AAA","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/liquidez":{"get":{"summary":"Pagina Liquidez","operationId":"pagina_liquidez_liquidez_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/hoteleria/datos":{"get":{"summary":"Hoteleria Datos","operationId":"hoteleria_datos_hoteleria_datos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/hoteleria/push":{"post":{"summary":"Hoteleria Push","description":"Recibe el resumen de Airbnb desde el nodo local. Misma llave que /tablero/rubros/push.","operationId":"hoteleria_push_hoteleria_push_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/hoteleria":{"get":{"summary":"Pagina Hoteleria","operationId":"pagina_hoteleria_hoteleria_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ia/monitor/push":{"post":{"summary":"Ia Monitor Push","description":"Filas [fecha, pilar, clave, metrica, valor] del robot. Solo los pilares del monitor: los niveles\n`empresa` y `pais` de indice='ia' (precio de los tokens) no se pueden pisar desde acá.","operationId":"ia_monitor_push_ia_monitor_push_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ia/monitor/hito":{"post":{"summary":"Ia Monitor Hito","description":"Una cifra manual: {fecha, serie, cifra, unidad, fuente, enlace}.","operationId":"ia_monitor_hito_ia_monitor_hito_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ia/monitor":{"get":{"summary":"Pagina Ia Monitor","description":"La página del monitor (31-oct-2026): las cinco cuentas y los cuatro pilares, pintados en el servidor\nsobre static/ia-monitor.html. Si la base falla, sale la página sin cifras y no un error.","operationId":"pagina_ia_monitor_ia_monitor_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ia/monitor/estado":{"get":{"summary":"Ia Monitor Estado","description":"Para revisar desde el Mac qué hay guardado (con la llave): series, puntos y último período.","operationId":"ia_monitor_estado_ia_monitor_estado_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/legal/socios/buscar":{"get":{"summary":"Buscar","operationId":"buscar_legal_socios_buscar_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/legal/socios/empresa/{rut}":{"get":{"summary":"Ficha Empresa","operationId":"ficha_empresa_legal_socios_empresa__rut__get","parameters":[{"name":"rut","in":"path","required":true,"schema":{"type":"string","title":"Rut"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/legal/socios/persona":{"get":{"summary":"Ficha Persona","operationId":"ficha_persona_legal_socios_persona_get","parameters":[{"name":"rut","in":"query","required":false,"schema":{"type":"string","default":"","title":"Rut"}},{"name":"nombre","in":"query","required":false,"schema":{"type":"string","default":"","title":"Nombre"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/legal/socios/red":{"get":{"summary":"Red","description":"Un salto de la red. Ids: E:<rut> empresa · C:<cve> empresa sin RUT · P:<rut> persona ·\nN:<nombre> persona sin RUT (no se amplía: puede ser un homónimo).","operationId":"red_legal_socios_red_get","parameters":[{"name":"id","in":"query","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/legal/socios/finalidad":{"post":{"summary":"Finalidad","operationId":"finalidad_legal_socios_finalidad_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/legal/socios/exclusion":{"get":{"summary":"Pagina Exclusion","operationId":"pagina_exclusion_legal_socios_exclusion_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Exclusion","operationId":"exclusion_legal_socios_exclusion_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/socios/exclusiones":{"get":{"summary":"Admin Exclusiones","operationId":"admin_exclusiones_admin_socios_exclusiones_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/socios/exclusiones/{id_}/aprobar":{"post":{"summary":"Admin Aprobar","operationId":"admin_aprobar_admin_socios_exclusiones__id___aprobar_post","parameters":[{"name":"id_","in":"path","required":true,"schema":{"type":"integer","title":"Id "}},{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/legal/socios/info":{"get":{"summary":"Info","description":"Lo que la página necesita al abrir: nivel de acceso, si ya declaró finalidad, rango de fechas.","operationId":"info_legal_socios_info_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/legal/socios":{"get":{"summary":"Pagina","operationId":"pagina_legal_socios_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/legal/datos":{"get":{"summary":"Legal Datos","description":"Una edición: el resumen y, si se pide `seccion`, sus filas.","operationId":"legal_datos_legal_datos_get","parameters":[{"name":"fecha","in":"query","required":false,"schema":{"type":"string","title":"Fecha"}},{"name":"seccion","in":"query","required":false,"schema":{"type":"string","title":"Seccion"}},{"name":"pais","in":"query","required":false,"schema":{"type":"string","default":"CL","title":"Pais"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/legal/buscar":{"get":{"summary":"Legal Buscar","description":"Busca en las ediciones guardadas. En marcas, por parecido (letras y sonido), no solo exacto.","operationId":"legal_buscar_legal_buscar_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","title":"Q"}},{"name":"seccion","in":"query","required":false,"schema":{"type":"string","default":"todo","title":"Seccion"}},{"name":"dias","in":"query","required":false,"schema":{"type":"integer","default":60,"title":"Dias"}},{"name":"pais","in":"query","required":false,"schema":{"type":"string","default":"CL","title":"Pais"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/legal/vivo":{"get":{"summary":"Legal Vivo","description":"Las cifras de la puerta de la portada: lo último guardado, sin leer nada.","operationId":"legal_vivo_legal_vivo_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/legal/serie":{"get":{"summary":"Legal Serie","description":"Por día: sociedades creadas/disueltas, solicitudes de marca y leyes. El pulso del país en trámites.","operationId":"legal_serie_legal_serie_get","parameters":[{"name":"dias","in":"query","required":false,"schema":{"type":"integer","default":60,"title":"Dias"}},{"name":"pais","in":"query","required":false,"schema":{"type":"string","default":"CL","title":"Pais"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/legal":{"get":{"summary":"Pagina Legal","operationId":"pagina_legal_legal_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/legal/{sub}":{"get":{"summary":"Pagina Legal Sub","operationId":"pagina_legal_sub_legal__sub__get","parameters":[{"name":"sub","in":"path","required":true,"schema":{"type":"string","title":"Sub"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tasas/datos":{"get":{"summary":"Tasas Datos","description":"La tabla de tasas. La tasa de hoy es pública; el resto sube con el plan.","operationId":"tasas_datos_tasas_datos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tasas/pais":{"get":{"summary":"Tasas Pais","description":"La serie histórica de un país. Es lo que se paga.","operationId":"tasas_pais_tasas_pais_get","parameters":[{"name":"c","in":"query","required":false,"schema":{"type":"string","default":"CL","title":"C"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tasas/divisas":{"get":{"summary":"Tasas Divisas","description":"Las 166 monedas: el valor de hoy es público, la variación es de quien tiene cuenta.","operationId":"tasas_divisas_tasas_divisas_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tasas/divisa":{"get":{"summary":"Tasas Divisa","description":"La historia de un par contra el dólar. Es lo que se paga.","operationId":"tasas_divisa_tasas_divisa_get","parameters":[{"name":"m","in":"query","required":false,"schema":{"type":"string","default":"CLP","title":"M"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tasas":{"get":{"summary":"Pagina Tasas","operationId":"pagina_tasas_tasas_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/cripto/aprender":{"get":{"summary":"Pagina Aprende","description":"La pestaña que explica cada moneda. Dirección propia porque es la que puede traer gente por\nbuscador: \"qué es bitcoin\" y \"cómo se fabrica\" son búsquedas, y no se responden desde un panel\nlateral escondido detrás de un precio.","operationId":"pagina_aprende_cripto_aprender_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/divisas":{"get":{"summary":"Pagina Divisas","description":"La misma página, abierta en la otra pestaña. Es una dirección propia a propósito: \"dólar\nhoy\" y \"tasa de política\" son dos búsquedas distintas y una sola URL solo puede ganar una.","operationId":"pagina_divisas_divisas_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/cripto/datos":{"get":{"summary":"Cripto Datos","operationId":"cripto_datos_cripto_datos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/cripto/moneda":{"get":{"summary":"Cripto Moneda","description":"La ficha y la serie de una moneda.\n\nLa FICHA va abierta para todos, a propósito: explicar qué es cada moneda, quién la hizo y cómo\nse fabrica es contenido que trae gente, y además es lo único de esta pestaña que no publica ya\ntodo el mundo en inglés. Lo que se paga es la serie COMPLETA; con cuenta gratis se ve el\núltimo año, y sin cuenta, el gráfico va cerrado.","operationId":"cripto_moneda_cripto_moneda_get","parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string","default":"bitcoin","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cripto":{"get":{"summary":"Pagina Cripto","operationId":"pagina_cripto_cripto_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mis-analisis":{"get":{"summary":"Pagina Mis Analisis","operationId":"pagina_mis_analisis_mis_analisis_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/portfolio":{"get":{"summary":"Pagina Portfolio","operationId":"pagina_portfolio_portfolio_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/portfolio/buscar":{"get":{"summary":"Buscar","operationId":"buscar_portfolio_buscar_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portfolio/empresa":{"get":{"summary":"Empresa","operationId":"empresa_portfolio_empresa_get","parameters":[{"name":"t","in":"query","required":false,"schema":{"type":"string","default":"","title":"T"}},{"name":"mercado","in":"query","required":false,"schema":{"type":"string","default":"","title":"Mercado"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portfolio/estado":{"get":{"summary":"Estado","description":"Lo mínimo para que la página sepa si abre la planilla o el cerrojo. Va sin caché: es\npersonal, y un proxy que lo guarde le abriría la planilla al visitante siguiente.","operationId":"estado_portfolio_estado_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/portfolio/hojas":{"get":{"summary":"Hojas","operationId":"hojas_portfolio_hojas_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Hoja Crear","operationId":"hoja_crear_portfolio_hojas_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HojaNueva"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portfolio/hojas/{hid}":{"put":{"summary":"Hoja Guardar","operationId":"hoja_guardar_portfolio_hojas__hid__put","parameters":[{"name":"hid","in":"path","required":true,"schema":{"type":"integer","title":"Hid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HojaCambio"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Hoja Borrar","operationId":"hoja_borrar_portfolio_hojas__hid__delete","parameters":[{"name":"hid","in":"path","required":true,"schema":{"type":"integer","title":"Hid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tablero/rubros/push":{"post":{"summary":"Rubros Push","description":"Recibe los rubros resumidos desde el nodo local. Misma llave que /etfs/push.","operationId":"rubros_push_tablero_rubros_push_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tablero/datos":{"get":{"summary":"Tablero Datos","operationId":"tablero_datos_tablero_datos_get","parameters":[{"name":"pais","in":"query","required":false,"schema":{"type":"string","default":"CL","title":"Pais"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tablero/vivo":{"get":{"summary":"Tablero Vivo","description":"Precio de AHORA de los índices y de las acciones del país (ver vivo.py). 30 s de caché.","operationId":"tablero_vivo_tablero_vivo_get","parameters":[{"name":"pais","in":"query","required":false,"schema":{"type":"string","default":"CL","title":"Pais"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/etfs/vivo":{"get":{"summary":"Etfs Vivo","description":"El precio de AHORA de los papeles del mapa de /etfs, para refrescar las celdas.\n\n**El mapa arrastraba DOS atrasos apilados y uno era nuestro.** Lo empuja el nodo del Mac\nuna vez por hora, así que al rezago de la fuente se le sumaba hasta una hora de foto\nvieja: el 13-oct-2026 el mapa mostraba Copec a 6.554,20 cuando había cerrado en 6.561,00.\nEsto saca nuestra hora —el precio se le pide a Yahoo desde acá, con 30 s de caché\ncompartida por todos los visitantes— y **declara el que no podemos sacar**: `rezago` en\nminutos, medido contra el reloj, no supuesto. Medido el 15-oct-2026 con cada bolsa\nabierta: Estados Unidos **0 min** (tiempo real), Brasil y Europa 15, Buenos Aires y México\n20, **Santiago 40**.\n\n**Vive en `tablero.py` y no en `api.py` a propósito** (15-oct-2026): su router ya está\nincluido y toda la maquinaria de precios en vivo es de este módulo, así que el endpoint no\nobliga a tocar `api.py` —que ese día estaba a medio refactorizar por otra sesión, con 230\nlíneas movidas hacia los módulos `paginas_*`—. La ruta se llama `/etfs/vivo` porque la\nconsume esa página; el nombre del módulo no amarra el nombre de la ruta.\n\n**Abierto, como el mapa.** La foto ya viaja con precio y variación sin candado (el mapa es\nabierto y lo que se cobra es la ficha): esconder la versión fresca del mismo número sería\ncobrar por el reloj.","operationId":"etfs_vivo_etfs_vivo_get","parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string","default":"spy","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ampliar.js":{"get":{"summary":"Ampliar Js","description":"El gráfico ampliado del tablero (2-oct-2026). Ruta propia: acá no hay StaticFiles montado.","operationId":"ampliar_js_ampliar_js_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/titulares.js":{"get":{"summary":"Titulares Js","description":"La franja de titulares bajo la barra de arriba (2-oct-2026), en todo el sitio.","operationId":"titulares_js_titulares_js_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/creditos":{"get":{"summary":"Creditos","description":"Software de terceros y sus licencias (2-oct-2026): la nota de autoría de Lightweight Charts vive\nacá para no llevar su logo dentro del gráfico.","operationId":"creditos_creditos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tablero/velas":{"get":{"summary":"Tablero Velas","description":"Velas (apertura, máximo, mínimo, cierre) del fondo del índice, desde Yahoo (vivo.velas).","operationId":"tablero_velas_tablero_velas_get","parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string","default":"spy","title":"Id"}},{"name":"rango","in":"query","required":false,"schema":{"type":"string","default":"1A","title":"Rango"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tablero/monto":{"get":{"summary":"Tablero Monto","description":"Monto transado día a día en US$ y acciones transadas (monto.py). S&P 500, Nasdaq 100 y Dow.","operationId":"tablero_monto_tablero_monto_get","parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string","default":"spy","title":"Id"}},{"name":"rango","in":"query","required":false,"schema":{"type":"string","default":"1A","title":"Rango"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tablero/serie":{"get":{"summary":"Tablero Serie","operationId":"tablero_serie_tablero_serie_get","parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string","default":"ech","title":"Id"}},{"name":"rango","in":"query","required":false,"schema":{"type":"string","default":"1A","title":"Rango"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tablero/mapa":{"get":{"summary":"Tablero Mapa","operationId":"tablero_mapa_tablero_mapa_get","parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string","default":"ech","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tablero/materia":{"get":{"summary":"Tablero Materia","description":"La serie larga de una materia prima (la misma del gráfico abierto de su ficha).","operationId":"tablero_materia_tablero_materia_get","parameters":[{"name":"cod","in":"query","required":false,"schema":{"type":"string","default":"cobre","title":"Cod"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tablero":{"get":{"summary":"Pagina Tablero","description":"Fue la vista previa; desde el 29-sep-2026 el tablero ES la portada: redirige a \"/\".","operationId":"pagina_tablero_tablero_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tablero/accion":{"get":{"summary":"Tablero Accion","description":"Una acción buscada desde la portada: su precio EN VIVO y su historia, para el gráfico.\n\n**No se baja nada nuevo para la historia.** La serie de cada papel ya vive en la base\n(`etfs:precio:<TICKER>`, la empuja el nodo) y es la misma que sirve `/etfs/precios`:\nvolver a pedirla afuera sería bajar dos veces el mismo dato.\n\n**El precio en vivo es el de `vivo`, el mismo de las tablas de la portada.** Si no se puede\ncotizar —papel de otra bolsa, fuente caída— se devuelve el último cierre de la serie y se\nDECLARA con `en_vivo: false`, para que la página pueda decir \"cierre del 7-oct\" en vez de\nhacer pasar un cierre viejo por un precio al minuto.","operationId":"tablero_accion_tablero_accion_get","parameters":[{"name":"t","in":"query","required":false,"schema":{"type":"string","default":"","title":"T"}},{"name":"rango","in":"query","required":false,"schema":{"type":"string","default":"1A","title":"Rango"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/titulares/resumen":{"get":{"summary":"Titulares Resumen","operationId":"titulares_resumen_titulares_resumen_get","parameters":[{"name":"n","in":"query","required":false,"schema":{"type":"integer","default":3,"title":"N"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/titulares/vivo":{"get":{"summary":"Titulares Vivo","operationId":"titulares_vivo_titulares_vivo_get","parameters":[{"name":"n","in":"query","required":false,"schema":{"type":"integer","default":14,"title":"N"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/titulares/portada":{"get":{"summary":"Titulares Portada","operationId":"titulares_portada_titulares_portada_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/boletin":{"get":{"summary":"Admin Boletin","description":"Vista previa del correo de esta semana, tal como lo vería alguien con esos filtros.","operationId":"admin_boletin_admin_boletin_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"imp","in":"query","required":false,"schema":{"type":"integer","default":3,"title":"Imp"}},{"name":"pais","in":"query","required":false,"schema":{"type":"string","default":"","title":"Pais"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/boletin/prueba":{"post":{"summary":"Admin Boletin Prueba","description":"Manda el correo de esta semana a UNA dirección, sin anotarlo como enviado.","operationId":"admin_boletin_prueba_admin_boletin_prueba_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"correo","in":"query","required":false,"schema":{"type":"string","default":"","title":"Correo"}},{"name":"imp","in":"query","required":false,"schema":{"type":"integer","default":3,"title":"Imp"}},{"name":"pais","in":"query","required":false,"schema":{"type":"string","default":"","title":"Pais"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/boletin/enviar":{"post":{"summary":"Admin Boletin Enviar","description":"Manda ya el correo de esta semana a quien todavía no lo recibió (es idempotente).","operationId":"admin_boletin_enviar_admin_boletin_enviar_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/boletin/estado":{"get":{"summary":"Admin Boletin Estado","operationId":"admin_boletin_estado_admin_boletin_estado_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/calendario/datos":{"get":{"summary":"Calendario Datos","operationId":"calendario_datos_calendario_datos_get","parameters":[{"name":"semana","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Semana"}},{"name":"imp","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Imp"}},{"name":"pais","in":"query","required":false,"schema":{"type":"string","default":"","title":"Pais"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/calendario/proximos":{"get":{"summary":"Calendario Proximos","description":"Para la portada: lo que viene (relevancia media o alta) y lo que acaba de salir hoy.","operationId":"calendario_proximos_calendario_proximos_get","parameters":[{"name":"n","in":"query","required":false,"schema":{"type":"integer","default":7,"title":"N"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/calendario/mes":{"get":{"summary":"Calendario Mes","description":"La vista de mes: todos los días de la grilla (de lunes a domingo, con los bordes del mes\nanterior y el siguiente), con lo justo para dibujar cada evento en su celda.","operationId":"calendario_mes_calendario_mes_get","parameters":[{"name":"y","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Y"}},{"name":"m","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"M"}},{"name":"imp","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Imp"}},{"name":"pais","in":"query","required":false,"schema":{"type":"string","default":"","title":"Pais"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/calendario.ics":{"get":{"summary":"Calendario Ics","description":"El calendario anónimo. Sigue vivo para quien ya lo agregó, pero el botón del sitio ya no lo\nentrega: ahora entrega el enlace personal, que se consigue dejando el correo.","operationId":"calendario_ics_calendario_ics_get","parameters":[{"name":"imp","in":"query","required":false,"schema":{"type":"integer","default":2,"title":"Imp"}},{"name":"pais","in":"query","required":false,"schema":{"type":"string","default":"","title":"Pais"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/calendario/suscribir":{"post":{"summary":"Calendario Suscribir","operationId":"calendario_suscribir_calendario_suscribir_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuscribirIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/calendario/c/{token}.ics":{"get":{"summary":"Calendario Ics Personal","operationId":"calendario_ics_personal_calendario_c__token__ics_get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/calendario/confirmar":{"get":{"summary":"Calendario Confirmar","operationId":"calendario_confirmar_calendario_confirmar_get","parameters":[{"name":"t","in":"query","required":false,"schema":{"type":"string","default":"","title":"T"}},{"name":"f","in":"query","required":false,"schema":{"type":"string","default":"","title":"F"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/calendario/baja":{"post":{"summary":"Calendario Baja","operationId":"calendario_baja_calendario_baja_post","parameters":[{"name":"t","in":"query","required":false,"schema":{"type":"string","default":"","title":"T"}},{"name":"f","in":"query","required":false,"schema":{"type":"string","default":"","title":"F"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Calendario Baja","operationId":"calendario_baja_calendario_baja_get","parameters":[{"name":"t","in":"query","required":false,"schema":{"type":"string","default":"","title":"T"}},{"name":"f","in":"query","required":false,"schema":{"type":"string","default":"","title":"F"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/calendario/contactos":{"get":{"summary":"Admin Contactos","description":"La lista para las campañas. Trae el enlace de baja firmado de cada uno, que tiene que ir en\ncada correo. Excluye a quien se dio de baja salvo que se pida `formato=todos`.","operationId":"admin_contactos_admin_calendario_contactos_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"formato","in":"query","required":false,"schema":{"type":"string","default":"json","title":"Formato"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/calendario-mes.js":{"get":{"summary":"Calendario Mes Js","operationId":"calendario_mes_js_calendario_mes_js_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/calendario/anticipa":{"get":{"summary":"Calendario Anticipa","description":"Para la portada: el próximo IPC de Chile y nuestra medición (el número solo con plan).","operationId":"calendario_anticipa_calendario_anticipa_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/calendario/aviso":{"post":{"summary":"Calendario Aviso","operationId":"calendario_aviso_calendario_aviso_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvisoIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/calendario":{"get":{"summary":"Pagina Calendario","operationId":"pagina_calendario_calendario_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/calendario.js":{"get":{"summary":"Calendario Js","operationId":"calendario_js_calendario_js_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/calendario":{"get":{"summary":"Admin Calendario","operationId":"admin_calendario_admin_calendario_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"refrescar","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Refrescar"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/redes/img/{fecha}/{archivo}":{"get":{"summary":"Redes Img","description":"Pública a propósito: Instagram y Facebook bajan la imagen desde esta dirección para\npublicarla. Son cifras públicas; nada que no esté ya en el sitio.","operationId":"redes_img_redes_img__fecha___archivo__get","parameters":[{"name":"fecha","in":"path","required":true,"schema":{"type":"string","title":"Fecha"}},{"name":"archivo","in":"path","required":true,"schema":{"type":"string","title":"Archivo"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/redes/datos":{"get":{"summary":"Redes Datos","operationId":"redes_datos_redes_datos_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/redes/generar":{"post":{"summary":"Redes Generar","operationId":"redes_generar_redes_generar_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"fecha","in":"query","required":false,"schema":{"type":"string","default":"","title":"Fecha"}},{"name":"tema","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tema"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/redes/{fecha}/editar":{"post":{"summary":"Redes Editar","operationId":"redes_editar_redes__fecha__editar_post","parameters":[{"name":"fecha","in":"path","required":true,"schema":{"type":"string","title":"Fecha"}},{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Cuerpo"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/redes/{fecha}/descartar":{"post":{"summary":"Redes Descartar","operationId":"redes_descartar_redes__fecha__descartar_post","parameters":[{"name":"fecha","in":"path","required":true,"schema":{"type":"string","title":"Fecha"}},{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/redes/{fecha}/publicar":{"post":{"summary":"Redes Publicar","operationId":"redes_publicar_redes__fecha__publicar_post","parameters":[{"name":"fecha","in":"path","required":true,"schema":{"type":"string","title":"Fecha"}},{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"red","in":"query","required":false,"schema":{"type":"string","default":"","title":"Red"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/redes/{fecha}/{tipo}.zip":{"get":{"summary":"Redes Zip","description":"historias.zip para WhatsApp (no deja publicar estados por API) y feed.zip para X\n(publicar por su API se paga): se bajan y se suben a mano.","operationId":"redes_zip_redes__fecha___tipo__zip_get","parameters":[{"name":"fecha","in":"path","required":true,"schema":{"type":"string","title":"Fecha"}},{"name":"tipo","in":"path","required":true,"schema":{"type":"string","title":"Tipo"}},{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/redes":{"get":{"summary":"Redes Pagina","operationId":"redes_pagina_redes_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/comercio-exterior":{"get":{"summary":"Comex Indice","operationId":"comex_indice_comercio_exterior_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/comercio-exterior/capitulo-{cap}":{"get":{"summary":"Comex Capitulo","operationId":"comex_capitulo_comercio_exterior_capitulo__cap__get","parameters":[{"name":"cap","in":"path","required":true,"schema":{"type":"string","title":"Cap"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/comercio-exterior/{nombre}":{"get":{"summary":"Comex Ficha","operationId":"comex_ficha_comercio_exterior__nombre__get","parameters":[{"name":"nombre","in":"path","required":true,"schema":{"type":"string","title":"Nombre"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/prensa/envio":{"post":{"summary":"Marcar Envio","description":"Marca a quién se le mandó qué. Esto NO manda nada: lo anota.\n\nEl envío lo hace el dueño desde su propio correo (ver la cabecera del módulo). Acá solo\nqueda el registro, que es lo que impide escribirle dos veces al mismo con la misma nota.","operationId":"marcar_envio_admin_prensa_envio_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvioIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/prensa/contacto":{"post":{"summary":"Guardar Contacto","operationId":"guardar_contacto_admin_prensa_contacto_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactoIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/prensa/nota":{"post":{"summary":"Guardar Nota","operationId":"guardar_nota_admin_prensa_nota_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotaIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/prensa/datos":{"get":{"summary":"Datos","operationId":"datos_admin_prensa_datos_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/prensa/nota/{nid}":{"get":{"summary":"Ver Nota","operationId":"ver_nota_admin_prensa_nota__nid__get","parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"integer","title":"Nid"}},{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/prensa":{"get":{"summary":"Pagina","operationId":"pagina_admin_prensa_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/oauth-protected-resource/mcp":{"get":{"summary":"Bien Conocido Recurso","operationId":"bien_conocido_recurso__well_known_oauth_protected_resource_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-protected-resource":{"get":{"summary":"Bien Conocido Recurso","operationId":"bien_conocido_recurso__well_known_oauth_protected_resource_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/openid-configuration":{"get":{"summary":"Bien Conocido Servidor","operationId":"bien_conocido_servidor__well_known_openid_configuration_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-authorization-server/mcp":{"get":{"summary":"Bien Conocido Servidor","operationId":"bien_conocido_servidor__well_known_oauth_authorization_server_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"summary":"Bien Conocido Servidor","operationId":"bien_conocido_servidor__well_known_oauth_authorization_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/{resto}":{"options":{"summary":"Opciones","operationId":"opciones_oauth__resto__options","parameters":[{"name":"resto","in":"path","required":true,"schema":{"type":"string","title":"Resto"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/{resto}":{"options":{"summary":"Opciones","operationId":"opciones__well_known__resto__options","parameters":[{"name":"resto","in":"path","required":true,"schema":{"type":"string","title":"Resto"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/registro":{"post":{"summary":"Registro","operationId":"registro_oauth_registro_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/autorizar":{"get":{"summary":"Autorizar","operationId":"autorizar_oauth_autorizar_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Autorizar Post","operationId":"autorizar_post_oauth_autorizar_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/token":{"post":{"summary":"Token","operationId":"token_oauth_token_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/revocar":{"post":{"summary":"Revocar","description":"RFC 7009: la IA avisa que se desconectó. Siempre 200, exista o no la llave.","operationId":"revocar_oauth_revocar_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/criterios":{"get":{"summary":"Admin Lista","operationId":"admin_lista_admin_criterios_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/criterios/fuentes":{"get":{"summary":"Admin Fuentes","description":"Lo recolectado. Con `texto=1` viene la transcripción entera (lo usa la revisión mensual).","operationId":"admin_fuentes_admin_criterios_fuentes_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"escuela","in":"query","required":false,"schema":{"type":"string","default":"","title":"Escuela"}},{"name":"solo_nuevas","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Solo Nuevas"}},{"name":"texto","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Texto"}},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","default":60,"title":"Limite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Admin Fuentes Subir","description":"El recolector del Mac empuja acá lo que encontró (YouTube no se deja leer desde Fly).","operationId":"admin_fuentes_subir_admin_criterios_fuentes_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/criterios/fuentes/usadas":{"post":{"summary":"Admin Fuentes Usadas","description":"La revisión marca lo que ya leyó, haya o no propuesta: así el mes siguiente parte de lo nuevo.","operationId":"admin_fuentes_usadas_admin_criterios_fuentes_usadas_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/criterios/monitorear":{"post":{"summary":"Admin Monitorear","description":"Corre la recolección del servidor ahora (noticias y webs; YouTube va desde el Mac).","operationId":"admin_monitorear_admin_criterios_monitorear_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"escuela","in":"query","required":false,"schema":{"type":"string","default":"","title":"Escuela"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/criterios/propuestas":{"get":{"summary":"Admin Propuestas","operationId":"admin_propuestas_admin_criterios_propuestas_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"estado","in":"query","required":false,"schema":{"type":"string","default":"pendiente","title":"Estado"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/criterios/propuestas/{pid}/aprobar":{"post":{"summary":"Admin Aprobar","description":"Aprobar = guardar la propuesta como versión nueva. El panel puede mandar la ficha retocada.","operationId":"admin_aprobar_admin_criterios_propuestas__pid__aprobar_post","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"integer","title":"Pid"}},{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/criterios/propuestas/{pid}/rechazar":{"post":{"summary":"Admin Rechazar","operationId":"admin_rechazar_admin_criterios_propuestas__pid__rechazar_post","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"integer","title":"Pid"}},{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/criterios/{eid}":{"get":{"summary":"Admin Ficha","operationId":"admin_ficha_admin_criterios__eid__get","parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","title":"Eid"}},{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Admin Guardar","operationId":"admin_guardar_admin_criterios__eid__post","parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","title":"Eid"}},{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/criterios/{eid}/propuesta":{"post":{"summary":"Admin Proponer","description":"La deja la revisión mensual: la ficha completa como quedaría, qué cambia y por qué, y las fuentes\n(url + fecha) que lo respaldan. Queda pendiente hasta que una persona la apruebe o la rechace.","operationId":"admin_proponer_admin_criterios__eid__propuesta_post","parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","title":"Eid"}},{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/criterios":{"get":{"summary":"Pagina","operationId":"pagina_criterios_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/criterios/escuelas":{"get":{"summary":"Escuelas","operationId":"escuelas_criterios_escuelas_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/criterios/dalio/todo-tiempo":{"get":{"summary":"Historia Todo Tiempo","description":"Abierta (decisión del dueño, 14-oct-2026): son precios públicos de fondos y es lo que trae visitas.\nSin descarga: la serie viaja para dibujar el gráfico, no hay CSV.","operationId":"historia_todo_tiempo_criterios_dalio_todo_tiempo_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/criterios/dalio/fuerzas":{"get":{"summary":"Fuerzas","operationId":"fuerzas_criterios_dalio_fuerzas_get","parameters":[{"name":"pais","in":"query","required":false,"schema":{"type":"string","default":"USA","title":"Pais"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/criterios/usar":{"post":{"summary":"Usar","description":"Guarda la escuela como estilo del usuario (lo mismo que el chip en /conectar-ia).","operationId":"usar_criterios_usar_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/criterios/{slug}":{"get":{"summary":"Pagina Escuela","operationId":"pagina_escuela_criterios__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/importar/aduana":{"post":{"summary":"Recibir","description":"El paquete que arma `importar_aduana.py` en el Mac (gzip). Reemplaza todo de una vez.","operationId":"recibir_importar_aduana_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/importar":{"get":{"summary":"Pagina","description":"La cifra de países se escribe en el HTML desde el servidor (la ve Google y quien no tiene JavaScript).","operationId":"pagina_importar_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/importar/buscar":{"get":{"summary":"Ruta Buscar","operationId":"ruta_buscar_importar_buscar_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/importar/producto":{"get":{"summary":"Ruta Producto","operationId":"ruta_producto_importar_producto_get","parameters":[{"name":"p","in":"query","required":false,"schema":{"type":"string","default":"","title":"P"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/examen":{"get":{"summary":"Ruta Examen","operationId":"ruta_examen_admin_examen_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"correr_ahora","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Correr Ahora"}},{"name":"correr","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Correr"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/conector/uso":{"get":{"summary":"Uso","operationId":"uso_admin_conector_uso_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"dias","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Dias"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp/{secreto}":{"options":{"summary":"Mcp Opciones","operationId":"mcp_opciones_mcp__secreto__options","parameters":[{"name":"secreto","in":"path","required":true,"schema":{"type":"string","title":"Secreto"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Mcp Secreto","operationId":"mcp_secreto_mcp__secreto__post","parameters":[{"name":"secreto","in":"path","required":true,"schema":{"type":"string","title":"Secreto"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Mcp Get","operationId":"mcp_get_mcp__secreto__get","parameters":[{"name":"secreto","in":"path","required":true,"schema":{"type":"string","title":"Secreto"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp":{"options":{"summary":"Mcp Opciones","operationId":"mcp_opciones_mcp_options","parameters":[{"name":"secreto","in":"query","required":false,"schema":{"type":"string","default":"","title":"Secreto"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Mcp","operationId":"mcp_mcp_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"get":{"summary":"Mcp Get","operationId":"mcp_get_mcp_get","parameters":[{"name":"secreto","in":"query","required":false,"schema":{"type":"string","default":"","title":"Secreto"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/gpt/openapi.json":{"get":{"summary":"Gpt Openapi","operationId":"gpt_openapi_gpt_openapi_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/gpt/{nombre}":{"post":{"summary":"Gpt Llamar","operationId":"gpt_llamar_gpt__nombre__post","parameters":[{"name":"nombre","in":"path","required":true,"schema":{"type":"string","title":"Nombre"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conectar-ia/gpt":{"post":{"summary":"Gpt Credenciales","description":"Solo el dueño: crea (o rota, con {\"rotar\": true}) el cliente OAuth del GPT y devuelve lo que se pega\nen el editor de GPT. El secreto se muestra UNA vez.","operationId":"gpt_credenciales_conectar_ia_gpt_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/conectar-ia/revisor":{"post":{"summary":"Revisor Enlace","description":"Solo el dueño: {\"dias\": 30} crea (o renueva) el enlace del revisor; {\"revocar\": true} lo corta.","operationId":"revisor_enlace_conectar_ia_revisor_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/entrar/revisor":{"get":{"summary":"Revisor Formulario","description":"Usuario y contraseña de la cuenta de prueba de los revisores (11-oct-2026). Sin códigos ni enlaces.","operationId":"revisor_formulario_entrar_revisor_get","parameters":[{"name":"volver","in":"query","required":false,"schema":{"type":"string","default":"","title":"Volver"}},{"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"}}}}}},"post":{"summary":"Revisor Entrar Clave","operationId":"revisor_entrar_clave_entrar_revisor_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/entrar/revisor/{token}":{"get":{"summary":"Revisor Entrar","description":"Abre la sesión del revisor y le explica qué hacer. No depende de que el conector esté abierto.","operationId":"revisor_entrar_entrar_revisor__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/openai-apps-challenge":{"get":{"summary":"Openai Desafio","operationId":"openai_desafio__well_known_openai_apps_challenge_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/conectar-ia/openai-challenge":{"post":{"summary":"Openai Desafio Guardar","operationId":"openai_desafio_guardar_conectar_ia_openai_challenge_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tu-ia":{"get":{"summary":"Producto","description":"La página de producto (7-oct-2026). Abierta al público con CONECTOR_ABIERTO; en prueba, solo el dueño.","operationId":"producto_tu_ia_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/terminos-ia":{"get":{"summary":"Terminos","description":"Términos de uso del conector (7-oct-2026). Públicos siempre que el conector exista: se enlazan desde\nla pantalla de \"Permitir\" y los piden los directorios de conectores. Con el pie del sitio (`_pagina`).","operationId":"terminos_terminos_ia_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tu-ia/documentacion":{"get":{"summary":"Documentacion","description":"Documentación pública (11-oct-2026): la URL de documentación de las fichas en los directorios de\nAnthropic y OpenAI. Pública aunque el conector esté cerrado, porque el revisor la abre antes del\nlanzamiento. Va ANTES de cualquier comodín de /tu-ia.","operationId":"documentacion_tu_ia_documentacion_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tu-ia/demo.gif":{"get":{"summary":"Demo Gif","description":"El GIF «Grok sin y con Xponda» de /tu-ia (12-oct-2026). Ruta propia: no hay StaticFiles montado.\nFuente y video con voz en docs/videos/.","operationId":"demo_gif_tu_ia_demo_gif_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tu-ia/tutorial/{ia}.{ext}":{"get":{"summary":"Tutorial","description":"Videos «cómo conectar Xponda» de /tu-ia (15-oct-2026), uno por IA, con su portada. El MP4 responde\npor tramos (Range): Safari no reproduce un video que no los admita, y la Starlette de producción no lo\nhace sola. Fuente: docs/videos/tutorial.py.","operationId":"tutorial_tu_ia_tutorial__ia___ext__get","parameters":[{"name":"ia","in":"path","required":true,"schema":{"type":"string","title":"Ia"}},{"name":"ext","in":"path","required":true,"schema":{"type":"string","title":"Ext"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conectar-ia/huecos":{"get":{"summary":"Huecos","description":"Lo que las IA le preguntaron a Xponda y no encontró (solo el dueño). Sirve para decidir qué datos sumar.","operationId":"huecos_conectar_ia_huecos_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tu-ia/hay":{"get":{"summary":"Hay Producto","description":"Para el botón de la portada: 204 si quien mira puede ver /tu-ia (abierto, o el dueño), si no 404.","operationId":"hay_producto_tu_ia_hay_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/conectar-ia":{"get":{"summary":"Pagina","operationId":"pagina_conectar_ia_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conectar-ia/estado":{"get":{"summary":"Estado","operationId":"estado_conectar_ia_estado_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/conectar-ia/criterios":{"post":{"summary":"Guardar Criterios","operationId":"guardar_criterios_conectar_ia_criterios_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/conectar-ia/llave":{"post":{"summary":"Nueva Llave","operationId":"nueva_llave_conectar_ia_llave_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/conectar-ia/revocar":{"post":{"summary":"Revocar","operationId":"revocar_conectar_ia_revocar_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/conectar-ia/ficha":{"post":{"summary":"Ficha Para Pegar","description":"Para las IA sin conectores: el análisis de UNA empresa en texto, listo para pegar.","operationId":"ficha_para_pegar_conectar_ia_ficha_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/manifest.webmanifest":{"get":{"summary":"Manifiesto","operationId":"manifiesto_manifest_webmanifest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/sw.js":{"get":{"summary":"Service Worker","description":"Sin caché larga: el navegador revisa el service worker en cada visita y así un arreglo\nllega al tiro. `Service-Worker-Allowed: /` le deja controlar todo el sitio.","operationId":"service_worker_sw_js_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/app.js":{"get":{"summary":"App Js","operationId":"app_js_app_js_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/icono-192.png":{"get":{"summary":"Servir","operationId":"servir_icono_192_png_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/icono-512.png":{"get":{"summary":"Servir","operationId":"servir_icono_512_png_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/icono-maskable-512.png":{"get":{"summary":"Servir","operationId":"servir_icono_maskable_512_png_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AnalisisIn":{"properties":{"titulo":{"type":"string","title":"Titulo"},"cuerpo":{"type":"string","title":"Cuerpo"},"bajada":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bajada"},"autor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Autor"},"producto":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Producto"},"acceso":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acceso","default":"suscriptores"},"brief":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brief"},"mercado":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mercado"}},"type":"object","required":["titulo","cuerpo"],"title":"AnalisisIn"},"AnalisisPegadoIn":{"properties":{"texto":{"type":"string","title":"Texto"},"acceso":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acceso","default":"suscriptores"},"autor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Autor"}},"type":"object","required":["texto"],"title":"AnalisisPegadoIn"},"AvisoIn":{"properties":{"id":{"type":"integer","title":"Id"},"activo":{"type":"boolean","title":"Activo","default":true}},"type":"object","required":["id"],"title":"AvisoIn"},"ConsultaIn":{"properties":{"producto":{"type":"string","title":"Producto"},"pregunta":{"type":"string","title":"Pregunta"}},"type":"object","required":["producto","pregunta"],"title":"ConsultaIn"},"ContactoB2B":{"properties":{"nombre":{"type":"string","title":"Nombre","default":""},"empresa":{"type":"string","title":"Empresa","default":""},"email":{"type":"string","title":"Email","default":""},"telefono":{"type":"string","title":"Telefono","default":""},"interes":{"type":"string","title":"Interes","default":""},"mensaje":{"type":"string","title":"Mensaje","default":""}},"type":"object","title":"ContactoB2B"},"ContactoIn":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"},"nombre":{"type":"string","title":"Nombre"},"medio":{"type":"string","title":"Medio","default":""},"area":{"type":"string","title":"Area","default":""},"correo":{"type":"string","title":"Correo","default":""},"perfil":{"type":"string","title":"Perfil","default":""},"como":{"type":"string","title":"Como","default":""},"prioridad":{"type":"integer","title":"Prioridad","default":2},"notas":{"type":"string","title":"Notas","default":""}},"type":"object","required":["nombre"],"title":"ContactoIn"},"EmailIn":{"properties":{"email":{"type":"string","title":"Email","default":""},"volver":{"type":"string","title":"Volver","default":"/"}},"type":"object","title":"EmailIn"},"EnvioIn":{"properties":{"nota_id":{"type":"integer","title":"Nota Id"},"contacto_id":{"type":"integer","title":"Contacto Id"},"estado":{"type":"string","title":"Estado"},"nota":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nota"}},"type":"object","required":["nota_id","contacto_id","estado"],"title":"EnvioIn"},"FichaIn":{"properties":{"negocios":{"items":{"type":"object"},"type":"array","title":"Negocios","default":[]},"negocio":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Negocio"},"propiedades":{"items":{"type":"object"},"type":"array","title":"Propiedades","default":[]},"caja":{"items":{"type":"object"},"type":"array","title":"Caja","default":[]},"acciones":{"items":{"type":"object"},"type":"array","title":"Acciones","default":[]},"moneda":{"type":"string","title":"Moneda","default":"CLP"},"guardar":{"type":"boolean","title":"Guardar","default":false}},"type":"object","title":"FichaIn"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HojaCambio":{"properties":{"canasto":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canasto"},"datos":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Datos"},"orden":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Orden"}},"type":"object","title":"HojaCambio"},"HojaNueva":{"properties":{"ticker":{"type":"string","title":"Ticker"},"mercado":{"type":"string","title":"Mercado","default":""}},"type":"object","required":["ticker"],"title":"HojaNueva"},"IndAgregarIn":{"properties":{"tipo":{"type":"string","title":"Tipo"},"url":{"type":"string","title":"Url"}},"type":"object","required":["tipo","url"],"title":"IndAgregarIn"},"IndAlertaIn":{"properties":{"id":{"type":"integer","title":"Id"},"modo":{"type":"string","title":"Modo"},"umbral":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Umbral"},"objetivo":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Objetivo"}},"type":"object","required":["id","modo"],"title":"IndAlertaIn"},"IndIdIn":{"properties":{"id":{"type":"integer","title":"Id"},"umbral":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Umbral"}},"type":"object","required":["id"],"title":"IndIdIn"},"IndPrefsIn":{"properties":{"alertas":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Alertas"},"correo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Correo"}},"type":"object","title":"IndPrefsIn"},"LogoIn":{"properties":{"variante":{"type":"string","title":"Variante","default":"normal"},"data":{"type":"string","title":"Data"}},"type":"object","required":["data"],"title":"LogoIn"},"LoteTrad":{"properties":{"textos":{"items":{"type":"string"},"type":"array","title":"Textos","default":[]},"de":{"type":"string","title":"De","default":"es"},"a":{"type":"string","title":"A","default":"en"}},"type":"object","title":"LoteTrad"},"MensajeIn":{"properties":{"telefono":{"type":"string","title":"Telefono"},"texto":{"type":"string","title":"Texto"},"nombre":{"type":"string","title":"Nombre","default":""},"phone_id":{"type":"string","title":"Phone Id","default":""}},"type":"object","required":["telefono","texto"],"title":"MensajeIn"},"NotaIn":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"},"slug":{"type":"string","title":"Slug"},"titulo":{"type":"string","title":"Titulo"},"gancho":{"type":"string","title":"Gancho","default":""},"cuerpo":{"type":"string","title":"Cuerpo","default":""},"estado":{"type":"string","title":"Estado","default":"borrador"}},"type":"object","required":["slug","titulo"],"title":"NotaIn"},"PPErrorIn":{"properties":{"mensaje":{"type":"string","title":"Mensaje","default":""}},"type":"object","title":"PPErrorIn"},"PayPalIn":{"properties":{"subscription_id":{"type":"string","title":"Subscription Id","default":""},"email":{"type":"string","title":"Email","default":""}},"type":"object","title":"PayPalIn"},"RelayIn":{"properties":{"codigo":{"type":"string","title":"Codigo"},"telefono":{"type":"string","title":"Telefono"}},"type":"object","required":["codigo","telefono"],"title":"RelayIn"},"ResumenIn":{"properties":{"fecha":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fecha"},"titulo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Titulo"},"cuerpo":{"type":"string","title":"Cuerpo"}},"type":"object","required":["cuerpo"],"title":"ResumenIn"},"RevisionAnalisisIn":{"properties":{"accion":{"type":"string","title":"Accion"},"titulo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Titulo"},"bajada":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bajada"},"cuerpo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cuerpo"},"acceso":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acceso"},"motivo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Motivo"},"brief":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brief"},"mercado":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mercado"}},"type":"object","required":["accion"],"title":"RevisionAnalisisIn"},"RevisionIn":{"properties":{"accion":{"type":"string","title":"Accion"},"titulo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Titulo"},"bajada":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bajada"},"cuerpo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cuerpo"},"motivo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Motivo"},"por":{"type":"string","title":"Por","default":"el equipo Xponda"}},"type":"object","required":["accion"],"title":"RevisionIn"},"SubIn":{"properties":{"email":{"type":"string","title":"Email","default":""},"empresa":{"type":"string","title":"Empresa","default":""},"producto":{"type":"string","title":"Producto","default":"todos"},"periodo":{"type":"string","title":"Periodo","default":"mensual"}},"type":"object","title":"SubIn"},"SuscribirIn":{"properties":{"correo":{"type":"string","title":"Correo"},"acepta":{"type":"boolean","title":"Acepta","default":false},"imp":{"type":"integer","title":"Imp","default":3},"pais":{"type":"string","title":"Pais","default":""},"origen":{"type":"string","title":"Origen","default":"calendario"}},"type":"object","required":["correo"],"title":"SuscribirIn"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}