# NOAA Tides & Currents

> Read NOAA's tide and current data for the US coast: water levels from any of its gauges, tide predictions for 3,500 stations, tidal current predictions, wind, air and water temperature, pressure and visibility, bridge clearances, and the live board from every PORTS. It also covers the long view - sea level trends and rise projections, record and extreme water levels, and high tide flooding days, likelihoods and projections. No account or API key required.

App · Weather & Space · 35 actions. Web page: https://docs.lodol.com/docs/integrations/noaa-tides-and-currents

## Actions

### Check service status

Check whether CO-OPS is running in Continuity of Operations mode, when it serves from its backup site and some products are reduced. A scheduled workflow can check this first and hold off rather than recording a gap as real data. No API key required.

**Inputs**: None.

**Outputs**

- `count` (number): How many rows came back.
- `entries` (list): A single row describing the service's current mode.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "entries": [
    {
      "continuity_of_operations": false,
      "status": "normal service"
    }
  ],
  "message": "",
  "station": null,
  "units": ""
}
```

### Find nearby stations

List the stations within a given distance of another one, nearest first, with what each measures. Use it to find the gauge nearest a harbour, or a fallback when a station goes quiet. No API key required.

**Inputs**

- Station ID (`station`, text, required): A CO-OPS station id of any kind: a water level station (8454000), a current meter (cb0102), or a prediction station (ACT0926). Find stations returns them, and a current prediction resource may want the bin-suffixed form, ACT0091_1.
- Within (`radius`, number): How far to search, in nautical miles. Defaults to 10. From 0.1 to 500.0. Default: `10.0`.

**Outputs**

- `count` (number): How many rows came back.
- `entries` (list): One row per station, nearest first.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `radius_nautical_miles` (number): The radius that was searched.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `station_id` (text): The station that was searched around.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "entries": [
    {
      "distance_nautical_miles": 18.4,
      "id": "8452660",
      "latitude": 41.504333,
      "longitude": -71.32614,
      "name": "Newport, RI",
      "station_type": "Water Level,Meteorological"
    }
  ],
  "message": "",
  "radius_nautical_miles": 10.0,
  "station": null,
  "station_id": "8454000",
  "units": ""
}
```

### Find stations

Find CO-OPS stations by name or state and get the id every other action takes, along with their coordinates and which networks they belong to. Pick the collection you need - active water level gauges, tide prediction stations, current meters, weather sensors, and more. No API key required.

**Inputs**

- Kind of station (`station_type`, text): Which collection to search. Leave blank for every station CO-OPS publishes. One of: `waterlevels` (Water level stations (active)), `historicwl` (Water level stations (active and historic)), `met` (Meteorological stations), `waterlevelsandmet` (Water level and meteorological stations), `tidepredictions` (Tide prediction stations), `harcon` (Stations with harmonic constituents), `datums` (Stations with published datums), `supersededdatums` (Stations with superseded datums), `benchmarks` (Stations with published benchmarks), `supersededbenchmarks` (Stations with superseded benchmarks), and 13 more.
- Name contains (`name_contains`, text): Only stations whose name contains this text, for example 'harbor'. Leave blank for all of them.
- State (`state`, text): Only stations in this US state or territory, as its two-letter code.
- Units (`units`, text): English gives feet, Fahrenheit and knots; metric gives metres, Celsius and centimetres per second. One of: `english` (English (feet, °F, knots)), `metric` (Metric (metres, °C, cm/s)). Default: `english`.
- Stations per page (`limit`, number): How many stations to return, up to 5000. Defaults to 200. From 1 to 5000. Default: `200`.
- Skip (`offset`, number): How many stations to skip before returning results. Feed the result's next_offset back in to walk a long list. From 0 to 5000. Default: `0`.

**Outputs**

- `count` (number): How many rows came back.
- `entries` (list): One row per station, by name.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `next_offset` (number): Feed this back as 'Skip' to read the next page. Null on the last page.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `total_matching` (number): How many stations matched before the page was cut.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "entries": [
    {
      "affiliations": "NWLON,PORTS",
      "available_resources": [
        "details",
        "sensors",
        "datums"
      ],
      "great_lakes": false,
      "id": "8454000",
      "latitude": 41.807167,
      "longitude": -71.400665,
      "name": "Providence",
      "ports_code": "nb",
      "shef_code": "FOXR1",
      "state": "RI",
      "station_type": "",
      "tidal": true,
      "tide_type": "Mixed",
      "time_zone_offset": -5
    }
  ],
  "message": "",
  "next_offset": null,
  "station": null,
  "total_matching": 1,
  "units": ""
}
```

### Get a station

Read one station's record - where it is, what it is affiliated with, which resources it publishes - and optionally fold those resources straight in, so its datums, sensors and flood thresholds arrive in the same step. No API key required.

**Inputs**

- Station ID (`station`, text, required): A CO-OPS station id of any kind: a water level station (8454000), a current meter (cb0102), or a prediction station (ACT0926). Find stations returns them, and a current prediction resource may want the bin-suffixed form, ACT0091_1.
- Include (`include`, list): Resources to fold into the record instead of fetching them separately. A station only carries the ones its kind publishes; asking for another is simply ignored. One or more of: `details`, `sensors`, `products` (Product links), `disclaimers`, `notices`, `datums`, `supersededdatums` (Superseded datums), `harcon` (Harmonic constituents), `tidepredoffsets` (Tide prediction offsets), `currentpredictionoffsets` (Current prediction offsets), and 5 more.
- Units (`units`, text): English gives feet, Fahrenheit and knots; metric gives metres, Celsius and centimetres per second. One of: `english` (English (feet, °F, knots)), `metric` (Metric (metres, °C, cm/s)). Default: `english`.

**Outputs**

- `count` (number): How many rows came back.
- `entries` (list): One row per station, by name.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `next_offset` (number): Feed this back as 'Skip' to read the next page. Null on the last page.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `total_matching` (number): How many stations matched before the page was cut.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "entries": [
    {
      "affiliations": "NWLON,PORTS",
      "available_resources": [
        "details",
        "sensors",
        "datums"
      ],
      "expanded": {
        "details": {
          "established": "1938-06-03 00:00:00",
          "id": "8454000",
          "noaachart": "13224",
          "removed": ""
        }
      },
      "great_lakes": false,
      "id": "8454000",
      "latitude": 41.807167,
      "longitude": -71.400665,
      "name": "Providence",
      "ports_code": "nb",
      "shef_code": "FOXR1",
      "state": "RI",
      "station_type": "",
      "tidal": true,
      "tide_type": "Mixed",
      "time_zone_offset": -5
    }
  ],
  "message": "",
  "next_offset": null,
  "station": null,
  "total_matching": 1,
  "units": ""
}
```

### Get annual current predictions

Read a whole year of tidal current predictions for one station in a single step: every slack water and every maximum flood and ebb, in order. This is the annual current table, the same one NOAA publishes as a report. No API key required.

**Inputs**

- Station (`station`, text, required): The tidal current prediction station, chosen by name. Harmonic stations can be predicted on any interval; subordinate stations only produce maximum flood, slack and maximum ebb.
- Year (`year`, number, required): The year to cover. From 1900 to 2100.
- Depth bin (`bin_number`, number): Which depth to predict for. Defaults to bin 1, which is the only bin most prediction stations have. From 1 to 200. Default: `1`.
- Time zone (`time_zone`, text): The time zone the predictions are timed in. One of: `LST_LDT` (Local time, corrected for daylight saving), `LST` (Local standard time), `GMT` (Greenwich Mean Time). Default: `LST_LDT`.
- Clock (`clock`, text): Whether times are written on a 12- or 24-hour clock. One of: `24hr` (24-hour clock), `am/pm` (12-hour clock). Default: `24hr`.
- Units (`units`, text): English gives feet, Fahrenheit and knots; metric gives metres, Celsius and centimetres per second. One of: `english` (English (feet, °F, knots)), `metric` (Metric (metres, °C, cm/s)). Default: `english`.

**Outputs**

- `count` (number): How many rows came back.
- `entries` (list): One row per slack water or maximum current, in order.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `time_column` (text): The report's own heading for its time column.
- `units` (text): The units the values are in, as the service reported them.
- `year` (text): The year covered.

**Example output**

```json
{
  "count": 2,
  "entries": [
    {
      "speed": null,
      "time": "2026-01-01 01:59",
      "type": "slack"
    },
    {
      "speed": 0.8,
      "time": "2026-01-01 06:23",
      "type": "flood"
    }
  ],
  "message": "",
  "station": {
    "id": "ACT0926_1",
    "latitude": null,
    "longitude": null,
    "name": ""
  },
  "time_column": "Date_Time (LST_LDT)",
  "units": "english",
  "year": "2026"
}
```

### Get annual flood outlook

Read how many days of high tide flooding a station is expected to see this meteorological year, as a low-to-high range, with when the outlook was issued and how it was computed. NOAA publishes it each May. No API key required.

**Inputs**

- Station (`station`, text, required): The water level station to read, chosen by name. Only stations that measure water levels are listed.
- Meteorological year (`met_year`, number): The May-to-April year to read. Leave blank for every outlook published for the station. From 1900 to 2100.
- Years to include (`years_back`, number): How many years to return, counting back from the year given. From 1 to 200.

**Outputs**

- `count` (number): How many rows came back.
- `details` (object): Whatever the product publishes alongside its rows - the datum it was computed against, the trend, the notice explaining how to read it.
- `entries` (list): One row per meteorological year that has been forecast.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "details": {},
  "entries": [
    {
      "highConf": 10,
      "lowConf": 5,
      "metYear": 2025,
      "projectDate": "2025-05-31",
      "projectMethod": "Quadratic",
      "stnId": "8454000",
      "stnName": "Providence, RI"
    }
  ],
  "message": "",
  "station": null,
  "units": ""
}
```

### Get benchmark elevations

Read a survey benchmark's published elevation and the datums measured from it - the fixed marks a tide station's heights are ultimately tied to, used when a gauge is re-levelled or replaced. Take the benchmark number from a station's benchmarks. No API key required.

**Inputs**

- Benchmark number (`benchmark_number`, number, required): The benchmark's 'vm' number, from Get station metadata with resource 'benchmarks'. At least 1.
- Mark ID (`mark_id`, text): Optional National Geodetic Survey permanent identifier, such as HU0108, to read one mark of that benchmark.
- As published on (`date`, date): Read the sheet as it stood on this date. Leave blank for the current one.

**Outputs**

- `benchmark_number` (number): The benchmark that was read.
- `count` (number): How many rows came back.
- `details` (object): Whatever the product publishes alongside its rows - the datum it was computed against, the trend, the notice explaining how to read it.
- `entries` (list): One row per published mark.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "benchmark_number": 8,
  "count": 1,
  "details": {},
  "entries": [
    {
      "datums": {
        "mhhw_offset": 1.83,
        "mllw_offset": 0.0
      },
      "elevation": 5.11,
      "epoch": "1983-2001",
      "hiObs": 4.98,
      "loObs": -1.09,
      "stationId": "1611400",
      "vmNum": 8
    }
  ],
  "message": "",
  "station": null,
  "units": ""
}
```

### Get bridge clearance

Read the air gap - the clearance between a bridge and the water beneath it - at the bridges NOAA measures, which is what a ship's master checks before passing under one. Measured from a fixed point on the bridge, so no datum applies. No API key required.

**Inputs**

- Bridge (`station`, text, required): The bridge whose clearance to read, chosen by name. Air gap is measured at a couple of dozen bridges over US shipping channels.
- Quick range (`date`, text): A ready-made period, instead of naming dates. Leave the start and end dates blank when using it. One of: `latest` (Latest reading (the last 18 minutes)), `today` (Today, from midnight), `recent` (The last 72 hours).
- From (`begin_date`, date and time): Start of the period to read, in the time zone chosen below. Pair it with an end date, or with 'Hours of data'.
- To (`end_date`, date and time): End of the period to read, in the time zone chosen below. Pair it with a start date, or with 'Hours of data'.
- Hours of data (`hours_back`, number): How many hours to read. On its own it counts back from now; with a start date it counts forward from there, and with an end date it counts back from there. From 0.1 to 8760.
- Units (`units`, text): English gives feet, Fahrenheit and knots; metric gives metres, Celsius and centimetres per second. One of: `english` (English (feet, °F, knots)), `metric` (Metric (metres, °C, cm/s)). Default: `english`.
- Time zone (`time_zone`, text): The time zone the dates you give and the times you get back are in. Local time is the station's own, not yours. One of: `lst_ldt` (Station local time (daylight saving applied)), `gmt`, `lst` (Station local standard time (no daylight saving)). Default: `lst_ldt`.

**Outputs**

- `count` (number): How many rows came back.
- `entries` (list): One row per reading, oldest first.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "entries": [
    {
      "flags": "0,0,0,0",
      "quality": "",
      "sigma": 0.118,
      "time": "2026-08-19 16:06",
      "value": 227.808
    }
  ],
  "message": "",
  "station": {
    "id": "8517986",
    "latitude": 40.6062,
    "longitude": -74.0448,
    "name": "Verrazano-Narrows Air Gap"
  },
  "units": "english"
}
```

### Get current meter status

Read a current meter's own housekeeping record for a period: which way it is pointing, its pitch and roll, the water temperature and pressure at the instrument, and its battery voltage. This is how you tell a station that has stopped reporting from one whose mooring has shifted. No API key required.

**Inputs**

- Station (`station`, text, required): The current meter to read, chosen by name. Meters deployed now, retired meters and short survey deployments are all listed.
- Quick range (`date`, text): A ready-made period, instead of naming dates. Leave the start and end dates blank when using it. One of: `latest` (Latest reading (the last 18 minutes)), `today` (Today, from midnight), `recent` (The last 72 hours).
- From (`begin_date`, date and time): Start of the period to read, in the time zone chosen below. Pair it with an end date, or with 'Hours of data'.
- To (`end_date`, date and time): End of the period to read, in the time zone chosen below. Pair it with a start date, or with 'Hours of data'.
- Hours of data (`hours_back`, number): How many hours to read. On its own it counts back from now; with a start date it counts forward from there, and with an end date it counts back from there. From 0.1 to 8760.
- Units (`units`, text): English gives feet, Fahrenheit and knots; metric gives metres, Celsius and centimetres per second. One of: `english` (English (feet, °F, knots)), `metric` (Metric (metres, °C, cm/s)). Default: `english`.
- Time zone (`time_zone`, text): The time zone the dates you give and the times you get back are in. Local time is the station's own, not yours. One of: `lst_ldt` (Station local time (daylight saving applied)), `gmt`, `lst` (Station local standard time (no daylight saving)). Default: `lst_ldt`.

**Outputs**

- `count` (number): How many rows came back.
- `entries` (list): One row per record, oldest first.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "entries": [
    {
      "battery_voltage": 11.5,
      "depth": null,
      "heading": 92.1,
      "pitch": -3.3,
      "pressure": 2.03,
      "roll": -3.2,
      "time": "2026-08-16 20:21:00",
      "water_temperature": 25.11
    }
  ],
  "message": "",
  "station": {
    "id": "cb0102",
    "latitude": 36.9594,
    "longitude": -76.0128,
    "name": "Cape Henry LB 2CH"
  },
  "units": "english"
}
```

### Get current predictions

Read predicted tidal currents: when the flood and ebb run hardest, when the water goes slack, and how fast it runs in between. Slack water is what you plan a transit or a dive around. Covers 4,000-odd prediction stations, for any date. No API key required.

**Inputs**

- Station (`station`, text, required): The tidal current prediction station, chosen by name. Harmonic stations can be predicted on any interval; subordinate stations only produce maximum flood, slack and maximum ebb.
- Interval (`interval`, text): Maximums and slacks is the current table itself. The other intervals return the predicted curve. Subordinate stations only publish maximums and slacks. One of: `max_slack` (Maximum flood, slack water and maximum ebb), `h` (Hourly), `60` (Every 60 minutes), `30` (Every 30 minutes), `10` (Every 10 minutes), `6` (Every 6 minutes), `1` (Every minute). Default: `max_slack`.
- Depth bin (`bin_number`, number): Which depth to predict for. Leave blank for the bin nearest the surface. From 0 to 200.
- Reported as (`velocity_type`, text): Flood and ebb reports the speed along the channel with the directions it runs, which is how a current table reads. Speed and direction reports a compass bearing instead, and only applies to the interval predictions at harmonic stations. One of: `default` (Flood and ebb directions), `speed_dir` (Speed and compass direction). Default: `default`.
- Quick range (`date`, text): A ready-made period, instead of naming dates. Leave the start and end dates blank when using it. One of: `latest` (Latest reading (the last 18 minutes)), `today` (Today, from midnight), `recent` (The last 72 hours).
- From (`begin_date`, date and time): Start of the period to read, in the time zone chosen below. Pair it with an end date, or with 'Hours of data'.
- To (`end_date`, date and time): End of the period to read, in the time zone chosen below. Pair it with a start date, or with 'Hours of data'.
- Hours of data (`hours_back`, number): How many hours to read. On its own it counts back from now; with a start date it counts forward from there, and with an end date it counts back from there. From 0.1 to 8760.
- Units (`units`, text): English gives feet, Fahrenheit and knots; metric gives metres, Celsius and centimetres per second. One of: `english` (English (feet, °F, knots)), `metric` (Metric (metres, °C, cm/s)). Default: `english`.
- Time zone (`time_zone`, text): The time zone the dates you give and the times you get back are in. Local time is the station's own, not yours. One of: `lst_ldt` (Station local time (daylight saving applied)), `gmt`, `lst` (Station local standard time (no daylight saving)). Default: `lst_ldt`.

**Outputs**

- `count` (number): How many rows came back.
- `entries` (list): One row per prediction, oldest first.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 2,
  "entries": [
    {
      "bin": 1,
      "depth": 10,
      "direction": null,
      "mean_ebb_direction": 66,
      "mean_flood_direction": 259,
      "speed": null,
      "time": "2026-08-19 03:12",
      "type": "flood",
      "velocity_major": 0.62
    },
    {
      "bin": 1,
      "depth": 10,
      "direction": null,
      "mean_ebb_direction": 66,
      "mean_flood_direction": 259,
      "speed": null,
      "time": "2026-08-19 05:18",
      "type": "slack",
      "velocity_major": 0
    }
  ],
  "message": "",
  "station": null,
  "units": "feet, knots"
}
```

### Get daily flood days

Read, day by day, whether a station flooded and how high the water got: the day's peak level, the hour it happened, and whether minor, moderate or major flooding was reached. High tide flooding is the sunny-day flooding that closes a road at high water. No API key required.

**Inputs**

- Station (`station`, text, required): The water level station to read, chosen by name. Only stations that measure water levels are listed.
- From (`start_date`, date, required): First day to include.
- To (`end_date`, date, required): Last day to include.
- Datum (`datum`, text): The level heights are measured from. One of: `MHHW` (MHHW - Mean Higher High Water), `MHW` (MHW - Mean High Water), `MTL` (MTL - Mean Tide Level), `MSL` (MSL - Mean Sea Level), `MLW` (MLW - Mean Low Water), `MLLW` (MLLW - Mean Lower Low Water (chart datum)), `NAVD` (NAVD - North American Vertical Datum), `STND` (STND - Station Datum). Default: `MHHW`.
- Units (`units`, text): English gives feet; metric gives metres. One of: `english` (English (feet)), `metric` (Metric (metres)). Default: `english`.

**Outputs**

- `count` (number): How many rows came back.
- `details` (object): Whatever the product publishes alongside its rows - the datum it was computed against, the trend, the notice explaining how to read it.
- `entries` (list): One row per day.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "details": {},
  "entries": [
    {
      "day": "09/01/2024",
      "majFlag": 0,
      "maxTime": 12,
      "maxWL": 8.78,
      "minFlag": 0,
      "modFlag": 0,
      "nanFlag": 0,
      "percent_completeness": 100.0
    }
  ],
  "message": "",
  "station": {
    "id": "8454000",
    "latitude": 41.807167,
    "longitude": -71.400665,
    "name": "Providence, RI"
  },
  "units": "feet"
}
```

### Get daily highest and lowest levels

Read the highest and lowest water level of each day at a station, with the time each happened and how complete that day's record was. Verified data - the quickest way to find the worst day of a storm, or to chart a season. No API key required.

**Inputs**

- Station (`station`, text, required): The water level station to read, chosen by name. Only stations that measure water levels are listed.
- Measured from (`measured_from`, text): Which series the daily extremes are taken from. The 6-minute series catches a sharper peak; the hourly one is the published default. One of: `hourly` (Hourly readings (the default)), `6` (6-minute readings). Default: `hourly`.
- From (`begin_date`, date and time, required): Start of the period to read. This product is verified after the fact, so it is always asked for by date rather than as a live reading.
- To (`end_date`, date and time, required): End of the period to read.
- Datum (`datum`, text): The level heights are measured from. Mean Lower Low Water is the nautical chart datum for US coastal waters and is what tide tables are drawn against; the Great Lakes use IGLD or LWD instead. One of: `MLLW` (MLLW - Mean Lower Low Water (chart datum)), `MHHW` (MHHW - Mean Higher High Water), `MHW` (MHW - Mean High Water), `MTL` (MTL - Mean Tide Level), `MSL` (MSL - Mean Sea Level), `MLW` (MLW - Mean Low Water), `NAVD` (NAVD - North American Vertical Datum), `STND` (STND - Station Datum), `IGLD` (IGLD - International Great Lakes Datum), `LWD` (LWD - Great Lakes Low Water Datum), `CRD` (CRD - Columbia River Datum). Default: `MLLW`.
- Units (`units`, text): English gives feet, Fahrenheit and knots; metric gives metres, Celsius and centimetres per second. One of: `english` (English (feet, °F, knots)), `metric` (Metric (metres, °C, cm/s)). Default: `english`.
- Time zone (`time_zone`, text): The time zone the dates you give and the times you get back are in. This product is only published in standard time or GMT. One of: `lst` (Station local standard time (no daylight saving)), `gmt`. Default: `lst`.

**Outputs**

- `count` (number): How many rows came back.
- `entries` (list): Two rows per day - the maximum and the minimum - in date order.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 2,
  "entries": [
    {
      "date": "2026-01-01",
      "flags": "0",
      "percent_complete": 100,
      "time": "05:00",
      "type": "maximum",
      "value": 6.087
    },
    {
      "date": "2026-01-01",
      "flags": "0",
      "percent_complete": 100,
      "time": "11:00",
      "type": "minimum",
      "value": 0.612
    }
  ],
  "message": "",
  "station": {
    "id": "8454000",
    "latitude": 41.8072,
    "longitude": -71.4007,
    "name": "Providence"
  },
  "units": "english"
}
```

### Get extreme water levels

Read the highest (or lowest) water level of every year, or every month, in a station's record, detrended so the years can be compared. Optionally add the exceedance levels - the height expected to be passed once a year, once a decade, once a century. No API key required.

**Inputs**

- Station (`station`, text, required): The water level station to read, chosen by name. Only stations that measure water levels are listed.
- One row per (`period`, text): Whether to read yearly or monthly extremes. One of: `annuals` (One row per year), `monthlies` (One row per month). Default: `annuals`.
- Extreme (`level_type`, text): Whether to read the highest or the lowest levels. One of: `high` (Highest levels), `low` (Lowest levels). Default: `high`.
- Also include (`details`, text): Add the exceedance probability levels - how high the water is expected to get at each return period. Leave blank for the extremes alone. One of: `exceedancelevels` (Add the yearly exceedance probability levels), `exceedancelevelsmonth` (Add the monthly exceedance probability levels).
- Units (`units`, text): English gives feet; metric gives metres. One of: `english` (English (feet)), `metric` (Metric (metres)). Default: `english`.

**Outputs**

- `count` (number): How many rows came back.
- `details` (object): Whatever the product publishes alongside its rows - the datum it was computed against, the trend, the notice explaining how to read it.
- `entries` (list): One row per year or month, oldest first, each with the extreme level reached. Asking for exceedance levels adds the levels expected to be passed once a year, once a decade and so on.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 2,
  "details": {
    "datum": "mhhw",
    "trend": 1.04,
    "trendUnits": "in/decade"
  },
  "entries": [
    {
      "value": 13.12,
      "year": 1938
    },
    {
      "value": 2.31,
      "year": 1939
    }
  ],
  "message": "",
  "station": {
    "id": "8454000",
    "latitude": null,
    "longitude": null,
    "name": ""
  },
  "units": "feet"
}
```

### Get flood day counts

Count how many days a station flooded, summarised by calendar year, by month, by season, or by meteorological year - the May to April year that keeps a winter's floods together. The record summary instead returns the worst year on record and how many flood days were typical in 2000, for comparison. No API key required.

**Inputs**

- Station (`station`, text, required): The water level station to read, chosen by name. Only stations that measure water levels are listed.
- Counted by (`period`, text): How the flood days are grouped. One of: `annual` (Calendar year), `monthly` (Month), `seasonal` (Season), `met_year` (Meteorological year (May to April)), `record` (Record and typical flood days). Default: `annual`.
- Year (`year`, number): The year to count. Leave blank for the whole published record - which is what the record summary wants, since it is only published for a couple of report years. From 1900 to 2100.
- Month (`month`, number): Counting by month: which month, 1 to 12. Leave blank for every month of the year. From 1 to 12.
- Season (`season`, text): Counting by season: which season. Leave blank for all four. One of: `1` (Winter (Dec, Jan, Feb)), `2` (Spring (Mar, Apr, May)), `3` (Summer (Jun, Jul, Aug)), `4` (Autumn (Sep, Oct, Nov)).
- Periods to include (`periods_back`, number): How many periods to return, counting back from the year given. Use it to pull a decade in one step. From 1 to 200.

**Outputs**

- `count` (number): How many rows came back.
- `details` (object): Whatever the product publishes alongside its rows - the datum it was computed against, the trend, the notice explaining how to read it.
- `entries` (list): One row per period.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `period` (text): Which summary was read.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "details": {},
  "entries": [
    {
      "majCount": 0,
      "minCount": 19,
      "modCount": 2,
      "nanCount": 0,
      "percent_completeness": 100.0,
      "stnId": "8454000",
      "stnName": "Providence, RI",
      "year": 2024
    }
  ],
  "message": "",
  "period": "annual",
  "station": null,
  "units": ""
}
```

### Get flood day projections

Read how many days of flooding a station is projected to see in a future decade, under each sea level rise scenario - or the narrower range now judged most likely. The number a planning or resilience case is built on. No API key required.

**Inputs**

- Station (`station`, text, required): The water level station to read, chosen by name. Only stations that measure water levels are listed.
- Read (`dataset`, text): Every scenario for the decade, or just the range now judged most likely. One of: `decadal` (Projected flood days per decade, by scenario), `likely_scenarios` (The scenarios judged most likely for the decade). Default: `decadal`.
- Decade (`decade`, number): The decade to project to, as a four-digit year such as 2050. Leave blank for every decade published. From 2020 to 2200.
- Decades to include (`decades_ahead`, number): How many decades to return, counting on from the decade given. From 1 to 20.
- Flooding level (`flood_threshold`, text): Only this level of flooding. Leave blank for all three. One of: `minor` (Minor flooding), `moderate` (Moderate flooding), `major` (Major flooding).

**Outputs**

- `count` (number): How many rows came back.
- `dataset` (text): 'decadal' or 'likely_scenarios', whichever was asked for.
- `details` (object): Whatever the product publishes alongside its rows - the datum it was computed against, the trend, the notice explaining how to read it.
- `entries` (list): One row per flooding level per decade.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "dataset": "decadal",
  "details": {},
  "entries": [
    {
      "decade": 2050,
      "flood_level": "minor",
      "high": 100,
      "intHigh": 85,
      "intLow": 55,
      "intermediate": 70,
      "low": 45,
      "source": "https://sealevel.globalchange.gov/internal_resources/756/noaa-nos-techrpt01-global-regional-SLR-scenarios-US.pdf"
    }
  ],
  "message": "",
  "station": {
    "id": "8454000",
    "latitude": 41.807167,
    "longitude": -71.400665,
    "name": "Providence, RI"
  },
  "units": ""
}
```

### Get flood level probabilities

Read how likely a given water level is at a station: the levels expected to be exceeded once in 1, 5, 10, 50 and 100 years, with confidence intervals, from NOAA's regional frequency analysis. This is the number a design or insurance question turns on. No API key required.

**Inputs**

- Station (`station`, text, required): The water level station to read, chosen by name. Only stations that measure water levels are listed.
- Datum (`datum`, text): The level heights are measured from. One of: `MHHW` (MHHW - Mean Higher High Water), `MHW` (MHW - Mean High Water), `MTL` (MTL - Mean Tide Level), `MSL` (MSL - Mean Sea Level), `MLW` (MLW - Mean Low Water), `MLLW` (MLLW - Mean Lower Low Water (chart datum)), `NAVD` (NAVD - North American Vertical Datum), `STND` (STND - Station Datum). Default: `MHHW`.
- Units (`units`, text): English gives feet; metric gives metres. One of: `english` (English (feet)), `metric` (Metric (metres)). Default: `english`.
- Use the long-term analysis (`long_term`, true/false): Use the analysis that accounts for long-term sea level change rather than the stationary one. Default: `false`.

**Outputs**

- `count` (number): How many rows came back.
- `details` (object): Whatever the product publishes alongside its rows - the datum it was computed against, the trend, the notice explaining how to read it.
- `entries` (list): One row per station, holding the levels expected to be exceeded at each return period - once in 1, 5, 10, 50 or 100 years - with their confidence intervals.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "details": {},
  "entries": [
    {
      "lat": "41.8072",
      "lon": "-71.4007",
      "name": "PROVIDENCE, PROVIDENCE RIVER",
      "stationId": "8454000",
      "tidalEpoch": "1983-2001"
    }
  ],
  "message": "",
  "station": null,
  "units": "feet"
}
```

### Get flood likelihoods

Read how likely high tide flooding is at a station over the coming year: the chance for each day, or the peak day of each month, with how far the predicted tide sits below the flooding threshold. This is the forecast behind NOAA's High Tide Bulletin. No API key required.

**Inputs**

- Station (`station`, text, required): The water level station to read, chosen by name. Only stations that measure water levels are listed.
- One row per (`report`, text): Every day in the period, or just the most likely day of each month. One of: `daily` (One row per day), `monthly_max` (The highest likelihood in each month). Default: `daily`.
- From (`start_date`, date): First day to include. Leave blank for the whole published run.
- To (`end_date`, date): Last day to include. Leave blank for the whole published run.
- Threshold (`threshold`, text): Which flooding threshold to forecast against. Leave blank for the ones the station publishes. One of: `nos_minor` (NOS minor flooding threshold), `nws_minor` (NWS minor flooding threshold), `0.5` (0.5 ft above the datum), `1.0` (1.0 ft above the datum), `1.5` (1.5 ft above the datum), `2.0` (2.0 ft above the datum), `2.5` (2.5 ft above the datum).
- Stations (`stations_published`, text): Whether to answer only for stations CO-OPS publishes likelihoods for. Leave blank for its own default. One of: `1` (Only stations CO-OPS publishes likelihoods for), `0` (Only stations it does not publish), `all` (Every station).
- Datum (`datum`, text): The level heights are measured from. One of: `MHHW` (MHHW - Mean Higher High Water), `MHW` (MHW - Mean High Water), `MTL` (MTL - Mean Tide Level), `MSL` (MSL - Mean Sea Level), `MLW` (MLW - Mean Low Water), `MLLW` (MLLW - Mean Lower Low Water (chart datum)), `NAVD` (NAVD - North American Vertical Datum), `STND` (STND - Station Datum). Default: `MHHW`.
- Units (`units`, text): English gives feet; metric gives metres. One of: `english` (English (feet)), `metric` (Metric (metres)). Default: `english`.

**Outputs**

- `count` (number): How many rows came back.
- `details` (object): Whatever the product publishes alongside its rows - the datum it was computed against, the trend, the notice explaining how to read it.
- `entries` (list): One row per day, or per month on the monthly reading.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `report` (text): 'daily' or 'monthly_max', whichever was asked for.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "details": {
    "region": "Northeast"
  },
  "entries": [
    {
      "date": "2026-08-19",
      "disttothreshold": -1.79,
      "flood": false,
      "likelihood": 0.0,
      "threshold": 1.83,
      "threshold_name": "NOS minor",
      "updated": "2026-07-13"
    }
  ],
  "message": "",
  "report": "daily",
  "station": {
    "id": "8454000",
    "latitude": 41.807167,
    "longitude": -71.400665,
    "name": "Providence, RI"
  },
  "units": "feet"
}
```

### Get forecast model water levels

Read water level guidance from NOAA's Operational Forecast System models - the nowcast and forecast for a station, at 6-minute steps. Where the gauge tells you what the water is doing, this tells you what the model expects it to do next. Available at real-time stations inside a model's area, from 2020 onwards. No API key required.

**Inputs**

- Station (`station`, text, required): The water level station to read, chosen by name. Only stations that measure water levels are listed.
- Quick range (`date`, text): A ready-made period, instead of naming dates. Leave the start and end dates blank when using it. One of: `latest` (Latest reading (the last 18 minutes)), `today` (Today, from midnight), `recent` (The last 72 hours).
- From (`begin_date`, date and time): Start of the period to read, in the time zone chosen below. Pair it with an end date, or with 'Hours of data'.
- To (`end_date`, date and time): End of the period to read, in the time zone chosen below. Pair it with a start date, or with 'Hours of data'.
- Hours of data (`hours_back`, number): How many hours to read. On its own it counts back from now; with a start date it counts forward from there, and with an end date it counts back from there. From 0.1 to 8760.
- Datum (`datum`, text): The level heights are measured from. Mean Lower Low Water is the nautical chart datum for US coastal waters and is what tide tables are drawn against; the Great Lakes use IGLD or LWD instead. One of: `MLLW` (MLLW - Mean Lower Low Water (chart datum)), `MHHW` (MHHW - Mean Higher High Water), `MHW` (MHW - Mean High Water), `MTL` (MTL - Mean Tide Level), `MSL` (MSL - Mean Sea Level), `MLW` (MLW - Mean Low Water), `NAVD` (NAVD - North American Vertical Datum), `STND` (STND - Station Datum), `IGLD` (IGLD - International Great Lakes Datum), `LWD` (LWD - Great Lakes Low Water Datum), `CRD` (CRD - Columbia River Datum). Default: `MLLW`.
- Units (`units`, text): English gives feet, Fahrenheit and knots; metric gives metres, Celsius and centimetres per second. One of: `english` (English (feet, °F, knots)), `metric` (Metric (metres, °C, cm/s)). Default: `english`.
- Time zone (`time_zone`, text): The time zone the dates you give and the times you get back are in. Local time is the station's own, not yours. One of: `lst_ldt` (Station local time (daylight saving applied)), `gmt`, `lst` (Station local standard time (no daylight saving)). Default: `lst_ldt`.

**Outputs**

- `count` (number): How many rows came back.
- `entries` (list): One row per reading, oldest first.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "entries": [
    {
      "flags": "",
      "quality": "",
      "sigma": null,
      "time": "2026-08-19 16:06",
      "value": 5.451
    }
  ],
  "message": "",
  "station": {
    "id": "9414290",
    "latitude": 37.8063,
    "longitude": -122.4659,
    "name": "San Francisco"
  },
  "units": "english"
}
```

### Get high and low waters

Read the high and low waters that actually happened at a station - when each tide turned and how high it got, with the higher high and lower low of each day marked. This is verified data, published about a month in arrears; for the tides still to come, use Get tide predictions. No API key required.

**Inputs**

- Station (`station`, text, required): The water level station to read, chosen by name. Only stations that measure water levels are listed.
- From (`begin_date`, date and time, required): Start of the period to read. This product is verified after the fact, so it is always asked for by date rather than as a live reading.
- To (`end_date`, date and time, required): End of the period to read.
- Hours of data (`hours_back`, number): How many hours to read. On its own it counts back from now; with a start date it counts forward from there, and with an end date it counts back from there. From 0.1 to 8760.
- Datum (`datum`, text): The level heights are measured from. Mean Lower Low Water is the nautical chart datum for US coastal waters and is what tide tables are drawn against; the Great Lakes use IGLD or LWD instead. One of: `MLLW` (MLLW - Mean Lower Low Water (chart datum)), `MHHW` (MHHW - Mean Higher High Water), `MHW` (MHW - Mean High Water), `MTL` (MTL - Mean Tide Level), `MSL` (MSL - Mean Sea Level), `MLW` (MLW - Mean Low Water), `NAVD` (NAVD - North American Vertical Datum), `STND` (STND - Station Datum), `IGLD` (IGLD - International Great Lakes Datum), `LWD` (LWD - Great Lakes Low Water Datum), `CRD` (CRD - Columbia River Datum). Default: `MLLW`.
- Units (`units`, text): English gives feet, Fahrenheit and knots; metric gives metres, Celsius and centimetres per second. One of: `english` (English (feet, °F, knots)), `metric` (Metric (metres, °C, cm/s)). Default: `english`.
- Time zone (`time_zone`, text): The time zone the dates you give and the times you get back are in. Local time is the station's own, not yours. One of: `lst_ldt` (Station local time (daylight saving applied)), `gmt`, `lst` (Station local standard time (no daylight saving)). Default: `lst_ldt`.

**Outputs**

- `count` (number): How many rows came back.
- `entries` (list): One row per tide, oldest first.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 2,
  "entries": [
    {
      "flags": "0,0",
      "time": "2026-06-01 02:48",
      "type": "low",
      "type_code": "L",
      "value": 1.055
    },
    {
      "flags": "0,0",
      "time": "2026-06-01 09:18",
      "type": "high",
      "type_code": "H",
      "value": 4.47
    }
  ],
  "message": "",
  "station": {
    "id": "8454000",
    "latitude": 41.8072,
    "longitude": -71.4007,
    "name": "Providence"
  },
  "units": "english"
}
```

### Get mean water levels

Read a station's monthly means - mean sea level, mean high and low water, the month's highest and lowest, and the tidal ranges - going back as far as the station does. Great Lakes stations can also be read as daily means. This is the series long-term change is measured in. No API key required.

**Inputs**

- Station (`station`, text, required): The water level station to read, chosen by name. Only stations that measure water levels are listed.
- Averaged over (`period`, text): Monthly means are published for every station. Daily means are a Great Lakes product only, and are always reported in local standard time. One of: `monthly_mean` (Monthly means), `daily_mean` (Daily means (Great Lakes only)). Default: `monthly_mean`.
- From (`begin_date`, date and time, required): Start of the period to read. This product is verified after the fact, so it is always asked for by date rather than as a live reading.
- To (`end_date`, date and time, required): End of the period to read.
- Datum (`datum`, text): The level heights are measured from. Mean Lower Low Water is the nautical chart datum for US coastal waters and is what tide tables are drawn against; the Great Lakes use IGLD or LWD instead. One of: `MLLW` (MLLW - Mean Lower Low Water (chart datum)), `MHHW` (MHHW - Mean Higher High Water), `MHW` (MHW - Mean High Water), `MTL` (MTL - Mean Tide Level), `MSL` (MSL - Mean Sea Level), `MLW` (MLW - Mean Low Water), `NAVD` (NAVD - North American Vertical Datum), `STND` (STND - Station Datum), `IGLD` (IGLD - International Great Lakes Datum), `LWD` (LWD - Great Lakes Low Water Datum), `CRD` (CRD - Columbia River Datum). Default: `MLLW`.
- Units (`units`, text): English gives feet, Fahrenheit and knots; metric gives metres, Celsius and centimetres per second. One of: `english` (English (feet, °F, knots)), `metric` (Metric (metres, °C, cm/s)). Default: `english`.
- Time zone (`time_zone`, text): The time zone the dates you give and the times you get back are in. Local time is the station's own, not yours. One of: `lst_ldt` (Station local time (daylight saving applied)), `gmt`, `lst` (Station local standard time (no daylight saving)). Default: `lst_ldt`.

**Outputs**

- `count` (number): How many rows came back.
- `entries` (list): One row per month for monthly means - each carrying every datum the month was summarised against - or one row per day for daily means, which carry a single value.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "entries": [
    {
      "diurnal_high_water_inequality": 0.279,
      "diurnal_low_water_inequality": 0.207,
      "dtl": 2.456,
      "gt": 4.751,
      "high_water_interval": 0.34,
      "highest": 6.419,
      "inferred": false,
      "low_water_interval": 5.97,
      "lowest": -1.022,
      "mhhw": 4.831,
      "mhw": 4.552,
      "mllw": 0.08,
      "mlw": 0.287,
      "mn": 4.265,
      "month": 1,
      "msl": 2.282,
      "mtl": 2.419,
      "year": 2025
    }
  ],
  "message": "",
  "station": {
    "id": "8454000",
    "latitude": 41.8072,
    "longitude": -71.4007,
    "name": "Providence"
  },
  "units": "english"
}
```

### Get measured currents

Read how fast the water is moving and which way, from one of NOAA's current meters. Each meter records at several depths, so pick a bin or take the one the station publishes by default. Covers meters deployed now as well as retired and survey deployments. No API key required.

**Inputs**

- Station (`station`, text, required): The current meter to read, chosen by name. Meters deployed now, retired meters and short survey deployments are all listed.
- Depth bin (`bin_number`, number): Which depth to read. Leave blank for the station's published bin, or use 0 for every bin at once (limited to seven days). Get station metadata, resource 'bins', lists the depths. From 0 to 200.
- Quick range (`date`, text): A ready-made period, instead of naming dates. Leave the start and end dates blank when using it. One of: `latest` (Latest reading (the last 18 minutes)), `today` (Today, from midnight), `recent` (The last 72 hours).
- From (`begin_date`, date and time): Start of the period to read, in the time zone chosen below. Pair it with an end date, or with 'Hours of data'.
- To (`end_date`, date and time): End of the period to read, in the time zone chosen below. Pair it with a start date, or with 'Hours of data'.
- Hours of data (`hours_back`, number): How many hours to read. On its own it counts back from now; with a start date it counts forward from there, and with an end date it counts back from there. From 0.1 to 8760.
- Hourly readings only (`hourly`, true/false): Return the reading on each hour instead of every six minutes. Default: `false`.
- Include signal quality (`detailed`, true/false): Also return the meter's echo intensity and correlation magnitude, which say how much to trust a reading. Not published for the last five days, or at every station. Default: `false`.
- Units (`units`, text): English gives feet, Fahrenheit and knots; metric gives metres, Celsius and centimetres per second. One of: `english` (English (feet, °F, knots)), `metric` (Metric (metres, °C, cm/s)). Default: `english`.
- Time zone (`time_zone`, text): The time zone the dates you give and the times you get back are in. Local time is the station's own, not yours. One of: `lst_ldt` (Station local time (daylight saving applied)), `gmt`, `lst` (Station local standard time (no daylight saving)). Default: `lst_ldt`.

**Outputs**

- `count` (number): How many rows came back.
- `entries` (list): One row per reading, oldest first.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "entries": [
    {
      "bin": 4,
      "correlation": null,
      "direction": 297,
      "echo_intensity": null,
      "speed": 0.935,
      "time": "2026-08-19 16:09"
    }
  ],
  "message": "",
  "station": {
    "id": "cb0102",
    "latitude": 36.9594,
    "longitude": -76.0128,
    "name": "Cape Henry LB 2CH"
  },
  "units": "english"
}
```

### Get observed sea level record

Read the observed sea level record a station's trend is fitted to - the trend itself, the seasonal cycle, and optionally the whole monthly mean series behind it. Choose the current tidal datum epoch or the most recent 30 years. No API key required.

**Inputs**

- Station (`station`, text, required): The water level station to read, chosen by name. Only stations that measure water levels are listed.
- Fitted over (`trend_period`, text): Which period the trend is computed across. One of: `NTDE` (National Tidal Datum Epoch (1983-2001)), `30YEAR` (Latest 30 years). Default: `NTDE`.
- Include the monthly series (`include_monthly_means`, true/false): Also return the monthly mean sea levels the trend was fitted to. That is decades of rows, so leave it off unless you are charting the record. Default: `false`.
- Units (`units`, text): English gives feet; metric gives metres. One of: `english` (English (feet)), `metric` (Metric (metres)). Default: `english`.

**Outputs**

- `count` (number): How many rows came back.
- `details` (object): Whatever the product publishes alongside its rows - the datum it was computed against, the trend, the notice explaining how to read it.
- `entries` (list): One row per station, holding the fitted trend, the station's metadata, and - when monthly means were asked for - the series the trend was fitted to.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "details": {},
  "entries": [
    {
      "metadata": {
        "state": "RI",
        "stationName": "Providence",
        "trendType": "NTDE",
        "trendUnits": "in/decade"
      },
      "seaLvlTrend": {
        "trend": 1.04,
        "trendError": 0.05
      },
      "stationId": "8454000"
    }
  ],
  "message": "",
  "station": null,
  "units": ""
}
```

### Get PORTS live readings

Read every live reading from one PORTS in a single call: water level, wind, air and water temperature, pressure, visibility and currents from every sensor in the port, all timestamped together. This is the screen a harbour pilot checks before a transit. No API key required.

**Inputs**

- PORTS (`ports_code`, text, required): The PORTS - the real-time system CO-OPS runs at a major seaport - to read, chosen by name.

**Outputs**

- `count` (number): How many rows came back.
- `entries` (list): One row per station reporting into the PORTS.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `observed_at` (text): When the screen was generated, YYYYMMDD HH:MM.
- `ports` (text): The PORTS that was read.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `time_zone` (text): The time zone the readings are timestamped in.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "entries": [
    {
      "kind": "water level",
      "latitude": 42.35389,
      "longitude": -71.05028,
      "measurements": {
        "airTemperature": {
          "airTemp": 84.38,
          "time": "2026-08-19 20:18:00.0"
        },
        "waterLevel": {
          "datum": "0",
          "observed": 9.723,
          "time": "2026-08-19 20:18:00.0",
          "trend": "rising"
        }
      },
      "name": "Boston",
      "station_id": "8443970"
    }
  ],
  "message": "",
  "observed_at": "20260819 16:24",
  "ports": "Boston Harbor PORTS",
  "station": null,
  "time_zone": "EDT",
  "units": ""
}
```

### Get record water levels

Read the ten highest water levels ever recorded at a station, with the storm that caused each one and how it was measured. The answer to 'has it ever been this high before?'. No API key required.

**Inputs**

- Station (`station`, text): The station to read, chosen by name. Leave blank for every station's records.
- Datum (`datum`, text): The level heights are measured from. One of: `MHHW` (MHHW - Mean Higher High Water), `MHW` (MHW - Mean High Water), `MTL` (MTL - Mean Tide Level), `MSL` (MSL - Mean Sea Level), `MLW` (MLW - Mean Low Water), `MLLW` (MLLW - Mean Lower Low Water (chart datum)), `NAVD` (NAVD - North American Vertical Datum), `STND` (STND - Station Datum). Default: `MHHW`.
- Units (`units`, text): English gives feet; metric gives metres. One of: `english` (English (feet)), `metric` (Metric (metres)). Default: `english`.

**Outputs**

- `count` (number): How many rows came back.
- `details` (object): Whatever the product publishes alongside its rows - the datum it was computed against, the trend, the notice explaining how to read it.
- `entries` (list): One row per record water level, highest first.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "details": {},
  "entries": [
    {
      "category": "Tropical",
      "datum": "MHHW",
      "event": "Great New England Hurricane",
      "height": 12.67,
      "peakDate": "1938-09-21",
      "peakTime": "00:00",
      "source": "High Water Mark",
      "stationId": "8454000",
      "stationName": "Providence, RI"
    }
  ],
  "message": "",
  "station": null,
  "units": "feet"
}
```

### Get regional flood outlook

Read NOAA's written high tide flooding outlook for a stretch of coast: which dates to watch this month and why, in plain English. Ready to drop straight into a newsletter or an alert. No API key required.

**Inputs**

- Region (`region`, text): Which stretch of coast the outlook is for. One of: `Northeast`, `Mid-Atlantic`, `Southeast and Caribbean Islands`, `Gulf Coast`, `West Coast`, `Pacific Islands`, `Alaska`. Default: `Northeast`.
- Year (`year`, number): The year to read. Leave blank for the current one. From 1900 to 2100.
- Month (`month`, number): The month to read, 1 to 12. Leave blank for the current one. From 1 to 12.

**Outputs**

- `count` (number): How many rows came back.
- `details` (object): Whatever the product publishes alongside its rows - the datum it was computed against, the trend, the notice explaining how to read it.
- `entries` (list): The outlook, as written for the region.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "details": {
    "month": "08",
    "region": "Northeast",
    "year": "2026"
  },
  "entries": [
    {
      "reason": "Most coastal locations along the Northeast coast are unlikely to experience flooding based primarily on tides this month. Expect higher tides on and around the dates of the new moon and full moon."
    }
  ],
  "message": "",
  "station": null,
  "units": ""
}
```

### Get sea level rise projections

Read how much sea level is projected to rise at a station, by decade and by scenario, from the US Interagency Sea Level Rise Task Force report - Low through Extreme, each with its confidence interval. The offsets dataset returns the reference levels those projections are stated against. No API key required.

**Inputs**

- Station (`station`, text, required): The water level station to read, chosen by name. Only stations that measure water levels are listed.
- Read (`dataset`, text): The projections themselves, or the offsets behind them. One of: `projections` (Projected rise, by scenario and year), `offsets` (Offsets used to reference the projections). Default: `projections`.
- Scenario (`scenario`, text): Only this rise scenario. Leave blank for all six, which is what you want to show a range. One of: `low`, `intermediate-low`, `intermediate`, `intermediate-high`, `high`, `extreme`.
- Projection year (`projection_year`, number): Only the projection for this year, which the report publishes by decade. Leave blank for every year. From 2000 to 2200.
- Stations (`affiliation`, text): Whether the station id is a US or a global one. One of: `US` (US stations), `Global` (Global stations). Default: `US`.
- Units (`units`, text): English gives feet; metric gives metres. One of: `english` (English (feet)), `metric` (Metric (metres)). Default: `english`.
- Page (`page`, number): Which page of results to read. Defaults to the first. From 1 to 1000. Default: `1`.

**Outputs**

- `count` (number): How many rows came back.
- `dataset` (text): 'projections' or 'offsets', whichever was asked for.
- `details` (object): Whatever the product publishes alongside its rows - the datum it was computed against, the trend, the notice explaining how to read it.
- `entries` (list): One row per scenario and projection year, or one per offset.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "dataset": "projections",
  "details": {
    "currPage": 1,
    "totalPages": 1
  },
  "entries": [
    {
      "projectionCiHigh": 15.7,
      "projectionCiLow": 7.9,
      "projectionRsl": 11.8,
      "projectionYear": 2050,
      "scenario": "Intermediate",
      "stationId": "8454000",
      "units": "in"
    }
  ],
  "message": "",
  "station": null,
  "units": ""
}
```

### Get sea level trend

Read how fast sea level is changing at a station, measured from its own record: the trend per decade, the confidence interval on it, and the years it was fitted over. Leave the station blank for every station NOAA publishes a trend for, US or global. No API key required.

**Inputs**

- Station (`station`, text): The station to read, chosen by name. Leave blank for every station with a published trend.
- Stations (`affiliation`, text): Whether to read US stations or the global ones NOAA also tracks. Leave blank for both. One of: `US` (US stations), `Global` (Global stations).

**Outputs**

- `count` (number): How many rows came back.
- `details` (object): Whatever the product publishes alongside its rows - the datum it was computed against, the trend, the notice explaining how to read it.
- `entries` (list): One row per station.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "details": {},
  "entries": [
    {
      "endDate": "2025-12-15",
      "latitude": 41.807167,
      "longitude": -71.400667,
      "startDate": "1938-07-15",
      "stationId": "8454000",
      "stationName": "Providence",
      "trend": 1.04,
      "trendError": 0.05,
      "trendUnits": "inches/decade"
    }
  ],
  "message": "",
  "station": null,
  "units": ""
}
```

### Get station metadata

Read one piece of a station's reference data: its tidal datums and the epoch they belong to, its harmonic constituents, its sensors and their status, its NOS and NWS flood thresholds, its survey benchmarks, its prediction offsets, or a current meter's depth bins and deployments. No API key required.

**Inputs**

- Station ID (`station`, text, required): A CO-OPS station id of any kind: a water level station (8454000), a current meter (cb0102), or a prediction station (ACT0926). Find stations returns them, and a current prediction resource may want the bin-suffixed form, ACT0091_1.
- Resource (`resource`, text): Which piece of the station's reference data to read. Get a station lists the ones it publishes. One of: `details` (Details (when it was installed, charts, time meridian)), `sensors` (Sensors installed, with status), `datums` (Tidal datums for the current epoch), `supersededdatums` (Tidal datums from the previous epoch), `harcon` (Harmonic constituents used for predictions), `benchmarks` (Survey benchmarks), `floodlevels` (NOS and NWS flood thresholds), `notices` (Station notices), `disclaimers`, `products` (Links to the products published for the station), and 4 more. Default: `datums`.
- Depth bin (`bin_number`, number): Harmonic constituents at a current meter only: return just this bin's constituents. Leave blank for all of them. From 1 to 200.
- Units (`units`, text): English gives feet, Fahrenheit and knots; metric gives metres, Celsius and centimetres per second. One of: `english` (English (feet, °F, knots)), `metric` (Metric (metres, °C, cm/s)). Default: `english`.

**Outputs**

- `count` (number): How many rows came back.
- `entries` (list): The resource's rows: one per datum, sensor, constituent, benchmark or bin. Resources that are a single record - flood levels, details, prediction offsets - come back as one row. The fields are the service's own; a datum, for instance, is name, description and value.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `resource` (text): Which resource was read.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `station_id` (text): The station it was read for.
- `summary` (object): The context that comes with the rows - the datum epoch, the number of bins, the units - when the resource has any.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 2,
  "entries": [
    {
      "description": "Station Datum",
      "name": "STND",
      "value": 0.0
    },
    {
      "description": "Mean Higher High Water",
      "name": "MHHW",
      "value": 4.8
    }
  ],
  "message": "",
  "resource": "datums",
  "station": null,
  "station_id": "8454000",
  "summary": {
    "OrthometricDatum": "NAVD88",
    "accepted": "Apr 17 2003",
    "epoch": "1983-2001",
    "superseded": ""
  },
  "units": "feet"
}
```

### Get storm peak water levels

Read the named storms of a year, then the peak water level each station recorded during one of them. Name a year to list its storms and their event ids, then feed an id back in to see what the water did along the coast. No API key required.

**Inputs**

- Year (`year`, number): List the storms of this year. Leave blank when reading one storm by its id. From 1900 to 2100.
- Storm (`event_id`, number): The event id of one storm, from an earlier run of this action. Returns what each station recorded. At least 1.
- Datum (`datum`, text): The level heights are measured from. One of: `MHHW` (MHHW - Mean Higher High Water), `MHW` (MHW - Mean High Water), `MTL` (MTL - Mean Tide Level), `MSL` (MSL - Mean Sea Level), `MLW` (MLW - Mean Low Water), `MLLW` (MLLW - Mean Lower Low Water (chart datum)), `NAVD` (NAVD - North American Vertical Datum), `STND` (STND - Station Datum). Default: `MHHW`.
- Units (`units`, text): English gives feet; metric gives metres. One of: `english` (English (feet)), `metric` (Metric (metres)). Default: `english`.

**Outputs**

- `count` (number): How many rows came back.
- `details` (object): Whatever the product publishes alongside its rows - the datum it was computed against, the trend, the notice explaining how to read it.
- `entries` (list): One row per storm when a year was named, or one row per station when a storm was.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "details": {},
  "entries": [
    {
      "eventId": 578,
      "eventType": "Extra Tropical",
      "height": null,
      "name": "Nor easter",
      "peakDate": null,
      "startDate": "2012-01-12 00:00:00",
      "stationId": null
    }
  ],
  "message": "",
  "station": null,
  "units": "feet"
}
```

### Get tide predictions

Read predicted tides for any of NOAA's 3,500 prediction stations: the high and low waters with their times and heights, or the whole curve at an interval you choose. Works for dates years ahead, so it answers 'when is high tide on Saturday?' as easily as it fills a year's tide table. No API key required.

**Inputs**

- Station (`station`, text, required): The tide prediction station, chosen by name. Every station tides are predicted for is listed, including the thousands of subordinate ones that have no gauge of their own.
- Interval (`interval`, text): High and low waters is the tide table most people want. The other intervals return the predicted curve, one row per interval. Subordinate stations - most of the 3,500 - only publish high and low waters. One of: `hilo` (High and low waters only), `h` (Hourly), `60` (Every 60 minutes), `30` (Every 30 minutes), `15` (Every 15 minutes), `10` (Every 10 minutes), `6` (Every 6 minutes), `5` (Every 5 minutes), `1` (Every minute). Default: `hilo`.
- Quick range (`date`, text): A ready-made period, instead of naming dates. Leave the start and end dates blank when using it. One of: `latest` (Latest reading (the last 18 minutes)), `today` (Today, from midnight), `recent` (The last 72 hours).
- From (`begin_date`, date and time): Start of the period to read, in the time zone chosen below. Pair it with an end date, or with 'Hours of data'.
- To (`end_date`, date and time): End of the period to read, in the time zone chosen below. Pair it with a start date, or with 'Hours of data'.
- Hours of data (`hours_back`, number): How many hours to read. On its own it counts back from now; with a start date it counts forward from there, and with an end date it counts back from there. From 0.1 to 8760.
- Datum (`datum`, text): The level heights are measured from. Mean Lower Low Water is the nautical chart datum for US coastal waters and is what tide tables are drawn against; the Great Lakes use IGLD or LWD instead. One of: `MLLW` (MLLW - Mean Lower Low Water (chart datum)), `MHHW` (MHHW - Mean Higher High Water), `MHW` (MHW - Mean High Water), `MTL` (MTL - Mean Tide Level), `MSL` (MSL - Mean Sea Level), `MLW` (MLW - Mean Low Water), `NAVD` (NAVD - North American Vertical Datum), `STND` (STND - Station Datum), `IGLD` (IGLD - International Great Lakes Datum), `LWD` (LWD - Great Lakes Low Water Datum), `CRD` (CRD - Columbia River Datum). Default: `MLLW`.
- Units (`units`, text): English gives feet, Fahrenheit and knots; metric gives metres, Celsius and centimetres per second. One of: `english` (English (feet, °F, knots)), `metric` (Metric (metres, °C, cm/s)). Default: `english`.
- Time zone (`time_zone`, text): The time zone the dates you give and the times you get back are in. Local time is the station's own, not yours. One of: `lst_ldt` (Station local time (daylight saving applied)), `gmt`, `lst` (Station local standard time (no daylight saving)). Default: `lst_ldt`.

**Outputs**

- `count` (number): How many rows came back.
- `entries` (list): One row per prediction, oldest first.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 2,
  "entries": [
    {
      "time": "2026-08-19 01:27",
      "type": "high",
      "type_code": "H",
      "value": 3.897
    },
    {
      "time": "2026-08-19 06:14",
      "type": "low",
      "type_code": "L",
      "value": 0.74
    }
  ],
  "message": "",
  "station": {
    "id": "8454000",
    "latitude": 41.8072,
    "longitude": -71.4007,
    "name": "Providence"
  },
  "units": "english"
}
```

### Get water levels

Read the water level measured at a tide station: the latest reading, today's, or any period you name. Choose the 6-minute series for the live gauge, the hourly series for verified history, or the 1-minute series for storm detail. Heights come back against the datum you pick, so they read the same way a tide table does. No API key required.

**Inputs**

- Station (`station`, text, required): The water level station to read, chosen by name. Only stations that measure water levels are listed.
- Series (`data_type`, text): Which water level series to read. The 6-minute series is the live gauge and is what most workflows want; the hourly series is verified about a month after the fact and is the one to use for history. One of: `water_level` (6-minute (preliminary or verified)), `one_minute_water_level` (1-minute (preliminary)), `hourly_height` (Hourly (verified)), `partner_water_level` (6-minute from a partner agency). Default: `water_level`.
- Quick range (`date`, text): A ready-made period, instead of naming dates. Leave the start and end dates blank when using it. One of: `latest` (Latest reading (the last 18 minutes)), `today` (Today, from midnight), `recent` (The last 72 hours).
- From (`begin_date`, date and time): Start of the period to read, in the time zone chosen below. Pair it with an end date, or with 'Hours of data'.
- To (`end_date`, date and time): End of the period to read, in the time zone chosen below. Pair it with a start date, or with 'Hours of data'.
- Hours of data (`hours_back`, number): How many hours to read. On its own it counts back from now; with a start date it counts forward from there, and with an end date it counts back from there. From 0.1 to 8760.
- Datum (`datum`, text): The level heights are measured from. Mean Lower Low Water is the nautical chart datum for US coastal waters and is what tide tables are drawn against; the Great Lakes use IGLD or LWD instead. One of: `MLLW` (MLLW - Mean Lower Low Water (chart datum)), `MHHW` (MHHW - Mean Higher High Water), `MHW` (MHW - Mean High Water), `MTL` (MTL - Mean Tide Level), `MSL` (MSL - Mean Sea Level), `MLW` (MLW - Mean Low Water), `NAVD` (NAVD - North American Vertical Datum), `STND` (STND - Station Datum), `IGLD` (IGLD - International Great Lakes Datum), `LWD` (LWD - Great Lakes Low Water Datum), `CRD` (CRD - Columbia River Datum). Default: `MLLW`.
- Units (`units`, text): English gives feet, Fahrenheit and knots; metric gives metres, Celsius and centimetres per second. One of: `english` (English (feet, °F, knots)), `metric` (Metric (metres, °C, cm/s)). Default: `english`.
- Time zone (`time_zone`, text): The time zone the dates you give and the times you get back are in. Local time is the station's own, not yours. One of: `lst_ldt` (Station local time (daylight saving applied)), `gmt`, `lst` (Station local standard time (no daylight saving)). Default: `lst_ldt`.

**Outputs**

- `count` (number): How many rows came back.
- `entries` (list): One row per reading, oldest first.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "entries": [
    {
      "flags": "0,0,0,0",
      "quality": "preliminary",
      "sigma": 0.036,
      "time": "2026-08-19 16:06",
      "value": 3.945
    }
  ],
  "message": "",
  "station": {
    "id": "8454000",
    "latitude": 41.8072,
    "longitude": -71.4007,
    "name": "Providence"
  },
  "units": "english"
}
```

### Get weather and water conditions

Read what a tide station's other sensors report: air and water temperature, wind speed, direction and gusts, barometric pressure, humidity, visibility, conductivity, and salinity. One action, one measurement at a time. Which sensors a station carries varies, and a measurement it does not record comes back empty rather than failing. No API key required.

**Inputs**

- Station (`station`, text, required): The station to read, chosen by name. Only stations carrying a weather or water-quality sensor are listed; which sensors a station has varies, so a measurement it does not record comes back empty rather than failing.
- Measurement (`measurement`, text): Which sensor to read. One of: `air_temperature` (Air temperature), `water_temperature` (Water temperature), `wind` (Wind (speed, direction and gusts)), `air_pressure` (Barometric pressure), `humidity` (Relative humidity), `conductivity`, `salinity` (Salinity and specific gravity), `visibility`. Default: `air_temperature`.
- Quick range (`date`, text): A ready-made period, instead of naming dates. Leave the start and end dates blank when using it. One of: `latest` (Latest reading (the last 18 minutes)), `today` (Today, from midnight), `recent` (The last 72 hours).
- From (`begin_date`, date and time): Start of the period to read, in the time zone chosen below. Pair it with an end date, or with 'Hours of data'.
- To (`end_date`, date and time): End of the period to read, in the time zone chosen below. Pair it with a start date, or with 'Hours of data'.
- Hours of data (`hours_back`, number): How many hours to read. On its own it counts back from now; with a start date it counts forward from there, and with an end date it counts back from there. From 0.1 to 8760.
- Hourly readings only (`hourly`, true/false): Return the reading on each hour instead of every six minutes. Useful for a long period, which is otherwise ten rows an hour. Default: `false`.
- Units (`units`, text): English gives feet, Fahrenheit and knots; metric gives metres, Celsius and centimetres per second. One of: `english` (English (feet, °F, knots)), `metric` (Metric (metres, °C, cm/s)). Default: `english`.
- Time zone (`time_zone`, text): The time zone the dates you give and the times you get back are in. Local time is the station's own, not yours. One of: `lst_ldt` (Station local time (daylight saving applied)), `gmt`, `lst` (Station local standard time (no daylight saving)). Default: `lst_ldt`.

**Outputs**

- `count` (number): How many rows came back.
- `entries` (list): One row per reading, oldest first. Which fields are filled in depends on the measurement: most report 'value', wind reports speed, direction and gust, and salinity reports salinity and specific gravity.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "entries": [
    {
      "direction": 230.0,
      "direction_cardinal": "SW",
      "flags": "0,0",
      "gust": 15.94,
      "speed": 12.83,
      "time": "2026-08-19 16:06"
    }
  ],
  "message": "",
  "station": {
    "id": "8454000",
    "latitude": 41.8072,
    "longitude": -71.4007,
    "name": "Providence"
  },
  "units": "english"
}
```

### List PORTS

List every PORTS - the Physical Oceanographic Real-Time Systems NOAA runs at major US seaports - with the two-letter code the other PORTS actions take. No API key required.

**Inputs**: None.

**Outputs**

- `count` (number): How many rows came back.
- `entries` (list): One row per PORTS, by name.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "entries": [
    {
      "code": "bh",
      "id": 79,
      "latitude": 42.34193,
      "longitude": -71.0142,
      "name": "Boston Harbor PORTS",
      "weather_forecast_url": "https://forecast.weather.gov/MapClick.php?lon=-71.02&lat=42.349"
    }
  ],
  "message": "",
  "station": null,
  "units": "English"
}
```

### List PORTS plots

List the plots CO-OPS publishes for PORTS stations - which chart is drawn for which station, and the image it is published as. No API key required.

**Inputs**

- Station ID (`station`, text): Only the plots for this station, by its id. Leave blank for every PORTS plot.
- Plots to return (`limit`, number): How many plots to return. Defaults to 200. From 1 to 5000. Default: `200`.

**Outputs**

- `count` (number): How many rows came back.
- `entries` (list): One row per plot.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `total_matching` (number): How many plots matched before the list was cut.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "entries": [
    {
      "image_name": "8443970_wl_72.png",
      "plot_tab": "3WM",
      "plot_type": "wl",
      "source_station_id": "8443970",
      "station_id": "8443970"
    }
  ],
  "message": "",
  "station": null,
  "total_matching": 8,
  "units": "English"
}
```

### List PORTS stations

List the stations that make up one PORTS, with the id and position of each - the water level gauges, current meters and weather sensors a port is watched with. No API key required.

**Inputs**

- PORTS (`ports_code`, text, required): The PORTS - the real-time system CO-OPS runs at a major seaport - to read, chosen by name.

**Outputs**

- `count` (number): How many rows came back.
- `entries` (list): One row per station in the PORTS.
- `message` (text): Empty on a normal read. When a station does not offer the product asked for, or has nothing recorded for the period, this carries the service's explanation and 'entries' is empty - the step succeeds so a workflow covering several stations is not stopped by the one without that sensor.
- `station` (object): The station the data came from. Null for products that cover many stations at once.
- `units` (text): The units the values are in, as the service reported them.

**Example output**

```json
{
  "count": 1,
  "entries": [
    {
      "label": "Boston",
      "latitude": 42.35389,
      "longitude": -71.05028,
      "ports_code": "bh",
      "ports_name": "Boston Harbor PORTS",
      "station_id": "8443970"
    }
  ],
  "message": "",
  "station": null,
  "units": "English"
}
```
