{"openapi":"3.1.0","info":{"title":"Marine & Surf Forecast API","version":"1.0.0","description":"Marine and surf forecasts as an API, powered by Open-Meteo — clean JSON, no key. Get the current sea state and the hourly and daily wave forecast for any coastline by latitude/longitude or simply by place name: significant wave height, period and direction, plus the swell and wind-wave components broken out separately, and daily maxima and dominant directions. A built-in geocoding helper turns a place name into coordinates. Forecasts run up to ten days ahead. Live forecast data straight from Open-Meteo's marine model. Ideal for surf-report apps, sailing and boating tools, coastal and marine-operations dashboards and beach widgets. 4 data endpoints. Authenticated with an x-oanor-key; fair-use rate limits per plan.","contact":{"name":"PremiumApi","url":"https://www.oanor.com/by/premiumapi"}},"servers":[{"url":"https://api.oanor.com/marine-api","description":"oanor gateway"}],"tags":[{"name":"Forecast"},{"name":"Reference"},{"name":"Meta"}],"components":{"securitySchemes":{"oanorKey":{"type":"apiKey","in":"header","name":"x-oanor-key","description":"Get your key at https://www.oanor.com/developer/keys"}}},"security":[{"oanorKey":[]}],"paths":{"/v1/daily":{"get":{"operationId":"get_v1_daily","tags":["Forecast"],"summary":"Daily wave & swell forecast","description":"","parameters":[{"name":"place","in":"query","required":false,"description":"Place name (or latitude/longitude)","schema":{"type":"string"},"example":"Biarritz"},{"name":"days","in":"query","required":false,"description":"Forecast days (1–10)","schema":{"type":"string"},"example":"5"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"count":5,"daily":[{"time":"2026-06-08","wave_height_max":1.72,"wave_period_max":9.4,"wind_wave_height_max":0.22,"swell_wave_height_max":1.72,"swell_wave_period_max":7.95,"wave_direction_dominant":303,"swell_wave_direction_dominant":303},{"time":"2026-06-09","wave_height_max":1.44,"wave_period_max":8.95,"wind_wave_height_max":0.32,"swell_wave_height_max":1.42,"swell_wave_period_max":7.65,"wave_direction_dominant":307,"swell_wave_direction_dominant":307},{"time":"2026-06-10","wave_height_max":1.66,"wave_period_max":9.8,"wind_wave_height_max":0.3,"swell_wave_height_max":1.66,"swell_wave_period_max":8.3,"wave_direction_dominant":309,"swell_wave_direction_dominant":309},{"time":"2026-06-11","wave_height_max":1.56,"wave_period_max":9.3,"wind_wave_height_max":0.4,"swell_wave_height_max":1.56,"swell_wave_period_max":7.8,"wave_direction_dominant":312,"swell_wave_direction_dominant":310},{"time":"2026-06-12","wave_height_max":1.2,"wave_period_max":7.85,"wind_wave_height_max":0.22,"swell_wave_height_max":1.04,"swell_wave_period_max":7.45,"wave_direction_dominant":319,"swell_wave_direction_dominant":313}],"location":{"name":"Biarritz","region":"New Aquitaine","country":"France","latitude":43.48055,"longitude":-1.55684}},"meta":{"timestamp":"2026-06-08T01:20:12.058Z","request_id":"f9cc9734-1b9f-4928-b464-69445c6c4712"},"status":"ok","message":"Forecast retrieved successfully","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/forecast":{"get":{"operationId":"get_v1_forecast","tags":["Forecast"],"summary":"Current sea state + daily summary","description":"","parameters":[{"name":"place","in":"query","required":false,"description":"Coastal place name (or use latitude/longitude)","schema":{"type":"string"},"example":"Nazare"},{"name":"latitude","in":"query","required":false,"description":"Latitude","schema":{"type":"string"}},{"name":"longitude","in":"query","required":false,"description":"Longitude","schema":{"type":"string"}}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"daily":[{"time":"2026-06-08","wave_height_max":2.26,"wave_period_max":8.65,"wind_wave_height_max":0.9,"swell_wave_height_max":2.12,"swell_wave_period_max":8.05,"wave_direction_dominant":312,"swell_wave_direction_dominant":306},{"time":"2026-06-09","wave_height_max":2.74,"wave_period_max":7.65,"wind_wave_height_max":2.18,"swell_wave_height_max":2.02,"swell_wave_period_max":8.35,"wave_direction_dominant":330,"swell_wave_direction_dominant":308},{"time":"2026-06-10","wave_height_max":2.78,"wave_period_max":8.05,"wind_wave_height_max":1.62,"swell_wave_height_max":2.14,"swell_wave_period_max":7.8,"wave_direction_dominant":334,"swell_wave_direction_dominant":320}],"units":{"wave_height":"m","wave_period":"s","wave_direction":"°"},"current":{"time":"2026-06-08T02:15","wave_height":2.1,"wave_period":8.55,"wave_direction":315,"wind_wave_height":0.68,"wind_wave_period":3.1,"swell_wave_height":1.98,"swell_wave_period":7.7,"swell_wave_direction":308},"location":{"name":"Nazaré","region":"Leiria District","country":"Portugal","latitude":39.60289,"longitude":-9.06836}},"meta":{"timestamp":"2026-06-08T01:20:12.175Z","request_id":"869ea870-dec4-4142-9f44-6a40930e01dc"},"status":"ok","message":"Forecast retrieved successfully","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/hourly":{"get":{"operationId":"get_v1_hourly","tags":["Forecast"],"summary":"Hourly wave & swell forecast","description":"","parameters":[{"name":"place","in":"query","required":false,"description":"Place name (or latitude/longitude)","schema":{"type":"string"},"example":"Honolulu"},{"name":"latitude","in":"query","required":false,"description":"Latitude","schema":{"type":"string"}},{"name":"longitude","in":"query","required":false,"description":"Longitude","schema":{"type":"string"}},{"name":"days","in":"query","required":false,"description":"Forecast days (1–10)","schema":{"type":"string"},"example":"2"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"count":48,"hourly":[{"time":"2026-06-07T00:00","wave_height":1.2,"wave_period":8.55,"wave_direction":146,"wind_wave_height":0.7,"swell_wave_height":0.6,"swell_wave_period":10.3,"swell_wave_direction":185},{"time":"2026-06-07T01:00","wave_height":1.2,"wave_period":8.5,"wave_direction":145,"wind_wave_height":0.72,"swell_wave_height":0.58,"swell_wave_period":10.35,"swell_wave_direction":186},{"time":"2026-06-07T02:00","wave_height":1.22,"wave_period":8.4,"wave_direction":143,"wind_wave_height":0.76,"swell_wave_height":0.58,"swell_wave_period":10.4,"swell_wave_direction":187},{"time":"2026-06-07T03:00","wave_height":1.24,"wave_period":8.35,"wave_direction":142,"wind_wave_height":0.78,"swell_wave_height":0.58,"swell_wave_period":10.4,"swell_wave_direction":187},{"time":"2026-06-07T04:00","wave_height":1.24,"wave_period":8.3,"wave_direction":142,"wind_wave_height":0.8,"swell_wave_height":0.56,"swell_wave_period":10.35,"swell_wave_direction":188},{"time":"2026-06-07T05:00","wave_height":1.26,"wave_period":8.25,"wave_direction":141,"wind_wave_height":0.82,"swell_wave_height":0.56,"swell_wave_period":10.3,"swell_wave_direction":188},{"time":"2026-06-07T06:00","wave_height":1.26,"wave_period":8.25,"wave_direction":140,"wind_wave_height":0.82,"swell_wave_height":0.56,"swell_wave_period":10.3,"swell_wave_direction":188},{"time":"2026-06-07T07:00","wave_height":1.28,"wave_period":8.3,"wave_direction":140,"wind_wave_height":0.84,"swell_wave_height":0.54,"swell_wave_period":10.25,"swell_wave_direction":188},{"time":"2026-06-07T08:00","wave_height":1.28,"wave_period":8.3,"wave_direction":139,"wind_wave_height":0.84,"swell_wave_height":0.54,"swell_wave_period":10.25,"swell_wave_direction":188},{"time":"2026-06-07T09:00","wave_height":1.28,"wave_period":8.3,"wave_direction":138,"wind_wave_height":0.86,"swell_wave_height":0.54,"swell_wave_period":10.1,"swell_wave_direction":188},{"time":"2026-06-07T10:00","wave_height":1.3,"wave_period":8.3,"wave_direction":138,"wind_wave_height":0.88,"swell_wave_height":0.54,"swell_wave_period":9.95,"swell_wave_direction":187},{"time":"2026-06-07T11:00","wave_height":1.3,"wave_period":8.35,"wave_direction":137,"wind_wave_height":0.9,"swell_wave_height":0.54,"swell_wave_period":10.2,"swell_wave_direction":187},{"time":"2026-06-07T12:00","wave_height":1.32,"wave_period":8.4,"wave_direction":137,"wind_wave_height":0.9,"swell_wave_height":0.54,"swell_wave_period":11.2,"swell_wave_direction":186},{"time":"2026-06-07T13:00","wave_height":1.32,"wave_period":8.5,"wave_direction":137,"wind_wave_height":0.92,"swell_wave_height":0.52,"swell_wave_period":12.65,"swell_wave_direction":185},{"time":"2026-06-07T14:00","wave_height":1.34,"wave_period":8.6,"wave_direction":137,"wind_wave_height":0.92,"swell_wave_height":0.52,"swell_wave_period":13.95,"swell_wave_direction":184},{"time":"2026-06-07T15:00","wave_height":1.34,"wave_period":8.75,"wave_direction":139,"wind_wave_height":0.9,"swell_wave_height":0.54,"swell_wave_period":14.9,"swell_wave_direction":180},{"time":"2026-06-07T16:00","wave_height":1.32,"wave_period":8.9,"wave_direction":140,"wind_wave_height":0.86,"swell_wave_height":0.54,"swell_wave_period":15.7,"swell_wave_direction":176},{"time":"2026-06-07T17:00","wave_height":1.32,"wave_period":9.05,"wave_direction":142,"wind_wave_height":0.84,"swell_wave_height":0.56,"swell_wave_period":16.2,"swell_wave_direction":172},{"time":"2026-06-07T18:00","wave_height":1.3,"wave_period":9.2,"wave_direction":144,"wind_wave_height":0.78,"swell_wave_height":0.58,"swell_wave_period":16.25,"swell_wave_direction":172},{"time":"2026-06-07T19:00","wave_height":1.3,"wave_period":9.4,"wave_direction":147,"wind_wave_height":0.72,"swell_wave_height":0.6,"swell_wave_period":16,"swell_wave_direction":173},{"time":"2026-06-07T20:00","wave_height":1.28,"wave_period":9.55,"wave_direction":149,"wind_wave_height":0.66,"swell_wave_height":0.62,"swell_wave_period":15.55,"swell_wave_direction":173},{"time":"2026-06-07T21:00","wave_height":1.28,"wave_period":9.65,"wave_direction":150,"wind_wave_height":0.64,"swell_wave_height":0.68,"swell_wave_period":14.8,"swell_wave_direction":174},{"time":"2026-06-07T22:00","wave_height":1.26,"wave_period":9.75,"wave_direction":151,"wind_wave_height":0.6,"swell_wave_height":0.74,"swell_wave_period":13.9,"swell_wave_direction":176},{"time":"2026-06-07T23:00","wave_height":1.26,"wave_period":9.9,"wave_direction":152,"wind_wave_height":0.58,"swell_wave_height":0.8,"swell_wave_period":13.25,"swell_wave_direction":177},{"time":"2026-06-08T00:00","wave_height":1.24,"wave_period":10.1,"wave_direction":153,"wind_wave_height":0.52,"swell_wave_height":0.8,"swell_wave_period":13.1,"swell_wave_direction":177},{"time":"2026-06-08T01:00","wave_height":1.24,"wave_period":10.25,"wave_direction":155,"wind_wave_height":0.48,"swell_wave_height":0.82,"swell_wave_period":13.25,"swell_wave_direction":176},{"time":"2026-06-08T02:00","wave_height":1.22,"wave_period":10.45,"wave_direction":156,"wind_wave_height":0.42,"swell_wave_height":0.82,"swell_wave_period":13.3,"swell_wave_direction":176},{"time":"2026-06-08T03:00","wave_height":1.2,"wave_period":10.6,"wave_direction":157,"wind_wave_height":0.42,"swell_wave_height":0.84,"swell_wave_period":13.1,"swell_wave_direction":174},{"time":"2026-06-08T04:00","wave_height":1.2,"wave_period":10.75,"wave_direction":157,"wind_wave_height":0.42,"swell_wave_height":0.84,"swell_wave_period":12.85,"swell_wave_direction":172},{"time":"2026-06-08T05:00","wave_height":1.18,"wave_period":10.8,"wave_direction":158,"wind_wave_height":0.42,"swell_wave_height":0.86,"swell_wave_period":12.7,"swell_wave_direction":170},{"time":"2026-06-08T06:00","wave_height":1.18,"wave_period":10.75,"wave_direction":157,"wind_wave_height":0.48,"swell_wave_height":0.84,"swell_wave_period":12.85,"swell_wave_direction":172},{"time":"2026-06-08T07:00","wave_height":1.2,"wave_period":10.65,"wave_direction":157,"wind_wave_height":0.52,"swell_wave_height":0.84,"swell_wave_period":13.2,"swell_wave_direction":173},{"time":"2026-06-08T08:00","wave_height":1.2,"wave_period":10.55,"wave_direction":156,"wind_wave_height":0.58,"swell_wave_height":0.82,"swell_wave_period":13.4,"swell_wave_direction":175},{"time":"2026-06-08T09:00","wave_height":1.22,"wave_period":10.45,"wave_direction":155,"wind_wave_height":0.62,"swell_wave_height":0.82,"swell_wave_period":13.4,"swell_wave_direction":175},{"time":"2026-06-08T10:00","wave_height":1.22,"wave_period":10.35,"wave_direction":153,"wind_wave_height":0.64,"swell_wave_height":0.84,"swell_wave_period":13.3,"swell_wave_direction":174},{"time":"2026-06-08T11:00","wave_height":1.24,"wave_period":10.25,"wave_direction":152,"wind_wave_height":0.68,"swell_wave_height":0.84,"swell_wave_period":13.25,"swell_wave_direction":174},{"time":"2026-06-08T12:00","wave_height":1.24,"wave_period":10.25,"wave_direction":152,"wind_wave_height":0.68,"swell_wave_height":0.84,"swell_wave_period":13.25,"swell_wave_direction":174},{"time":"2026-06-08T13:00","wave_height":1.26,"wave_period":10.25,"wave_direction":151,"wind_wave_height":0.7,"swell_wave_height":0.86,"swell_wave_period":13.2,"swell_wave_direction":173},{"time":"2026-06-08T14:00","wave_height":1.26,"wave_period":10.3,"wave_direction":151,"wind_wave_height":0.7,"swell_wave_height":0.86,"swell_wave_period":13.2,"swell_wave_direction":173},{"time":"2026-06-08T15:00","wave_height":1.26,"wave_period":10.35,"wave_direction":152,"wind_wave_height":0.68,"swell_wave_height":0.86,"swell_wave_period":13.15,"swell_wave_direction":173},{"time":"2026-06-08T16:00","wave_height":1.26,"wave_period":10.4,"wave_direction":152,"wind_wave_height":0.68,"swell_wave_height":0.88,"swell_wave_period":13.1,"swell_wave_direction":173},{"time":"2026-06-08T17:00","wave_height":1.26,"wave_period":10.45,"wave_direction":153,"wind_wave_height":0.66,"swell_wave_height":0.88,"swell_wave_period":13.05,"swell_wave_direction":173},{"time":"2026-06-08T18:00","wave_height":1.26,"wave_period":10.5,"wave_direction":154,"wind_wave_height":0.64,"swell_wave_height":0.88,"swell_wave_period":13,"swell_wave_direction":173},{"time":"2026-06-08T19:00","wave_height":1.28,"wave_period":10.55,"wave_direction":155,"wind_wave_height":0.64,"swell_wave_height":0.9,"swell_wave_period":12.95,"swell_wave_direction":173},{"time":"2026-06-08T20:00","wave_height":1.28,"wave_period":10.6,"wave_direction":156,"wind_wave_height":0.62,"swell_wave_height":0.9,"swell_wave_period":12.9,"swell_wave_direction":173},{"time":"2026-06-08T21:00","wave_height":1.28,"wave_period":10.7,"wave_direction":157,"wind_wave_height":0.58,"swell_wave_height":0.9,"swell_wave_period":12.85,"swell_wave_direction":173},{"time":"2026-06-08T22:00","wave_height":1.26,"wave_period":10.8,"wave_direction":157,"wind_wave_height":0.56,"swell_wave_height":0.92,"swell_wave_period":12.8,"swell_wave_direction":173},{"time":"2026-06-08T23:00","wave_height":1.26,"wave_period":10.85,"wave_direction":158,"wind_wave_height":0.52,"swell_wave_height":0.92,"swell_wave_period":12.75,"swell_wave_direction":173}],"location":{"name":"Honolulu","region":"Hawaii","country":"United States","latitude":21.30694,"longitude":-157.85834}},"meta":{"timestamp":"2026-06-08T01:20:12.265Z","request_id":"194e7a74-c870-426e-8e74-231b7f5d3bdf"},"status":"ok","message":"Forecast retrieved successfully","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/geocode":{"get":{"operationId":"get_v1_geocode","tags":["Reference"],"summary":"Place name to coordinates","description":"","parameters":[{"name":"query","in":"query","required":true,"description":"Place name","schema":{"type":"string"},"example":"Honolulu"},{"name":"limit","in":"query","required":false,"description":"Max results (1–20)","schema":{"type":"string"},"example":"5"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"count":5,"query":"Honolulu","results":[{"name":"Honolulu","region":"Hawaii","country":"United States","latitude":21.30694,"timezone":"Pacific/Honolulu","longitude":-157.85834,"population":350964,"country_code":"US"},{"name":"Honolulu","region":"North Carolina","country":"United States","latitude":35.36294,"timezone":"America/New_York","longitude":-77.28163,"country_code":"US"},{"name":"Honolulu","region":"Karas Region","country":"Namibia","latitude":-27.98517,"timezone":"Africa/Windhoek","longitude":18.77134,"country_code":"NA"},{"name":"Honolulu","region":"Central Finland","country":"Finland","latitude":62.02538,"timezone":"Europe/Helsinki","longitude":26.07524,"country_code":"FI"},{"name":"Honolulu Zoo","region":"Hawaii","country":"United States","latitude":21.27361,"timezone":"Pacific/Honolulu","longitude":-157.82028,"country_code":"US"}]},"meta":{"timestamp":"2026-06-08T01:20:12.364Z","request_id":"ea3cfe94-b276-40b5-ace7-2d3de2d6050f"},"status":"ok","message":"Geocode retrieved successfully","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/meta":{"get":{"operationId":"get_v1_meta","tags":["Meta"],"summary":"Spec","description":"","parameters":[],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"service":"marine-api","endpoints":{"GET /v1/meta":"This document.","GET /v1/daily":"Daily wave/swell forecast (days=).","GET /v1/hourly":"Hourly wave/swell forecast (days=).","GET /v1/geocode":"Resolve a place name to coordinates.","GET /v1/forecast":"Current sea state + daily summary (place= or latitude=&longitude=)."},"description":"Marine & surf forecasts via Open-Meteo: current sea state and hourly/daily wave & swell forecasts (height, period, direction; swell and wind waves) by latitude/longitude or place name, plus a place→coordinates geocoding helper. Real forecast data, no key."},"meta":{"timestamp":"2026-06-08T01:20:12.452Z","request_id":"bb27b5f5-1add-4e5b-b99f-a97dc67dc516"},"status":"ok","message":"Meta","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}}},"x-oanor-pricing":[{"slug":"free","name":"Free","price_cents_month":0,"monthly_call_quota":4000,"rps_limit":5,"hard_limit":true},{"slug":"starter","name":"Starter","price_cents_month":550,"monthly_call_quota":55000,"rps_limit":15,"hard_limit":true},{"slug":"pro","name":"Pro","price_cents_month":2400,"monthly_call_quota":280000,"rps_limit":30,"hard_limit":true},{"slug":"mega","name":"Mega","price_cents_month":8000,"monthly_call_quota":1100000,"rps_limit":80,"hard_limit":true}],"x-oanor-marketplace-url":"https://www.oanor.com/api/marine-api"}