nano Weather APIBeta

Limits, quotas & headers

Plans

PlanUnits / monthBurst / s (per key)Endpoints
Free10,0005weather, health, stations
Starter500,00020weather, health, stations, history, radar_grid
Pro5,000,000100weather, health, stations, history, radar_grid, radar_volume, variants
Enterprisecustom200weather, health, stations, history, radar_grid, radar_volume, variants

The monthly quota belongs to the organization (all live keys together) and resets on the 1st at 00:00 UTC.

Units

The quota counts weighted units. Only responses with status < 400 are charged.

RequestUnits
/v2/weather1; 2 with hours > 48 or past_hours > 0
/v2/health, /v2/stations1
/v2/history1 per started 31 days (hourly) / 366 days (daily)
/v2/radar/grid, /v2/radar/volume2
/v2/radar/volume/rain/… frames0
/v2/meta/*free, no key

Burst limit

Each key has a token bucket that refills at the plan’s rate per second (capacity = rate). Mobile keys additionally have a bucket per installation (X-Install-Id, at most 20/s). An empty bucket answers 429 rate-limited with Retry-After.

Response headers

Keyed responses carry the IETF RateLimit headers (r = remaining after this request, t = seconds until reset):

RateLimit-Policy: "burst";q=20;w=1, "month";q=500000;w=2592000
RateLimit: "burst";r=19;t=1, "month";r=412345;t=1048576
X-Request-Id: 7f3c…

Mobile keys add "install"; unlimited plans omit "month". Quote X-Request-Id when you contact support.

Errors

All errors are RFC 9457 application/problem+json with type, code, title, status and detail. Match on code — it is the stable slug below. type is a URI that may change (it is about:blank until the public API address is final).

StatuscodeWhen
401unauthorizedno key, unknown key
401key-revokedthe key was revoked
401app-archivedthe key’s app is archived (reversible — restore the app)
401key-expiredthe key passed its expiry
403organization-disabledthe organization is disabled
403plan-feature-missingendpoint (or variant ≠ stable) not in your plan
403scope-missingin the plan, but the key’s scopes exclude it
403origin-not-allowedweb key with allowed origins; Origin sent and matches none
403bundle-requiredmobile key with bundle IDs; X-Ios-Bundle-Identifier / X-Android-Package missing
403bundle-not-allowedmobile key with bundle IDs; the bundle/package header matches none
429rate-limitedburst bucket empty; wait Retry-After seconds
429quota-exceededmonthly units used up; Retry-After = seconds until the 1st (UTC)
503auth-unavailabletemporary; retry shortly
HTTP/1.1 429 Too Many Requests
Content-Type: application/problem+json
Retry-After: 1

{"type": "about:blank", "code": "rate-limited", "title": "Too many requests", "status": 429, "detail": "…"}