{
  "openapi": "3.1.0",
  "info": {
    "title": "¿Hay luz? Estado de cortes de luz (datos públicos)",
    "version": "1.0.0",
    "summary": "Último estado conocido de los cortes de luz en CABA, el conurbano y la Provincia de Buenos Aires (Argentina).",
    "description": "Archivo JSON público y de solo lectura que reorganiza datos públicos del ENRE/ENReGE (Edenor y Edesur) y del OCEBA (EDELAP, EDEA, EDEN y EDES). Sitio no oficial. No hay clave ni registro. Se renueva cada 2 minutos aproximadamente. Si `fetched_at` tiene más de 15 minutos, el dato puede estar viejo: no lo interpretes como ausencia de cortes. Una zona sin entrada solo significa 'sin cortes informados' cuando la fuente respondió y el dato es reciente. Documentación: https://cortesdeluz.com.ar/datos/",
    "termsOfService": "https://cortesdeluz.com.ar/aviso-legal/",
    "contact": { "name": "¿Hay luz? (un proyecto de Hábitat Zero)", "email": "contacto@cortesdeluz.com.ar", "url": "https://cortesdeluz.com.ar/datos/" },
    "license": { "name": "Uso libre con atribución: Fuente ¿Hay luz? (cortesdeluz.com.ar), con datos del ENRE/OCEBA", "url": "https://cortesdeluz.com.ar/para-medios/" }
  },
  "servers": [
    { "url": "https://live.cortesdeluz.com.ar", "description": "Principal (copia estática en CDN, cache de 60 s)" },
    { "url": "https://api.cortesdeluz.com.ar", "description": "Respaldo (mismo contenido, servido por el Worker)" }
  ],
  "paths": {
    "/current.json": {
      "get": {
        "operationId": "getEstadoActual",
        "summary": "Estado actual de los cortes",
        "description": "Totales de usuarios sin servicio de Edenor y Edesur, estado por zona, puntos con coordenadas y, si está disponible, el estado de la Provincia de Buenos Aires (OCEBA).",
        "responses": {
          "200": {
            "description": "Estado actual.",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/Estado" },
                "example": {
                  "v": 1,
                  "generated_at": "2026-10-26T09:15:30Z",
                  "fetched_at": "2026-10-26T09:11:09Z",
                  "source_ts": "2026-10-26 06:09 ART",
                  "totales": { "edenor": 124, "edesur": 129 },
                  "zonas": { "caba/nunez": [124, 1, 0] },
                  "points": [ { "d": "EDENOR", "t": "MT", "lat": -34.5483, "lon": -58.45926, "u": 124, "n": "2026-10-26 08:00", "r": "caba/nunez", "nm": "Núñez", "z": "CABA" } ]
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Estado": {
        "type": "object",
        "required": ["v", "fetched_at", "totales", "points"],
        "properties": {
          "v": { "type": "integer", "description": "Versión del formato." },
          "generated_at": { "type": "string", "format": "date-time", "description": "Cuándo se generó el archivo (UTC)." },
          "fetched_at": { "type": "string", "format": "date-time", "description": "Hora en que se consultó la fuente (UTC). Usala para decidir si el dato es reciente." },
          "source_ts": { "type": "string", "description": "Hora que informa el ENRE para su mapa, en hora de Argentina (ART). Ejemplo: 2026-10-26 06:09 ART." },
          "totales": { "type": "object", "description": "Usuarios sin servicio informados por distribuidora (AMBA).", "properties": { "edenor": { "type": "integer" }, "edesur": { "type": "integer" } } },
          "zonas": { "type": "object", "description": "Por ruta de zona (por ejemplo caba/palermo o quilmes): [usuarios sin servicio ahora, cantidad de puntos, cortes programados próximos]. Una ruta sin entrada significa sin cortes informados, solo si el dato es reciente.", "additionalProperties": { "type": "array", "items": { "type": "integer" }, "minItems": 3, "maxItems": 3 } },
          "points": { "type": "array", "description": "Puntos de corte informados por el ENRE.", "items": { "$ref": "#/components/schemas/Punto" } },
          "pba": { "type": "object", "description": "Provincia de Buenos Aires según el OCEBA, si está disponible: fuentes (estado de cada distribuidora) y zonas (por partido). Antes de usarlo, verificá que cada fuente figure ok y reciente." }
        },
        "additionalProperties": true
      },
      "Punto": {
        "type": "object",
        "properties": {
          "d": { "type": "string", "enum": ["EDENOR", "EDESUR"], "description": "Distribuidora." },
          "t": { "type": "string", "description": "Tipo de red: MT (media tensión) o BT (baja tensión)." },
          "lat": { "type": "number", "description": "Latitud aproximada." },
          "lon": { "type": "number", "description": "Longitud aproximada." },
          "u": { "type": "integer", "description": "Usuarios sin servicio en este punto." },
          "n": { "type": "string", "description": "Hora estimada de normalización informada por el ENRE (solo media tensión), si existe." },
          "r": { "type": "string", "description": "Ruta de la zona en cortesdeluz.com.ar: la página es https://cortesdeluz.com.ar/{r}/." },
          "nm": { "type": "string", "description": "Nombre de la zona." },
          "z": { "type": "string", "description": "Partido o CABA." }
        }
      }
    }
  }
}
