{
  "schemaVersion": "2.0",
  "generatedAt": "2026-08-27T22:38:01.106Z",
  "cacheTtlSeconds": 300,
  "status": "fresh",
  "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": 45,
      "highFt": 65,
      "label": "45–65 ft",
      "score": 82,
      "confidence": "medium",
      "modeled": true,
      "modelId": "florida-visibility-v0.2",
      "disclaimer": "Modeled estimate—not a direct underwater visibility sensor reading."
    },
    "zoneComparison": {
      "offshore": {
        "lowFt": 45,
        "highFt": 65,
        "label": "45–65 ft",
        "score": 82,
        "confidence": "medium",
        "modeled": true,
        "modelId": "florida-visibility-v0.2",
        "disclaimer": "Modeled estimate—not a direct underwater visibility sensor reading."
      },
      "beach": {
        "lowFt": 15,
        "highFt": 25,
        "label": "15–25 ft",
        "score": 76,
        "confidence": "medium",
        "modeled": true,
        "modelId": "florida-visibility-v0.2",
        "disclaimer": "Modeled estimate—not a direct underwater visibility sensor reading."
      }
    },
    "nextHighTide": {
      "time": "2026-08-28T01:01:00.000Z",
      "heightFt": 2.928,
      "type": "high"
    },
    "nextLowTide": {
      "time": "2026-08-28T06:45:00.000Z",
      "heightFt": 0.471,
      "type": "low"
    },
    "waveHeightFt": 1.5,
    "verdict": {
      "code": "GO",
      "label": "GO",
      "worthTheDrive": true,
      "safetyOverride": false,
      "reason": "The experimental visibility and surface-condition thresholds are met."
    },
    "freshness": {
      "status": "fresh",
      "freshSources": 6,
      "staleSources": 0,
      "unavailableSources": 0,
      "totalSources": 6
    }
  },
  "conditions": {
    "waves": {
      "heightFt": 1.5,
      "dominantPeriodSeconds": 7,
      "meanDirectionDegrees": 81,
      "meanDirectionCardinal": "E",
      "observedAt": "2026-08-27T22:30:00.000Z",
      "source": "Open-Meteo marine model fallback"
    },
    "wind": {
      "speedKnots": 2.9,
      "gustKnots": 4.1,
      "directionDegrees": 130,
      "directionCardinal": "SE",
      "observedAt": "2026-08-27T21:54:00.000Z",
      "source": "NOAA NDBC LKWF1"
    },
    "waterTemperatureF": 87.3,
    "airTemperatureF": 85.8,
    "tides": {
      "stationId": "8722495",
      "stationName": "Jupiter Inlet, south jetty",
      "datum": "MLLW",
      "phase": "rising",
      "previous": {
        "time": "2026-08-27T18:23:00.000Z",
        "heightFt": 0.335,
        "type": "low"
      },
      "next": {
        "time": "2026-08-28T01:01:00.000Z",
        "heightFt": 2.928,
        "type": "high"
      },
      "nextHigh": {
        "time": "2026-08-28T01:01:00.000Z",
        "heightFt": 2.928,
        "type": "high"
      },
      "nextLow": {
        "time": "2026-08-28T06:45:00.000Z",
        "heightFt": 0.471,
        "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-27T22:38:01.106Z",
      "waveHeightFt": 1,
      "dominantPeriodSeconds": 15,
      "meanWaveDirectionDeg": null,
      "windSpeedKt": 7,
      "windGustKt": 10,
      "windDirectionDeg": 150,
      "thunderProbabilityPct": 27,
      "weather": "Thunderstorms · Rain Showers"
    }
  },
  "forecast": [
    {
      "date": "2026-08-27",
      "label": "Today",
      "maxWaveHeightFt": 1,
      "dominantPeriodSeconds": 15,
      "maxWindKnots": 7,
      "windDirectionCardinal": "SE",
      "maxThunderProbabilityPct": 27,
      "weather": "Thunderstorms · Rain Showers",
      "diveOutlook": "Favorable",
      "conditionScore": 83
    },
    {
      "date": "2026-08-28",
      "label": "Fri",
      "maxWaveHeightFt": 1,
      "dominantPeriodSeconds": 14,
      "maxWindKnots": 8,
      "windDirectionCardinal": "SE",
      "maxThunderProbabilityPct": 22,
      "weather": "Thunderstorms · Rain Showers",
      "diveOutlook": "Favorable",
      "conditionScore": 84
    },
    {
      "date": "2026-08-29",
      "label": "Sat",
      "maxWaveHeightFt": 2,
      "dominantPeriodSeconds": 12,
      "maxWindKnots": 9,
      "windDirectionCardinal": "SE",
      "maxThunderProbabilityPct": 51,
      "weather": "Thunderstorms · Rain Showers",
      "diveOutlook": "Mixed",
      "conditionScore": 63
    }
  ],
  "alerts": [],
  "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": 82,
    "confidence": "medium",
    "dataCompleteness": 1,
    "inputs": [
      {
        "id": "waves",
        "label": "Offshore wave height",
        "weight": 0.42,
        "value": 1.5,
        "unit": "ft",
        "score": 78,
        "source": "Marine observation/model",
        "available": true
      },
      {
        "id": "wind",
        "label": "Wind speed and direction",
        "weight": 0.24,
        "value": 2.9,
        "secondaryValue": 130,
        "unit": "kt",
        "score": 96,
        "source": "Marine observation/model",
        "available": true
      },
      {
        "id": "tide",
        "label": "Tide phase / time to high",
        "weight": 0.18,
        "value": "rising",
        "secondaryValue": 143,
        "unit": "minutes-to-high",
        "score": 84,
        "source": "NOAA CO-OPS",
        "available": true
      },
      {
        "id": "thunder",
        "label": "Thunderstorm probability",
        "weight": 0.16,
        "value": 27,
        "unit": "%",
        "score": 66,
        "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-08-27T22:38:01.106Z",
      "observedAt": null,
      "validThrough": "2026-08-30T20:19: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-08-27T22:38:01.106Z",
      "observedAt": "2026-08-27T21:54:00.000Z",
      "validThrough": null,
      "timestampType": "observation",
      "ageMinutes": 44,
      "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-08-27T22:38:01.106Z",
      "observedAt": "2026-08-27T21:54:00.000Z",
      "validThrough": null,
      "timestampType": "observation",
      "ageMinutes": 44,
      "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-08-27T22:38:01.106Z",
      "observedAt": "2026-08-27T19:56:46+00:00",
      "validThrough": "2026-09-04T01:00:00.000Z",
      "timestampType": "forecast-issued",
      "ageMinutes": 161,
      "staleAfterMinutes": 360,
      "stale": false,
      "required": true,
      "status": "fresh",
      "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-08-27T22:38:01.106Z",
      "observedAt": "2026-08-27T22:30:00.000Z",
      "validThrough": null,
      "timestampType": "model-current",
      "ageMinutes": 8,
      "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-08-27T22:38:01.106Z",
      "observedAt": null,
      "validThrough": null,
      "timestampType": "retrieved",
      "ageMinutes": null,
      "staleAfterMinutes": 30,
      "stale": false,
      "required": true,
      "status": "fresh",
      "note": "No active alerts returned for 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"
    ]
  }
}