Skip to content
Docs navigation

Weather data for the software you build.

One call returns current, hourly, daily, alerts, outlooks, and astronomy. GeoJSON for maps. A hosted MCP for agents. An onboarding MCP so your agent can sign up, mint a key, and build on your behalf.
# first: export SMARTERWEATHER_API_KEY=sw_live_... (or: set -a; source .env; set +a)
curl "https://api.smarterweather.com/v1/weather?location=Boston,%20MA&units=imperial" \
  -H "Authorization: Bearer $SMARTERWEATHER_API_KEY"
// save as sample.mjs; run: node --env-file=.env sample.mjs (Node 20.6+, ESM top-level await)
const res = await fetch(
  "https://api.smarterweather.com/v1/weather?location=Boston,%20MA&units=imperial",
  { headers: { Authorization: `Bearer ${process.env.SMARTERWEATHER_API_KEY}` } },
);
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const data = await res.json();
console.log(JSON.stringify(data, null, 2));
import os, sys, requests

r = requests.get(
    "https://api.smarterweather.com/v1/weather",
    params={"location":"Boston, MA","units":"imperial"},
    headers={"Authorization": f"Bearer {os.environ['SMARTERWEATHER_API_KEY']}"},
)
if not r.ok:
    sys.exit(f"{r.status_code} {r.text}")
data = r.json()
print(data)
package main

import (
	"fmt"
	"io"
	"log"
	"net/http"
	"os"
)

func main() {
	req, err := http.NewRequest("GET", "https://api.smarterweather.com/v1/weather?location=Boston,%20MA&units=imperial", nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Authorization", "Bearer "+os.Getenv("SMARTERWEATHER_API_KEY"))
	res, err := http.DefaultClient.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer res.Body.Close()
	body, err := io.ReadAll(res.Body)
	if err != nil {
		log.Fatal(err)
	}
	if res.StatusCode < 200 || res.StatusCode > 299 {
		log.Fatalf("%s %s", res.Status, body)
	}
	fmt.Println(string(body))
}
location
{
  "lat": 42.3601,
  "lon": -71.0589,
  "name": "Boston",
  "region": "MA",
  "country": "US",
  "timezone": "America/New_York",
  "county": "Suffolk",
  "zip": "02108"
}
current
{
  "time": "2026-04-20T15:00:00Z",
  "temperature": 58.4,
  "feels_like": 56.1,
  "humidity": 62,
  "dew_point": 45.2,
  "pressure": 30.05,
  "wind_speed": 11.3,
  "wind_gust": 17.8,
  "wind_direction": 240,
  "visibility": 10,
  "cloud_cover": 35,
  "uv_index": 5,
  "precip_rate": 0,
  "precip_type": "none",
  "conditions": "Partly Cloudy",
  "icon": "partly-cloudy-day",
  "severe": false
}
hourly
[
  {
    "time": "2026-04-20T16:00:00Z",
    "temperature": 59.1,
    "feels_like": 56.8,
    "humidity": 60,
    "wind_speed": 12.1,
    "wind_direction": 245,
    "precip_probability": 5,
    "precip_amount": 0,
    "conditions": "Partly Cloudy",
    "icon": "partly-cloudy-day"
  },
  {
    "time": "2026-04-20T17:00:00Z",
    "temperature": 59.6,
    "feels_like": 57.2,
    "humidity": 58,
    "wind_speed": 12.4,
    "wind_direction": 245,
    "precip_probability": 5,
    "precip_amount": 0,
    "conditions": "Partly Cloudy",
    "icon": "partly-cloudy-day"
  }
]
daily
[
  {
    "date": "2026-04-20",
    "high": 61,
    "low": 44.5,
    "humidity_avg": 55,
    "wind_speed_max": 14.2,
    "wind_direction": 240,
    "precip_probability": 10,
    "precip_total": 0,
    "snow_total": 0,
    "conditions": "Partly Cloudy",
    "icon": "partly-cloudy-day",
    "day": {
      "temperature": 61,
      "wind_speed": 14.2,
      "wind_direction": 240,
      "precip_probability": 10,
      "precip_total": 0,
      "conditions": "Partly Cloudy",
      "icon": "partly-cloudy-day",
      "narrative": "Partly cloudy with a high near 61. West winds 10 to 15 mph."
    },
    "night": {
      "temperature": 44.5,
      "wind_speed": 6.8,
      "wind_direction": 260,
      "precip_probability": 5,
      "precip_total": 0,
      "conditions": "Mostly Clear",
      "icon": "mostly-clear-night",
      "narrative": "Mostly clear with a low around 45. Winds becoming light."
    }
  }
]
alerts
[]
outlooks
[]
astro
{
  "civil_dawn": "2026-04-20T09:37:00Z",
  "sunrise": "2026-04-20T10:05:00Z",
  "solar_noon": "2026-04-20T16:47:00Z",
  "sunset": "2026-04-20T23:29:00Z",
  "civil_dusk": "2026-04-20T23:57:00Z",
  "day_length": 48240,
  "daylight_length": 51600,
  "moonrise": "2026-04-20T11:42:00Z",
  "moonset": "2026-04-21T01:18:00Z",
  "moon_phase": 0.15,
  "moon_phase_name": "Waxing Crescent",
  "moon_illumination": 0.22,
  "polar": null
}
units
{
  "temperature": "F",
  "wind_speed": "mph",
  "pressure": "inHg",
  "visibility": "mi",
  "precip_amount": "in"
}
attribution
{
  "sources": [
    "NOAA NBM",
    "HRRR",
    "RTMA",
    "MRMS",
    "NWS",
    "JPL Ephemeris"
  ],
  "notice": "Weather data from NOAA/NWS. Astronomical calculations from JPL ephemerides."
}
meta
{
  "schema_version": "2026-04-20",
  "generated_at": "2026-04-20T15:00:04Z",
  "freshness": [
    {
      "source": "rtma",
      "product_id": "rtma_conus_2p5km",
      "reference_time": "2026-04-20T14:45:00Z",
      "latest_valid": "2026-04-20T14:45:00Z",
      "age_seconds": 904
    },
    {
      "source": "hrrr",
      "product_id": "hrrr_conus_3km",
      "reference_time": "2026-04-20T14:00:00Z",
      "latest_valid": "2026-04-20T15:00:00Z",
      "age_seconds": 3604
    }
  ],
  "warnings": []
}

Smarter Weather covers the 50 US states and DC only. Every route that takes a point (lat and lon, zip or location) returns 404 outside-coverage for a point outside the 50 states and DC. /v1/alerts and /v1/observations return it for a bounding box that touches no US domain (CONUS, Alaska, Hawaii); a box that touches one may still include area outside the US. /v1/weather/batch reports it per item as outside_coverage, and /v1/point with points and /v1/series/batch mark such points out_of_domain, as they do a point the check could not reach in time (retry it). If the location lookup is unavailable, the check can briefly fail open. Routes keyed by a station, radar site, forecast office or alert id, and nationwide lists, are not filtered by point, so do not treat an empty result as an all-clear. See Errors.

Three ways in

REST

REST API

Call /v1/weather from any application. Scheduling, logistics, maps, and consumer apps use the same catalog and the same key.
Open the quickstart →

MCP

Weather MCP

36 hosted tools for live forecasts, alerts, and model data. Same catalog as REST, built for agent runtimes.
Set up the weather MCP →

Agents

Agents are first-class developers

The onboarding MCP lets an agent sign_up, create_api_key, get_documentation, configure_mcp, get_usage, and upgrade_plan on behalf of a person or a company.
Built for agents →

The catalog

Every operation in the OpenAPI contract, grouped the way the docs are. Same endpoints on REST and the weather MCP.

Weather

  • GET/v1/weatherGet blended weather for a location.
  • POST/v1/weather/batchGet blended weather for up to 25 locations in one call.
  • GET/v1/windowsConsecutive hours that meet activity criteria.
  • GET/v1/outlooksOutlook detail for a location and hazard family (SPC, WPC, CPC).
  • GET/v1/outlooks/climateCPC climate outlooks at a location, from 6-10 day to seasonal.

Alerts

  • GET/v1/alertsSearch NWS alerts at a point or in a bounding box.
  • GET/v1/alerts/{id}Get a single NWS alert by id.
  • POST/v1/pois/exposureCivic POIs inside a bounded polygon.

Storms and tropical

  • GET/v1/storm-tracksGet active storm-cell tracks as GeoJSON.
  • GET/v1/storm-reportsGet recent NWS local storm reports as GeoJSON.
  • GET/v1/nexrad/featuresGet NEXRAD Level III algorithm-detection overlays as GeoJSON.
  • GET/v1/tropicalGet the aggregated NHC tropical overlay as GeoJSON.
  • GET/v1/tropical/observationsGet Hurricane Hunter aircraft reconnaissance as GeoJSON.
  • GET/v1/record-eventsGet NWS climate-record events as GeoJSON.

Observations and soundings

  • GET/v1/observationsGet latest METAR station observations as GeoJSON.
  • GET/v1/observations/nearestGet nearest METAR station observations.
  • GET/v1/lightningGet recent lightning activity at a point.
  • GET/v1/soundingsGet latest RAOB radiosonde soundings as GeoJSON.
  • GET/v1/soundings/nearestGet nearest RAOB radiosonde soundings.

Geocoding

  • GET/v1/geocode/reverseReverse-geocode a coordinate to a location.
  • GET/v1/geocode/autosuggestTypeahead-style location lookup.
  • GET/v1/geocode/searchForward-geocode a place name or US ZIP.

Point data and exposure

  • GET/v1/products/{product_id}/exposure-summaryCumulative population exposure for a risk-zone product.
  • GET/v1/pointCurated point value(s) for allowlisted stored data.
  • GET/v1/seriesTime series of catalog grid and snapshot products at a point.
  • POST/v1/series/batchTime series of catalog products at up to 25 locations.

Climate and agriculture

  • GET/v1/climate-reportsGet NWS daily climate reports as GeoJSON.
  • GET/v1/agriculture/growing-degree-daysGrowing Degree Units (GDU / GDD) for a point.
  • GET/v1/climate/normalsDay-of-year climate normals for a point.

Forecaster guidance

  • GET/v1/guidance/mesoscaleGet active SPC Mesoscale Discussion polygons as GeoJSON.
  • GET/v1/guidance/precipitationGet active WPC Mesoscale Precipitation Discussion polygons as GeoJSON.
  • GET/v1/text-productsList recent NWS text products of one type.
  • GET/v1/discussions/mesoscaleTemporary alias for GET /v1/guidance/mesoscale.Deprecated

Health and deprecations

  • GET/v1/healthService health probe.
  • GET/v1/statusPlatform data-freshness status.
  • GET/v1/catalogList the data catalog's products.
  • GET/v1/catalog/{product_id}Describe one data catalog product.
  • GET/.well-known/deprecationsList active API deprecations.