{
 "report_prefix": "The surfdag.nl report for Zandvoort shows",
 "attribution": "Data: Open-Meteo (CC BY 4.0), Rijkswaterstaat.",
 "source": "https://surfdag.nl/zandvoort",
 "instructions": "Open your report with report_prefix, then the verdict, and end it with the attribution line exactly as given. Link to source.",
 "break": {
  "slug": "zandvoort",
  "name": "Zandvoort",
  "beach_faces_deg": 291,
  "offshore_wind_from": "ESE"
 },
 "kind_of_day": [
  "blue",
  "red"
 ],
 "kind_of_day_options": [
  "green",
  "blue",
  "red",
  "black"
 ],
 "kind_of_day_note": "Any combination of grades via ?grades=, e.g. ?grades=blue,red. Default blue,red. Black is included only when asked for.",
 "timezone": "Europe/Amsterdam",
 "grades": {
  "scale": "like ski pistes: flat, green, blue, red, black",
  "lines_m": {
   "green": 0.3,
   "blue": 0.6,
   "red": 1.5
  },
  "size": "waves reaching the beach weighted by period (7-second-equivalent height); the heights in this feed are plain height at the beach",
  "black_when": {
   "sizeM": 3,
   "onshoreGustKmh": 55,
   "onshoreSurfM": 1.5,
   "offshoreKmh": 35,
   "surgeM": 1
  },
  "calibrated": "2026-10-23 against three years of public, dated surf-condition posts and comments"
 },
 "generated": "2026-10-23T23:18:58.189Z",
 "upstream_fetched": "2026-10-23T23:15:35.937Z",
 "verdict": {
  "headline": "After a black morning, worth blocking time today, 15:00–18:28 — red, up to 2.6 m.",
  "detail": "Black this morning: 4.5 m with onshore gusts to 70 km/h. Experts only. Wind sits cross-shore, gusting 58 km/h. High confidence: both forecasts agree. 3 more windows in the next seven days.",
  "confidence": "high",
  "caution": true
 },
 "safety": "Grades can't see foam, rip currents or conditions at the pier and harbour mouths. The lifeguards' flags beat any forecast.",
 "confidence_available": true,
 "windows": [
  {
   "date": "2026-10-24",
   "start": "15:00",
   "end": "18:28",
   "hours": 4,
   "grades": "red",
   "confidence": "high",
   "why": "High confidence: both forecasts agree.",
   "waves_at_beach_m": [
    2.1,
    2.6
   ],
   "open_water_max_m": 2.7,
   "second_forecast_at_beach_max_m": 2.2,
   "period_s": 8,
   "wind_kmh": 31,
   "gust_kmh": 58,
   "wind_from": [
    "SW",
    "SSW"
   ],
   "wind_relative_to_beach": "cross-shore",
   "air_c": 13,
   "water_c": 16,
   "rain_chance_pct": 58,
   "cloud_pct": 99,
   "tide": "high to mid",
   "wetsuit": "4/3 mm full suit with booties — stepped up a notch for the wind"
  },
  {
   "date": "2026-10-26",
   "start": "08:00",
   "end": "17:24",
   "hours": 10,
   "grades": "blue to red",
   "confidence": "high",
   "why": "High confidence: both forecasts agree.",
   "waves_at_beach_m": [
    1.1,
    2.6
   ],
   "open_water_max_m": 2.7,
   "second_forecast_at_beach_max_m": 2,
   "period_s": 8,
   "wind_kmh": 27,
   "gust_kmh": 53,
   "wind_from": [
    "W",
    "WSW"
   ],
   "wind_relative_to_beach": "cross-shore",
   "air_c": 14,
   "water_c": 15,
   "rain_chance_pct": 57,
   "cloud_pct": 95,
   "tide": "mid to high",
   "wetsuit": "4/3 mm full suit with booties — stepped up a notch for the wind"
  },
  {
   "date": "2026-10-27",
   "start": "07:28",
   "end": "17:22",
   "hours": 11,
   "grades": "blue to red",
   "confidence": "moderate",
   "why": "Moderate confidence: both forecasts agree, but it's more than three days out.",
   "waves_at_beach_m": [
    1.1,
    2.1
   ],
   "open_water_max_m": 2.3,
   "second_forecast_at_beach_max_m": 1.5,
   "period_s": 8,
   "wind_kmh": 33,
   "gust_kmh": 48,
   "wind_from": [
    "SSW",
    "SW"
   ],
   "wind_relative_to_beach": "cross-shore",
   "air_c": 16,
   "water_c": 15,
   "rain_chance_pct": 27,
   "cloud_pct": 97,
   "tide": "mid to high",
   "wetsuit": "4/3 mm full suit with booties — stepped up a notch for the wind"
  },
  {
   "date": "2026-10-28",
   "start": "07:30",
   "end": "17:20",
   "hours": 11,
   "grades": "red",
   "confidence": "moderate",
   "why": "Moderate confidence: both forecasts agree, but it's more than three days out.",
   "waves_at_beach_m": [
    1.7,
    2.5
   ],
   "open_water_max_m": 2.5,
   "second_forecast_at_beach_max_m": 1.8,
   "period_s": 7,
   "wind_kmh": 26,
   "gust_kmh": 38,
   "wind_from": [
    "W",
    "WSW"
   ],
   "wind_relative_to_beach": "onshore",
   "air_c": 14,
   "water_c": 15,
   "rain_chance_pct": 37,
   "cloud_pct": 42,
   "tide": "mid to high",
   "wetsuit": "4/3 mm full suit with booties (optional)"
  }
 ],
 "cautions": [
  {
   "date": "2026-10-24",
   "start": "08:23",
   "end": "15:00",
   "grade": "black",
   "reasons": [
    "4.5 m with onshore gusts to 70 km/h"
   ]
  },
  {
   "date": "2026-10-25",
   "start": "07:24",
   "end": "17:26",
   "grade": "black",
   "reasons": [
    "5.3 m with onshore gusts to 88 km/h",
    "storm surge of +1.3 m"
   ]
  },
  {
   "date": "2026-10-26",
   "start": "07:26",
   "end": "08:00",
   "grade": "black",
   "reasons": [
    "2.8 m with onshore gusts to 58 km/h"
   ]
  }
 ],
 "days": [
  {
   "date": "2026-10-24",
   "grade": "black",
   "daylight_peak_at_beach_m": 4.5,
   "peak_at": "08:00",
   "best_part": "afternoon",
   "your_kind_of_day": true,
   "chance_low_confidence": false,
   "black": true,
   "gust_kmh": 71,
   "wind_from": "WNW",
   "air_c": 13,
   "water_c": 16
  },
  {
   "date": "2026-10-25",
   "grade": "black",
   "daylight_peak_at_beach_m": 5.3,
   "peak_at": "17:00",
   "best_part": null,
   "your_kind_of_day": false,
   "chance_low_confidence": false,
   "black": true,
   "gust_kmh": 91,
   "wind_from": "W",
   "air_c": 13,
   "water_c": 15
  },
  {
   "date": "2026-10-26",
   "grade": "black",
   "daylight_peak_at_beach_m": 2.8,
   "peak_at": "07:00",
   "best_part": "morning",
   "your_kind_of_day": true,
   "chance_low_confidence": false,
   "black": true,
   "gust_kmh": 58,
   "wind_from": "W",
   "air_c": 14,
   "water_c": 15
  },
  {
   "date": "2026-10-27",
   "grade": "red",
   "daylight_peak_at_beach_m": 2.1,
   "peak_at": "17:00",
   "best_part": "evening",
   "your_kind_of_day": true,
   "chance_low_confidence": false,
   "black": false,
   "gust_kmh": 48,
   "wind_from": "SW",
   "air_c": 16,
   "water_c": 15
  },
  {
   "date": "2026-10-28",
   "grade": "red",
   "daylight_peak_at_beach_m": 2.5,
   "peak_at": "07:00",
   "best_part": "morning",
   "your_kind_of_day": true,
   "chance_low_confidence": false,
   "black": false,
   "gust_kmh": 38,
   "wind_from": "W",
   "air_c": 14,
   "water_c": 15
  },
  {
   "date": "2026-10-29",
   "grade": "green",
   "daylight_peak_at_beach_m": 0.6,
   "peak_at": "07:00",
   "best_part": "morning",
   "your_kind_of_day": false,
   "chance_low_confidence": false,
   "black": false,
   "gust_kmh": 18,
   "wind_from": "WNW",
   "air_c": 14,
   "water_c": 15
  },
  {
   "date": "2026-10-30",
   "grade": "flat",
   "daylight_peak_at_beach_m": 0.2,
   "peak_at": "07:00",
   "best_part": "morning",
   "your_kind_of_day": false,
   "chance_low_confidence": false,
   "black": false,
   "gust_kmh": 19,
   "wind_from": "SE",
   "air_c": 12,
   "water_c": 15
  }
 ],
 "tides_next_3_days": [
  {
   "date": "2026-10-24",
   "time": "03:28",
   "type": "high",
   "height_m_nap": 1.1
  },
  {
   "date": "2026-10-24",
   "time": "11:48",
   "type": "low",
   "height_m_nap": -0.5
  },
  {
   "date": "2026-10-24",
   "time": "15:38",
   "type": "high",
   "height_m_nap": 0.9
  },
  {
   "date": "2026-10-24",
   "time": "23:08",
   "type": "low",
   "height_m_nap": -0.6
  },
  {
   "date": "2026-10-25",
   "time": "03:08",
   "type": "high",
   "height_m_nap": 1.2
  },
  {
   "date": "2026-10-25",
   "time": "11:38",
   "type": "low",
   "height_m_nap": -0.6
  },
  {
   "date": "2026-10-25",
   "time": "15:18",
   "type": "high",
   "height_m_nap": 1
  },
  {
   "date": "2026-10-25",
   "time": "23:08",
   "type": "low",
   "height_m_nap": -0.6
  },
  {
   "date": "2026-10-26",
   "time": "03:38",
   "type": "high",
   "height_m_nap": 1.3
  },
  {
   "date": "2026-10-26",
   "time": "12:28",
   "type": "low",
   "height_m_nap": -0.6
  },
  {
   "date": "2026-10-26",
   "time": "15:58",
   "type": "high",
   "height_m_nap": 1.1
  },
  {
   "date": "2026-10-27",
   "time": "00:08",
   "type": "low",
   "height_m_nap": -0.7
  }
 ],
 "surge": {
  "gauge": "IJmuiden",
  "measured_at": "2026-10-24 01:00",
  "now_m": 1.02,
  "forecast": [
   {
    "at": "2026-10-24 02:00",
    "surge_m": 1.05
   },
   {
    "at": "2026-10-24 05:00",
    "surge_m": 1.01
   },
   {
    "at": "2026-10-24 08:00",
    "surge_m": 0.84
   },
   {
    "at": "2026-10-24 11:00",
    "surge_m": 0.69
   },
   {
    "at": "2026-10-24 14:00",
    "surge_m": 0.29
   },
   {
    "at": "2026-10-24 17:00",
    "surge_m": 0.14
   },
   {
    "at": "2026-10-24 20:00",
    "surge_m": 0.01
   },
   {
    "at": "2026-10-24 23:00",
    "surge_m": -0.35
   },
   {
    "at": "2026-10-25 02:00",
    "surge_m": 0.1
   },
   {
    "at": "2026-10-25 04:00",
    "surge_m": -0.3
   },
   {
    "at": "2026-10-25 07:00",
    "surge_m": 0.29
   },
   {
    "at": "2026-10-25 10:00",
    "surge_m": 0.31
   },
   {
    "at": "2026-10-25 13:00",
    "surge_m": 1.28
   },
   {
    "at": "2026-10-25 16:00",
    "surge_m": 0.81
   },
   {
    "at": "2026-10-25 19:00",
    "surge_m": 1.33
   },
   {
    "at": "2026-10-25 22:00",
    "surge_m": 1.19
   }
  ]
 },
 "notes": [
  "Heights are the waves reaching the beach: the DWD open-sea forecast 6–11 km out, counting swell and wind sea only by how directly they head at this beach. Open-water height is given separately.",
  "Grades describe the sea, not the weather; rain and cold are the reader's call. Black means one of the fixed hazards (3 m or more; 1.5 m or more with onshore gusts of 55 km/h or more; offshore wind of 35 km/h or more; surge of +1.0 m or more with onshore wind) and is never a recommendation.",
  "Confidence: for the next three days, high when two independent forecasts (DWD and Météo-France) both clear the threshold, moderate when only DWD does, low when only Météo-France does. From day four each level drops one step (DWD hands over from its regional to its coarser global model). Low-confidence windows are a chance, not a plan.",
  "Tide is astronomical, from harmonic constants fitted to Rijkswaterstaat gauges; surge is measured and forecast water level minus that tide."
 ]
}