{
  "openapi": "3.1.0",
  "jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
  "info": {
    "title": "Indicadores API",
    "version": "2026.08",
    "description": "API pública de Indicadores para consultar datos económicos y financieros de Argentina. Las operaciones de lectura no requieren autenticación. Conservá generatedAt, date, time y sourceDate al citar una respuesta.",
    "contact": {
      "name": "Indicadores",
      "url": "https://indicadores.com.ar/contact",
      "email": "contacto@indicadores.com.ar"
    },
    "license": {
      "name": "Datos informativos; sin asesoramiento financiero",
      "url": "https://indicadores.com.ar/privacy"
    }
  },
  "servers": [
    {
      "url": "https://indicadores.com.ar",
      "description": "Producción"
    }
  ],
  "externalDocs": {
    "description": "Portal para desarrolladores",
    "url": "https://indicadores.com.ar/developers"
  },
  "tags": [
    { "name": "Indicadores", "description": "Cotizaciones y principales indicadores económicos." },
    { "name": "Rendimientos", "description": "Tasas, billeteras, depósitos y fondos." },
    { "name": "Mercados", "description": "CEDEARs, bonos, mercados globales y calendario de resultados." },
    { "name": "Oficial", "description": "Series y aperturas publicadas por BCRA e INDEC." },
    { "name": "Fondos", "description": "Catálogo y recomendaciones de fondos comunes de inversión." },
    { "name": "Utilidades", "description": "Salud del servicio, históricos e imágenes de emisores." }
  ],
  "paths": {
    "/api/indicator-cards": {
      "get": {
        "operationId": "getIndicatorCards",
        "tags": ["Indicadores"],
        "summary": "Obtiene las tarjetas cambiarias",
        "description": "Devuelve dólar oficial, blue, MEP, CCL, tarjeta y cripto con valores de compra, venta, valor medio y fecha de actualización.",
        "responses": {
          "200": { "$ref": "#/components/responses/IndicatorCards" },
          "500": { "$ref": "#/components/responses/InternalError" }
        }
      }
    },
    "/api/indicators": {
      "get": {
        "operationId": "getIndicatorsSnapshot",
        "tags": ["Indicadores"],
        "summary": "Obtiene el snapshot económico principal",
        "description": "Devuelve cotizaciones, inflación mensual y mayorista, riesgo país, reservas del BCRA, base monetaria y MERVAL. Los errores parciales se informan en errors.",
        "responses": {
          "200": { "$ref": "#/components/responses/IndicatorsSnapshot" },
          "500": { "$ref": "#/components/responses/InternalError" }
        }
      }
    },
    "/api/rendimientos": {
      "get": {
        "operationId": "getRendimientos",
        "tags": ["Rendimientos"],
        "summary": "Compara rendimientos en pesos",
        "description": "Devuelve billeteras, cuentas remuneradas, fondos comunes, plazos fijos, LECAPs y BONCAPs con tipo de tasa, límite, fecha y fuente cuando están disponibles.",
        "responses": {
          "200": { "$ref": "#/components/responses/Rendimientos" },
          "500": { "$ref": "#/components/responses/InternalError" }
        }
      }
    },
    "/api/cedears": {
      "get": {
        "operationId": "getCedears",
        "tags": ["Mercados"],
        "summary": "Lista CEDEARs",
        "description": "Devuelve CEDEARs con ticker, empresa, mercado, precio en pesos, variación, ratio, referencia USD, CCL implícito, spread y volumen cuando la fuente los publica.",
        "responses": {
          "200": { "$ref": "#/components/responses/Cedears" },
          "500": { "$ref": "#/components/responses/InternalError" }
        }
      }
    },
    "/api/earnings": {
      "get": {
        "operationId": "getEarningsCalendar",
        "tags": ["Mercados"],
        "summary": "Obtiene el calendario de resultados",
        "description": "Devuelve las próximas fechas de resultados de empresas vinculadas a CEDEARs, con fecha, período, ticker y nombre cuando están disponibles.",
        "responses": {
          "200": { "$ref": "#/components/responses/Earnings" },
          "500": { "$ref": "#/components/responses/InternalError" }
        }
      }
    },
    "/api/global-stats": {
      "get": {
        "operationId": "getGlobalStats",
        "tags": ["Mercados"],
        "summary": "Obtiene estadísticas globales",
        "description": "Devuelve índices, commodities, tasas, monedas y criptoactivos globales con valor, variación y hora de mercado cuando están disponibles.",
        "responses": {
          "200": { "$ref": "#/components/responses/GlobalStats" },
          "500": { "$ref": "#/components/responses/InternalError" }
        }
      }
    },
    "/api/market-boards": {
      "get": {
        "operationId": "getMarketBoards",
        "tags": ["Mercados"],
        "summary": "Obtiene paneles de bonos",
        "description": "Devuelve tablas de LECAPs, BONCAPs, bonos CER, soberanos USD y obligaciones negociables corporativas.",
        "responses": {
          "200": { "$ref": "#/components/responses/MarketBoards" },
          "500": { "$ref": "#/components/responses/InternalError" }
        }
      }
    },
    "/api/bcra-panel": {
      "get": {
        "operationId": "getBcraPanel",
        "tags": ["Oficial"],
        "summary": "Obtiene indicadores seleccionados del BCRA",
        "description": "Devuelve reservas, tasas, depósitos, préstamos, base monetaria, inflación e índices publicados por el Banco Central, con unidad, categoría y fecha.",
        "responses": {
          "200": { "$ref": "#/components/responses/BcraPanel" },
          "500": { "$ref": "#/components/responses/InternalError" }
        }
      }
    },
    "/api/indec-breakdowns": {
      "get": {
        "operationId": "getIndecBreakdowns",
        "tags": ["Oficial"],
        "summary": "Obtiene aperturas del INDEC",
        "description": "Devuelve inflación por división y crecimiento sectorial de la actividad económica con sus períodos de referencia.",
        "responses": {
          "200": { "$ref": "#/components/responses/IndecBreakdowns" },
          "500": { "$ref": "#/components/responses/InternalError" }
        }
      }
    },
    "/api/dolar-comparison": {
      "get": {
        "operationId": "getDollarComparison",
        "tags": ["Indicadores"],
        "summary": "Compara cotizaciones de dólares",
        "description": "Devuelve una comparación de cotizaciones ARS/USD, USDT, USDC y MEP con las fuentes disponibles.",
        "responses": {
          "200": { "$ref": "#/components/responses/GenericJson" },
          "500": { "$ref": "#/components/responses/InternalError" }
        }
      }
    },
    "/api/pix-comparison": {
      "get": {
        "operationId": "getPixComparison",
        "tags": ["Indicadores"],
        "summary": "Obtiene referencias ARS/BRL para Pix",
        "description": "Devuelve referencias de conversión entre pesos argentinos y reales para comparar pagos con Pix.",
        "responses": {
          "200": { "$ref": "#/components/responses/GenericJson" },
          "500": { "$ref": "#/components/responses/InternalError" }
        }
      }
    },
    "/api/remesas": {
      "get": {
        "operationId": "getRemesas",
        "tags": ["Indicadores"],
        "summary": "Lista opciones de remesas",
        "description": "Devuelve proveedores, comisiones, notas y enlaces para comparar servicios de cobro o transferencia internacional.",
        "responses": {
          "200": { "$ref": "#/components/responses/GenericJson" },
          "500": { "$ref": "#/components/responses/InternalError" }
        }
      }
    },
    "/api/news": {
      "get": {
        "operationId": "getMarketNews",
        "tags": ["Mercados"],
        "summary": "Obtiene noticias económicas",
        "description": "Devuelve un resumen de noticias económicas recientes cuando la fuente RSS está disponible; cada noticia incluye título, enlace y fecha si fueron publicados.",
        "responses": {
          "200": { "$ref": "#/components/responses/GenericJson" },
          "500": { "$ref": "#/components/responses/InternalError" }
        }
      }
    },
    "/api/morosidad": {
      "get": {
        "operationId": "getMorosidad",
        "tags": ["Oficial"],
        "summary": "Obtiene indicadores de morosidad",
        "description": "Devuelve señales de morosidad publicadas por entidades consultables en la Central de Deudores del BCRA.",
        "responses": {
          "200": { "$ref": "#/components/responses/GenericJson" },
          "500": { "$ref": "#/components/responses/InternalError" }
        }
      }
    },
    "/api/fci/funds": {
      "get": {
        "operationId": "listFciFunds",
        "tags": ["Fondos"],
        "summary": "Lista fondos comunes de inversión",
        "description": "Devuelve el catálogo de fondos filtrado por categoría, además de los fondos con mejor rendimiento anual dentro del límite solicitado.",
        "parameters": [
          { "$ref": "#/components/parameters/FciCategory" },
          { "$ref": "#/components/parameters/FciTop" }
        ],
        "responses": {
          "200": { "$ref": "#/components/responses/FciFunds" },
          "500": { "$ref": "#/components/responses/InternalError" }
        }
      }
    },
    "/api/fci/recommendations": {
      "get": {
        "operationId": "recommendFciFunds",
        "tags": ["Fondos"],
        "summary": "Recomienda fondos para un horizonte",
        "description": "Ordena fondos comunes según el monto y la cantidad de días solicitados. La respuesta conserva la categoría, el período y los supuestos usados.",
        "parameters": [
          { "$ref": "#/components/parameters/Amount" },
          { "$ref": "#/components/parameters/Days" },
          { "$ref": "#/components/parameters/FciCategory" },
          { "$ref": "#/components/parameters/FciRecommendationsTop" }
        ],
        "responses": {
          "200": { "$ref": "#/components/responses/FciRecommendations" },
          "400": { "$ref": "#/components/responses/ApiError" },
          "500": { "$ref": "#/components/responses/InternalError" }
        }
      }
    },
    "/api/fci/fund-detail": {
      "get": {
        "operationId": "getFciFundDetail",
        "tags": ["Fondos"],
        "summary": "Obtiene el detalle de un fondo",
        "description": "Busca la ficha de un fondo por classId o cafciCode y usa fundId o cnvCode como referencias alternativas cuando la fuente lo requiere.",
        "parameters": [
          { "$ref": "#/components/parameters/ClassId" },
          { "$ref": "#/components/parameters/FundId" },
          { "$ref": "#/components/parameters/CnvCode" }
        ],
        "responses": {
          "200": { "$ref": "#/components/responses/GenericJson" },
          "400": { "$ref": "#/components/responses/ApiError" },
          "500": { "$ref": "#/components/responses/InternalError" }
        }
      }
    },
    "/api/cuit-score": {
      "get": {
        "operationId": "getCuitScore",
        "tags": ["Oficial"],
        "summary": "Consulta una señal de reputación CUIT",
        "description": "Consulta señales públicas de la Central de Deudores del BCRA para un CUIT/CUIL. No devuelve credenciales ni información privada.",
        "parameters": [
          {
            "name": "cuit",
            "in": "query",
            "required": true,
            "description": "CUIT o CUIL de 11 dígitos, con o sin guiones.",
            "schema": { "type": "string", "pattern": "^[0-9]{11}$" },
            "example": "20123456789"
          }
        ],
        "responses": {
          "200": { "$ref": "#/components/responses/GenericJson" },
          "400": { "$ref": "#/components/responses/ApiError" },
          "502": { "$ref": "#/components/responses/ApiError" }
        }
      }
    },
    "/api/history": {
      "get": {
        "operationId": "getIndicatorHistory",
        "tags": ["Utilidades"],
        "summary": "Obtiene puntos históricos",
        "description": "Devuelve puntos históricos para una serie documentada. Cada punto contiene un timestamp Unix en milisegundos y un valor numérico.",
        "parameters": [
          {
            "name": "series",
            "in": "query",
            "required": true,
            "description": "Serie a consultar.",
            "schema": {
              "type": "string",
              "enum": ["usdArsOfficial", "dolarBlue", "dolarCrypto", "dolarTarjeta", "dolarMep", "dolarContadoConLiqui", "riesgoPais", "inflationMonthly", "bcraReservesUsdMillions", "baseMonetaria"]
            }
          },
          {
            "name": "range",
            "in": "query",
            "required": false,
            "description": "Ventana temporal de la serie.",
            "schema": { "type": "string", "enum": ["24h", "7d", "1m", "1y", "5y"], "default": "24h" }
          }
        ],
        "responses": {
          "200": { "$ref": "#/components/responses/History" },
          "400": { "$ref": "#/components/responses/ApiError" },
          "500": { "$ref": "#/components/responses/InternalError" }
        }
      }
    },
    "/api/cedear-logo": {
      "get": {
        "operationId": "getCedearLogo",
        "tags": ["Utilidades"],
        "summary": "Obtiene el logo de un CEDEAR",
        "description": "Resuelve una imagen SVG o un fallback para el emisor de un CEDEAR a partir de su ticker y mercado.",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": true,
            "description": "Ticker original o ticker del CEDEAR.",
            "schema": { "type": "string", "minLength": 1 }
          },
          {
            "name": "market",
            "in": "query",
            "required": false,
            "description": "Mercado de referencia, por ejemplo NASDAQ, NYSE o B3.",
            "schema": { "type": "string" }
          }
        ],
        "responses": {
          "200": { "description": "Imagen del emisor.", "content": { "image/svg+xml": { "schema": { "type": "string" } } } },
          "400": { "$ref": "#/components/responses/ApiError" },
          "404": { "$ref": "#/components/responses/ApiError" }
        }
      }
    },
    "/health": {
      "get": {
        "operationId": "getServiceHealth",
        "tags": ["Utilidades"],
        "summary": "Comprueba la salud del servicio",
        "description": "Ejecuta comprobaciones livianas de disponibilidad de fuentes y devuelve status, servicios, tiempos y degradaciones detectadas.",
        "parameters": [
          {
            "name": "service",
            "in": "query",
            "required": false,
            "description": "Limita la comprobación a un servicio conocido.",
            "schema": { "type": "string", "enum": ["site", "rendimientos", "cedears", "bcra", "indec", "global_stats", "conversiones", "news"] }
          }
        ],
        "responses": {
          "200": { "$ref": "#/components/responses/Health" },
          "503": { "$ref": "#/components/responses/Health" },
          "500": { "$ref": "#/components/responses/InternalError" }
        }
      }
    }
  },
  "components": {
    "parameters": {
      "FciCategory": {
        "name": "category",
        "in": "query",
        "required": false,
        "description": "Categoría de FCI; omití el parámetro o usá Todos para incluir todas.",
        "schema": { "type": "string", "default": "Todos" }
      },
      "FciTop": {
        "name": "top",
        "in": "query",
        "required": false,
        "description": "Cantidad de tarjetas destacadas.",
        "schema": { "type": "integer", "minimum": 1, "maximum": 10, "default": 4 }
      },
      "FciRecommendationsTop": {
        "name": "top",
        "in": "query",
        "required": false,
        "description": "Cantidad máxima de recomendaciones.",
        "schema": { "type": "integer", "minimum": 1, "maximum": 20, "default": 7 }
      },
      "Amount": {
        "name": "amount",
        "in": "query",
        "required": true,
        "description": "Monto de inversión en pesos argentinos.",
        "schema": { "type": "number", "exclusiveMinimum": 0 },
        "example": 100000
      },
      "Days": {
        "name": "days",
        "in": "query",
        "required": true,
        "description": "Horizonte de inversión en días.",
        "schema": { "type": "integer", "minimum": 1, "maximum": 3650 },
        "example": 30
      },
      "ClassId": {
        "name": "classId",
        "in": "query",
        "required": true,
        "description": "Código de clase CAFCI.",
        "schema": { "type": "string", "minLength": 1 }
      },
      "FundId": {
        "name": "fundId",
        "in": "query",
        "required": false,
        "description": "Identificador alternativo de familia de fondo.",
        "schema": { "type": "string" }
      },
      "CnvCode": {
        "name": "cnvCode",
        "in": "query",
        "required": false,
        "description": "Código CNV alternativo.",
        "schema": { "type": "string" }
      }
    },
    "responses": {
      "ApiError": {
        "description": "Error de validación, ruta o proveedor con formato estructurado.",
        "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiErrorResponse" } } }
      },
      "InternalError": {
        "description": "Error interno con código, mensaje y sugerencia de recuperación.",
        "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiErrorResponse" } } }
      },
      "GenericJson": {
        "description": "Respuesta JSON pública.",
        "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GenericResponse" } } }
      },
      "IndicatorCards": {
        "description": "Snapshot de tarjetas cambiarias.",
        "content": { "application/json": { "schema": { "$ref": "#/components/schemas/IndicatorCardsResponse" } } }
      },
      "IndicatorsSnapshot": {
        "description": "Snapshot económico principal.",
        "content": { "application/json": { "schema": { "$ref": "#/components/schemas/IndicatorsSnapshotResponse" } } }
      },
      "Rendimientos": {
        "description": "Catálogo de rendimientos.",
        "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RendimientosResponse" } } }
      },
      "Cedears": {
        "description": "Catálogo de CEDEARs.",
        "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CedearsResponse" } } }
      },
      "Earnings": {
        "description": "Calendario de resultados.",
        "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EarningsResponse" } } }
      },
      "GlobalStats": {
        "description": "Estadísticas globales.",
        "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GlobalStatsResponse" } } }
      },
      "MarketBoards": {
        "description": "Paneles de bonos y obligaciones.",
        "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MarketBoardsResponse" } } }
      },
      "BcraPanel": {
        "description": "Indicadores BCRA.",
        "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BcraPanelResponse" } } }
      },
      "IndecBreakdowns": {
        "description": "Aperturas INDEC.",
        "content": { "application/json": { "schema": { "$ref": "#/components/schemas/IndecBreakdownsResponse" } } }
      },
      "FciFunds": {
        "description": "Catálogo de FCI.",
        "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FciFundsResponse" } } }
      },
      "FciRecommendations": {
        "description": "Recomendaciones de FCI.",
        "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FciRecommendationsResponse" } } }
      },
      "History": {
        "description": "Puntos históricos.",
        "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HistoryResponse" } } }
      },
      "Health": {
        "description": "Estado de los servicios.",
        "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HealthResponse" } } }
      }
    },
    "schemas": {
      "ApiError": {
        "type": "object",
        "required": ["code", "message", "hint"],
        "properties": {
          "code": { "type": "string", "description": "Código estable para lógica de recuperación." },
          "message": { "type": "string", "description": "Explicación humana breve." },
          "hint": { "type": "string", "description": "Siguiente acción recomendada para un agente o cliente." },
          "path": { "type": "string" },
          "method": { "type": "string" }
        },
        "additionalProperties": false
      },
      "ApiErrorResponse": {
        "type": "object",
        "required": ["error", "documentation"],
        "properties": {
          "error": { "$ref": "#/components/schemas/ApiError" },
          "documentation": { "type": "string", "format": "uri" }
        },
        "additionalProperties": false
      },
      "GenericResponse": {
        "type": "object",
        "description": "Objeto JSON con generatedAt y datos específicos de la operación.",
        "properties": { "generatedAt": { "type": "string", "format": "date-time" } },
        "additionalProperties": true
      },
      "IndicatorCardsResponse": {
        "allOf": [
          { "$ref": "#/components/schemas/GenericResponse" },
          { "type": "object", "required": ["data"], "properties": { "data": { "type": "object", "description": "Mapa de tarjetas por nombre de indicador.", "additionalProperties": true }, "errors": { "type": "array", "items": { "type": "string" } } } }
        ]
      },
      "IndicatorsSnapshotResponse": {
        "allOf": [
          { "$ref": "#/components/schemas/GenericResponse" },
          { "type": "object", "required": ["data"], "properties": { "data": { "type": "object", "description": "Snapshot de dólar, inflación, riesgo, BCRA y MERVAL.", "additionalProperties": true }, "errors": { "type": "array", "items": { "type": "string" } } } }
        ]
      },
      "RendimientosResponse": {
        "allOf": [
          { "$ref": "#/components/schemas/GenericResponse" },
          { "type": "object", "properties": { "source": { "type": "string" }, "sections": { "type": "array", "items": { "type": "object", "additionalProperties": true } }, "errors": { "type": "array", "items": { "type": "string" } } } }
        ]
      },
      "CedearsResponse": {
        "allOf": [
          { "$ref": "#/components/schemas/GenericResponse" },
          { "type": "object", "required": ["rows"], "properties": { "cclReference": { "type": ["number", "null"] }, "rows": { "type": "array", "items": { "$ref": "#/components/schemas/CedearRow" } }, "errors": { "type": "array", "items": { "type": "string" } } } }
        ]
      },
      "CedearRow": {
        "type": "object",
        "required": ["symbol", "name"],
        "properties": {
          "symbol": { "type": "string" }, "name": { "type": "string" }, "market": { "type": "string" },
          "value": { "type": ["number", "null"] }, "changePercent": { "type": ["number", "null"] },
          "ratio": { "type": ["number", "null"] }, "usdPrice": { "type": ["number", "null"] },
          "cclImplicit": { "type": ["number", "null"] }, "spreadPercent": { "type": ["number", "null"] },
          "arsVolume": { "type": ["number", "null"] }, "tickerOriginal": { "type": "string" },
          "tags": { "type": "array", "items": { "type": "string" } }
        },
        "additionalProperties": true
      },
      "EarningsResponse": {
        "allOf": [
          { "$ref": "#/components/schemas/GenericResponse" },
          { "type": "object", "properties": { "rows": { "type": "array", "items": { "type": "object", "properties": { "symbol": { "type": "string" }, "name": { "type": "string" }, "date": { "type": ["string", "null"] }, "period": { "type": ["string", "null"] } }, "additionalProperties": true } }, "errors": { "type": "array", "items": { "type": "string" } } } }
        ]
      },
      "GlobalStatsResponse": {
        "allOf": [
          { "$ref": "#/components/schemas/GenericResponse" },
          { "type": "object", "properties": { "stats": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string" }, "label": { "type": "string" }, "value": { "type": ["number", "null"] }, "changePercent": { "type": ["number", "null"] } }, "additionalProperties": true } } } }
        ]
      },
      "MarketBoardsResponse": { "allOf": [{ "$ref": "#/components/schemas/GenericResponse" }, { "type": "object", "additionalProperties": true }] },
      "BcraPanelResponse": { "allOf": [{ "$ref": "#/components/schemas/GenericResponse" }, { "type": "object", "properties": { "variables": { "type": "array", "items": { "type": "object", "additionalProperties": true } } }, "additionalProperties": true }] },
      "IndecBreakdownsResponse": { "allOf": [{ "$ref": "#/components/schemas/GenericResponse" }, { "type": "object", "properties": { "inflation": { "type": "object", "additionalProperties": true }, "growth": { "type": "object", "additionalProperties": true } }, "additionalProperties": true }] },
      "FciFundsResponse": { "allOf": [{ "$ref": "#/components/schemas/GenericResponse" }, { "type": "object", "properties": { "category": { "type": "string" }, "topYearly": { "type": "array", "items": { "type": "object", "additionalProperties": true } }, "funds": { "type": "array", "items": { "type": "object", "additionalProperties": true } } }, "additionalProperties": true }] },
      "FciRecommendationsResponse": { "allOf": [{ "$ref": "#/components/schemas/GenericResponse" }, { "type": "object", "properties": { "input": { "type": "object", "additionalProperties": true }, "recommendations": { "type": "array", "items": { "type": "object", "additionalProperties": true } } }, "additionalProperties": true }] },
      "HistoryResponse": { "allOf": [{ "$ref": "#/components/schemas/GenericResponse" }, { "type": "object", "required": ["series", "range", "points"], "properties": { "series": { "type": "string" }, "range": { "type": "string" }, "points": { "type": "array", "items": { "type": "object", "required": ["t", "v"], "properties": { "t": { "type": "integer", "description": "Unix timestamp en milisegundos." }, "v": { "type": "number" } }, "additionalProperties": false } } }, "additionalProperties": true }] },
      "HealthResponse": { "type": "object", "required": ["status", "ok", "generatedAt", "services"], "properties": { "status": { "type": "string", "enum": ["ok", "degraded", "down"] }, "ok": { "type": "boolean" }, "generatedAt": { "type": "string", "format": "date-time" }, "services": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "status": { "type": "string" }, "ok": { "type": "boolean" }, "durationMs": { "type": "number" } }, "additionalProperties": true } } }, "additionalProperties": true }
    }
  }
}
