{
  "schemaVersion": "2.0",
  "generatedAt": "2026-10-25T03:51:14.274Z",
  "cacheTtlSeconds": 300,
  "status": "partial",
  "location": {
    "id": "jupiter",
    "name": "Jupiter",
    "region": "Palm Beach County, Florida",
    "country": "US",
    "latitude": 26.9342,
    "longitude": -80.025,
    "tideStation": "8722495",
    "tideName": "Jupiter Inlet, south jetty",
    "zone": "offshore",
    "zoneLabel": "Offshore / reef"
  },
  "availableLocations": [
    {
      "id": "jupiter",
      "name": "Jupiter",
      "region": "Palm Beach County, Florida",
      "country": "US",
      "latitude": 26.9342,
      "longitude": -80.025,
      "tideStation": "8722495"
    },
    {
      "id": "palm-beach",
      "name": "Palm Beach",
      "region": "Palm Beach County, Florida",
      "country": "US",
      "latitude": 26.7041,
      "longitude": -80.0326,
      "tideStation": "8722588"
    },
    {
      "id": "fort-lauderdale",
      "name": "Fort Lauderdale",
      "region": "Broward County, Florida",
      "country": "US",
      "latitude": 26.107,
      "longitude": -80.086,
      "tideStation": "8722956"
    },
    {
      "id": "lauderdale-by-the-sea",
      "name": "Lauderdale-by-the-Sea",
      "region": "Broward County, Florida",
      "country": "US",
      "latitude": 26.1895,
      "longitude": -80.0928,
      "tideStation": "8722899"
    },
    {
      "id": "key-largo",
      "name": "Key Largo",
      "region": "Monroe County, Florida",
      "country": "US",
      "latitude": 25.0865,
      "longitude": -80.313,
      "tideStation": "8723651"
    },
    {
      "id": "naples",
      "name": "Naples",
      "region": "Collier County, Florida",
      "country": "US",
      "latitude": 26.1311,
      "longitude": -81.8075,
      "tideStation": "8725110"
    },
    {
      "id": "fort-myers",
      "name": "Fort Myers",
      "region": "Lee County, Florida",
      "country": "US",
      "latitude": 26.452,
      "longitude": -81.965,
      "tideStation": "8725366"
    },
    {
      "id": "bimini",
      "name": "Bimini",
      "region": "The Bahamas",
      "country": "BS",
      "latitude": 25.7244,
      "longitude": -79.2972,
      "tideStation": null
    }
  ],
  "availableZones": [
    {
      "id": "offshore",
      "name": "Offshore / reef",
      "sampleDepth": "Reefs and open water beyond the beach zone"
    },
    {
      "id": "beach",
      "name": "Beach / shore",
      "sampleDepth": "Surf zone, pier and near-shore water"
    }
  ],
  "summary": {
    "visibility": {
      "lowFt": 15,
      "highFt": 35,
      "label": "15–35 ft",
      "score": 27,
      "confidence": "medium",
      "modeled": true,
      "modelId": "florida-visibility-v0.2",
      "disclaimer": "Modeled estimate—not a direct underwater visibility sensor reading."
    },
    "zoneComparison": {
      "offshore": {
        "lowFt": 15,
        "highFt": 35,
        "label": "15–35 ft",
        "score": 27,
        "confidence": "medium",
        "modeled": true,
        "modelId": "florida-visibility-v0.2",
        "disclaimer": "Modeled estimate—not a direct underwater visibility sensor reading."
      },
      "beach": {
        "lowFt": 2,
        "highFt": 12,
        "label": "2–12 ft",
        "score": 19,
        "confidence": "medium",
        "modeled": true,
        "modelId": "florida-visibility-v0.2",
        "disclaimer": "Modeled estimate—not a direct underwater visibility sensor reading."
      }
    },
    "nextHighTide": {
      "time": "2026-10-25T12:23:00.000Z",
      "heightFt": 3.459,
      "type": "high"
    },
    "nextLowTide": {
      "time": "2026-10-25T05:37:00.000Z",
      "heightFt": 0.279,
      "type": "low"
    },
    "waveHeightFt": 6.4,
    "verdict": {
      "code": "NO_GO",
      "label": "NO GO",
      "worthTheDrive": false,
      "safetyOverride": true,
      "reason": "Small Craft Advisory"
    },
    "freshness": {
      "status": "partial",
      "freshSources": 5,
      "staleSources": 1,
      "unavailableSources": 0,
      "totalSources": 6
    }
  },
  "conditions": {
    "waves": {
      "heightFt": 6.4,
      "dominantPeriodSeconds": 8.2,
      "meanDirectionDegrees": 30,
      "meanDirectionCardinal": "NE",
      "observedAt": "2026-10-25T03:45:00.000Z",
      "source": "Open-Meteo marine model fallback"
    },
    "wind": {
      "speedKnots": 17.1,
      "gustKnots": 19,
      "directionDegrees": 30,
      "directionCardinal": "NE",
      "observedAt": "2026-10-25T03:00:00.000Z",
      "source": "NOAA NDBC LKWF1"
    },
    "waterTemperatureF": 79.9,
    "airTemperatureF": 78.8,
    "tides": {
      "stationId": "8722495",
      "stationName": "Jupiter Inlet, south jetty",
      "datum": "MLLW",
      "phase": "falling",
      "previous": {
        "time": "2026-10-24T23:46:00.000Z",
        "heightFt": 3.168,
        "type": "high"
      },
      "next": {
        "time": "2026-10-25T05:37:00.000Z",
        "heightFt": 0.279,
        "type": "low"
      },
      "nextHigh": {
        "time": "2026-10-25T12:23:00.000Z",
        "heightFt": 3.459,
        "type": "high"
      },
      "nextLow": {
        "time": "2026-10-25T05:37:00.000Z",
        "heightFt": 0.279,
        "type": "low"
      },
      "predictions": [
        {
          "time": "2026-10-24T04:56:00.000Z",
          "heightFt": 0.543,
          "type": "low"
        },
        {
          "time": "2026-10-24T11:37:00.000Z",
          "heightFt": 3.304,
          "type": "high"
        },
        {
          "time": "2026-10-24T17:23:00.000Z",
          "heightFt": 0.819,
          "type": "low"
        },
        {
          "time": "2026-10-24T23:46:00.000Z",
          "heightFt": 3.168,
          "type": "high"
        },
        {
          "time": "2026-10-25T05:37:00.000Z",
          "heightFt": 0.279,
          "type": "low"
        },
        {
          "time": "2026-10-25T12:23:00.000Z",
          "heightFt": 3.459,
          "type": "high"
        },
        {
          "time": "2026-10-25T18:06:00.000Z",
          "heightFt": 0.72,
          "type": "low"
        },
        {
          "time": "2026-10-26T00:30:00.000Z",
          "heightFt": 3.24,
          "type": "high"
        },
        {
          "time": "2026-10-26T06:20:00.000Z",
          "heightFt": 0.08,
          "type": "low"
        },
        {
          "time": "2026-10-26T13:09:00.000Z",
          "heightFt": 3.553,
          "type": "high"
        },
        {
          "time": "2026-10-26T18:50:00.000Z",
          "heightFt": 0.678,
          "type": "low"
        },
        {
          "time": "2026-10-27T01:14:00.000Z",
          "heightFt": 3.278,
          "type": "high"
        },
        {
          "time": "2026-10-27T07:05:00.000Z",
          "heightFt": -0.027,
          "type": "low"
        },
        {
          "time": "2026-10-27T13:57:00.000Z",
          "heightFt": 3.574,
          "type": "high"
        },
        {
          "time": "2026-10-27T19:36:00.000Z",
          "heightFt": 0.699,
          "type": "low"
        },
        {
          "time": "2026-10-28T02:01:00.000Z",
          "heightFt": 3.276,
          "type": "high"
        },
        {
          "time": "2026-10-28T07:52:00.000Z",
          "heightFt": -0.029,
          "type": "low"
        },
        {
          "time": "2026-10-28T14:46:00.000Z",
          "heightFt": 3.525,
          "type": "high"
        },
        {
          "time": "2026-10-28T20:24:00.000Z",
          "heightFt": 0.78,
          "type": "low"
        }
      ]
    },
    "marineForecast": {
      "validAt": "2026-10-25T03:51:14.274Z",
      "waveHeightFt": 5,
      "dominantPeriodSeconds": 10,
      "meanWaveDirectionDeg": null,
      "windSpeedKt": 16,
      "windGustKt": 18,
      "windDirectionDeg": 50,
      "thunderProbabilityPct": 23,
      "weather": "Rain Showers · Thunderstorms"
    }
  },
  "forecast": [
    {
      "date": "2026-10-24",
      "label": "Today",
      "maxWaveHeightFt": 5,
      "dominantPeriodSeconds": 10,
      "maxWindKnots": 16,
      "windDirectionCardinal": "NE",
      "maxThunderProbabilityPct": 23,
      "weather": "Rain Showers · Thunderstorms",
      "diveOutlook": "Poor",
      "conditionScore": 42
    },
    {
      "date": "2026-10-25",
      "label": "Sun",
      "maxWaveHeightFt": 11,
      "dominantPeriodSeconds": 10,
      "maxWindKnots": 26,
      "windDirectionCardinal": "NE",
      "maxThunderProbabilityPct": 33,
      "weather": "Rain Showers · Thunderstorms",
      "diveOutlook": "Poor",
      "conditionScore": 30
    },
    {
      "date": "2026-10-26",
      "label": "Mon",
      "maxWaveHeightFt": 12,
      "dominantPeriodSeconds": 11,
      "maxWindKnots": 29,
      "windDirectionCardinal": "NE",
      "maxThunderProbabilityPct": 20,
      "weather": "Rain Showers · Thunderstorms",
      "diveOutlook": "Poor",
      "conditionScore": 35
    }
  ],
  "alerts": [
    {
      "id": "https://api.weather.gov/alerts/urn:oid:2.49.0.1.840.0.bcc6d3536cf4186199b06ac4aeb5b39d6a758cb5.001.1",
      "event": "Small Craft Advisory",
      "headline": "Small Craft Advisory issued October 24 at 3:21PM EDT until October 25 at 2:00PM EDT by NWS Miami FL",
      "severity": "Minor",
      "urgency": "Expected",
      "certainty": "Likely",
      "sentAt": "2026-10-24T15:21:00-04:00",
      "effectiveAt": "2026-10-24T15:21:00-04:00",
      "expiresAt": "2026-10-25T04:00:00-04:00",
      "url": "https://api.weather.gov/alerts/urn:oid:2.49.0.1.840.0.bcc6d3536cf4186199b06ac4aeb5b39d6a758cb5.001.1",
      "safetyOverride": true
    },
    {
      "id": "https://api.weather.gov/alerts/urn:oid:2.49.0.1.840.0.bcc6d3536cf4186199b06ac4aeb5b39d6a758cb5.001.2",
      "event": "Gale Watch",
      "headline": "Gale Watch issued October 24 at 3:21PM EDT until October 26 at 8:00PM EDT by NWS Miami FL",
      "severity": "Moderate",
      "urgency": "Future",
      "certainty": "Possible",
      "sentAt": "2026-10-24T15:21:00-04:00",
      "effectiveAt": "2026-10-24T15:21:00-04:00",
      "expiresAt": "2026-10-25T04:00:00-04:00",
      "url": "https://api.weather.gov/alerts/urn:oid:2.49.0.1.840.0.bcc6d3536cf4186199b06ac4aeb5b39d6a758cb5.001.2",
      "safetyOverride": true
    }
  ],
  "model": {
    "id": "florida-visibility-v0.2-offshore",
    "label": "Experimental Florida visibility model · Offshore / reef",
    "experimental": true,
    "disclaimer": "Modeled estimate—not a direct underwater visibility sensor reading.",
    "score": 27,
    "confidence": "medium",
    "dataCompleteness": 1,
    "inputs": [
      {
        "id": "waves",
        "label": "Offshore wave height",
        "weight": 0.42,
        "value": 6.4,
        "unit": "ft",
        "score": 10,
        "source": "Marine observation/model",
        "available": true
      },
      {
        "id": "wind",
        "label": "Wind speed and direction",
        "weight": 0.24,
        "value": 17.1,
        "secondaryValue": 30,
        "unit": "kt",
        "score": 36,
        "source": "Marine observation/model",
        "available": true
      },
      {
        "id": "tide",
        "label": "Tide phase / time to high",
        "weight": 0.18,
        "value": "falling",
        "secondaryValue": 512,
        "unit": "minutes-to-high",
        "score": 52,
        "source": "NOAA CO-OPS",
        "available": true
      },
      {
        "id": "thunder",
        "label": "Thunderstorm probability",
        "weight": 0.16,
        "value": 23,
        "unit": "%",
        "score": 71,
        "source": "Marine forecast",
        "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 local rain and river-discharge data, then recalibrate the active weights."
      },
      {
        "id": "verified-reports",
        "label": "Verified diver and captain reports",
        "status": "collection-ready",
        "proposedWeight": 0.25,
        "note": "Reports are stored beside the prior prediction so measured error can calibrate future model versions."
      },
      {
        "id": "camera-water-color",
        "label": "Inlet camera water-color signal",
        "status": "not-connected",
        "proposedWeight": 0.1,
        "note": "Requires permission, image-quality checks and a validated clarity classifier."
      },
      {
        "id": "satellite-turbidity",
        "label": "Satellite turbidity / chlorophyll proxy",
        "status": "not-connected",
        "proposedWeight": 0.12,
        "note": "Near-shore ocean-color retrievals require quality control and local validation."
      }
    ],
    "calibrationNote": "Ranges are explicit placeholders until a larger set of time-aligned local reports is collected. Beach estimates apply an added surf-zone and onshore-wind penalty."
  },
  "history": {
    "enabled": true,
    "reportEntryEnabled": false,
    "endpoint": "/api/history?location=jupiter&zone=offshore"
  },
  "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-10-25T03:51:14.274Z",
      "observedAt": null,
      "validThrough": "2026-10-28T20:24:00.000Z",
      "timestampType": "prediction-validity",
      "ageMinutes": null,
      "staleAfterMinutes": null,
      "stale": false,
      "required": false,
      "status": "fresh",
      "note": "Astronomical predictions; heights use MLLW and times are normalized to UTC.",
      "distanceMiles": null
    },
    {
      "id": "ndbc-waves",
      "name": "Nearest NOAA wave observations",
      "agency": "NOAA National Data Buoy Center",
      "stationId": "LKWF1",
      "stationName": "LKWF1",
      "url": "https://www.ndbc.noaa.gov/station_page.php?station=LKWF1",
      "fetchedAt": "2026-10-25T03:51:14.274Z",
      "observedAt": "2026-10-25T03:00:00.000Z",
      "validThrough": null,
      "timestampType": "observation",
      "ageMinutes": 51,
      "staleAfterMinutes": 180,
      "stale": false,
      "required": false,
      "status": "fresh",
      "note": "Nearest recent NDBC/NOS observation with useful marine data; approximately 22 miles from the selected point.",
      "distanceMiles": 22.2
    },
    {
      "id": "ndbc-met",
      "name": "Nearest NOAA wind and water observations",
      "agency": "NOAA National Data Buoy Center",
      "stationId": "LKWF1",
      "stationName": "LKWF1",
      "url": "https://www.ndbc.noaa.gov/station_page.php?station=LKWF1",
      "fetchedAt": "2026-10-25T03:51:14.274Z",
      "observedAt": "2026-10-25T03:00:00.000Z",
      "validThrough": null,
      "timestampType": "observation",
      "ageMinutes": 51,
      "staleAfterMinutes": 180,
      "stale": false,
      "required": false,
      "status": "fresh",
      "note": "Nearest recent NDBC/NOS observation with useful marine data; approximately 22 miles from the selected point.",
      "distanceMiles": 22.2
    },
    {
      "id": "nws-marine",
      "name": "NWS point-resolved marine grid",
      "agency": "NOAA / National Weather Service",
      "stationId": "MFL/111,102",
      "stationName": "NWS grid MFL/111,102",
      "url": "https://marine.weather.gov/MapClick.php?lat=26.9342&lon=-80.025",
      "fetchedAt": "2026-10-25T03:51:14.274Z",
      "observedAt": "2026-10-24T20:02:36+00:00",
      "validThrough": "2026-11-01T01:00:00.000Z",
      "timestampType": "forecast-issued",
      "ageMinutes": 469,
      "staleAfterMinutes": 360,
      "stale": true,
      "required": true,
      "status": "stale",
      "note": null,
      "distanceMiles": null
    },
    {
      "id": "open-meteo-marine",
      "name": "Open-Meteo marine model fallback",
      "agency": "Open-Meteo",
      "stationId": "26.9342,-80.025",
      "stationName": "Jupiter marine model point",
      "url": "https://open-meteo.com/en/docs/marine-weather-api",
      "fetchedAt": "2026-10-25T03:51:14.274Z",
      "observedAt": "2026-10-25T03:45:00.000Z",
      "validThrough": null,
      "timestampType": "model-current",
      "ageMinutes": 6,
      "staleAfterMinutes": 180,
      "stale": false,
      "required": true,
      "status": "fresh",
      "note": "Modeled fallback used when nearby NOAA observations or NWS marine fields are missing.",
      "distanceMiles": null
    },
    {
      "id": "nws-alerts",
      "name": "NWS active alerts",
      "agency": "NOAA / National Weather Service",
      "stationId": "26.9342,-80.025",
      "stationName": "Jupiter point alerts",
      "url": "https://www.weather.gov/",
      "fetchedAt": "2026-10-25T03:51:14.274Z",
      "observedAt": "2026-10-24T15:21:00-04:00",
      "validThrough": "2026-10-25T04:00:00-04:00",
      "timestampType": "retrieved",
      "ageMinutes": 510,
      "staleAfterMinutes": 30,
      "stale": false,
      "required": true,
      "status": "fresh",
      "note": "2 active alert(s) at the selected point.",
      "distanceMiles": null
    }
  ],
  "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"
    ]
  }
}