Microproduct data guideintermediate

NOAA Tides and Currents

Official coastal water levels, tide predictions, currents, and station metadata for building harbor, shoreline, and marine-planning tools.

At a glance

Difficulty
Intermediate — some data preparation helps
Size
Small · ≤0.1 GB
Formats
JSON, CSV, XML
Access
API
API key
Not required
Provider
NOAA Center for Operational Oceanographic Products and Services
Updates
Continuous
Data terms
U.S. Government public data / NOAA disclaimer

From source to product signal

Test a product idea in four steps

NOAA CO-OPS publishes observed and predicted water levels for supported coastal stations. Start with one station and one UTC day, using the same units and tidal datum for both series. Station coverage, time zone, units, datum, and the distinction between an observation and a prediction must remain explicit.

1

Check the setup

  • Python 3.10 or newer
  • A notebook environment such as Jupyter or Google Colab
  • An internet connection
2

Access the data

  1. 1.Use the station metadata tools to confirm that the station supports water levels and predictions.
  2. 2.Request one day of observations and predictions with the same station, time zone, units, and tidal datum.
  3. 3.Retain quality flags and label each series as observed or predicted before comparing values.
Open official source
3

Run the Python example

Install the packages, then run the notebook cell.

python -m pip install pandas requests

import pandas as pd
import requests

base_url = "https://api.tidesandcurrents.noaa.gov/api/prod/datagetter"
common = {
    "date": "today",
    "station": "9414290",
    "datum": "MLLW",
    "time_zone": "gmt",
    "units": "metric",
    "application": "TrilemmaDataGuide",
    "format": "json",
}
observed_response = requests.get(base_url, params={**common, "product": "water_level"}, timeout=30)
predicted_response = requests.get(base_url, params={**common, "product": "predictions"}, timeout=30)
observed_response.raise_for_status()
predicted_response.raise_for_status()
observed = pd.DataFrame(observed_response.json()["data"]).rename(columns={"t": "time", "v": "observed_m"})
predicted = pd.DataFrame(predicted_response.json()["predictions"]).rename(columns={"t": "time", "v": "predicted_m"})
comparison = observed.merge(predicted, on="time", how="inner")
comparison[["observed_m", "predicted_m"]] = comparison[["observed_m", "predicted_m"]].apply(pd.to_numeric)
comparison["difference_m"] = comparison["observed_m"] - comparison["predicted_m"]
comparison["retrieved_at_utc"] = pd.Timestamp.now(tz="UTC")
print(comparison[["time", "observed_m", "predicted_m", "difference_m", "q"]].head())
4

Test a useful signal

Compare observed and predicted water levels

Find when observed water level differs most from the tide prediction at one station during one day.

  1. 01Confirm that both series use station 9414290, GMT, metric units, and the MLLW tidal datum.
  2. 02Match timestamps and rank the absolute observed-minus-predicted differences while retaining observation quality flags.
  3. 03Explain how preliminary observations, station coverage, datum, time zone, and prediction-versus-observation semantics limit the comparison.

Dataset details

NOAA Center for Operational Oceanographic Products and Services is a government source. Last verified 2026-08-11. Temporal coverage: station-dependent historical, current, and predicted conditions.

Domains

Coastal DataWater ResourcesMarine Operations

Data types

Time SeriesStation Data

Tasks

Water-Level MonitoringForecast EvaluationOperational Planning

Geography

United States

Formats

JSONCSVXML

Provider

NOAA Center for Operational Oceanographic Products and Services

Data terms

U.S. Government public data / NOAA disclaimer