Surfline API: Get surf forecast
Gets current surf conditions and the five free forecast days for a Surfline spot found by name. A region narrows spots that share a name. Daily values are taken at 9 a.m. and 3 p.m. local time (morning and afternoon surf heights) and 9 a.m. for the rest.
Unofficial. Not affiliated with or endorsed by Surfline.
Inputs
Values from the run on Oct 23, 2026, shown under Output.
- Region optional
region Location to distinguish spots with the same name, such as Hawaii or California.
California
Default
.- Spot Name, required
spot_name Surf spot name, such as Pipeline or Huntington Beach Pier.
Huntington Beach Pier
Input as JSON
{ "region": "California", "spot_name": "Huntington Beach Pier"}Output
{ "region": "United States, California, Orange County, Huntington Beach", "spot_name": "Huntington Beach Pier Northside", "forecast_days": [ { "date": "2026-10-23", "rating": "Fair", "wind_direction": "E", "wind_speed_mph": 1.9, "main_swell_direction": "S", "main_swell_height_ft": 1.9, "main_swell_period_seconds": 17, "morning_surf_height_max_ft": 5, "morning_surf_height_min_ft": 4, "afternoon_surf_height_max_ft": 5, "afternoon_surf_height_min_ft": 4 }, { "date": "2026-10-24", "rating": "Fair to Good", "wind_direction": "ENE", "wind_speed_mph": 2.4, "main_swell_direction": "S", "main_swell_height_ft": 2.4, "main_swell_period_seconds": 15, "morning_surf_height_max_ft": 5, "morning_surf_height_min_ft": 4, "afternoon_surf_height_max_ft": 5, "afternoon_surf_height_min_ft": 4 }, { "date": "2026-10-25", "rating": "Fair", "wind_direction": "ENE", "wind_speed_mph": 2.1, "main_swell_direction": "S", "main_swell_height_ft": 2.2, "main_swell_period_seconds": 14, "morning_surf_height_max_ft": 4, "morning_surf_height_min_ft": 3, "afternoon_surf_height_max_ft": 4, "afternoon_surf_height_min_ft": 3 } ], "surfline_link": "https://www.surfline.com/surf-report/huntington-beach-pier-northside/5842041f4e65fad6a7708827" , "surfline_spot_id": "5842041f4e65fad6a7708827", "current_conditions": { "rating": "Fair", "tide_state": "Rising", "wind_direction": "ESE", "wind_speed_mph": 3.5, "surf_height_max_ft": 5, "surf_height_min_ft": 4, "water_temperature_f": 73 }}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"surfline.com/get_surf_forecast","input":{"region":"California","spot_name":"Huntington Beach Pier"}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "surfline.com/get_surf_forecast" , "input": { "region": "California", "spot_name": "Huntington Beach Pier" }})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "surfline.com/get_surf_forecast" , "input": { "region": "California", "spot_name": "Huntington Beach Pier" } }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run surfline.com/get_surf_forecast# with {"region":"California","spot_name":"Huntington Beach Pier"}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "type": "object", "required": [ "spot_name" ], "properties": { "region": { "type": "string", "default": "", "description": "Location to distinguish spots with the same name, such as Hawaii or California." }, "spot_name": { "type": "string", "description": "Surf spot name, such as Pipeline or Huntington Beach Pier." } }}Output schema
{ "type": "object", "required": [ "spot_name", "region", "current_conditions", "forecast_days", "surfline_link", "surfline_spot_id" ], "properties": { "region": { "type": "string" }, "spot_name": { "type": "string" }, "forecast_days": { "type": "array", "items": { "type": "object", "required": [ "date", "morning_surf_height_min_ft", "morning_surf_height_max_ft", "afternoon_surf_height_min_ft", "afternoon_surf_height_max_ft", "rating", "main_swell_height_ft", "main_swell_period_seconds", "main_swell_direction", "wind_speed_mph", "wind_direction" ], "properties": { "date": { "type": "string", "format": "date" }, "rating": { "type": [ "string", "null" ] }, "wind_direction": { "type": [ "string", "null" ] }, "wind_speed_mph": { "type": [ "number", "null" ] }, "main_swell_direction": { "type": [ "string", "null" ] }, "main_swell_height_ft": { "type": [ "number", "null" ] }, "main_swell_period_seconds": { "type": [ "number", "null" ] }, "morning_surf_height_max_ft": { "type": [ "number", "null" ] }, "morning_surf_height_min_ft": { "type": [ "number", "null" ] }, "afternoon_surf_height_max_ft": { "type": [ "number", "null" ] }, "afternoon_surf_height_min_ft": { "type": [ "number", "null" ] } } } }, "surfline_link": { "type": "string" }, "surfline_spot_id": { "type": "string", "x-fous-developer": true }, "current_conditions": { "type": "object", "required": [ "surf_height_min_ft", "surf_height_max_ft", "rating", "wind_speed_mph", "wind_direction", "tide_state", "water_temperature_f" ], "properties": { "rating": { "type": [ "string", "null" ] }, "tide_state": { "type": [ "string", "null" ] }, "wind_direction": { "type": [ "string", "null" ] }, "wind_speed_mph": { "type": [ "number", "null" ] }, "surf_height_max_ft": { "type": [ "number", "null" ] }, "surf_height_min_ft": { "type": [ "number", "null" ] }, "water_temperature_f": { "type": [ "number", "null" ] } } } }}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
surfline.com/get_surf_forecast- Returns
- spot name and region, current conditions, five forecast days, Surfline link and spot id
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method surfline.com/get_surf_forecast with the inputs above.
Ask your agent
- What are the surf conditions right now at Pipeline on the North Shore of Oahu, and what's the forecast for the next five days?
- Can you check the surf forecast for Huntington Beach Pier in California this week?
- I'm planning a trip to Mavericks in Half Moon Bay; how big will the waves be over the next few days, morning and afternoon?
- Give me the current swell and five-day outlook for Trestles in Southern California before I head out tomorrow.
- Look up the surf report for Jaws in Maui, including the spot ID and a link to the full Surfline page.
See more
Gets the latest published OnTheSnow snow report for a ski resort by name, optionally narrowed by region or country. Off-season measurements may be unavailable; surface conditions are returned only when stated in words on the report.
onthesnow.com/get_ski_reportGets The Weather Channel's daily forecast for a city, address, ZIP code or postcode: up to 15 upcoming days with highs, lows, conditions, rain chance, wind, humidity, UV and sun times.
weather.com/get_daily_forecastLooks up the National Weather Service seven-day day and night forecast for a U.S. city, address, or ZIP code. Forecast availability depends on NWS land-grid coverage.
weather.gov/get_forecastGets current conditions and today's high and low from The Weather Channel for a city, postcode, ZIP code or street address worldwide. Street addresses are geocoded exactly first; some observations omit gusts or other measurements.
weather.com/get_current_weatherGets the latest observed weather from a nearby National Weather Service station for a US city, address, or ZIP code. Measurements the station does not report are null.
weather.gov/get_current_conditionsGets up to 10 days of MSN Weather forecasts for a city, address, or ZIP code, with optional hourly forecasts for the next 24 hours.
msn.com/get_forecastFinds the nearest NOAA tide prediction station to a US coastal place (within 30 miles) and returns its high and low tide times in local time with predicted heights above MLLW.
tidesandcurrents.noaa.gov/get_tide_timesReturns CNBC levels and changes for major stock indexes and U.S. futures, optionally by region. Quote times and market-status labels are null when CNBC does not show them; quotes may be delayed.
cnbc.com/get_market_snapshot