{
    "ok": true,
    "contract": "jdserver.open-data/v1",
    "generated_at": "2026-10-01T22:00:00+00:00",
    "station": {
        "slug": "cerdanyola_centre",
        "municipality": "Cerdanyola del Valles",
        "station": "Centre",
        "region": "Catalunya",
        "timezone": "Europe/Madrid",
        "coordinates": {
            "latitude": 41.4902,
            "longitude": 2.1369,
            "elevation_m": 80
        }
    },
    "license": {
        "id": "JDServer-site-terms",
        "name": "Condiciones de reutilización del sitio",
        "url": "https://meteocerdanyola.com/2026/sites/cerdanyola_centre/aviso-legal.html",
        "access": "public",
        "reuse": "authorization_required_unless_otherwise_indicated_or_legally_permitted",
        "attribution": "Cerdanyola del Valles · Centre",
        "notice": "La descarga no concede por sí sola una licencia abierta adicional."
    },
    "datasets": {
        "recent": {
            "key": "observed_at",
            "range": "6, 24 o 48 horas",
            "maximum_rows": 5000,
            "fields": {
                "temperature_c": {
                    "label": "Temperatura",
                    "unit": "°C",
                    "group": "temperature"
                },
                "feels_like_c": {
                    "label": "Sensación térmica",
                    "unit": "°C",
                    "group": "temperature"
                },
                "humidity_pct": {
                    "label": "Humedad relativa",
                    "unit": "%",
                    "group": "humidity"
                },
                "wind_speed_kmh": {
                    "label": "Velocidad del viento",
                    "unit": "km/h",
                    "group": "wind"
                },
                "wind_direction": {
                    "label": "Dirección del viento",
                    "unit": null,
                    "group": "wind"
                },
                "wind_direction_deg": {
                    "label": "Dirección del viento en grados",
                    "unit": "°",
                    "group": "wind"
                },
                "pressure_hpa": {
                    "label": "Presión atmosférica",
                    "unit": "hPa",
                    "group": "pressure"
                },
                "rain_today_mm": {
                    "label": "Lluvia acumulada del día",
                    "unit": "mm",
                    "group": "rain"
                },
                "rain_rate_mm_h": {
                    "label": "Intensidad de precipitación",
                    "unit": "mm/h",
                    "group": "rain"
                },
                "solar_w_m2": {
                    "label": "Radiación solar",
                    "unit": "W/m²",
                    "group": "solar"
                },
                "uv_index": {
                    "label": "Índice UV",
                    "unit": null,
                    "group": "uv"
                }
            }
        },
        "daily": {
            "key": "date",
            "range": "máximo 366 días",
            "maximum_rows": 366,
            "fields": {
                "temperature_mean_c": {
                    "label": "Temperatura media",
                    "unit": "°C",
                    "group": "temperature"
                },
                "temperature_max_c": {
                    "label": "Temperatura máxima",
                    "unit": "°C",
                    "group": "temperature"
                },
                "temperature_min_c": {
                    "label": "Temperatura mínima",
                    "unit": "°C",
                    "group": "temperature"
                },
                "feels_like_mean_c": {
                    "label": "Sensación media",
                    "unit": "°C",
                    "group": "temperature"
                },
                "humidity_max_pct": {
                    "label": "Humedad máxima",
                    "unit": "%",
                    "group": "humidity"
                },
                "humidity_min_pct": {
                    "label": "Humedad mínima",
                    "unit": "%",
                    "group": "humidity"
                },
                "wind_max_kmh": {
                    "label": "Viento máximo",
                    "unit": "km/h",
                    "group": "wind"
                },
                "pressure_max_hpa": {
                    "label": "Presión máxima",
                    "unit": "hPa",
                    "group": "pressure"
                },
                "pressure_min_hpa": {
                    "label": "Presión mínima",
                    "unit": "hPa",
                    "group": "pressure"
                },
                "rain_mm": {
                    "label": "Precipitación",
                    "unit": "mm",
                    "group": "rain"
                },
                "rain_rate_max_mm_h": {
                    "label": "Intensidad máxima",
                    "unit": "mm/h",
                    "group": "rain"
                },
                "uv_index_max": {
                    "label": "Índice UV máximo",
                    "unit": null,
                    "group": "uv"
                }
            }
        },
        "monthly": {
            "key": "period",
            "range": "máximo 120 meses",
            "maximum_rows": 120,
            "fields": {
                "temperature_mean_c": {
                    "label": "Temperatura media",
                    "unit": "°C",
                    "group": "temperature"
                },
                "temperature_max_c": {
                    "label": "Temperatura máxima",
                    "unit": "°C",
                    "group": "temperature"
                },
                "temperature_min_c": {
                    "label": "Temperatura mínima",
                    "unit": "°C",
                    "group": "temperature"
                },
                "feels_like_mean_c": {
                    "label": "Sensación media",
                    "unit": "°C",
                    "group": "temperature"
                },
                "humidity_max_pct": {
                    "label": "Humedad máxima",
                    "unit": "%",
                    "group": "humidity"
                },
                "humidity_min_pct": {
                    "label": "Humedad mínima",
                    "unit": "%",
                    "group": "humidity"
                },
                "wind_max_kmh": {
                    "label": "Viento máximo",
                    "unit": "km/h",
                    "group": "wind"
                },
                "pressure_max_hpa": {
                    "label": "Presión máxima",
                    "unit": "hPa",
                    "group": "pressure"
                },
                "pressure_min_hpa": {
                    "label": "Presión mínima",
                    "unit": "hPa",
                    "group": "pressure"
                },
                "rain_mm": {
                    "label": "Precipitación",
                    "unit": "mm",
                    "group": "rain"
                },
                "rain_rate_max_mm_h": {
                    "label": "Intensidad máxima",
                    "unit": "mm/h",
                    "group": "rain"
                },
                "uv_index_max": {
                    "label": "Índice UV máximo",
                    "unit": null,
                    "group": "uv"
                }
            }
        },
        "annual": {
            "key": "year",
            "range": "máximo 30 años",
            "maximum_rows": 30,
            "fields": {
                "temperature_mean_c": {
                    "label": "Temperatura media",
                    "unit": "°C",
                    "group": "temperature"
                },
                "temperature_max_c": {
                    "label": "Temperatura máxima",
                    "unit": "°C",
                    "group": "temperature"
                },
                "temperature_min_c": {
                    "label": "Temperatura mínima",
                    "unit": "°C",
                    "group": "temperature"
                },
                "feels_like_mean_c": {
                    "label": "Sensación media",
                    "unit": "°C",
                    "group": "temperature"
                },
                "humidity_max_pct": {
                    "label": "Humedad máxima",
                    "unit": "%",
                    "group": "humidity"
                },
                "humidity_min_pct": {
                    "label": "Humedad mínima",
                    "unit": "%",
                    "group": "humidity"
                },
                "wind_max_kmh": {
                    "label": "Viento máximo",
                    "unit": "km/h",
                    "group": "wind"
                },
                "pressure_max_hpa": {
                    "label": "Presión máxima",
                    "unit": "hPa",
                    "group": "pressure"
                },
                "pressure_min_hpa": {
                    "label": "Presión mínima",
                    "unit": "hPa",
                    "group": "pressure"
                },
                "rain_mm": {
                    "label": "Precipitación",
                    "unit": "mm",
                    "group": "rain"
                },
                "rain_rate_max_mm_h": {
                    "label": "Intensidad máxima",
                    "unit": "mm/h",
                    "group": "rain"
                },
                "uv_index_max": {
                    "label": "Índice UV máximo",
                    "unit": null,
                    "group": "uv"
                }
            }
        }
    },
    "variable_groups": [
        "temperature",
        "humidity",
        "wind",
        "pressure",
        "rain",
        "solar",
        "uv"
    ],
    "formats": [
        "json",
        "csv"
    ],
    "examples": {
        "recent_json": "https://meteocerdanyola.com/2026/api/open-data.php?v=1&slug=cerdanyola_centre&dataset=recent&hours=24&variables=temperature,humidity,wind,pressure,rain&format=json",
        "daily_csv": "https://meteocerdanyola.com/2026/api/open-data.php?v=1&slug=cerdanyola_centre&dataset=daily&from=2026-09-26&to=2026-10-02&variables=temperature,rain&format=csv",
        "monthly_json": "https://meteocerdanyola.com/2026/api/open-data.php?v=1&slug=cerdanyola_centre&dataset=monthly&from=2025-11&to=2026-10&variables=temperature,rain&format=json"
    },
    "usage": {
        "method": "GET",
        "authentication": "none",
        "cors": "*",
        "timezone": "Europe/Madrid",
        "null_semantics": "null significa no disponible; no equivale a cero",
        "responsible_use": "Respeta los límites, la caché HTTP y las condiciones del sitio. No realices extracción masiva.",
        "observation_time": "recent.rows[].observed_at identifica cada observación y su desplazamiento UTC. Los periodos daily/monthly/annual son fechas locales, no instantes de actualización.",
        "generated_at": "Hora UTC de generación agrupada en intervalos técnicos; no es la hora de la observación ni acredita su frescura.",
        "update_frequency": "Depende de la estación y de la fuente. No se ofrece una cadencia garantizada ni SLA; comprueba las fechas, huecos y cabeceras HTTP de cada respuesta.",
        "types": "Variables numéricas: número JSON o null; wind_direction: texto o null; observed_at: fecha ISO 8601 con zona. feels_like_c es calculada, no otro sensor.",
        "legacy_sources": "latest.json mezcla números y cadenas numéricas; algunos ceros de sensores opcionales heredados pueden representar ausencia. Open Data no puede recuperar un null que ya fue sustituido en origen.",
        "daily_summary_endpoint": "summary24h.php resume el día natural local. rain24h es lluvia de hoy, no una ventana móvil de 24 horas; algunas horas de extremos son aproximadas.",
        "rain_rate_maximum": "rain_rate_max_mm_h solo usa un máximo de intensidad acreditado. Si no existe en la fuente del periodo, devuelve null; radiación solar no es intensidad de lluvia.",
        "versioning": "Solicita v=1 y consulta fields y changelog. El contrato publicado no implica acceso ilimitado ni permanencia indefinida de todas las rutas.",
        "discovery": "Accesibilidad e indexación son distintas: se mantienen las directivas robots y X-Robots-Tag existentes."
    },
    "agent_content": {
        "implementation": "JDServer own Markdown extract; not Cloudflare conversion",
        "content_type": "text/markdown; charset=utf-8",
        "pages": [
            "index",
            "explicamos",
            "station"
        ],
        "example": "https://meteocerdanyola.com/2026/api/agent-content.php?slug=cerdanyola_centre&page=index",
        "notice": "Extracto acotado: observaciones del JSON publicado y ficha editorial. No reproduce gráficos, predicciones ni toda la explicación dinámica."
    },
    "changelog": [
        {
            "version": "1.0.2",
            "date": "2026-10-01",
            "changes": [
                "Corrección de intensidad máxima: fuente de intensidad o null, nunca radiación solar",
                "Documentación de tiempos, tipos, ausentes, límites de actualización y descubrimiento",
                "Extracto Markdown propio anunciado para las tres páginas de Cerdanyola Centre"
            ]
        },
        {
            "version": "1.0.1",
            "date": "2026-09-11",
            "changes": [
                "Metadatos de generación estables dentro del intervalo técnico",
                "Documentación de caché alineada con la política HTTP efectiva"
            ]
        },
        {
            "version": "1.0.0",
            "date": "2026-09-11",
            "changes": [
                "Contrato público inicial",
                "JSON y CSV",
                "Observaciones y resúmenes diario, mensual y anual"
            ]
        }
    ]
}
