{
 "report_prefix": "The surfdag.nl report for Ter Heijde shows",
 "attribution": "Data: Open-Meteo (CC BY 4.0), Rijkswaterstaat.",
 "source": "https://surfdag.nl/ter-heijde",
 "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": "ter-heijde",
  "name": "Ter Heijde",
  "beach_faces_deg": 310,
  "offshore_wind_from": "SE"
 },
 "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:15:49.739Z",
 "upstream_fetched": "2026-10-23T23:15:49.468Z",
 "verdict": {
  "headline": "After a black morning, worth blocking time today, 14:00–18:30 — blue to red, up to 2.6 m.",
  "detail": "Black this morning: 4.2 m with onshore gusts to 69 km/h. Experts only. Wind sits cross-shore, gusting 53 km/h. High confidence: both forecasts agree. 3 more windows in the next seven days. There's also a chance Tuesday, 14:00–17:00: blue, up to 1.6 m (low confidence: our main forecast shows it, the second doesn't, but it's more than three days out).",
  "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": "14:00",
   "end": "18:30",
   "hours": 5,
   "grades": "blue to red",
   "confidence": "high",
   "why": "High confidence: both forecasts agree.",
   "waves_at_beach_m": [
    1.7,
    2.6
   ],
   "open_water_max_m": 2.7,
   "second_forecast_at_beach_max_m": 1.9,
   "period_s": 8,
   "wind_kmh": 31,
   "gust_kmh": 53,
   "wind_from": [
    "WSW",
    "SW"
   ],
   "wind_relative_to_beach": "cross-shore",
   "air_c": 13,
   "water_c": 14,
   "rain_chance_pct": 71,
   "cloud_pct": 100,
   "tide": "high to low",
   "wetsuit": "4/3 mm full suit with booties — stepped up a notch for the wind"
  },
  {
   "date": "2026-10-26",
   "start": "08:00",
   "end": "17:26",
   "hours": 10,
   "grades": "blue to red",
   "confidence": "high",
   "why": "High confidence: both forecasts agree.",
   "waves_at_beach_m": [
    0.9,
    2.2
   ],
   "open_water_max_m": 2.3,
   "second_forecast_at_beach_max_m": 1.5,
   "period_s": 8,
   "wind_kmh": 22,
   "gust_kmh": 53,
   "wind_from": [
    "W",
    "WSW"
   ],
   "wind_relative_to_beach": "cross-shore",
   "air_c": 13,
   "water_c": 13,
   "rain_chance_pct": 64,
   "cloud_pct": 97,
   "tide": "low to mid",
   "wetsuit": "4/3 mm full suit with booties, 3 mm gloves and a hood — stepped up a notch for the wind"
  },
  {
   "date": "2026-10-27",
   "start": "07:29",
   "end": "12:00",
   "hours": 5,
   "grades": "blue",
   "confidence": "moderate",
   "why": "Moderate confidence: both forecasts agree, but it's more than three days out.",
   "waves_at_beach_m": [
    0.8,
    0.9
   ],
   "open_water_max_m": 1.6,
   "second_forecast_at_beach_max_m": 1,
   "period_s": 7,
   "wind_kmh": 27,
   "gust_kmh": 54,
   "wind_from": [
    "SSW"
   ],
   "wind_relative_to_beach": "cross-shore",
   "air_c": 16,
   "water_c": 13,
   "rain_chance_pct": 23,
   "cloud_pct": 73,
   "tide": "mid to low",
   "wetsuit": "4/3 mm full suit with booties, 3 mm gloves and a hood — stepped up a notch for the wind"
  },
  {
   "date": "2026-10-27",
   "start": "14:00",
   "end": "17:00",
   "hours": 3,
   "grades": "blue",
   "confidence": "low",
   "why": "Low confidence: our main forecast shows it, the second doesn't, but it's more than three days out.",
   "waves_at_beach_m": [
    1.1,
    1.6
   ],
   "open_water_max_m": 2.2,
   "second_forecast_at_beach_max_m": 0.8,
   "period_s": 7,
   "wind_kmh": 30,
   "gust_kmh": 60,
   "wind_from": [
    "SSW",
    "SW"
   ],
   "wind_relative_to_beach": "cross-shore",
   "air_c": 17,
   "water_c": 13,
   "rain_chance_pct": 30,
   "cloud_pct": 100,
   "tide": "mid to high",
   "wetsuit": "4/3 mm full suit with booties, 3 mm gloves and a hood — stepped up a notch for the wind"
  },
  {
   "date": "2026-10-28",
   "start": "07:30",
   "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.3,
    2
   ],
   "open_water_max_m": 2.2,
   "second_forecast_at_beach_max_m": 1.4,
   "period_s": 7,
   "wind_kmh": 21,
   "gust_kmh": 49,
   "wind_from": [
    "W",
    "WSW"
   ],
   "wind_relative_to_beach": "onshore",
   "air_c": 14,
   "water_c": 13,
   "rain_chance_pct": 20,
   "cloud_pct": 41,
   "tide": "mid to high",
   "wetsuit": "4/3 mm full suit with booties, 3 mm gloves and a hood — stepped up a notch for the wind"
  }
 ],
 "cautions": [
  {
   "date": "2026-10-24",
   "start": "08:23",
   "end": "14:00",
   "grade": "black",
   "reasons": [
    "4.2 m with onshore gusts to 69 km/h"
   ]
  },
  {
   "date": "2026-10-25",
   "start": "07:25",
   "end": "17:28",
   "grade": "black",
   "reasons": [
    "4.7 m with onshore gusts to 85 km/h"
   ]
  },
  {
   "date": "2026-10-26",
   "start": "07:27",
   "end": "08:00",
   "grade": "black",
   "reasons": [
    "2.4 m with onshore gusts to 59 km/h"
   ]
  },
  {
   "date": "2026-10-27",
   "start": "17:00",
   "end": "17:24",
   "grade": "black",
   "reasons": [
    "1.8 m with onshore gusts to 60 km/h"
   ]
  }
 ],
 "days": [
  {
   "date": "2026-10-24",
   "grade": "black",
   "daylight_peak_at_beach_m": 4.2,
   "peak_at": "08:00",
   "best_part": "afternoon",
   "your_kind_of_day": true,
   "chance_low_confidence": false,
   "black": true,
   "gust_kmh": 69,
   "wind_from": "W",
   "air_c": 13,
   "water_c": 14
  },
  {
   "date": "2026-10-25",
   "grade": "black",
   "daylight_peak_at_beach_m": 4.7,
   "peak_at": "17:00",
   "best_part": null,
   "your_kind_of_day": false,
   "chance_low_confidence": false,
   "black": true,
   "gust_kmh": 89,
   "wind_from": "W",
   "air_c": 13,
   "water_c": 14
  },
  {
   "date": "2026-10-26",
   "grade": "black",
   "daylight_peak_at_beach_m": 2.4,
   "peak_at": "07:00",
   "best_part": "morning",
   "your_kind_of_day": true,
   "chance_low_confidence": false,
   "black": true,
   "gust_kmh": 59,
   "wind_from": "W",
   "air_c": 13,
   "water_c": 13
  },
  {
   "date": "2026-10-27",
   "grade": "black",
   "daylight_peak_at_beach_m": 1.8,
   "peak_at": "17:00",
   "best_part": "afternoon",
   "your_kind_of_day": true,
   "chance_low_confidence": false,
   "black": true,
   "gust_kmh": 60,
   "wind_from": "WSW",
   "air_c": 17,
   "water_c": 13
  },
  {
   "date": "2026-10-28",
   "grade": "red",
   "daylight_peak_at_beach_m": 2,
   "peak_at": "07:00",
   "best_part": "morning",
   "your_kind_of_day": true,
   "chance_low_confidence": false,
   "black": false,
   "gust_kmh": 49,
   "wind_from": "W",
   "air_c": 14,
   "water_c": 13
  },
  {
   "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": 22,
   "wind_from": "W",
   "air_c": 14,
   "water_c": 13
  },
  {
   "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": 25,
   "wind_from": "ESE",
   "air_c": 14,
   "water_c": 13
  }
 ],
 "tides_next_3_days": [
  {
   "date": "2026-10-24",
   "time": "02:35",
   "type": "high",
   "height_m_nap": 1.2
  },
  {
   "date": "2026-10-24",
   "time": "09:25",
   "type": "low",
   "height_m_nap": -0.4
  },
  {
   "date": "2026-10-24",
   "time": "14:45",
   "type": "high",
   "height_m_nap": 1
  },
  {
   "date": "2026-10-24",
   "time": "21:55",
   "type": "low",
   "height_m_nap": -0.6
  },
  {
   "date": "2026-10-25",
   "time": "02:15",
   "type": "high",
   "height_m_nap": 1.3
  },
  {
   "date": "2026-10-25",
   "time": "10:35",
   "type": "low",
   "height_m_nap": -0.4
  },
  {
   "date": "2026-10-25",
   "time": "14:25",
   "type": "high",
   "height_m_nap": 1.2
  },
  {
   "date": "2026-10-25",
   "time": "19:45",
   "type": "low",
   "height_m_nap": -0.5
  },
  {
   "date": "2026-10-25",
   "time": "20:15",
   "type": "high",
   "height_m_nap": -0.5
  },
  {
   "date": "2026-10-25",
   "time": "22:25",
   "type": "low",
   "height_m_nap": -0.6
  },
  {
   "date": "2026-10-26",
   "time": "02:45",
   "type": "high",
   "height_m_nap": 1.4
  },
  {
   "date": "2026-10-26",
   "time": "08:05",
   "type": "low",
   "height_m_nap": -0.3
  },
  {
   "date": "2026-10-26",
   "time": "08:55",
   "type": "high",
   "height_m_nap": -0.3
  },
  {
   "date": "2026-10-26",
   "time": "11:25",
   "type": "low",
   "height_m_nap": -0.4
  },
  {
   "date": "2026-10-26",
   "time": "15:05",
   "type": "high",
   "height_m_nap": 1.3
  },
  {
   "date": "2026-10-26",
   "time": "19:55",
   "type": "low",
   "height_m_nap": -0.5
  },
  {
   "date": "2026-10-26",
   "time": "21:25",
   "type": "high",
   "height_m_nap": -0.5
  },
  {
   "date": "2026-10-26",
   "time": "23:25",
   "type": "low",
   "height_m_nap": -0.6
  }
 ],
 "surge": {
  "gauge": "Hoek van Holland",
  "measured_at": "2026-10-24 01:00",
  "now_m": 0.9,
  "forecast": [
   {
    "at": "2026-10-24 02:00",
    "surge_m": 0.81
   },
   {
    "at": "2026-10-24 05:00",
    "surge_m": 0.8
   },
   {
    "at": "2026-10-24 08:00",
    "surge_m": 0.73
   },
   {
    "at": "2026-10-24 11:00",
    "surge_m": 0.61
   },
   {
    "at": "2026-10-24 14:00",
    "surge_m": 0.31
   },
   {
    "at": "2026-10-24 17:00",
    "surge_m": 0.09
   },
   {
    "at": "2026-10-24 20:00",
    "surge_m": -0.11
   },
   {
    "at": "2026-10-24 23:00",
    "surge_m": -0.48
   },
   {
    "at": "2026-10-25 02:00",
    "surge_m": -0.35
   },
   {
    "at": "2026-10-25 04:00",
    "surge_m": -0.29
   },
   {
    "at": "2026-10-25 07:00",
    "surge_m": 0.4
   },
   {
    "at": "2026-10-25 10:00",
    "surge_m": 0.12
   },
   {
    "at": "2026-10-25 13:00",
    "surge_m": 0.95
   },
   {
    "at": "2026-10-25 16:00",
    "surge_m": 0.66
   },
   {
    "at": "2026-10-25 19:00",
    "surge_m": 1.3
   },
   {
    "at": "2026-10-25 22:00",
    "surge_m": 0.95
   }
  ]
 },
 "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."
 ]
}