{"openapi":"3.1.0","info":{"title":"Gestión Pública Perú — API Insights","description":"Public REST API over Peru's MEF budget history (2013-2026, 32M rows).\n\n**No auth required.** SELECT/WITH only. Caps: 10,000 rows per query, 30s timeout, 30 queries/min per IP.\n\nSource: [datosabiertos.mef.gob.pe](https://datosabiertos.mef.gob.pe). Updated daily ~10:45 AM Peru time.","version":"1.0"},"paths":{"/api/insights/schema":{"get":{"tags":["insights"],"summary":"Schema","description":"Devuelve columnas disponibles + cobertura años + ejemplo.","operationId":"schema_api_insights_schema_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/insights/query":{"post":{"tags":["insights"],"summary":"Query","description":"Ejecuta una query SELECT sobre `mef_historico`. Cap 10_000 filas.\n\nRate-limited: 30 queries / 60s por IP (token bucket in-memory). Si excede,\ndevuelve 429 con header Retry-After.","operationId":"query_api_insights_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/insights/slices/{nombre}":{"get":{"tags":["insights"],"summary":"Slice Json","description":"Proxy local de los JSON precomputados (mismos archivos que el CDN sirve\nbajo https://gestionpublicaperu.com.pe/data/insights/).","operationId":"slice_json_api_insights_slices__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"}}}}}}},"/api/insights/dump/manifest.json":{"get":{"tags":["insights"],"summary":"Dump Manifest","description":"Lista de parquets disponibles para bulk download.\n\nDevuelve por cada año: tamaño, mtime ISO, sha256 (si está disponible),\nflag es_parcial (año en curso = snapshot diario), URL absoluta.","operationId":"dump_manifest_api_insights_dump_manifest_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/insights/dump/{archivo}":{"get":{"tags":["insights"],"summary":"Dump Parquet","description":"Sirve el parquet completo de un año. Sin cap, sin transformación.\n\nWhitelist: solo `{YYYY}.parquet` para años 2000..2099. Cualquier otro\nnombre devuelve 400.","operationId":"dump_parquet_api_insights_dump__archivo__get","parameters":[{"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"}}}}}}},"/api/insights/_stats":{"get":{"tags":["insights"],"summary":"Stats","description":"Métricas in-memory del MCP server. Sin auth — solo metadata agregada de uso\n(calls/errors/avg_ms por tool). No expone SQL ni argumentos reales.","operationId":"stats_api_insights__stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/insights/_health":{"get":{"tags":["insights"],"summary":"Health","description":"Métricas extendidas: estado DuckDB + rate limit + MCP tools.\n\nPúblico, sin auth — pensado para monitoring externo y debugging operativo.","operationId":"health_api_insights__health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/insights/dimensions":{"get":{"tags":["insights"],"summary":"Dimensions","description":"Devuelve valores distintos de las 6 dimensiones clave para poblar dropdowns.\n\nSin parámetros. Cacheado in-memory con TTL 5 min — las dimensiones casi no\ncambian día a día. No requiere auth ni rate limit (lectura barata).","operationId":"dimensions_api_insights_dimensions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/insights/serie":{"get":{"tags":["insights"],"summary":"Serie","description":"Serie anual PIM/Devengado/Avance% con filtros simples — sin SQL.\n\nTodos los params son opcionales. Strings se sanitizan vs SQL injection\n(escape de comilla simple). Devuelve filas listas para mostrar.","operationId":"serie_api_insights_serie_get","parameters":[{"name":"sector","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sector"}},{"name":"pliego","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pliego"}},{"name":"departamento","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Departamento"}},{"name":"nivel","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nivel"}},{"name":"fuente","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fuente"}},{"name":"funcion","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Funcion"}},{"name":"incluir_anio_parcial","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Incluir Anio Parcial"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/insights/top-sectores":{"get":{"tags":["insights"],"summary":"Top Sectores","description":"Top sectores por PIM en un año dado. Default = último año cerrado.\n\nFiltra a sectores con código numérico de 2 dígitos — excluye agregados\nespeciales del MEF ('M', 'R', etc.). Limit 33 (universo completo).","operationId":"top_sectores_api_insights_top_sectores_get","parameters":[{"name":"anio","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Anio"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/insights/slices/":{"get":{"tags":["insights"],"summary":"Lista Slices","description":"Lista los JSON disponibles en /api/insights/slices/.","operationId":"lista_slices_api_insights_slices__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/insights/regenerar/stream":{"get":{"summary":"Stream Regenerar Insights Get","description":"SSE — admin-only. Disparado desde el botón 'Regenerar Insights' de la sección Presentaciones.","operationId":"stream_regenerar_insights_get_api_insights_regenerar_stream_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AlertasConfigInput":{"properties":{"perfil":{"type":"string","title":"Perfil","default":""},"telefonos":{"items":{"type":"string"},"type":"array","title":"Telefonos","default":[]},"correos":{"items":{"type":"string"},"type":"array","title":"Correos","default":[]},"enviar_email":{"type":"boolean","title":"Enviar Email","default":true},"enviar_whatsapp":{"type":"boolean","title":"Enviar Whatsapp","default":true}},"type":"object","title":"AlertasConfigInput"},"AutoRefreshInput":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":false},"interval_min":{"type":"integer","title":"Interval Min","default":10},"perfil":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Perfil"},"multi_perfil":{"type":"boolean","title":"Multi Perfil","default":false}},"type":"object","title":"AutoRefreshInput"},"Body_programacion_subir_api_maestros_programacion_subir_reprogramacion_post":{"properties":{"archivo":{"type":"string","contentMediaType":"application/octet-stream","title":"Archivo"}},"type":"object","required":["archivo"],"title":"Body_programacion_subir_api_maestros_programacion_subir_reprogramacion_post"},"Body_subir_api_maestros_oficinas_subir_post":{"properties":{"archivo":{"type":"string","contentMediaType":"application/octet-stream","title":"Archivo"}},"type":"object","required":["archivo"],"title":"Body_subir_api_maestros_oficinas_subir_post"},"CaptchaInput":{"properties":{"valor":{"type":"string","title":"Valor"}},"type":"object","required":["valor"],"title":"CaptchaInput"},"ChatMessage":{"properties":{"message":{"type":"string","title":"Message"},"history":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"History","default":[]}},"type":"object","required":["message"],"title":"ChatMessage"},"CrearPerfilBody":{"properties":{"perfil":{"type":"string","title":"Perfil"},"entidad":{"type":"string","title":"Entidad"},"label":{"type":"string","title":"Label"},"clave":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Clave"},"admin":{"type":"boolean","title":"Admin","default":false},"permisos":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Permisos"}},"type":"object","required":["perfil","entidad","label"],"title":"CrearPerfilBody"},"EditarPerfilBody":{"properties":{"entidad":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entidad"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"admin":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Admin"},"activo":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Activo"},"permisos":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Permisos"}},"type":"object","title":"EditarPerfilBody"},"EjecutarInput":{"properties":{"usuario":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Usuario"},"clave":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Clave"},"skip_presupuestal":{"type":"boolean","title":"Skip Presupuestal","default":false}},"type":"object","title":"EjecutarInput"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IntervalBody":{"properties":{"interval_min":{"type":"integer","title":"Interval Min"}},"type":"object","required":["interval_min"],"title":"IntervalBody"},"LoginRequest":{"properties":{"usuario":{"type":"string","title":"Usuario"},"clave":{"type":"string","title":"Clave"}},"type":"object","required":["usuario","clave"],"title":"LoginRequest"},"PdfRequest":{"properties":{"html":{"type":"string","title":"Html"},"orientacion":{"type":"string","title":"Orientacion","default":"landscape"},"titulo":{"type":"string","title":"Titulo","default":"reporte"}},"type":"object","required":["html"],"title":"PdfRequest"},"PivotRequest":{"properties":{"dataset":{"type":"string","title":"Dataset"},"perfil":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Perfil"},"rows":{"items":{"type":"string"},"type":"array","title":"Rows"},"cols":{"items":{"type":"string"},"type":"array","title":"Cols"},"values":{"items":{"$ref":"#/components/schemas/PivotValueSpec"},"type":"array","title":"Values"},"filters":{"additionalProperties":true,"type":"object","title":"Filters"},"top_n":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Top N"},"titulo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Titulo"},"modo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Modo"},"orientacion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Orientacion"}},"type":"object","required":["dataset"],"title":"PivotRequest"},"PivotValueSpec":{"properties":{"col":{"type":"string","title":"Col"},"agg":{"type":"string","title":"Agg","default":"sum"},"axis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Axis"}},"type":"object","required":["col"],"title":"PivotValueSpec"},"QueryReq":{"properties":{"sql":{"type":"string","title":"Sql"},"limit":{"type":"integer","title":"Limit","default":1000}},"type":"object","required":["sql"],"title":"QueryReq"},"ResetClaveBody":{"properties":{"clave":{"type":"string","title":"Clave"}},"type":"object","required":["clave"],"title":"ResetClaveBody"},"SsiRequest":{"properties":{"sectores":{"items":{"type":"string"},"type":"array","title":"Sectores","default":["12"]},"nivel":{"type":"string","title":"Nivel","default":"ambos"}},"type":"object","title":"SsiRequest"},"ToggleBody":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"ToggleBody"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}},"servers":[{"url":"https://app.gestionpublicaperu.com.pe","description":"Production"}],"tags":[{"name":"insights","description":"Public endpoints over the MEF budget history (`mef_historico` DuckDB view)."}]}