{
  "schemaVersion": "1.0",
  "generatedAt": "2026-08-27T01:41:52.193Z",
  "cacheTtlSeconds": 300,
  "status": "fresh",
  "location": {
    "id": "jupiter-offshore",
    "name": "Jupiter Offshore",
    "region": "Palm Beach County, Florida",
    "latitude": 26.9342,
    "longitude": -80.025,
    "timeZone": "America/New_York"
  },
  "summary": {
    "visibility": {
      "lowFt": 35,
      "highFt": 55,
      "label": "35–55 ft",
      "score": 66,
      "confidence": "medium",
      "modeled": true,
      "modelId": "jupiter-offshore-v0.1",
      "disclaimer": "Modeled estimate—not a direct underwater visibility sensor reading."
    },
    "nextHighTide": {
      "time": "2026-08-27T12:34:00.000Z",
      "heightFt": 2.788,
      "type": "high"
    },
    "nextLowTide": {
      "time": "2026-08-27T06:09:00.000Z",
      "heightFt": 0.65,
      "type": "low"
    },
    "waveHeightFt": 1.3,
    "verdict": {
      "code": "WATCH",
      "label": "WATCH",
      "worthTheDrive": false,
      "safetyOverride": false,
      "reason": "Some inputs are favorable, but the full GO threshold is not met."
    },
    "freshness": {
      "status": "fresh",
      "freshSources": 5,
      "staleSources": 0,
      "unavailableSources": 0,
      "totalSources": 5
    }
  },
  "conditions": {
    "waves": {
      "heightFt": 1.3,
      "dominantPeriodSeconds": 3,
      "meanDirectionDegrees": 123,
      "meanDirectionCardinal": "SE",
      "observedAt": "2026-08-27T01:00:00.000Z",
      "source": "NDBC 41122"
    },
    "wind": {
      "speedKnots": 12.1,
      "gustKnots": 14,
      "directionDegrees": 100,
      "directionCardinal": "E",
      "observedAt": "2026-08-27T00:54:00.000Z",
      "source": "NDBC LKWF1"
    },
    "waterTemperatureF": 87.3,
    "airTemperatureF": 85.5,
    "tides": {
      "stationId": "8722495",
      "datum": "MLLW",
      "phase": "falling",
      "previous": {
        "time": "2026-08-27T00:23:00.000Z",
        "heightFt": 2.835,
        "type": "high"
      },
      "next": {
        "time": "2026-08-27T06:09:00.000Z",
        "heightFt": 0.65,
        "type": "low"
      },
      "nextHigh": {
        "time": "2026-08-27T12:34:00.000Z",
        "heightFt": 2.788,
        "type": "high"
      },
      "nextLow": {
        "time": "2026-08-27T06:09:00.000Z",
        "heightFt": 0.65,
        "type": "low"
      },
      "predictions": [
        {
          "time": "2026-08-26T05:31:00.000Z",
          "heightFt": 0.837,
          "type": "low"
        },
        {
          "time": "2026-08-26T11:51:00.000Z",
          "heightFt": 2.65,
          "type": "high"
        },
        {
          "time": "2026-08-26T17:45:00.000Z",
          "heightFt": 0.402,
          "type": "low"
        },
        {
          "time": "2026-08-27T00:23:00.000Z",
          "heightFt": 2.835,
          "type": "high"
        },
        {
          "time": "2026-08-27T06:09:00.000Z",
          "heightFt": 0.65,
          "type": "low"
        },
        {
          "time": "2026-08-27T12:34:00.000Z",
          "heightFt": 2.788,
          "type": "high"
        },
        {
          "time": "2026-08-27T18:23:00.000Z",
          "heightFt": 0.335,
          "type": "low"
        },
        {
          "time": "2026-08-28T01:01:00.000Z",
          "heightFt": 2.928,
          "type": "high"
        },
        {
          "time": "2026-08-28T06:45:00.000Z",
          "heightFt": 0.471,
          "type": "low"
        },
        {
          "time": "2026-08-28T13:16:00.000Z",
          "heightFt": 2.908,
          "type": "high"
        },
        {
          "time": "2026-08-28T19:01:00.000Z",
          "heightFt": 0.308,
          "type": "low"
        },
        {
          "time": "2026-08-29T01:38:00.000Z",
          "heightFt": 2.979,
          "type": "high"
        },
        {
          "time": "2026-08-29T07:21:00.000Z",
          "heightFt": 0.314,
          "type": "low"
        },
        {
          "time": "2026-08-29T13:58:00.000Z",
          "heightFt": 2.999,
          "type": "high"
        },
        {
          "time": "2026-08-29T19:39:00.000Z",
          "heightFt": 0.33,
          "type": "low"
        },
        {
          "time": "2026-08-30T02:15:00.000Z",
          "heightFt": 2.988,
          "type": "high"
        },
        {
          "time": "2026-08-30T07:58:00.000Z",
          "heightFt": 0.195,
          "type": "low"
        },
        {
          "time": "2026-08-30T14:40:00.000Z",
          "heightFt": 3.051,
          "type": "high"
        },
        {
          "time": "2026-08-30T20:19:00.000Z",
          "heightFt": 0.404,
          "type": "low"
        }
      ]
    },
    "marineForecast": {
      "validAt": "2026-08-27T01:41:52.193Z",
      "waveHeightFt": 1,
      "dominantPeriodSeconds": 3,
      "meanWaveDirectionDeg": null,
      "windSpeedKt": 8,
      "windGustKt": 10,
      "windDirectionDeg": 140,
      "thunderProbabilityPct": 33,
      "weather": "Thunderstorms · Rain Showers"
    }
  },
  "forecast": [
    {
      "date": "2026-08-26",
      "label": "Today",
      "maxWaveHeightFt": 1,
      "dominantPeriodSeconds": 3,
      "maxWindKnots": 8,
      "windDirectionCardinal": "SE",
      "maxThunderProbabilityPct": 33,
      "weather": "Thunderstorms · Rain Showers",
      "diveOutlook": "Favorable",
      "conditionScore": 80
    },
    {
      "date": "2026-08-27",
      "label": "Thu",
      "maxWaveHeightFt": 1,
      "dominantPeriodSeconds": 15,
      "maxWindKnots": 9,
      "windDirectionCardinal": "S",
      "maxThunderProbabilityPct": 35,
      "weather": "Thunderstorms · Rain Showers",
      "diveOutlook": "Favorable",
      "conditionScore": 77
    },
    {
      "date": "2026-08-28",
      "label": "Fri",
      "maxWaveHeightFt": 1,
      "dominantPeriodSeconds": 14,
      "maxWindKnots": 8,
      "windDirectionCardinal": "SE",
      "maxThunderProbabilityPct": 36,
      "weather": "Thunderstorms · Rain Showers",
      "diveOutlook": "Favorable",
      "conditionScore": 78
    }
  ],
  "alerts": [],
  "model": {
    "id": "jupiter-offshore-v0.1",
    "label": "Experimental Jupiter offshore visibility model",
    "experimental": true,
    "disclaimer": "Modeled estimate—not a direct underwater visibility sensor reading.",
    "score": 66,
    "confidence": "medium",
    "dataCompleteness": 1,
    "inputs": [
      {
        "id": "waves",
        "label": "Offshore wave height",
        "weight": 0.42,
        "value": 1.3,
        "unit": "ft",
        "score": 80,
        "source": "NDBC wave buoy",
        "available": true
      },
      {
        "id": "wind",
        "label": "Wind speed and direction",
        "weight": 0.24,
        "value": 12.1,
        "secondaryValue": 100,
        "unit": "kt",
        "score": 57,
        "source": "NDBC Lake Worth Pier",
        "available": true
      },
      {
        "id": "tide",
        "label": "Tide phase / time to high",
        "weight": 0.18,
        "value": "falling",
        "secondaryValue": 652,
        "unit": "minutes-to-high",
        "score": 52,
        "source": "NOAA CO-OPS",
        "available": true
      },
      {
        "id": "thunder",
        "label": "Thunderstorm probability",
        "weight": 0.16,
        "value": 33,
        "unit": "%",
        "score": 59,
        "source": "NWS marine grid",
        "available": true
      }
    ],
    "weights": {
      "waves": 0.42,
      "wind": 0.24,
      "tide": 0.18,
      "thunder": 0.16
    },
    "placeholders": [
      {
        "id": "rainfall-runoff-24h",
        "label": "24-hour rainfall and runoff",
        "status": "not-connected",
        "proposedWeight": 0.14,
        "note": "Connect a local rain gauge or USGS source, then recalibrate all active weights."
      },
      {
        "id": "diver-reports",
        "label": "Recent verified diver reports",
        "status": "not-connected",
        "proposedWeight": 0.25,
        "note": "The most important future calibration input; never scrape community sites without permission."
      },
      {
        "id": "camera-water-color",
        "label": "Inlet camera water-color signal",
        "status": "not-connected",
        "proposedWeight": 0.1,
        "note": "Requires a licensed camera feed and a validated clarity classifier."
      },
      {
        "id": "satellite-turbidity",
        "label": "Satellite turbidity / chlorophyll proxy",
        "status": "not-connected",
        "proposedWeight": 0.12,
        "note": "Use as a proxy only; near-shore ocean-color retrievals require careful quality control."
      }
    ],
    "calibrationNote": "Ranges are conservative placeholders until matched against time-aligned local diver reports."
  },
  "sources": [
    {
      "id": "coops-tides",
      "name": "NOAA CO-OPS tide predictions",
      "agency": "NOAA CO-OPS",
      "stationId": "8722495",
      "stationName": "Jupiter Inlet, south jetty",
      "url": "https://tidesandcurrents.noaa.gov/noaatidepredictions.html?id=8722495",
      "fetchedAt": "2026-08-27T01:41:52.193Z",
      "observedAt": null,
      "validThrough": "2026-08-30T20:19:00.000Z",
      "timestampType": "prediction-validity",
      "ageMinutes": null,
      "staleAfterMinutes": null,
      "stale": false,
      "status": "fresh",
      "note": "Astronomical predictions; heights use MLLW and times are normalized to UTC."
    },
    {
      "id": "ndbc-met",
      "name": "Lake Worth Pier observations",
      "agency": "NOAA NDBC / NOS",
      "stationId": "LKWF1",
      "stationName": "Lake Worth Pier, FL",
      "url": "https://www.ndbc.noaa.gov/station_page.php?station=LKWF1",
      "fetchedAt": "2026-08-27T01:41:52.193Z",
      "observedAt": "2026-08-27T00:54:00.000Z",
      "validThrough": null,
      "timestampType": "observation",
      "ageMinutes": 48,
      "staleAfterMinutes": 120,
      "stale": false,
      "status": "fresh",
      "note": null
    },
    {
      "id": "ndbc-waves",
      "name": "Nearby offshore wave observations",
      "agency": "NOAA National Data Buoy Center",
      "stationId": "41122",
      "stationName": "Hollywood Beach, FL",
      "url": "https://www.ndbc.noaa.gov/station_page.php?station=41122",
      "fetchedAt": "2026-08-27T01:41:52.193Z",
      "observedAt": "2026-08-27T01:00:00.000Z",
      "validThrough": null,
      "timestampType": "observation",
      "ageMinutes": 42,
      "staleAfterMinutes": 150,
      "stale": false,
      "status": "fresh",
      "note": "Fallback station selected because the preferred Fort Pierce feed was unavailable or stale.",
      "fallbackUsed": true,
      "distanceMiles": 65
    },
    {
      "id": "nws-marine",
      "name": "NWS coastal marine grid forecast",
      "agency": "NOAA / National Weather Service",
      "stationId": "MFL/111,102",
      "stationName": "Coastal waters from Jupiter Inlet to Deerfield Beach",
      "url": "https://marine.weather.gov/MapClick.php?lat=26.9342&lon=-80.0250",
      "fetchedAt": "2026-08-27T01:41:52.193Z",
      "observedAt": "2026-08-26T20:16:42+00:00",
      "validThrough": "2026-09-03T01:00:00.000Z",
      "timestampType": "forecast-issued",
      "ageMinutes": 325,
      "staleAfterMinutes": 360,
      "stale": false,
      "status": "fresh",
      "note": null
    },
    {
      "id": "nws-alerts",
      "name": "NWS active alerts",
      "agency": "NOAA / National Weather Service",
      "stationId": "AMZ650 / point 26.9342,-80.0250",
      "stationName": "Jupiter coastal waters",
      "url": "https://www.weather.gov/mfl/",
      "fetchedAt": "2026-08-27T01:41:52.193Z",
      "observedAt": null,
      "validThrough": null,
      "timestampType": "retrieved",
      "ageMinutes": null,
      "staleAfterMinutes": 30,
      "stale": false,
      "status": "fresh",
      "note": "No active alerts returned for the offshore point."
    }
  ],
  "errors": [],
  "safety": {
    "message": "Planning aid only. A GO verdict means configured condition thresholds are met; it is not a guarantee of safe diving.",
    "verify": [
      "NWS marine forecast and alerts",
      "Local inlet and current conditions",
      "Dive operator guidance",
      "Personal training and limits"
    ]
  }
}