---
name: nws-api-ingestion
description: "How to get National Weather Service API (api.weather.gov) data into a pandas DataFrame and Parquet: access, the request, the format, limits, quirks and terms."
---

# Load an NWS hourly point forecast into pandas and Parquet

Source entry: https://signal-lab-jet.vercel.app/datasets/nws-api
Provider: https://www.weather.gov/documentation/services-web-api
Checked against the provider's documentation: 2026-10-30

## Access
- No account or API key.
- A User-Agent header is required. Observed 2026-10-30: omitting the header returned HTTP 403.

## Request
```bash
curl -H 'User-Agent: SignalLabCatalog/1.0 (catalog@signal-lab.example)' 'https://api.weather.gov/points/41.88,-87.63'
```

## Format
GeoJSON/JSON-LD. The /points response links to forecastHourly; that response contains a properties.periods array with ISO 8601 times and forecast fields.

## Load into pandas and Parquet
Needs Python 3 with requests, pandas and pyarrow.
```python
"""NWS hourly point forecast for Chicago -> pandas -> Parquet. No key."""
import requests
import pandas as pd

HEADERS = {"User-Agent": "SignalLabCatalog/1.0 (catalog@signal-lab.example)"}
point = requests.get("https://api.weather.gov/points/41.88,-87.63", headers=HEADERS, timeout=30)
point.raise_for_status()
forecast_url = point.json()["properties"]["forecastHourly"]
forecast = requests.get(forecast_url, headers=HEADERS, timeout=30)
forecast.raise_for_status()
df = pd.DataFrame(forecast.json()["properties"]["periods"])
df["startTime"] = pd.to_datetime(df["startTime"], utc=True)
df["endTime"] = pd.to_datetime(df["endTime"], utc=True)
df.to_parquet("nws_chicago_hourly.parquet", index=False)
print(len(df), "hourly periods", df["startTime"].min().isoformat(), "to", df["startTime"].max().isoformat())
```
Run by us on 2026-10-30 (python 3.13.5 | pandas 3.1.0 | pyarrow 26.0.0 | requests 2.34.2). Result: 156 hourly periods 2026-10-30T14:00:00+00:00 to 2026-11-06T01:00:00+00:00

## Limits
- Rate limit: Not stated. NWS says the numeric limit is not public.
- The hourly point forecast covers the next seven days.

## Quirks
- Resolve coordinates through /points, then follow properties.forecastHourly; office and grid coordinates can change.
- Forecast timestamps carry offsets. Convert with utc=True before combining locations.
- This endpoint gives the current forecast, not a historical forecast archive.

## Terms and attribution
- NWS information is generally public-domain material unless marked otherwise. Do not claim it as your own, imply endorsement, or present modified content as official material.
- Check product timestamps and third-party markings.
- Terms page: https://www.weather.gov/disclaimer

## Sources
- https://www.weather.gov/documentation/services-web-api: "All of the information presented via the API is intended to be open data, free to use for any purpose."
- https://www.weather.gov/documentation/services-web-api: "A User Agent is required to identify your application."
- https://www.weather.gov/documentation/services-web-api: "The rate limit is not public information, but allows a generous amount for typical use."
- https://www.weather.gov/disclaimer: "The information on National Weather Service (NWS) Web pages are in the public domain, unless specifically noted otherwise, and may be used without charge for any lawful purpose"

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.
