Developers Built by a developer. For developers.

Weather data that
just works.

Most weather APIs are expensive, over-engineered, or designed for enterprise procurement teams. WeatherLens is different. One API key. Clean JSON. Four endpoints. Up and running in under 5 minutes. No SDK, no OAuth, no XML.

4 endpointsforecast, climate, accuracy, historical
<100msedge-cached globally
100/dayfree forever

Everything Your App Needs. Nothing It Doesn't.

Four clean endpoints. Predictable JSON schema. No surprise billing.

GET/api/v1/forecast

Up to 16 days of temperature, precipitation probability, wind, UV index, and humidity. NWS precision for US days 1–7, Open-Meteo global coverage to day 16.

lat/londays param16-day horizon
GET/api/v1/climate

Multi-year weighted climate averages for any coordinate and day-of-year. Surface seasonal baselines, anomaly detection, and historical context alongside every forecast.

any coordinateday-of-yearweighted avg
GET/api/v1/accuracy

This is what no other API gives you. Forecast accuracy by source, lead time, and month for any location. Show users a confidence score backed by real data.

by sourceby lead timemonthly
GET/api/v1/historical

365 days of observed weather actuals for any global coordinate. Retroactive analysis, model training, loss validation — all via one simple GET request. Pro plan.

365 daysobserved actualspro only

Developer Experience without the friction.

We obsessed over the details that slow developers down.

🔑
One Header. That's It.
Pass X-API-Key in your request header. No OAuth, no JWT refresh flows, no multi-step auth. Your key is ready the moment you sign up.
📐
Consistent JSON Schema
Every endpoint returns a predictable, documented schema. No surprise null fields, no undocumented nested objects. What you see in the docs is what you get.
Edge-Cached Responses
Responses are cached at Vercel's global edge with 5-minute freshness. Typical latency under 100ms worldwide. No cold starts, no warm-up time.
🚦
Clean Rate Limit Errors
Hit your daily limit? You get a 429 with a clear body: your limit, your usage, and when it resets. No silent failures, no mysterious 500s.
🌍
Any Lat/Lon on Earth
Pass any valid coordinates. NWS precision for US locations, Open-Meteo for the rest of the world. One API covers your entire global user base.
💰
Predictable Pricing
100 req/day free forever. $9/mo for 5K req/day. $29/mo for 50K req/day + historical. Hard caps, prorated billing, no overage surprises.

From zero to weather data in 60 seconds.

Pick your language. Copy. Paste. Run.

Quick start — 5 languages
# cURL
curl -H "X-API-Key: YOUR_KEY" \
  "https://weatherlens.dev/api/v1/forecast?lat=40.7128&lon=-74.0060&days=7"

# JavaScript (fetch)
const res = await fetch(
  "https://weatherlens.dev/api/v1/forecast?lat=40.7128&lon=-74.0060&days=7",
  { headers: { "X-API-Key": "YOUR_KEY" } }
);
const data = await res.json();

# Python
import httpx
data = httpx.get(
  "https://weatherlens.dev/api/v1/forecast",
  params={"lat": 40.7128, "lon": -74.0060, "days": 7},
  headers={"X-API-Key": "YOUR_KEY"}
).json()

# Go
req, _ := http.NewRequest("GET",
  "https://weatherlens.dev/api/v1/forecast?lat=40.7128&lon=-74.0060&days=7", nil)
req.Header.Set("X-API-Key", "YOUR_KEY")
resp, _ := http.DefaultClient.Do(req)

# Ruby
require "net/http"
uri = URI("https://weatherlens.dev/api/v1/forecast?lat=40.7128&lon=-74.0060&days=7")
req = Net::HTTP::Get.new(uri)
req["X-API-Key"] = "YOUR_KEY"
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }

Built on Infrastructure You'd Choose

Modern, open, and transparent. No black-box magic.

Next.js on Vercel
Edge-optimized API routes. Global CDN. Zero cold starts.
🐘
Neon Postgres
Serverless Postgres. All forecast, accuracy, and climate data.
🏛️
NWS + Open-Meteo
Dual-source blending. Best-in-class for every use case.
⚙️
GitHub Actions
Hourly data collection. Weekly climate normals. Always fresh.

Your API key is waiting. Go ship something.

100 free requests per day. No credit card. No sales call. Sign up and get your key in 30 seconds.