{
  "openapi": "3.1.0",
  "info": {
    "title": "Revisa tu web — API de Arubeus",
    "version": "1.0.0",
    "description": "Revisión gratuita y orientativa de la web de un negocio local: funcionamiento y HTTPS, contacto con un toque (teléfono y WhatsApp), municipio en el título, meta descripción y datos estructurados, adaptación al móvil y velocidad en móvil. No requiere autenticación. No se guarda la dirección revisada. Límite de uso por IP.",
    "contact": { "name": "Adrián Rubio · Arubeus", "email": "adrian@arubeus.com", "url": "https://arubeus.com/contacto/" }
  },
  "servers": [{ "url": "https://arubeus.com" }],
  "paths": {
    "/api/revisar.php": {
      "get": {
        "operationId": "revisarWeb",
        "summary": "Revisa la web de un negocio local",
        "description": "Sin `paso` (o `paso=rapido`) devuelve las comprobaciones rápidas (1-3 s). Con `paso=velocidad` devuelve solo la medición de velocidad en móvil (10-40 s, usa PageSpeed Insights). El peso de cada comprobación suma 100; la puntuación final es la suma de `valor × peso` de las comprobaciones con valor, reescalada a 100.",
        "parameters": [
          { "name": "url", "in": "query", "required": true, "description": "Dirección de la web (con o sin https://). Debe ser un dominio público en los puertos 80 o 443.", "schema": { "type": "string", "maxLength": 300 }, "example": "https://telenieto.es" },
          { "name": "municipio", "in": "query", "required": false, "description": "Municipio del negocio, para comprobar que aparece en el título de la página.", "schema": { "type": "string", "maxLength": 60 }, "example": "Alcorcón" },
          { "name": "paso", "in": "query", "required": false, "description": "`rapido` (por defecto) o `velocidad`.", "schema": { "type": "string", "enum": ["rapido", "velocidad"], "default": "rapido" } }
        ],
        "responses": {
          "200": { "description": "Revisión realizada.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Revision" } } } },
          "422": { "description": "Dirección no válida o no accesible.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } },
          "429": { "description": "Límite de uso alcanzado (cabecera Retry-After).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Comprobacion": {
        "type": "object",
        "properties": {
          "id": { "type": "string", "enum": ["funciona", "contacto", "municipio", "seo_local", "movil", "velocidad"] },
          "titulo": { "type": "string" },
          "estado": { "type": "string", "enum": ["ok", "aviso", "fallo", "na"] },
          "valor": { "type": ["number", "null"], "minimum": 0, "maximum": 1, "description": "Fracción conseguida; null si no se pudo comprobar." },
          "peso": { "type": "integer", "description": "Peso en la puntuación final." },
          "detalle": { "type": "string" },
          "consejo": { "type": "string" }
        },
        "required": ["id", "titulo", "estado", "peso", "detalle"]
      },
      "Revision": {
        "type": "object",
        "properties": {
          "ok": { "type": "boolean" },
          "url": { "type": "string", "description": "Dirección final tras redirecciones (solo en el paso rápido)." },
          "comprobaciones": { "type": "array", "items": { "$ref": "#/components/schemas/Comprobacion" } },
          "comprobacion": { "$ref": "#/components/schemas/Comprobacion" },
          "nota": { "type": "string" }
        },
        "required": ["ok"]
      },
      "Error": { "type": "object", "properties": { "ok": { "const": false }, "error": { "type": "string" } }, "required": ["ok", "error"] }
    }
  }
}
