---
name: noaa-coops-data-api-ingestion
description: "How to get NOAA CO-OPS Data API data into a pandas DataFrame and Parquet: access, the request, the format, limits, quirks and terms."
---

# Load recent NOAA CO-OPS water levels into Parquet

Source entry: https://signal-lab-jet.vercel.app/datasets/noaa-coops-data-api
Provider: https://api.tidesandcurrents.noaa.gov/api/prod/
Checked against the provider's documentation: 2026-11-01

## Access
- No account or key. The data-retrieval endpoint accepts public query parameters.
- Specify an application identifier, station, product, time range, units, time zone and output format; water-level products also need a datum.

## Request
```bash
curl 'https://api.tidesandcurrents.noaa.gov/api/prod/datagetter?date=recent&station=9414290&product=water_level&datum=MLLW&time_zone=gmt&units=metric&application=SignalLab&format=json'
```

## Format
JSON object with station metadata and observation rows containing time, water-level value, standard deviation, quality flags and preliminary or verified status.

## Load into pandas and Parquet
Needs Python 3 with requests, pandas and pyarrow.
```python
"""NOAA CO-OPS recent San Francisco water levels -> pandas -> Parquet."""
import requests
import pandas as pd

URL = "https://api.tidesandcurrents.noaa.gov/api/prod/datagetter"
PARAMS = {"date": "recent", "station": "9414290", "product": "water_level",
          "datum": "MLLW", "time_zone": "gmt", "units": "metric",
          "application": "SignalLab", "format": "json"}
r = requests.get(URL, params=PARAMS, timeout=60)
r.raise_for_status()
payload = r.json()
df = pd.DataFrame(payload["data"])
df["time"] = pd.to_datetime(df["t"], utc=True)
df["water_level_m"] = pd.to_numeric(df["v"])
df.to_parquet("noaa_coops_water_levels.parquet", index=False)
print(len(df), "observations at", payload["metadata"]["name"],
      df["time"].min().isoformat(), "to", df["time"].max().isoformat())
```
Run by us on 2026-11-01 (python 3.13.5 | pandas 3.1.0 | pyarrow 26.0.0 | requests 2.34.2). Result: 719 observations at San Francisco 2026-10-30T02:24:00+00:00 to 2026-11-02T02:12:00+00:00

## Limits
- The recent selector returns the last 72 hours.
- One-minute requests are limited to four days and six-minute requests to one month; longer-interval products allow larger spans.
- The API throttles heavy query volume, but no numeric request rate is stated.

## Quirks
- Set time_zone=gmt and parse timestamps as UTC; local station modes can include daylight-saving behavior.
- Store datum and units with water-level values because identical numbers are not comparable across reference datums or unit systems.
- The q field distinguishes preliminary from verified values, and monthly verification can revise earlier observations.
- Some products require additional parameters such as datum, bin, interval or velocity type.

## Terms and attribution
- CO-OPS says government-server information is public domain unless specifically annotated otherwise.
- NOS asks for attribution when its material is reproduced and redistributed.
- Do not modify data and present the result as official government material; preliminary data require appropriate caution.
- Terms page: https://www.tidesandcurrents.noaa.gov/disclaimers.html

## Sources
- https://api.tidesandcurrents.noaa.gov/api/prod/: "The CO-OPS API for data retrieval can be used to retrieve"
- https://api.tidesandcurrents.noaa.gov/api/prod/: "Data length is limited to 4 days"
- https://www.tidesandcurrents.noaa.gov/disclaimers.html: "may be used freely by the public."

## Help improve this skill
Missing a source, or see something to improve? Call the MCP tool suggest_source or feedback (or POST /api/suggest or /api/feedback). Reviewed ideas: https://signal-lab-jet.vercel.app/agent-suggestions

Information for educational purposes only. Free tiers, limits and licenses belong to the providers and may change; check the provider's own terms before using the data.
