{
  "schemaVersion": 2,
  "losAngeles": {
    "sources": [
      {
        "name": "CDIP MOP coastal forecast (ECMWF; explicit WW3 fallback)",
        "kind": "spectral coastal significant wave height at about 10 m, not breaking surf",
        "url": "https://www.cdip.ucsd.edu/m/documents/models.html"
      },
      {
        "name": "CDIP MOP coastal nowcast",
        "kind": "buoy-driven coastal prediction for past/current hours only",
        "url": "https://cdip.ucsd.edu/mops/"
      },
      {
        "name": "NWS Los Angeles/Oxnard Surf Zone Forecast",
        "kind": "official breaking-surf forecast",
        "url": "https://tgftp.nws.noaa.gov/data/raw/fz/fzus56.klox.srf.lox.txt"
      },
      {
        "name": "NDBC Santa Monica Bay 46221",
        "kind": "offshore buoy observation",
        "url": "https://www.ndbc.noaa.gov/data/realtime2/46221.txt"
      },
      {
        "name": "NOAA CO-OPS Santa Monica 9410840",
        "kind": "tide prediction",
        "url": "https://api.tidesandcurrents.noaa.gov/api/prod/"
      },
      {
        "name": "Open-Meteo Marine and Weather",
        "kind": "marine-model estimate and wind forecast",
        "url": "https://open-meteo.com/en/docs/marine-weather-api"
      }
    ]
  },
  "coverageCatalog": {
    "counts": {
      "spots": 700,
      "markets": 187,
      "countriesOrTerritories": 76,
      "sources": 73,
      "profiles": 44
    },
    "profiles": {
      "US_CA": {
        "tier": "A",
        "report": "NWS_SRF",
        "observations": "CDIP_THREDDS|NDBC_REALTIME",
        "tides": "NOAA_COOPS",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "California gets unusually strong CDIP buoy and modeled nearshore coverage."
      },
      "US_PNW_OR": {
        "tier": "A",
        "report": "NWS_SRF|NWS_CWF",
        "observations": "NDBC_REALTIME",
        "tides": "NOAA_COOPS",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "Oregon SRF coverage varies by NWS office; preserve zone-level provenance."
      },
      "US_PNW_WA": {
        "tier": "B",
        "report": "NWS_CWF",
        "observations": "NDBC_REALTIME",
        "tides": "NOAA_COOPS",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "No uniformly available spot-level official surf report; use buoy plus model."
      },
      "US_HAWAII": {
        "tier": "A+",
        "report": "NWS_SRF|NWS_HFO_OMR",
        "observations": "PACIOOS_ERDDAP|NDBC_REALTIME|CDIP_THREDDS",
        "tides": "NOAA_COOPS",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "Best non-LA launch region: official shore-facing forecast plus human spot observations and dense buoys."
      },
      "US_EAST": {
        "tier": "A",
        "report": "NWS_SRF",
        "observations": "NDBC_REALTIME",
        "tides": "NOAA_COOPS",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "SRF is usually county/zone based and commonly includes rip risk and surf height."
      },
      "US_GULF": {
        "tier": "A",
        "report": "NWS_SRF",
        "observations": "NDBC_REALTIME",
        "tides": "NOAA_COOPS",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "Wind-sea dominated; freshness and local wind matter more than long-period swell."
      },
      "US_GREAT_LAKES": {
        "tier": "A",
        "report": "NWS_SRF|NWS_NSH",
        "observations": "NDBC_REALTIME",
        "tides": "",
        "model": "OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML",
        "notes": "Use spot-assigned Great Lakes NWS surf-zone or nearshore products; ocean models and astronomical tide products do not apply."
      },
      "US_PR_VI": {
        "tier": "A+",
        "report": "NWS_SRF",
        "observations": "CARICOOS_ERDDAP|NDBC_REALTIME",
        "tides": "NOAA_COOPS",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "CARICOOS provides valuable Rincon and San Juan wave observations."
      },
      "US_PACIFIC_TERRITORIES": {
        "tier": "A",
        "report": "NWS_SRF|NWS_CWF",
        "observations": "PACIOOS_ERDDAP|NDBC_REALTIME|CDIP_THREDDS",
        "tides": "NOAA_COOPS|WORLDTIDES",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML",
        "notes": "PacIOOS has wave buoys in Guam, CNMI, American Samoa, and parts of Micronesia."
      },
      "CANADA": {
        "tier": "B",
        "report": "ECCC_GEOMET",
        "observations": "DFO_CANADIAN_WAVES",
        "tides": "CHS_IWLS",
        "model": "ECCC_GEOMET|OPEN_METEO_MARINE|OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML",
        "notes": "Official observations and tides are strong; break-level surf translation remains your model."
      },
      "MEXICO": {
        "tier": "D",
        "report": "LOCAL_MET_HTML",
        "observations": "THE_BUOY_API",
        "tides": "WORLDTIDES",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER|COPERNICUS_GLOBAL_WAVE",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "Use a model-first implementation; validate any available local buoy or port feed per region."
      },
      "MODEL_FIRST_AMERICAS": {
        "tier": "D",
        "report": "LOCAL_MET_HTML",
        "observations": "THE_BUOY_API",
        "tides": "WORLDTIDES",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER|COPERNICUS_GLOBAL_WAVE",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "No uniform easy national observation API identified; expose model-derived confidence."
      },
      "CHILE": {
        "tier": "C",
        "report": "DIRECTEMAR_SHOA",
        "observations": "DIRECTEMAR_SHOA|THE_BUOY_API",
        "tides": "DIRECTEMAR_SHOA|WORLDTIDES",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER|COPERNICUS_GLOBAL_WAVE",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "Official Chilean marine products improve the model-first baseline."
      },
      "BRAZIL": {
        "tier": "C",
        "report": "CHM_MARINE",
        "observations": "PNBOIA_CHM",
        "tides": "WORLDTIDES",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER|COPERNICUS_GLOBAL_WAVE",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "PNBOIA coverage and station uptime vary; make source freshness explicit."
      },
      "PORTUGAL": {
        "tier": "B",
        "report": "IPMA_MARINE",
        "observations": "IH_PORTUGAL|THE_BUOY_API",
        "tides": "IH_PORTUGAL|WORLDTIDES",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER|COPERNICUS_GLOBAL_WAVE",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "Strong combination of national wave buoys, marine bulletins, and global model data."
      },
      "SPAIN": {
        "tier": "B",
        "report": "PUERTOS_PORTUS",
        "observations": "PUERTOS_PORTUS|THE_BUOY_API",
        "tides": "PUERTOS_PORTUS|WORLDTIDES",
        "model": "PUERTOS_PORTUS|OPEN_METEO_MARINE|OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "PORTUS supplies both measurements and forecasts, including the Canaries."
      },
      "FRANCE": {
        "tier": "B",
        "report": "METEO_FRANCE_WAVES",
        "observations": "CANDHIS|THE_BUOY_API",
        "tides": "SHOM|WORLDTIDES",
        "model": "METEO_FRANCE_WAVES|OPEN_METEO_MARINE|OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "CANDHIS includes metropolitan and overseas nearshore stations."
      },
      "UK": {
        "tier": "B",
        "report": "LOCAL_MET_HTML",
        "observations": "CEFAS_WAVENET|UK_NCM_REALTIME",
        "tides": "UKHO_TIDES|WORLDTIDES",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER|COPERNICUS_GLOBAL_WAVE",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "Observation-rich; use Cefas and coastal observatories, then your own spot transform."
      },
      "IRELAND": {
        "tier": "B",
        "report": "MET_EIREANN_MARINE",
        "observations": "IRELAND_ERDDAP",
        "tides": "WORLDTIDES",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER|COPERNICUS_GLOBAL_WAVE",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "Marine Institute ERDDAP is one of the easiest European buoy feeds."
      },
      "NORTH_EUROPE": {
        "tier": "C",
        "report": "LOCAL_MET_HTML",
        "observations": "THE_BUOY_API",
        "tides": "WORLDTIDES",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER|COPERNICUS_GLOBAL_WAVE",
        "fallback": "SURF_FORECAST_HTML",
        "notes": "Add national sources where convenient; use a consistent model-first core."
      },
      "ICELAND": {
        "tier": "B",
        "report": "LOCAL_MET_HTML",
        "observations": "VEGAGERDIN_BUOYS|THE_BUOY_API",
        "tides": "WORLDTIDES",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER|COPERNICUS_GLOBAL_WAVE",
        "fallback": "SURF_FORECAST_HTML",
        "notes": "Wave buoy observations improve confidence at exposed Icelandic breaks."
      },
      "NORWAY": {
        "tier": "C",
        "report": "MET_NORWAY_OCEAN",
        "observations": "THE_BUOY_API",
        "tides": "WORLDTIDES",
        "model": "MET_NORWAY_OCEAN|OPEN_METEO_MARINE|OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML",
        "notes": "Use MET Norway for the official model layer and Open-Meteo for normalized queries."
      },
      "ITALY": {
        "tier": "C",
        "report": "LOCAL_MET_HTML",
        "observations": "ISPRA_WAVES|THE_BUOY_API",
        "tides": "ISPRA_WAVES|WORLDTIDES",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER|COPERNICUS_GLOBAL_WAVE",
        "fallback": "SURF_FORECAST_HTML",
        "notes": "Mediterranean surf is event-driven; display low confidence when swell is below model resolution."
      },
      "MEDITERRANEAN_MODEL": {
        "tier": "D",
        "report": "LOCAL_MET_HTML",
        "observations": "THE_BUOY_API",
        "tides": "WORLDTIDES",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER|COPERNICUS_GLOBAL_WAVE",
        "fallback": "SURF_FORECAST_HTML",
        "notes": "Model-first; short-period local wind seas require careful coastal wind handling."
      },
      "MOROCCO": {
        "tier": "D",
        "report": "LOCAL_MET_HTML",
        "observations": "THE_BUOY_API",
        "tides": "WORLDTIDES",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER|COPERNICUS_GLOBAL_WAVE",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "Strong Atlantic model signal but limited easy public nearshore observations."
      },
      "SOUTH_AFRICA": {
        "tier": "B",
        "report": "SAWS_MARINE",
        "observations": "CSIR_WAVENET",
        "tides": "SANHO_TIDES|WORLDTIDES",
        "model": "SAWS_MARINE|OPEN_METEO_MARINE|OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "CSIR station HTML plus SAWS forecasts form a credible regional stack."
      },
      "MODEL_FIRST_AFRICA": {
        "tier": "D",
        "report": "LOCAL_MET_HTML",
        "observations": "THE_BUOY_API",
        "tides": "WORLDTIDES",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER|COPERNICUS_GLOBAL_WAVE",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "Use national warnings where available, otherwise model-derived conditions with explicit confidence."
      },
      "FRENCH_OVERSEAS": {
        "tier": "B",
        "report": "METEO_FRANCE_WAVES",
        "observations": "CANDHIS",
        "tides": "SHOM|WORLDTIDES",
        "model": "METEO_FRANCE_WAVES|OPEN_METEO_MARINE|OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "French overseas territories can reuse the France adapters."
      },
      "JAPAN": {
        "tier": "B",
        "report": "JMA_WAVES",
        "observations": "NOWPHAS",
        "tides": "NOWPHAS|WORLDTIDES",
        "model": "JMA_WAVES|OPEN_METEO_MARINE|OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "Excellent national observations; Japanese interface and station mapping add implementation work."
      },
      "TAIWAN": {
        "tier": "B",
        "report": "CWA_OPEN_DATA",
        "observations": "CWA_OPEN_DATA",
        "tides": "CWA_OPEN_DATA|WORLDTIDES",
        "model": "CWA_OPEN_DATA|OPEN_METEO_MARINE|OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML",
        "notes": "CWA open-data catalog can supply both model and observation fields."
      },
      "KOREA": {
        "tier": "C",
        "report": "LOCAL_MET_HTML",
        "observations": "KHOA_OCEANGRID",
        "tides": "KHOA_OCEANGRID|WORLDTIDES",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML",
        "notes": "KHOA is strongest for tide/current/sea-level; use global wave model for surf inputs."
      },
      "INDONESIA": {
        "tier": "C",
        "report": "BMKG_OFS",
        "observations": "THE_BUOY_API",
        "tides": "BMKG_OFS|WORLDTIDES",
        "model": "BMKG_OFS|OPEN_METEO_MARINE|OPEN_METEO_WEATHER|COPERNICUS_GLOBAL_WAVE",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "BMKG supplies official model maps and warnings; individual reef translation remains spot-specific."
      },
      "PHILIPPINES": {
        "tier": "C",
        "report": "PAGASA_MARINE",
        "observations": "THE_BUOY_API",
        "tides": "WORLDTIDES",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER|COPERNICUS_GLOBAL_WAVE",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "PAGASA is regional; Open-Meteo/Copernicus provide the point forecast."
      },
      "INDIA": {
        "tier": "C",
        "report": "INCOIS_OSF",
        "observations": "INCOIS_OSF",
        "tides": "WORLDTIDES",
        "model": "INCOIS_OSF|OPEN_METEO_MARINE|OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML",
        "notes": "INCOIS offers a strong official model suite; some observation products are visualization-only."
      },
      "MODEL_FIRST_ASIA": {
        "tier": "D",
        "report": "LOCAL_MET_HTML",
        "observations": "THE_BUOY_API",
        "tides": "WORLDTIDES",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER|COPERNICUS_GLOBAL_WAVE",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "Use global model plus national warning text and clearly mark estimated surf height."
      },
      "AU_QLD": {
        "tier": "B",
        "report": "BOM_MARINE",
        "observations": "QLD_WAVES|AODN_IMOS",
        "tides": "WORLDTIDES",
        "model": "BOM_MARINE|OPEN_METEO_MARINE|OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "Queensland current-wave table is technically straightforward."
      },
      "AU_NSW": {
        "tier": "B",
        "report": "BOM_MARINE",
        "observations": "NSW_MHL|AODN_IMOS",
        "tides": "NSW_MHL|WORLDTIDES",
        "model": "BOM_MARINE|OPEN_METEO_MARINE|OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "MHL supplies a strong seven-site observation spine."
      },
      "AU_WA": {
        "tier": "B",
        "report": "BOM_MARINE",
        "observations": "WA_DOT_WAVES|AODN_IMOS",
        "tides": "WA_DOT_WAVES|WORLDTIDES",
        "model": "BOM_MARINE|OPEN_METEO_MARINE|OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "WA Transport has near-real-time wave and tide station pages."
      },
      "AU_OTHER": {
        "tier": "C",
        "report": "BOM_MARINE",
        "observations": "AODN_IMOS",
        "tides": "WORLDTIDES",
        "model": "BOM_MARINE|OPEN_METEO_MARINE|OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "State/regional buoy sources can be added after launch."
      },
      "NEW_ZEALAND": {
        "tier": "B",
        "report": "METSERVICE_SURF",
        "observations": "NZ_REGIONAL_BUOYS",
        "tides": "NIWA_TIDE_API|LINZ_TIDES",
        "model": "METSERVICE_SURF|OPEN_METEO_MARINE|OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "MetService public surf HTML is unusually close to the desired UI."
      },
      "PACIFIC_PACIOOS": {
        "tier": "B",
        "report": "LOCAL_MET_HTML",
        "observations": "PACIOOS_ERDDAP|CDIP_THREDDS",
        "tides": "WORLDTIDES|NOAA_COOPS",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "PacIOOS wave buoys substantially improve selected Pacific islands."
      },
      "PACIFIC_FRENCH": {
        "tier": "B",
        "report": "METEO_FRANCE_WAVES",
        "observations": "CANDHIS|THE_BUOY_API",
        "tides": "SHOM|WORLDTIDES",
        "model": "METEO_FRANCE_WAVES|OPEN_METEO_MARINE|OPEN_METEO_WEATHER",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "Reuse French national and overseas adapters."
      },
      "PACIFIC_MODEL": {
        "tier": "D",
        "report": "LOCAL_MET_HTML",
        "observations": "THE_BUOY_API",
        "tides": "WORLDTIDES",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER|COPERNICUS_GLOBAL_WAVE",
        "fallback": "SURF_FORECAST_HTML|SURFLINE_HTML",
        "notes": "Model-first; add local met-office bulletins and any community buoy as independent layers."
      },
      "US_ALASKA": {
        "tier": "B",
        "report": "NWS_CWF|NWS_MWW",
        "observations": "NDBC_REALTIME",
        "tides": "NOAA_COOPS|WORLDTIDES",
        "model": "OPEN_METEO_MARINE|OPEN_METEO_WEATHER|COPERNICUS_GLOBAL_WAVE",
        "fallback": "SURF_FORECAST_HTML",
        "notes": "No uniform break-level surf product. Use Alaska coastal forecasts, nearby NDBC stations where available, tides, and a model-derived spot transform."
      }
    },
    "sources": [
      {
        "code": "OPEN_METEO_MARINE",
        "name": "Open-Meteo Marine API",
        "coverage": "Global ocean points",
        "role": "Wave and swell model forecast; SST",
        "access": "Public HTTPS; query by latitude/longitude",
        "format": "JSON",
        "endpoint": "https://marine-api.open-meteo.com/v1/marine",
        "docs_url": "https://open-meteo.com/en/docs/marine-weather-api",
        "difficulty": "Easy",
        "notes": "Best universal baseline. Model-grid data, not measured breaking surf."
      },
      {
        "code": "OPEN_METEO_WEATHER",
        "name": "Open-Meteo Weather API",
        "coverage": "Global",
        "role": "Wind, gusts, weather",
        "access": "Public HTTPS; query by latitude/longitude",
        "format": "JSON",
        "endpoint": "https://api.open-meteo.com/v1/forecast",
        "docs_url": "https://open-meteo.com/en/docs",
        "difficulty": "Easy",
        "notes": "Use at the spot coordinate or a nearby exposed coastal point."
      },
      {
        "code": "COPERNICUS_GLOBAL_WAVE",
        "name": "Copernicus Marine Global Ocean Waves",
        "coverage": "Global ocean",
        "role": "Independent wave-model backend and cross-check",
        "access": "Account plus Copernicus Marine Toolbox",
        "format": "NetCDF/Zarr",
        "endpoint": "GLOBAL_ANALYSISFORECAST_WAV_001_027",
        "docs_url": "https://data.marine.copernicus.eu/product/GLOBAL_ANALYSISFORECAST_WAV_001_027/description",
        "difficulty": "Moderate",
        "notes": "1/12 degree, 3-hourly fields, total sea plus wind-wave and swell partitions."
      },
      {
        "code": "WORLDTIDES",
        "name": "WorldTides API",
        "coverage": "Global coasts",
        "role": "Tide predictions and station lookup",
        "access": "API key",
        "format": "JSON",
        "endpoint": "https://www.worldtides.info/api/v3",
        "docs_url": "https://www.worldtides.info/",
        "difficulty": "Easy",
        "notes": "Use when a national tide API is unavailable or inconvenient."
      },
      {
        "code": "SHN_TIDES",
        "name": "Servicio de Hidrografía Naval tide tables",
        "coverage": "Individually checked Argentine tide stations",
        "role": "Official astronomical high and low water predictions",
        "access": "Public monthly HTML table via form POST",
        "format": "HTML",
        "endpoint": "https://www.hidro.gov.ar/oceanografia/tmareas/RE_TablasDeMarea.asp",
        "docs_url": "https://www.hidro.gov.ar/oceanografia/tmareas/form_tmareas.asp",
        "difficulty": "Moderate",
        "notes": "Validate station identity, published coordinates, UTC-3 convention, metre units, requested month, and station reduction plane before parsing. Provider issue time is unavailable."
      },
      {
        "code": "DHN_TIDES",
        "name": "Peru DHN tide predictions",
        "coverage": "Individually checked Peruvian port stations",
        "role": "Official astronomical high and low water predictions",
        "access": "Public two-day HTML response",
        "format": "HTML",
        "endpoint": "https://www.dhn.mil.pe/app/mareas/res.php",
        "docs_url": "https://www.dhn.mil.pe/portal/tabla-mareas",
        "difficulty": "Moderate",
        "notes": "Validate station identity, published coordinates, America/Lima convention, centimetre units, selected dates, and NMBSO datum before parsing. Provider issue time is unavailable."
      },
      {
        "code": "SOHMA_TIDES",
        "name": "Uruguay SOHMA tide tables",
        "coverage": "La Paloma and Punta del Este official port predictions",
        "role": "Official hourly astronomical tide predictions",
        "access": "Public annual PDF",
        "format": "PDF tables",
        "endpoint": "https://sohma.armada.mil.uy/index.php/servicios/informacion-mareografica",
        "docs_url": "https://sohma.armada.mil.uy/index.php/servicios/informacion-mareografica",
        "difficulty": "Hard",
        "notes": "2026 tables use centimetres, Uruguay official time (UTC-3), and each port's chart-reduction plane related to Ex-Wharton. No stable structured runtime response is connected."
      },
      {
        "code": "MIO_CIMAR",
        "name": "MIO-CIMAR regional ocean forecast",
        "coverage": "Costa Rica South Pacific and Caribbean regional forecast areas",
        "role": "Official six-hourly regional modeled wave forecast and safety commentary",
        "access": "Public JSON",
        "format": "JSON",
        "endpoint": "https://miocimarv2.herokuapp.com/api/local_forecasts/",
        "docs_url": "https://miocimar.ucr.ac.cr/pronosticos-locales",
        "difficulty": "Moderate",
        "notes": "Validate forecast-region identity and seven-day six-hourly coverage. Heights are modeled open-water values, directions are propagation-toward vectors converted to from-bearings, and the response exposes no issue timestamp."
      },
      {
        "code": "MIO_CIMAR_TIDES",
        "name": "MIO-CIMAR Costa Rica tide predictions",
        "coverage": "Uvita, Golfito, and Limón official annual prediction stations",
        "role": "Official astronomical high and low tide predictions",
        "access": "Public JSON and annual PDF",
        "format": "JSON",
        "endpoint": "https://miocimarv2.herokuapp.com/api/tide_regions/",
        "docs_url": "https://miocimar.ucr.ac.cr/mareas",
        "difficulty": "Moderate",
        "notes": "Validate exact station identity, annual-table URL, UTC instants, metre units, America/Costa_Rica presentation, and the provider-described mean-low-tide reference before parsing."
      },
      {
        "code": "SCSFC_TIDES",
        "name": "South China Sea Forecast Center tide predictions",
        "coverage": "Named South China Sea tide stations including Hainan",
        "role": "Official astronomical high and low tide predictions",
        "access": "Public rolling HTML tables",
        "format": "HTML",
        "endpoint": "https://g.hyyb.org/systems/HyybTyhoonStormsurge/Tide2018/ZongtaiStationList.php?Province=HN",
        "docs_url": "https://g.hyyb.org/systems/HyybTyhoonStormsurge/Tide2018/ZongtaiStationList.php?Province=HN",
        "difficulty": "Moderate",
        "notes": "Validate exact Chinese station identity, selected local dates, centimetre units, Asia/Shanghai convention, station coordinates, and local-gauge datum before parsing."
      },
      {
        "code": "SURF_FORECAST_HTML",
        "name": "Surf-Forecast public pages",
        "coverage": "Global; 7,000+ listed breaks",
        "role": "Spot discovery and break-specific HTML fallback",
        "access": "Public HTML",
        "format": "HTML",
        "endpoint": "https://www.surf-forecast.com/countries",
        "docs_url": "https://www.surf-forecast.com/",
        "difficulty": "Moderate",
        "notes": "Useful long-tail directory and comparison feed; presentation markup is less stable than an API."
      },
      {
        "code": "SURFLINE_HTML",
        "name": "Surfline public spot pages",
        "coverage": "Global",
        "role": "Break-specific comparison, cams, and metadata",
        "access": "Public HTML/application pages",
        "format": "HTML/embedded application data",
        "endpoint": "https://www.surfline.com/surf-reports-forecasts-cams",
        "docs_url": "https://www.surfline.com/surf-reports-forecasts-cams",
        "difficulty": "Hard",
        "notes": "Useful secondary comparison; more dynamic and brittle than official text/JSON feeds."
      },
      {
        "code": "OSM_OVERPASS",
        "name": "OpenStreetMap Overpass API",
        "coverage": "Global mapped features",
        "role": "Candidate spot and coastal-feature discovery",
        "access": "Public read-only API",
        "format": "JSON/XML",
        "endpoint": "https://overpass-api.de/api/interpreter",
        "docs_url": "https://wiki.openstreetmap.org/wiki/Overpass_API",
        "difficulty": "Moderate",
        "notes": "Coverage and tagging are uneven; sport=surfing often marks facilities as well as locations."
      },
      {
        "code": "THE_BUOY_API",
        "name": "The Buoy API",
        "coverage": "Multiple national buoy networks",
        "role": "Normalized nearest-buoy discovery and readings",
        "access": "Public discovery plus authenticated endpoints",
        "format": "JSON",
        "endpoint": "See live API documentation",
        "docs_url": "https://labouee.app/en/wave-buoy-data-api",
        "difficulty": "Easy",
        "notes": "Aggregator for several official networks; useful to reduce custom adapters."
      },
      {
        "code": "NWS_SRF",
        "name": "US National Weather Service Surf Zone Forecast",
        "coverage": "Many US Atlantic, Gulf, Great Lakes, West Coast, Hawaii, Guam, and Puerto Rico zones",
        "role": "Official zone surf height, rip risk, wind, weather, and sometimes tides/water temperature",
        "access": "Public text product",
        "format": "Plain text/HTML wrapper",
        "endpoint": "https://forecast.weather.gov/product.php?site=NWS&issuedby={WFO}&product=SRF&format=txt",
        "docs_url": "https://www.weather.gov/safety/ripcurrent-forecasts",
        "difficulty": "Easy",
        "notes": "Zone/county level rather than true break-level. Parse issuance time and labeled fields."
      },
      {
        "code": "NWS_CWF",
        "name": "US National Weather Service Coastal Waters Forecast",
        "coverage": "US coastal waters",
        "role": "Marine wind, seas, and hazards where SRF is absent",
        "access": "Public text product",
        "format": "Plain text/HTML wrapper",
        "endpoint": "https://forecast.weather.gov/product.php?site=NWS&issuedby={WFO}&product=CWF&format=txt",
        "docs_url": "https://www.weather.gov/marine/",
        "difficulty": "Easy",
        "notes": "Offshore/coastal-zone forecast, not breaking surf."
      },
      {
        "code": "NWS_NSH",
        "name": "US National Weather Service Great Lakes Nearshore Forecast",
        "coverage": "US Great Lakes waters within five nautical miles of shore",
        "role": "Lake wind, significant wave height, weather, and hazards where SRF is absent",
        "access": "Public API product inventory and bulletin",
        "format": "GeoJSON inventory and plain-text bulletin",
        "endpoint": "https://api.weather.gov/products/types/NSH/locations/{WFO}",
        "docs_url": "https://www.weather.gov/marine/forecast",
        "difficulty": "Easy",
        "notes": "Nearshore significant wave height, not breaking surf at an individual spot."
      },
      {
        "code": "NWS_HFO_OMR",
        "name": "NWS Honolulu Surf Observations",
        "coverage": "Hawaiian Islands",
        "role": "Human-observed spot surf heights, period, direction, wind, and remarks",
        "access": "Public text product",
        "format": "Plain text/HTML wrapper",
        "endpoint": "https://forecast.weather.gov/product.php?site=HFO&issuedby=HFO&product=OMR&format=txt",
        "docs_url": "https://forecast.weather.gov/product.php?site=HFO&issuedby=HFO&product=OMR&format=txt",
        "difficulty": "Easy",
        "notes": "Rows may be missing; preserve nulls and observation time."
      },
      {
        "code": "NDBC_REALTIME",
        "name": "NOAA NDBC real-time station files",
        "coverage": "US and many international marine stations",
        "role": "Measured significant wave height, period, direction, wind, and water temperature",
        "access": "Public static files by station ID",
        "format": "Whitespace-delimited text",
        "endpoint": "https://www.ndbc.noaa.gov/data/realtime2/{STATION}.txt",
        "docs_url": "https://www.ndbc.noaa.gov/faq/rt_data_access.shtml",
        "difficulty": "Easy",
        "notes": "Latest 45 days. Offshore significant wave height is not breaking-wave face height."
      },
      {
        "code": "NOAA_COOPS",
        "name": "NOAA CO-OPS Tides and Currents API",
        "coverage": "US coasts, Great Lakes, and territories",
        "role": "Tide predictions, observed water levels, station metadata",
        "access": "Public API",
        "format": "JSON/XML/CSV",
        "endpoint": "https://api.tidesandcurrents.noaa.gov/api/prod/datagetter",
        "docs_url": "https://tidesandcurrents.noaa.gov/web_services_info.html",
        "difficulty": "Easy",
        "notes": "Use Metadata API to locate the nearest valid tide station."
      },
      {
        "code": "CDIP_THREDDS",
        "name": "Coastal Data Information Program THREDDS",
        "coverage": "California plus US and territorial wave stations; modeled California nearshore points",
        "role": "Measured wave spectra/parameters and modeled nearshore wave fields",
        "access": "Public THREDDS/OPeNDAP/NCSS",
        "format": "NetCDF",
        "endpoint": "https://thredds.cdip.ucsd.edu/thredds/catalog/cdip/realtime/catalog.html",
        "docs_url": "https://cdip.ucsd.edu/m/documents/data_access.html",
        "difficulty": "Moderate",
        "notes": "Preferred CDIP access. latest_3day.nc aggregates recent station data."
      },
      {
        "code": "PACIOOS_ERDDAP",
        "name": "PacIOOS ERDDAP",
        "coverage": "Hawaii, Guam, CNMI, American Samoa, FSM, and other Pacific islands",
        "role": "Wave buoy observations and regional ocean datasets",
        "access": "Public ERDDAP",
        "format": "JSON/CSV/NetCDF",
        "endpoint": "https://pae-paha.pacioos.hawaii.edu/erddap/tabledap/cdip_wave_agg.json",
        "docs_url": "https://www.pacioos.hawaii.edu/data/erddap/",
        "difficulty": "Easy",
        "notes": "One query can return the latest observation for multiple CDIP stations."
      },
      {
        "code": "CARICOOS_ERDDAP",
        "name": "CARICOOS ERDDAP",
        "coverage": "Puerto Rico and US Virgin Islands",
        "role": "Near-real-time wave buoy observations",
        "access": "Public ERDDAP",
        "format": "JSON/CSV/NetCDF",
        "endpoint": "https://dm3.caricoos.org/erddap/tabledap/",
        "docs_url": "https://www.caricoos.org/data-download?locale=en",
        "difficulty": "Easy",
        "notes": "Dataset IDs vary by buoy; Rincon and San Juan are useful anchors."
      },
      {
        "code": "DFO_CANADIAN_WAVES",
        "name": "Fisheries and Oceans Canada Wave Data",
        "coverage": "Canadian Atlantic, Pacific, Arctic, and Great Lakes stations",
        "role": "Wave buoy history and observations",
        "access": "Public web download",
        "format": "CSV and spectral formats",
        "endpoint": "https://www.meds-sdmm.dfo-mpo.gc.ca/isdm-gdsi/waves-vagues/index-eng.htm",
        "docs_url": "https://www.meds-sdmm.dfo-mpo.gc.ca/isdm-gdsi/waves-vagues/index-eng.htm",
        "difficulty": "Moderate",
        "notes": "Search, visualize, and download; check buoy status and quality codes."
      },
      {
        "code": "CHS_IWLS",
        "name": "Canadian Hydrographic Service IWLS API",
        "coverage": "Canada",
        "role": "Tide predictions, water levels, and station metadata",
        "access": "Public API",
        "format": "JSON",
        "endpoint": "https://api-iwls.dfo-mpo.gc.ca/api/v1/",
        "docs_url": "https://api-iwls.dfo-mpo.gc.ca/swagger-ui.html",
        "difficulty": "Easy",
        "notes": "Official Canadian tide/water-level API; timestamps are UTC."
      },
      {
        "code": "ECCC_GEOMET",
        "name": "Environment Canada MSC GeoMet",
        "coverage": "Canada",
        "role": "Wind, weather, marine model fields, alerts",
        "access": "Public OGC APIs",
        "format": "JSON/CSV/GRIB/NetCDF/GeoTIFF depending collection",
        "endpoint": "https://api.weather.gc.ca/",
        "docs_url": "https://eccc-msc.github.io/open-data/msc-geomet/readme_en/",
        "difficulty": "Moderate",
        "notes": "Good official forecast backend; discover collection IDs from /collections."
      },
      {
        "code": "NSW_MHL",
        "name": "NSW Manly Hydraulics Laboratory Wave Data",
        "coverage": "New South Wales",
        "role": "Near-real-time measured wave height, direction, period, temperature",
        "access": "Public HTML/data pages",
        "format": "HTML/downloads",
        "endpoint": "https://mhl.nsw.gov.au/Data",
        "docs_url": "https://mhl.nsw.gov.au/Data",
        "difficulty": "Moderate",
        "notes": "Seven continuously recording offshore sites from Byron Bay to Eden."
      },
      {
        "code": "QLD_WAVES",
        "name": "Queensland Government Wave Monitoring",
        "coverage": "Queensland",
        "role": "Latest significant wave height, direction, and sea temperature",
        "access": "Public HTML tables",
        "format": "HTML",
        "endpoint": "https://apps.des.qld.gov.au/waves/",
        "docs_url": "https://apps.des.qld.gov.au/waves/",
        "difficulty": "Easy",
        "notes": "Straightforward current-data table with station pages."
      },
      {
        "code": "WA_DOT_WAVES",
        "name": "Western Australia Transport Wave Data",
        "coverage": "Western Australia, Esperance to Geraldton and selected sites",
        "role": "Near-real-time sea/swell height, direction, period; tide data",
        "access": "Public HTML/maps and downloads",
        "format": "HTML/download files",
        "endpoint": "https://www.transport.wa.gov.au/marine/charts-warnings-current-conditions/coastal-data-charts/wave-data",
        "docs_url": "https://www.transport.wa.gov.au/marine/charts-warnings-current-conditions/coastal-data-charts/wave-data",
        "difficulty": "Moderate",
        "notes": "Station pages and comparative-swell views; exact data calls may need browser inspection."
      },
      {
        "code": "AODN_IMOS",
        "name": "Australian Ocean Data Network / IMOS",
        "coverage": "Australia",
        "role": "National wave observations and ocean datasets",
        "access": "Public portal, WFS/THREDDS/downloads",
        "format": "CSV/NetCDF/geospatial services",
        "endpoint": "https://portal.aodn.org.au/",
        "docs_url": "https://imos.org.au/",
        "difficulty": "Moderate",
        "notes": "Best national discovery layer; state sites may be easier for latest observations."
      },
      {
        "code": "BOM_MARINE",
        "name": "Australian Bureau of Meteorology Marine Forecasts/AUSWAVE",
        "coverage": "Australia and surrounding waters",
        "role": "Official wind, sea, swell, warnings, and wave model maps",
        "access": "Public HTML/data feeds",
        "format": "HTML/images/feeds",
        "endpoint": "http://www.bom.gov.au/marine/",
        "docs_url": "http://www.bom.gov.au/marine/",
        "difficulty": "Moderate",
        "notes": "Use as the official forecast and warning layer; model extraction may require BOM feeds."
      },
      {
        "code": "METSERVICE_SURF",
        "name": "MetService New Zealand Surf Forecasts",
        "coverage": "New Zealand beaches and regions",
        "role": "Surf-oriented wind, swell, wave height, quality, SST, and tide display",
        "access": "Public HTML",
        "format": "HTML",
        "endpoint": "https://www.metservice.com/marine/surf",
        "docs_url": "https://www.metservice.com/marine/surf",
        "difficulty": "Moderate",
        "notes": "Strong public HTML source for a report-first UI; no simple public JSON endpoint identified."
      },
      {
        "code": "NIWA_TIDE_API",
        "name": "NIWA Tide Forecasting API",
        "coverage": "New Zealand EEZ",
        "role": "Tide predictions and charts",
        "access": "API",
        "format": "JSON/CSV/SVG/PNG",
        "endpoint": "See NIWA developer documentation",
        "docs_url": "https://developer.niwa.co.nz/docs/tide-api/latest/overview",
        "difficulty": "Easy",
        "notes": "Supports point forecasts around New Zealand coastal and ocean waters."
      },
      {
        "code": "LINZ_TIDES",
        "name": "LINZ Tide Predictions and Sea-Level Data",
        "coverage": "New Zealand",
        "role": "Official tide predictions and observed sea level",
        "access": "Public HTML/downloads and LDS services",
        "format": "HTML/downloads/API services",
        "endpoint": "https://www.linz.govt.nz/products-services/tides-and-tidal-streams/tide-predictions",
        "docs_url": "https://www.linz.govt.nz/products-services/tides-and-tidal-streams/tide-predictions",
        "difficulty": "Moderate",
        "notes": "Use NIWA API for simple point queries; retain LINZ as official reference and data source."
      },
      {
        "code": "NZ_REGIONAL_BUOYS",
        "name": "New Zealand Regional Wave Buoy Pages",
        "coverage": "Selected New Zealand regions",
        "role": "Measured wave height, direction, and period",
        "access": "Public HTML/downloads",
        "format": "HTML/CSV where offered",
        "endpoint": "https://www.ecan.govt.nz/data/current-wave-data",
        "docs_url": "https://www.ecan.govt.nz/data/current-wave-data",
        "difficulty": "Moderate",
        "notes": "No single easy national endpoint; aggregate regional council and research-network pages."
      },
      {
        "code": "CEFAS_WAVENET",
        "name": "Cefas WaveNet",
        "coverage": "United Kingdom coastline",
        "role": "Near-real-time measured wave data and archives",
        "access": "Public current JSON for individually confirmed OGL stations; archive account and third-party restrictions vary by station",
        "format": "JSON",
        "endpoint": "https://wavenet-api.cefas.co.uk/api",
        "docs_url": "https://www.cefas.co.uk/data-and-publications/wavenet/",
        "difficulty": "Moderate",
        "notes": "Reviewed Moray Firth, Tyne/Tees, Scarweather and South Pembrokeshire station identity, units and OGL metadata. Thirty-minute UTC telemetry; preliminary automated QC. Magnetic directions withheld; regional offshore measurements, not local surf. Torness is display-only and excluded. © Crown copyright 2026; see Cefas data policy."
      },
      {
        "code": "UK_NCM_REALTIME",
        "name": "UK National Coastal Monitoring Real-Time Data",
        "coverage": "England and Wales coastal observatories",
        "role": "Wave buoys, tide gauges, and meteorology",
        "access": "Public HTML; API key option",
        "format": "HTML/API",
        "endpoint": "https://coastalmonitoring.org/realtimedata/",
        "docs_url": "https://coastalmonitoring.org/realtimedata/",
        "difficulty": "Moderate",
        "notes": "Useful nearshore complement to Cefas WaveNet."
      },
      {
        "code": "UKHO_TIDES",
        "name": "UK Hydrographic Office Tidal API",
        "coverage": "United Kingdom and supported stations",
        "role": "Tide predictions",
        "access": "Authenticated/subscription API",
        "format": "JSON",
        "endpoint": "See UKHO Tidal API documentation",
        "docs_url": "https://admiraltyapi.portal.azure-api.net/",
        "difficulty": "Easy",
        "notes": "Technically clean but authenticated; WorldTides is simpler for prototyping."
      },
      {
        "code": "IRELAND_ERDDAP",
        "name": "Marine Institute Irish Weather Buoy ERDDAP",
        "coverage": "Ireland offshore buoy network",
        "role": "Real-time wave height/period, wind, SST, pressure",
        "access": "Public ERDDAP",
        "format": "JSON/CSV/NetCDF",
        "endpoint": "https://erddap.marine.ie/erddap/tabledap/IWBNetwork.json",
        "docs_url": "https://erddap.marine.ie/erddap/tabledap/IWBNetwork.html",
        "difficulty": "Easy",
        "notes": "Clean structured source; typically hourly observations."
      },
      {
        "code": "MET_EIREANN_MARINE",
        "name": "Met Éireann Sea Area and Coastal Reports",
        "coverage": "Ireland",
        "role": "Official marine wind, sea state, swell, warnings",
        "access": "Public HTML/text",
        "format": "HTML/text",
        "endpoint": "https://www.met.ie/forecasts/marine-inland-lakes/sea-area-forecast",
        "docs_url": "https://www.met.ie/forecasts/marine-inland-lakes/sea-area-forecast",
        "difficulty": "Easy",
        "notes": "Regional marine report rather than spot-level surf."
      },
      {
        "code": "CANDHIS",
        "name": "CANDHIS / Cerema",
        "coverage": "Metropolitan France and French overseas territories",
        "role": "Nearshore measured sea-state observations and archives",
        "access": "Public HTML/downloads; API listed",
        "format": "API/downloads/HTML",
        "endpoint": "https://candhis.cerema.fr/",
        "docs_url": "https://candhis.cerema.fr/",
        "difficulty": "Moderate",
        "notes": "National coastal wave-observation network with overseas stations."
      },
      {
        "code": "METEO_FRANCE_WAVES",
        "name": "Météo-France Marine and Wave Data",
        "coverage": "France, European waters, and French territories",
        "role": "Official wave-model forecasts and marine bulletins",
        "access": "Public data portal and HTML products",
        "format": "GRIB/NetCDF/HTML depending product",
        "endpoint": "https://donneespubliques.meteofrance.fr/",
        "docs_url": "https://donneespubliques.meteofrance.fr/",
        "difficulty": "Moderate",
        "notes": "Use regional products where available; Open-Meteo may expose Météo-France model output more simply."
      },
      {
        "code": "SHOM",
        "name": "SHOM Oceanographic and Tide Services",
        "coverage": "France and French territories",
        "role": "Tides, oceanograms, and point marine forecasts",
        "access": "Public widgets/pages; authenticated APIs for some services",
        "format": "HTML/images/JSON depending service",
        "endpoint": "https://data.shom.fr/",
        "docs_url": "https://data.shom.fr/",
        "difficulty": "Moderate",
        "notes": "Useful tide/reference layer for France and overseas territories."
      },
      {
        "code": "PUERTOS_PORTUS",
        "name": "Puertos del Estado PORTUS",
        "coverage": "Spain, including Canary Islands",
        "role": "Measured buoys/tide gauges plus wave, sea-level, current, and SST forecasts",
        "access": "Public HTML/portal",
        "format": "HTML/tables/downloads",
        "endpoint": "https://portus.puertos.es/",
        "docs_url": "https://www.puertos.es/servicios/oceanografia",
        "difficulty": "Moderate",
        "notes": "One of the strongest official regional stacks in Europe."
      },
      {
        "code": "IPMA_MARINE",
        "name": "IPMA Marine Forecasts",
        "coverage": "Portugal mainland, Madeira, Azores",
        "role": "Official marine bulletins, wind, and significant-wave forecasts",
        "access": "Public HTML/data products",
        "format": "HTML/images/data products",
        "endpoint": "https://www.ipma.pt/en/maritima/",
        "docs_url": "https://www.ipma.pt/en/maritima/",
        "difficulty": "Moderate",
        "notes": "Use with Instituto Hidrográfico observations."
      },
      {
        "code": "IH_PORTUGAL",
        "name": "Instituto Hidrográfico MONICAN Buoys and Tides",
        "coverage": "Portugal",
        "role": "Real-time wave-buoy parameters and tide predictions",
        "access": "Public HTML/maps",
        "format": "HTML",
        "endpoint": "https://monican.hidrografico.pt/",
        "docs_url": "https://www.hidrografico.pt/",
        "difficulty": "Moderate",
        "notes": "Buoy pages expose significant/max height, periods, peak direction, and SST."
      },
      {
        "code": "ISPRA_WAVES",
        "name": "ISPRA Italian Wave and Tide Networks",
        "coverage": "Italy",
        "role": "Wave observations and sea-level/tide stations",
        "access": "Public portals; aggregator support",
        "format": "HTML/data services",
        "endpoint": "https://www.mareografico.it/",
        "docs_url": "https://www.isprambiente.gov.it/",
        "difficulty": "Moderate",
        "notes": "Station availability varies; use Copernicus/Open-Meteo as the consistent model layer."
      },
      {
        "code": "VEGAGERDIN_BUOYS",
        "name": "Vegagerðin Iceland Wave Buoys",
        "coverage": "Iceland",
        "role": "Wave buoy observations",
        "access": "Public pages; normalized by some aggregators",
        "format": "HTML/data feeds",
        "endpoint": "https://www.vegagerdin.is/",
        "docs_url": "https://www.vegagerdin.is/",
        "difficulty": "Moderate",
        "notes": "Use with Icelandic Met Office or global model forecast."
      },
      {
        "code": "MET_NORWAY_OCEAN",
        "name": "MET Norway Ocean Forecast API",
        "coverage": "Norway and adjacent waters",
        "role": "Ocean and wave forecasts",
        "access": "Public API",
        "format": "JSON/NetCDF depending service",
        "endpoint": "https://api.met.no/",
        "docs_url": "https://api.met.no/",
        "difficulty": "Moderate",
        "notes": "Use service documentation and retain Open-Meteo as a simple fallback."
      },
      {
        "code": "CSIR_WAVENET",
        "name": "CSIR WaveNet South Africa",
        "coverage": "Major South African ports and coastal stations",
        "role": "Near-real-time measured waves and weather",
        "access": "Public HTML pages",
        "format": "HTML/images",
        "endpoint": "https://wavenet.csir.co.za/",
        "docs_url": "https://wavenet.csir.co.za/",
        "difficulty": "Moderate",
        "notes": "Station pages are old-style HTML and technically easy to inspect; some locations are virtual/model buoys."
      },
      {
        "code": "SAWS_MARINE",
        "name": "South African Weather Service Marine Portal",
        "coverage": "South Africa and METAREA VII",
        "role": "Official high-resolution waves, winds, hazards, and rip-current products",
        "access": "Public HTML/maps",
        "format": "HTML/images",
        "endpoint": "https://marine.weathersa.co.za/",
        "docs_url": "https://marine.weathersa.co.za/Forecasts_HighResWaves.html",
        "difficulty": "Moderate",
        "notes": "Use for official forecast layer; CSIR WaveNet supplies observations."
      },
      {
        "code": "SANHO_TIDES",
        "name": "South African Navy Hydrographic Office Tides",
        "coverage": "South Africa and selected regional ports",
        "role": "Tide predictions",
        "access": "Public HTML/tables",
        "format": "HTML/PDF",
        "endpoint": "https://www.sanho.co.za/",
        "docs_url": "https://www.sanho.co.za/",
        "difficulty": "Moderate",
        "notes": "WorldTides is easier for normalized machine access."
      },
      {
        "code": "NOWPHAS",
        "name": "NOWPHAS Japan",
        "coverage": "Japanese coast",
        "role": "Real-time and historical wave/tide observations",
        "access": "Public web/data downloads",
        "format": "HTML/downloads",
        "endpoint": "https://nowphas.mlit.go.jp/",
        "docs_url": "https://nowphas.mlit.go.jp/",
        "difficulty": "Moderate",
        "notes": "Strong official observation source; interface is Japanese-first."
      },
      {
        "code": "JMA_WAVES",
        "name": "Japan Meteorological Agency Marine/Wave Forecasts",
        "coverage": "Japan and surrounding seas",
        "role": "Official wave forecasts and charts",
        "access": "Public HTML/data products",
        "format": "HTML/images/data products",
        "endpoint": "https://www.jma.go.jp/bosai/map.html#contents=wave",
        "docs_url": "https://www.jma.go.jp/jma/indexe.html",
        "difficulty": "Moderate",
        "notes": "Regional forecast layer; Open-Meteo offers an easier normalized point query."
      },
      {
        "code": "CWA_OPEN_DATA",
        "name": "Taiwan Central Weather Administration Open Data",
        "coverage": "Taiwan",
        "role": "Wave-model forecast, wind, buoy, and tide observations",
        "access": "Open-data API/AWS",
        "format": "JSON/XML/files",
        "endpoint": "https://opendata.cwa.gov.tw/",
        "docs_url": "https://opendata.cwa.gov.tw/",
        "difficulty": "Moderate",
        "notes": "Use dataset catalog IDs; includes wave height/period/direction products."
      },
      {
        "code": "KHOA_OCEANGRID",
        "name": "Korea Hydrographic and Oceanographic Agency Open API",
        "coverage": "South Korea",
        "role": "Tides, currents, sea level, and ocean observations",
        "access": "API key/open-data portal",
        "format": "JSON/XML",
        "endpoint": "https://www.khoa.go.kr/oceangrid/",
        "docs_url": "https://www.khoa.go.kr/oceangrid/",
        "difficulty": "Moderate",
        "notes": "Pair with Open-Meteo for a simple wave forecast."
      },
      {
        "code": "BMKG_OFS",
        "name": "BMKG Ocean Forecast System",
        "coverage": "Indonesia",
        "role": "Significant wave height, mean period, swell, wind, marine warnings, tides",
        "access": "Public HTML/maps; API documentation linked by BMKG",
        "format": "HTML/JSON behind app",
        "endpoint": "https://peta-maritim.bmkg.go.id/ofs",
        "docs_url": "https://peta-maritim.bmkg.go.id/",
        "difficulty": "Moderate",
        "notes": "Official national source; browser network inspection may reveal stable JSON services."
      },
      {
        "code": "PAGASA_MARINE",
        "name": "PAGASA Marine Forecasts",
        "coverage": "Philippines",
        "role": "Official high-seas/offshore forecasts and warnings",
        "access": "Public HTML/text",
        "format": "HTML/text",
        "endpoint": "https://www.pagasa.dost.gov.ph/marine",
        "docs_url": "https://www.pagasa.dost.gov.ph/marine",
        "difficulty": "Easy",
        "notes": "Regional rather than break-level; combine with Open-Meteo."
      },
      {
        "code": "INCOIS_OSF",
        "name": "INCOIS Ocean State Forecast",
        "coverage": "India, Indian Ocean, and partner regions",
        "role": "3-hourly wave, swell, wind, current, SST forecasts and observation products",
        "access": "Public web/maps; some downloads/ERDDAP",
        "format": "HTML/NetCDF/ERDDAP depending product",
        "endpoint": "https://incois.gov.in/site/services/osf.jsp",
        "docs_url": "https://incois.gov.in/site/services/osf.jsp",
        "difficulty": "Moderate",
        "notes": "Official 5–10 day model suite; some real-time observations are visualization-only."
      },
      {
        "code": "DIRECTEMAR_SHOA",
        "name": "Chile DIRECTEMAR/SHOA Marine Data",
        "coverage": "Chile",
        "role": "Wave forecasts, buoy observations, tides, and marine bulletins",
        "access": "Public HTML/maps",
        "format": "HTML/images/data pages",
        "endpoint": "https://www.directemar.cl/",
        "docs_url": "https://www.directemar.cl/",
        "difficulty": "Moderate",
        "notes": "Use SHOA/DIRECTEMAR pages for observations and official bulletins; Open-Meteo for normalized point forecasts."
      },
      {
        "code": "PNBOIA_CHM",
        "name": "Brazilian Navy PNBOIA / CHM",
        "coverage": "Brazilian coast and South Atlantic",
        "role": "Near-real-time met-ocean buoy data",
        "access": "Public HTML/map and linked data pages",
        "format": "HTML/data links",
        "endpoint": "https://www.marinha.mil.br/chm/dados-do-goos-brasil/pnboia",
        "docs_url": "https://www.marinha.mil.br/chm/dados-do-goos-brasil/pnboia",
        "difficulty": "Moderate",
        "notes": "Network availability changes; station pages link real-time data and metadata."
      },
      {
        "code": "CHM_MARINE",
        "name": "Brazilian Navy Marine Forecasts",
        "coverage": "Brazilian coast and METAREA V",
        "role": "Official 24/48-hour wind, wave, and hazard bulletins",
        "access": "Public HTML/text",
        "format": "HTML/text",
        "endpoint": "https://www.marinha.mil.br/chm/dados-do-smm-meteoromarinha/previsao-24-horas",
        "docs_url": "https://www.marinha.mil.br/chm/dados-do-smm-previsao-oceanografica/previsao-meteoceanografica",
        "difficulty": "Easy",
        "notes": "Broad forecast areas rather than spot-level predictions."
      },
      {
        "code": "LOCAL_MET_HTML",
        "name": "National or regional meteorological marine bulletin",
        "coverage": "Country-specific",
        "role": "Warnings and official marine narrative where no structured surf feed exists",
        "access": "Public HTML/text",
        "format": "HTML/text",
        "endpoint": "Country-specific",
        "docs_url": "",
        "difficulty": "Varies",
        "notes": "Keep as an additive safety/official layer; do not use as the only spot forecast."
      },
      {
        "code": "MMS_HEAVY_SWELL",
        "name": "Mauritius Meteorological Services heavy swell warning",
        "coverage": "Mauritius and Rodrigues open waters",
        "role": "Official warning-level open-sea swell forecast",
        "access": "Public HTML",
        "format": "HTML/text",
        "endpoint": "https://metservice.intnet.mu/warning-bulletin-heavy-swell-warning.php",
        "docs_url": "https://metservice.intnet.mu/",
        "difficulty": "Moderate",
        "notes": "Validate exact issue and validity times, Mauritius-and-Rodrigues scope, metre units, and active-warning state. Values are neither observations nor breaking surf."
      },
      {
        "code": "SRI_LANKA_METEO",
        "name": "Sri Lanka Department of Meteorology marine forecasts",
        "coverage": "Sea areas around Sri Lanka",
        "role": "Official 24-hour marine-weather and shipping narratives",
        "access": "Public JSON content endpoint",
        "format": "JSON containing multilingual text bulletins",
        "endpoint": "https://meteo.gov.lk/content.json",
        "docs_url": "https://meteo.gov.lk/",
        "difficulty": "Moderate",
        "notes": "Retain named-area wording, kmph units, issue/validity times, and regional scope; do not convert the narrative to spot waves or breaking surf."
      },
      {
        "code": "INUMET_MARINE",
        "name": "INUMET Uruguay marine forecast",
        "coverage": "Named Uruguay ports and coastal points",
        "role": "Official 72-hour GFS-Wave point forecast",
        "access": "Public run-specific JSON",
        "format": "JSON",
        "endpoint": "https://www.inumet.gub.uy/reportes/pronos_marino_auto/",
        "docs_url": "https://www.inumet.gub.uy/reportes/pages/pronostico-marino/",
        "difficulty": "Moderate",
        "notes": "Runs 00/06/12/18 UTC; validate corrida, named point, 73 hourly values, metre/second units, and freshness. Values are model significant wave height, not observations or breaking surf."
      },
      {
        "code": "NWS_MWW",
        "name": "NWS Marine Weather Message",
        "coverage": "United States coastal waters and Great Lakes",
        "role": "Marine watches, warnings, and advisories",
        "access": "Public HTTPS; select the issuing weather forecast office",
        "format": "Text/HTML",
        "endpoint": "https://forecast.weather.gov/product_sites.php?product=MWW",
        "docs_url": "https://www.weather.gov/marine/mwwinfo",
        "difficulty": "Moderate",
        "notes": "Resolve the issuing office and marine zone before using an MWW product."
      },
      {
        "code": "RWS_TIDES",
        "name": "Rijkswaterstaat astronomical tides",
        "coverage": "Individually checked Dutch coastal tide stations",
        "role": "Astronomical high and low water predictions",
        "access": "Public POST Waterwebservices API; fair use",
        "format": "JSON",
        "endpoint": "https://ddapi20-waterwebservices.rijkswaterstaat.nl/ONLINEWAARNEMINGENSERVICES/OphalenWaarnemingen",
        "docs_url": "https://rijkswaterstaatdata.nl/waterdata/",
        "difficulty": "medium",
        "notes": "Pair GETETBRKD2 event type with WATHTE by timestamp. Heights in cm relative to NAP; never interpret the event-type numeric placeholder as water height."
      },
      {
        "code": "ECCC_MARINE",
        "name": "ECCC official marine wave bulletins",
        "coverage": "Reviewed Eastern Shore western half and Fourchu forecast areas",
        "role": "Dated regional combined wind-wave and swell forecast narrative; not breaking surf",
        "access": "Public HTTPS download; MSC open data usage policy",
        "format": "Marine XML with independent wave-forecast issue time and valid-period text",
        "endpoint": "https://dd.weather.gc.ca/today/marine_weather/atlantic/",
        "docs_url": "https://eccc-msc.github.io/open-data/msc-data/marine-weather/readme_marine-weather-datamart_en/",
        "difficulty": "Moderate",
        "notes": "Dated files replace retired undated URLs. Wave bulletins twice daily; discover latest matching file, validate area, issue and coverage. Preserve original metre wording without inventing daily height ranges."
      },
      {
        "code": "DMA_MARINE",
        "name": "Departamento Meteorologico Aruba Marine Forecast",
        "coverage": "Aruba and local Caribbean waters",
        "role": "Regional wind, sea state, wave height, direction, and period",
        "access": "Public government webpage",
        "format": "HTML",
        "endpoint": "https://www.meteo.aw/marine.php?Selecteer=Selecteer&lang=en",
        "docs_url": "https://www.meteo.aw/wxmarine.php",
        "difficulty": "Easy",
        "notes": "Coast-sector and open-water forecast; not breaking surf."
      },
      {
        "code": "BMS_MARINE",
        "name": "Barbados Meteorological Services Marine Forecast",
        "coverage": "Fifteen named coastal and open-water zones around Barbados",
        "role": "Coastal-zone swell range and confidence",
        "access": "Public government webpage",
        "format": "Embedded XML in HTML",
        "endpoint": "https://www.barbadosweather.org/marineBarResp.php",
        "docs_url": "https://www.gov.bb/Departments/meteorological-department",
        "difficulty": "Moderate",
        "notes": "BMS names beaches in each zone and publishes metre ranges twice daily; values are coastal-zone swell, not breaking surf."
      },
      {
        "code": "MDC_MARINE",
        "name": "Meteorological Department Curaçao Marine Forecast",
        "coverage": "Seas around Curaçao",
        "role": "Island-wide sea state, wave height, wind, visibility, and weather",
        "access": "Public government webpage",
        "format": "HTML",
        "endpoint": "https://www.meteo.cw/forecast_marine.php?Lang=Eng&St=TNCC&Sws=R11",
        "docs_url": "https://www.meteo.cw/",
        "difficulty": "Easy",
        "notes": "Issue-date forecast for regional seas; the source omits issue time and does not describe breaking surf."
      },
      {
        "code": "INDOMET_MARINE",
        "name": "INDOMET official marine bulletin",
        "coverage": "Dominican Republic marine zones",
        "role": "Official dated marine bulletin discovery and regional Zone VIII sea forecast when Worker-readable",
        "access": "Public HTML and PDF",
        "format": "HTML index with PDF bulletin",
        "endpoint": "https://indomet.gob.do/pronostico/informes-marino/informe-marino-3/",
        "docs_url": "https://indomet.gob.do/",
        "difficulty": "Moderate",
        "notes": "Production currently validates the current bulletin link only; numeric PDF fields remain unavailable without a Worker-compatible extractor. Preserve regional significant sea height as non-breaking forecast evidence."
      }
    ]
  }
}
