Weather models are like digital photos — the smaller the "pixels," the sharper the image. The GFS model covers the planet in 13 km pixels (blurry, like a low-res photo). Your actual forecast comes from a 2.5 km pixel (sharp, like a high-res photo) — cell TWC/97,63 — covering your home in Saddlebrooke, Arizona. This site explains the data pipeline that produces it.
///cared.rangers.decor
🏢 NWS Tucson (TWC)
📡 Radar: KEMX
🗺️ Pinal County
Your home at ///cared.rangers.decor is mapped to a specific cell in the NWS Tucson forecast domain. The API snaps coordinates to the nearest supported grid point — about 875 m from your home.
| Address | 520 N Park Ave, Suite 304, Tucson, AZ 85719 |
| Phone | (520) 670-6526 |
| w-twc.webmaster@noaa.gov | |
| Web | weather.gov/twc |
| Region | Western (parent: WSRH) |
| Counties | Pinal, Pima, Cochise, Santa Cruz, Graham, Greenlee |
| Radar | KEMX — Mt. Bigelow (~55 km SE) |
| Forecast Zone | AZZ506 (Tucson metro area) |
| County | Pinal (AZC021) |
| Time Zone | America/Phoenix — no DST |
| Elevation | 1,053 m (3,455 ft) |
| Nearest ASOS | KRYN (Tucson Int'l) ~40 km SE |
The National Weather Service provides a free, public JSON API at api.weather.gov — no API key needed, just a User-Agent header identifying your application. This is the same API that powers weather.gov, and many third-party services layer on top of it.
GET https://api.weather.gov/points/32.5471,-110.8514
Takes lat/lon, returns the grid office and grid coordinates for that location. The NWS divides the US into a grid managed by local Weather Forecast Offices (WFOs). The precision is limited — your coordinates get snapped to the nearest ~1 km supported point.
GET https://api.weather.gov/gridpoints/TWC/97,63/forecast
Returns the forecast for that grid cell as GeoJSON: 12-hour day/night periods for 7 days, plus detailedForecast text, wind, precipitation probability, and more.
The US is divided into a ~2.5 km grid by each local WFO. Every point in the country belongs to exactly one grid cell. Meteorologists at each WFO edit the model guidance cell-by-cell to produce the National Digital Forecast Database (NDFD) — the authoritative forecast for the US.
When you check weather on weather.gov, or use most weather APIs, they ultimately read from the NDFD grids. The forecast for your home in Saddlebrooke is produced at the Tucson office and comes from cell TWC/97,63.
A common question: "Do Apple Weather, AccuWeather, and The Weather Channel all start from this same NWS data?"
The honest answer is complicated — it varies by company and by data type.
Think of it like GPS: the government provides the foundational signals (NWS data), and companies build their own products on top — some just repackage (weather.gov apps), others layer proprietary models (AccuWeather, IBM), and some blend multiple sources (Apple Weather). The NWS data is the common foundation, but commercial forecasts diverge significantly due to proprietary downscaling and modeling.
Your forecast isn't just one model — it's the output of a pipeline. Global models feed regional models, which feed high-resolution models, and then a human meteorologist edits the final grid.
RAP (Rapid Refresh) shares the same 13 km grid as GFS, but covers only CONUS and updates hourly — used for convection and precipitation nowcasting.
The GFS sees your home as part of a 13 km block — roughly from Oracle to the eastern Tucson outskirts (27 NDFD cells in one). The NAM narrows it to 12 km (23 NDFD cells). The HRRR gets closer at 3 km — just 1.4× coarser than your final forecast. But it's the NWS Tucson forecasters who take all of that and produce the final 2.5 km forecast specifically for TWC/97,63 — adjusting for Catalina Mountain foothills, urban heat effects, and local terrain that no model can fully resolve.
Numerical models need real-world measurements to initialize and validate. The NWS operates one of the world's densest weather observation networks — every bit of it is free and public.
Automated Surface Observing Systems — over 900 stations nationwide reporting temperature, wind, pressure, visibility, and precipitation every 1–5 minutes. Run by NOAA, FAA, and DoD jointly. These are the primary validation data for all numerical models.
| Saddlebrooke | ~875 m from snapped NWS grid point |
| KRYN (Tucson Int'l) | ~40 km SE — major ASOS site |
| KPHX (Phoenix) | ~105 km NW |
The WSR-88D Doppler radar on Mt. Bigelow (~55 km SE of Saddlebrooke). Measures precipitation intensity, velocity (wind direction toward/away), and can detect tornado debris signatures. Data feeds into HRRR via data assimilation and directly into forecaster decisions.
Launched twice daily (00z and 12z) from ~92 stations globally — the only direct measurement of temperature, humidity, pressure, and wind above the surface. These are critical for initializing all numerical models. The nearest launch site is Tucson — balloons go up at 5 AM and 5 PM MST daily, reaching ~30 km altitude.
The Meteorological Assimilation Data Ingest System aggregates data from ASOS, DOT road sensors, private weather stations, aircraft reports (AMDAR), and more — standardizing and quality-checking everything before feeding it into the models. Observations may be delayed up to 20 minutes for QC processing.
ASOS station at KRYN records temperature: 97°F at 3:00 PM MST. KEMX radar shows a thunderstorm cell developing over the Catalinas. A radiosonde launched from Tucson measures the vertical profile of the atmosphere.
MADIS processes and quality-checks all observations. The HRRR model does this hourly — the most frequent data assimilation cycle of any operational model. Physical measurements become the model's "initial conditions."
NOAA's supercomputers (Gaea, Hera, Dogwood) run the models forward in time. GFS runs 16 days out at 13 km globally. NAM runs 84 hours at 12 km. HRRR runs 48 hours at 3 km. Each produces temperature, wind, precipitation, and dozens of other variables for every grid cell — including TWC/97,63.
A meteorologist at the Tucson WFO examines the model output, compares it to current observations (radar, satellite, surface), and overrides any grid cell where the model is wrong — including yours at TWC/97,63. The human is the last line of defense.
The edited forecast is published to the National Digital Forecast Database — a seamless national grid at 2.5 km resolution. Your weather.gov page, this API, and any service that reads NWS data all pull from the same NDFD grid.
Despite billion-dollar supercomputers and kilometer-scale models, the final forecast for your grid cell is edited by a person at the Tucson NWS office.
Meteorologists look at model output and literally ask: "Does this match what I see on radar, satellite, and from local observations?" They can adjust any parameter — temperature, precipitation probability, wind speed, sky cover — for any specific grid cell in their domain.
For Saddlebrooke specifically, the Tucson forecasters know that:
| AWIPS II | Main workstation — overlays models, radar, satellite, obs |
| Grid editing | Modify NDFD grid values cell by cell or by region |
| Satellite | GOES-16 — visible/infrared, updated every 30 seconds |
| Radar | KEMX + regional mosaic for storm tracking |
| Collaboration | Conference calls with neighboring offices during severe wx |
| Verification | Post-analysis of how well model forecasts matched reality |
The National Digital Forecast Database is the final, authoritative weather forecast for the United States. Every WFO's edited grids are stitched together into a seamless national mosaic. TWC/97,63 is one of millions of cells. This is the dataset served by api.weather.gov and displayed on weather.gov.
The forecast for your cell was last updated from the NWS Tucson office and covers 7 days forward. The 2.5 km cell specifically covers your immediate neighborhood — compare this to GFS which treats most of northeast Tucson as a single temperature.
When you check the weather on your phone, you're getting the output of a 1.5 × 1.5 mile square that a human meteorologist in Tucson specifically edited for your neighborhood — not a computer model averaging over 100 square miles.
GFS (13 km): Treats everything from Oracle to eastern Tucson — an area spanning nearly 170 square miles — as a single temperature. If the model predicts 95°F, that's the average across the entire block. The foothills, the valley, and everything in between get the same number.
NDFD (2.5 km): Your specific cell TWC/97,63 covers roughly Saddlebrooke and immediate surroundings — about 1.5 square miles. The Tucson forecaster can adjust your temperature independently from downtown Tucson. When they know the Catalinas channel afternoon storms southwest toward your area, they tweak the precip probability for your cell only.
The difference between "95°F across half the county" and "97°F at 3,455 ft in the Catalina foothills with a 30% storm chance by 4 PM" is the 2.5 km grid.
api.weather.gov. No subscription. No API key. This is your tax-funded weather infrastructure.api.weather.gov/points/{lat},{lon} to find your office and grid ID. From there, /gridpoints/{office}/{x},{y}/forecast gives you the 7-day.Your weather forecast is produced by a meteorologist at the NWS Tucson office, using supercomputer models and real-time observations, for a 1.5 × 1.5 mile grid cell covering Saddlebrooke. The 2.5 km NDFD grid is among the finest operational forecast resolutions in the world — and it's all public data, updated 4 times a day, free for anyone to use.
Every endpoint from the NWS API for your grid cell, with example responses. You can paste any of these URLs directly into a browser or curl command.
GET https://api.weather.gov/points/32.5471,-110.8514
Returns everything needed to locate the forecast: grid office, coordinates, nearest station, timezone, radar, sunrise/sunset. First call in every weather query.
{
"properties": {
"cwa": "TWC",
"gridId": "TWC",
"gridX": 97,
"gridY": 63,
"timeZone": "America/Phoenix",
"radarStation": "KEMX",
"forecastZone": "https://api.weather.gov/zones/forecast/AZZ506",
"county": "https://api.weather.gov/zones/county/AZC021",
"relativeLocation": {
"properties": {
"city": "Saddlebrooke", "state": "AZ",
"distance": { "value": 875.6, "unitCode": "wmoUnit:m" },
"bearing": { "value": 31, "unitCode": "wmoUnit:degree_(angle)" }
}
},
"forecast": "https://api.weather.gov/gridpoints/TWC/97,63/forecast",
"forecastHourly": "https://api.weather.gov/gridpoints/TWC/97,63/forecast/hourly",
"forecastGridData": "https://api.weather.gov/gridpoints/TWC/97,63",
"observationStations": "https://api.weather.gov/gridpoints/TWC/97,63/stations",
"astronomicalData": {
"sunrise": "2026-05-13T05:24:42-07:00",
"sunset": "2026-05-13T19:14:49-07:00",
"civilTwilightBegin": "2026-05-13T04:59:05-07:00",
"civilTwilightEnd": "2026-05-13T19:40:25-07:00"
}
}
}GET https://api.weather.gov/gridpoints/TWC/97,63/forecast
12-hour day/night periods for 7 days. Each period includes temperature, wind, detailed text description, and precipitation probability.
{
"properties": {
"generatedAt": "2026-05-13T06:32:46+00:00",
"validTimes": "2026-05-13T00:00:00+00:00/P8DT1H",
"periods": [
{
"number": 1, "name": "Overnight",
"isDaytime": false,
"temperature": 69, "temperatureUnit": "F",
"windSpeed": "5 mph", "windDirection": "SE",
"shortForecast": "Mostly Cloudy",
"detailedForecast": "Mostly cloudy. Low around 69, with temperatures rising to around 72 overnight. Southeast wind around 5 mph.",
"probabilityOfPrecipitation": { "value": 1, "unitCode": "wmoUnit:percent" }
},
{
"number": 2, "name": "Wednesday",
"isDaytime": true,
"temperature": 97, "temperatureUnit": "F",
"windSpeed": "15 mph", "windDirection": "SSW",
"shortForecast": "Mostly Sunny",
"detailedForecast": "Mostly sunny, with a high near 97. South southwest wind 5 to 15 mph, with gusts as high as 25 mph.",
"probabilityOfPrecipitation": { "value": 1, "unitCode": "wmoUnit:percent" }
}
]
}
}Each period has: temperature, temperatureUnit, windSpeed, windDirection, shortForecast (icon text), detailedForecast (prose), probabilityOfPrecipitation (null = not modeled, 0-100 = %). Odd number = nighttime, even = daytime.
GET https://api.weather.gov/gridpoints/TWC/97,63/forecast/hourly
Same data structure as the 7-day forecast but in 1-hour increments (~168 periods for 7 days). Useful for knowing exactly when conditions change — wind shift at 2 PM, rain starting at 5 PM, etc.
{
"properties": {
"periods": [
{
"number": 1,
"startTime": "2026-05-13T04:00:00-07:00",
"endTime": "2026-05-13T05:00:00-07:00",
"isDaytime": false,
"temperature": 69, "temperatureUnit": "F",
"windSpeed": "5 mph", "windDirection": "SE",
"shortForecast": "Mostly Cloudy",
"probabilityOfPrecipitation": { "value": 1 },
"relativeHumidity": { "value": 37 },
"dewpoint": { "value": 41.0, "unitCode": "wmoUnit:degC" },
"wetBulbGlobeTemperature": { "value": 68.0 },
"skyCover": { "value": 75 }
}
]
}
}Hourly also includes relativeHumidity, dewpoint, wetBulbGlobeTemperature, and skyCover — all as QuantitativeValue objects.
GET https://api.weather.gov/gridpoints/TWC/97,63
The most powerful endpoint. Returns every forecast variable for this grid cell as separate time series arrays. This is what weather apps use to build custom graphs and overlays. Each variable is an array of [value, ISO-timestamp] pairs covering 7+ days.
{
"properties": {
"updateTime": "2026-05-13T06:32:46+00:00",
"validTimes": "2026-05-13T00:00:00+00:00/P8DT1H",
"elevation": { "value": 1053.084, "unitCode": "wmoUnit:m" },
"temperature": {
"uom": "wmoUnit:degC",
"values": [
{ "validTime": "2026-05-13T04:00:00+00:00/P6H", "value": 20.3 }
]
},
"dewpoint": { "uom": "wmoUnit:degC", "values": [...] },
"relativeHumidity": { "uom": "wmoUnit:percent", "values": [...] },
"apparentTemperature": { "uom": "wmoUnit:degC", "values": [...] },
"windSpeed": { "uom": "wmoUnit:km_h-1", "values": [...] },
"windGust": { "uom": "wmoUnit:km_h-1", "values": [...] },
"windDirection": { "uom": "wmoUnit:degree_(angle)", "values": [...] },
"skyCover": { "uom": "wmoUnit:percent", "values": [...] },
"probabilityOfPrecipitation": { "uom": "wmoUnit:percent", "values": [...] },
"quantitativePrecipitation": { "uom": "wmoUnit:mm", "values": [...] },
"snowfallAmount": { "uom": "wmoUnit:mm", "values": [...] },
"weather": { "values": [...] },
"hazards": { "values": [...] },
"ceilingHeight": { "uom": "wmoUnit:m", "values": [...] },
"visibility": { "uom": "wmoUnit:m", "values": [...] },
"lightningActivityLevel": { "uom": "wmoUnit:percent", "values": [...] },
"pressure": { "uom": "wmoUnit:Pa", "values": [...] },
"heatIndex": { "uom": "wmoUnit:degC", "values": [...] },
"windChill": { "uom": "wmoUnit:degC", "values": [...] },
"probabilityOfTropicalStormWinds": { "values": [] },
"probabilityOfHurricaneWinds": { "values": [] },
"redFlagThreatIndex": { "values": [...] },
"hainesIndex": { "values": [...] }
}
}Over 40+ variables including temperature, dewpoint, humidity, wind (speed/gust/direction), sky cover, precipitation (POP, QPF, snow, ice), ceiling, visibility, lightning, wave/swell data (coastal), pressure, heat index, wind chill, and severe weather probabilities.
GET https://api.weather.gov/gridpoints/TWC/97,63/stations
Returns a list of reporting stations near this grid cell, ranked by proximity. You can then fetch current observations from any individual station.
{
"features": [
{ "properties": { "stationIdentifier": "A1355", "name": "Tortolita Mtn" } },
{ "properties": { "stationIdentifier": "KRYN", "name": "Tucson International Airport" } },
{ "properties": { "stationIdentifier": "KTUS", "name": "Tucson / Ryan Airfield" } }
]
}Each station has a dedicated observation endpoint: GET /stations/KRYN/observations/latest returns the most recent reading.
GET /stations/KRYN/observations/latest
GET https://api.weather.gov/alerts/active?zone=AZZ506
Active weather alerts for forecast zone AZZ506 (Saddlebrooke area). Returns CAP (Common Alerting Protocol v1.2) format. Also filterable by state, region, point, or county.
{
"features": [
{
"properties": {
"event": "Excessive Heat Warning",
"headline": "Excessive Heat Warning issued May 12 at 12:41PM MST until May 15 at 8:00PM MST by NWS Tucson AZ",
"severity": "Severe",
"urgency": "Expected",
"certainty": "Likely",
"areaDesc": "Pinal County",
"effective": "2026-05-12T19:41:00+00:00",
"expires": "2026-05-15T03:00:00+00:00",
"description": "* WHAT...Dangerously hot conditions with temperatures up to 108 expected.",
"instruction": "Drink plenty of fluids, stay in an air-conditioned room..."
}
}
]
}Key fields: event (type), severity (Extreme/Severe/Moderate/Minor), urgency (Immediate/Expected/Future/Past/Unknown), certainty (Observed/Likely/Possible/Unlikely), headline (brief summary), description (full details), instruction (action items).
GET https://api.weather.gov/offices/TWC
Contact info, address, and full jurisdiction listing for the NWS Tucson office.
{
"@type": "GovernmentOrganization",
"id": "TWC",
"name": "NWS Tucson Arizona",
"address": {
"streetAddress": "520 North Park Ave, Suite 304",
"addressLocality": "Tucson", "addressRegion": "AZ", "postalCode": "85719"
},
"telephone": "(520) 670-6526",
"email": "w-twc.webmaster@noaa.gov",
"sameAs": "https://www.weather.gov/twc",
"nwsRegion": "wr",
"responsibleCounties": [
"https://api.weather.gov/zones/county/AZC003",
"https://api.weather.gov/zones/county/AZC009",
"https://api.weather.gov/zones/county/AZC011",
"https://api.weather.gov/zones/county/AZC019",
"https://api.weather.gov/zones/county/AZC021",
"https://api.weather.gov/zones/county/AZC023"
],
"responsibleForecastZones": ["AZZ501", ..., "AZZ515"],
"responsibleFireZones": ["AZZ150", "AZZ151", "AZZ152", "AZZ153", "AZZ154"]
}GET https://api.weather.gov/points/32.5471,-110.8514
The points response includes NWR (NOAA Weather Radio) info for your location.
"nwr": {
"transmitter": "WXL30",
"sameCode": "004021",
"areaBroadcast": "https://api.weather.gov/radio/WXL30/broadcast",
"pointBroadcast": "https://api.weather.gov/points/32.5471,-110.8514/radio"
}| Endpoint | Purpose | Cache |
|---|---|---|
/points/{lat},{lon} | Resolve location to grid cell | Cache indefinitely (grid is stable) |
/gridpoints/{id}/{x},{y}/forecast | 7-day day/night forecast | ~15 min |
/gridpoints/{id}/{x},{y}/forecast/hourly | Hourly breakdown | ~15 min |
/gridpoints/{id}/{x},{y} | Raw multi-variable data | ~15 min |
/gridpoints/{id}/{x},{y}/stations | Nearest observation stations | Cache indefinitely |
/stations/{id}/observations/latest | Latest sensor readings | Fetch each request |
/alerts/active?zone={zone} | Active watches/warnings | ~2 min |
/offices/{id} | WFO contact info | Cache indefinitely |
All endpoints return JSON (GeoJSON). Set a User-Agent header identifying your app (required). No API key. Rate limits are generous but non-public — don't hammer the API.
curl -sL "https://api.weather.gov/gridpoints/TWC/97,63/forecast" \
-H "User-Agent: (my-app, me@example.com)" | \
python3 -c "
import json,sys
d = json.load(sys.stdin)
for p in d['properties']['periods'][:2]:
print(f\"{p['name']}: {p['temperature']}°{p['temperatureUnit']} - {p['shortForecast']}\")
"