NOAA API: Get water level
Gets the latest NOAA coastal water level, the matching tide prediction, the direction of change, and water temperature for the station nearest a US coastal place (within 50 miles).
Unofficial. Not affiliated with or endorsed by NOAA.
Inputs
Values from the run on Oct 23, 2026, shown under Output.
- Units optional
units Water-level units, for example imperial (feet) or metric (meters).
metric
One of
imperial,metric. Defaultimperial.- Location, required
location US coastal town, beach, or harbor, for example Charleston, SC.
San Francisco, CA
Input as JSON
{ "units": "metric", "location": "San Francisco, CA"}Output
{ "difference": 0.359, "level_unit": "meters", "station_id": "9414290", "station_name": "San Francisco", "station_page": "https://tidesandcurrents.noaa.gov/stationhome.html?id=9414290" , "distance_miles": 3.4, "water_direction": "steady", "observation_time": "2026-10-23T02:48:00-07:00", "observed_water_level": 0.695, "predicted_water_level": 0.336, "water_temperature_celsius": null, "water_temperature_fahrenheit": null}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"tidesandcurrents.noaa.gov/get_water_level","input":{"units":"metric","location":"San Francisco, CA"}}' # 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": "tidesandcurrents.noaa.gov/get_water_level" , "input": { "units": "metric", "location": "San Francisco, CA" }})# 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": "tidesandcurrents.noaa.gov/get_water_level" , "input": { "units": "metric", "location": "San Francisco, CA" } }), 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 tidesandcurrents.noaa.gov/get_water_level# with {"units":"metric","location":"San Francisco, CA"}"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": [ "location" ], "properties": { "units": { "enum": [ "imperial", "metric" ], "type": "string", "default": "imperial", "description": "Water-level units, for example imperial (feet) or metric (meters)." }, "location": { "type": "string", "description": "US coastal town, beach, or harbor, for example Charleston, SC." } }, "additionalProperties": false}Output schema
{ "type": "object", "required": [ "station_name", "distance_miles", "observation_time", "observed_water_level", "predicted_water_level", "difference", "level_unit", "water_direction", "water_temperature_fahrenheit", "water_temperature_celsius", "station_page", "station_id" ], "properties": { "difference": { "type": "number", "description": "Observed minus predicted water level, in level_unit." }, "level_unit": { "enum": [ "feet", "meters" ], "type": "string", "description": "Unit for water-level values." }, "station_id": { "type": "string", "description": "NOAA station identifier.", "x-fous-developer": true }, "station_name": { "type": "string", "description": "Name of the NOAA water level station." }, "station_page": { "type": "string", "description": "NOAA station page link." }, "distance_miles": { "type": "number", "description": "Distance from the searched place to the station in miles." }, "water_direction": { "enum": [ "rising", "falling", "steady" ], "type": "string", "description": "Change in recent observations." }, "observation_time": { "type": "string", "description": "Observation time at the station in local ISO 8601 with UTC offset." }, "observed_water_level": { "type": "number", "description": "Observed height above mean lower low water, in level_unit." }, "predicted_water_level": { "type": "number", "description": "Predicted height at observation time above mean lower low water, in level_unit." }, "water_temperature_celsius": { "type": [ "number", "null" ], "description": "Most recent water temperature in degrees Celsius, or null if unavailable." }, "water_temperature_fahrenheit": { "type": [ "number", "null" ], "description": "Most recent water temperature in degrees Fahrenheit, or null if unavailable." } }, "additionalProperties": false}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
tidesandcurrents.noaa.gov/get_water_level- Returns
- station, distance, observation time, observed and predicted water level, difference, direction, water temperature
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 tidesandcurrents.noaa.gov/get_water_level with the inputs above.
Ask your agent
- What is the current water level at the coast near Galveston, TX right now compared with the tide prediction?
- Is the tide rising or falling at Newport Beach harbor, and what's the water temperature there?
- I need the latest observed sea level in meters for the Santa Barbara waterfront, plus the predicted level for the same time.
- Check the nearest NOAA tide station to Ocean City, Maryland and tell me the water level difference and direction of change.
- Give me the observed water level in feet and water temperature for the station closest to Savannah, GA's coast.
See more
All NOAA methodsFinds 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_timesGets the 30-minute chance of aurora overhead near a place, current geomagnetic activity, and the three-day Kp outlook. Visibility also depends on darkness and local conditions; tonight uses approximate local solar hours 18:00-06:00.
swpc.noaa.gov/get_aurora_forecastLists active tropical cyclones in the selected basin, strongest first, with current conditions, advisory and forecast cone.
nhc.noaa.gov/list_active_stormsLists NOAA space weather alerts, warnings, watches and summaries issued in the last 1 to 7 days, newest first, with validity times and NOAA scale levels when the message gives them.
swpc.noaa.gov/list_space_weather_alertsGets the latest water height, flow, 24-hour trend and flood-stage status at the active USGS river gauge best matching a river or town and state. Flood stage is null when not published; gauges without recent stage, flow or 24-hour history are not returned.
waterdata.usgs.gov/get_river_levelGets 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 current conditions and RealFeel for a city or postal code on AccuWeather. The UV level follows standard UV-index ranges. Air quality is null unless it is shown with the current conditions.
accuweather.com/get_current_weatherGets 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_weather