KTML WEATHER DOCUMENTATION
Personal-use API
Read-only JSON endpoints for the operator's own private applications and same-origin site features.
Connection
GET https://weather.ktml.space/api/v1/health
Accept: application/json Successful JSON responses use UTF-8. Read-only and bounded historical JSON routes allow 60 requests per minute with a burst of 20. Archive navigation and generated media have separate edge limits sized for interactive timelines and video playback.
The API is for a single person’s reasonable use in their own private applications. It is not a data origin for another public website, hosted dashboard, widget, feed, mirror, resale product, or bulk archive. Browser requests are same-origin only: no cross-origin access headers are emitted and explicit cross-site browser requests are rejected. Personal native or server-side clients can call the API directly within the published limits. See the Terms of Use.
Same-origin KTML pages and the two health routes do not require credentials. Other native or server-side clients must send the operator’s private token as Authorization: Bearer <token>. Never put that token in a public webpage, client bundle, URL, log, or shared repository.
GET /api/v1/station/current HTTP/1.1
Host: weather.ktml.space
Accept: application/json
Authorization: Bearer YOUR_PRIVATE_TOKEN Endpoints
| ROUTE | RESULT | CACHE |
|---|---|---|
/api/health.json | Web-process liveness | No store |
/api/v1/health | API, database, station, and camera health | No store |
/api/v1/conditions | Current observation, NWS delta, and Realistic Expectation report | No store |
/api/v1/station | Public station metadata | 5 minutes |
/api/v1/station/current | Latest normalized observation | No store |
/api/v1/station/status | Station and camera freshness | No store |
/api/v1/station/history | Bounded aggregate history | 30 seconds |
/api/v1/station/daily | Daily almanac and prior-day comparison | 1 minute |
/api/v1/station/sensors | Privacy-safe sensor inventory | 5 minutes |
/api/v1/air-quality/current | Current preliminary AirNow reporting-area AQI | 2 minutes |
/api/v1/air-quality/history?hours=24 | Bounded 1-168 hour AQI history | 5 minutes |
/api/v1/alerts | Persisted active NWS alerts | 1 minute |
/api/v1/thunder | NWS thunder guidance and available on-site lightning | 2 minutes |
/api/v1/cameras | Camera identities and latest archive timestamps | 1 minute |
/api/v1/cameras/{camera}/frames | Bounded frame list | 1 minute |
/api/v1/cameras/near | Frames nearest an ISO timestamp | 5 minutes |
/api/v1/timelapses/latest | Rolling video status and next edition time | 30 seconds |
/api/v1/archive/calendar | Protected recent/year/month/day index | 1 minute |
/api/v1/archive/day | Protected daily camera/video/weather summary | 1 minute |
/api/v1/archive/at | Protected exact-time frame and weather match | 1 minute |
Air and storms
GET /api/v1/air-quality/current
GET /api/v1/air-quality/history?hours=24
GET /api/v1/alerts
GET /api/v1/thunder AirNow data is preliminary. The thunder response keeps NWS probability/alerts separate from fields supplied by a compatible on-site Ambient lightning detector. Provider credentials and raw payloads remain server-side.
History examples
GET /api/v1/station/history?range=24h&metrics=temperature_f,dew_point_f
GET /api/v1/station/history?range=7d&metrics=temperature_f&compare=previous
GET /api/v1/cameras/north/frames?from=2026-08-22T00:00:00Z&to=2026-08-23T00:00:00Z&limit=100
GET /api/v1/cameras/sky-wide/frames?from=2026-08-25T00:00:00Z&to=2026-08-26T00:00:00Z&limit=100
GET /api/v1/cameras/near?at=2026-08-23T02:15:00Z&tolerance=300 Station ranges are 6h, 24h, 7d, 30d, and 1y. Camera ranges are limited to 31 days and 500 frames per request.
Historical access
Archive JSON, derived historical frames, generated videos, and archive pages require a completed Anubis browser challenge. Canonical original frames have no public route. These endpoints are designed for the interactive archive, not bulk mirroring.
Errors
Invalid bounded requests return 400. Missing or incorrect personal-client credentials return 401. Disallowed cross-site browser use returns 403. Limits return 429 with Retry-After. Missing historical frames return 404. Temporary database or media failures return 503. Internal paths, raw Ambient payloads, device identifiers, and credentials are not returned.