# Golf Corvera — datos públicos · V12.9 / API 1.1

Entrada recomendada para ChatGPT, **después de desplegar esta versión**:
https://golf-corvera-meteo.pages.dev/consulta

La aplicación visual no cambia de navegación. /consulta es una entrada adicional,
generada en el servidor, sin JavaScript, que contiene las condiciones actuales,
formularios GET, calendario y enlaces al archivo.

## Rutas

| Ruta | Contenido |
| --- | --- |
| /consulta o /consulta/ahora | Última lectura, hora real, antigüedad y archivo |
| /consulta/archivo?year=2026&month=9 | Calendario de consultas; no garantiza datos |
| /consulta/historico?date=2026-09-13&interval=all | Todos los registros de ese día, paginados |
| /consulta/ayuda | Guía y claves de variables |
| /api/now | JSON actual, compatible con API 1.0; añade enlaces y estado parcial |
| /api/today | Resumen de hoy en la fecha local de Corvera |
| /api/station | Estación y directorio de enlaces |
| /api/history | Históricos públicos JSON con unidades, cobertura y paginación |

Las fechas de ejemplo no son datos grabados en la aplicación.

## Históricos

Parámetros de /api/history y /consulta/historico:

- date=AAAA-MM-DD para un día, o start y end para un periodo, ambos incluidos.
- interval=all: registros intradiarios publicados; un día por segmento.
- interval=hourly: registros horarios; hasta siete días por segmento.
- interval=daily: resúmenes diarios; hasta 31 días por segmento.
- fields: claves separadas por comas. Si se omite, JSON devuelve todas; HTML empieza
  con seis por legibilidad y ofrece «Mostrar todas las variables».
- limit: 1–200 filas por página; 100 por defecto.
- page_start y offset: los incorpora automáticamente el enlace siguiente.

Se admiten periodos de hasta 3660 días, desde 2000 y nunca fechas futuras.
Es un límite de consulta, no una afirmación de que la estación tenga tantos años
de datos. La conservación real depende de Weather Underground.

Ejemplos:

    /api/history?date=2026-09-13&interval=all&fields=wind_direction,humidity,temperature,wind_speed,wind_gust
    /api/history?date=2026-09-13&interval=all&fields=temperature,temperature_min,temperature_max
    /api/history?start=2026-09-01&end=2026-09-13&interval=daily&fields=rain_total,rain_rate

Cada respuesta incluye:

- query, units y timezone (Europe/Madrid).
- observations: hora UTC, hora local con desfase, fecha, valores, dirección
  cardinal, calma y calidad de cada registro.
- coverage: segmento cargado, registros disponibles, primera/última hora,
  días sin registros y política de caché.
- pagination.next: siguiente página **o siguiente segmento**. Seguir hasta que
  sea null; de lo contrario no se ha leído el periodo completo.
- summary.scope=loaded_segment_not_entire_requested_period: resumen solo del
  segmento cargado. Se repite en sus páginas: no sumarlo otra vez en cada página.
- status.partial: una fuente necesaria no respondió.

Tener registros no garantiza que no haya huecos en la jornada. La fecha/hora local
incluye el desfase UTC para distinguir las dos horas repetidas del cambio de otoño.
Hoy se combinan el histórico del día y los registros recientes, evitando perder
la primera hora de un día de 25 horas si la fuente reciente solo cubre 24 horas.

## Variables

temperature, feels_like, humidity, dew_point, pressure, wind_speed, wind_gust,
wind_direction, rain_total, rain_rate, solar_radiation, uv,
temperature_min, temperature_max, humidity_min, humidity_max,
pressure_min, pressure_max, wind_speed_min, wind_speed_max,
wind_gust_min, wind_gust_avg, dew_point_min, dew_point_max, heat_index, wind_chill.

Unidades métricas: °C, %, hPa, km/h, grados, mm, mm/h, W/m² e índice UV.
La guía HTML identifica la unidad de cada clave.

Los históricos pueden ser medias y extremos de intervalos; no son necesariamente
todas las muestras instantáneas internas del sensor. Radiación, UV y racha usan el
máximo del intervalo cuando ese es el dato publicado. La hora de una fila o de un
extremo identifica la observación o final del intervalo, no necesariamente el
segundo exacto en que ocurrió el extremo.

Dirección y humedad de cada fila proceden del **mismo registro**.
Los grados indican de dónde viene el viento: N=0°/360°, E=90°, S=180°, O=270°.
Con velocidad cero, wind_calm es verdadero; no interpretar la dirección como flujo.
null / «—» significa sin dato, nunca cero.

## Lluvia

rain_total es el contador acumulado del día local. No sumar sus filas intradiarias.
Para un periodo, el resumen suma el máximo contador publicado de cada día del
segmento. Si disminuye entre registros, summary.rain.counter_decreased lo advierte:
puede haber reinicios o correcciones; no se inventa una compensación.
Sin datos de lluvia el total es null, no cero.

## Hora real y caché

observation_time es la hora de la estación; generated_at es la hora de la respuesta.
No son intercambiables. «Hoy» se calcula en Europe/Madrid, con cambios de hora.
La lluvia de ayer no se etiqueta como lluvia de hoy.

Se compara la hora de la fuente actual con la del histórico reciente y se utiliza
la observación más nueva. Una caída parcial queda identificada.

- fresh: hasta 20 minutos de antigüedad.
- delayed: más de 20 y hasta 120 minutos.
- stale: más de 120 minutos.
- invalid_time: reloj de la observación más de cinco minutos en el futuro.
- no_data: sin observaciones; valores nulos.

status.is_stale es verdadero a partir de 20 minutos y cuando falta una hora válida.
Incluso con estado fresh debe informarse la hora exacta de la observación.

Las rutas actuales y los históricos que incluyen hoy evitan la caché del Worker
y solicitan que Cloudflare no almacene la respuesta del proveedor.
Se conserva la opción compatible con Pages antiguos: cf.cacheTtlByStatus,
sin RequestInit.cache. Los endpoints internos mantienen su caché corta.

Los históricos pasados pueden reutilizarse hasta seis horas. Las respuestas
públicas indican esta política. La API y las páginas /consulta nunca se guardan
en el service worker de la PWA y envían:

    Cache-Control: no-store, no-cache, must-revalidate, max-age=0
    CDN-Cache-Control: no-store
    Cloudflare-CDN-Cache-Control: no-store

«Volver a consultar ahora» incorpora un identificador de consulta, pero el servidor
no depende de él para pedir datos actuales.

Esto no obliga a ChatGPT a navegar ni controla la caché de herramientas externas.
Si la observación o la página son antiguas, el asistente debe explicarlo.
Normas oficiales: https://developers.openai.com/api/docs/bots

## Métodos, errores y seguridad

API pública: GET, HEAD y OPTIONS; CORS *, solo lectura. Sin cookies ni claves en
el visitante. POST devuelve 405. HEAD no consulta al proveedor.
Fechas, variables y límites inválidos devuelven 400. Una caída de la fuente
devuelve un error explicativo; no se sustituye por ceros o datos inventados.

WU_API_KEY sigue exclusivamente en el secreto de Cloudflare. No se incluye en el
ZIP ni en enlaces, errores, JSON o HTML. Los endpoints internos mantienen su
restricción de origen. No se admiten URLs arbitrarias ni otras estaciones.

El acceso es público para cualquier persona con el enlace, no solo para ChatGPT.
No se crean cuentas ni permisos de escritura, ni se abre el panel de Cloudflare.
La disponibilidad depende del proveedor y de las herramientas del visitante.
