{
  "service": "stormq",
  "description": "Active tropical cyclones from the centres that warn on them: position, track, forecast, cone and events.",
  "usage": [
    "GET /storms                        -- every active storm, without geometry",
    "GET /storms?geometry=full          -- with each cone and warning line",
    "GET /storms?season=2026            -- every storm seen that season, ended ones too",
    "GET /storms/ep152026               -- one storm: track, forecast, cone, warnings, events oldest first, and the advisory's own bulletin",
    "GET /storms/2026-EP-15             -- the same, by reference",
    "GET /storms/ep152026?geometry=none -- without the cone",
    "GET /storms/ep152026.json          -- the same, as JSON even to a browser",
    "GET /events?since=2026-09-28T00:00:00Z -- every storm's events seen after since, oldest first, 500 a page",
    "GET /sources                      -- how each centre's feed is doing: last read, last pass, last error",
    "GET /21.31,-157.86                 -- active storms within 1000 km, now or forecast",
    "GET /?lat=21.31&lon=-157.86&within=500 -- a radius from 1 to 5000 km",
    "GET /21.31,-157.86?geometry=full   -- with each storm's cone and warning lines"
  ],
  "note": "Every storm is its warning centre's own advisory, in the centre's own units and words. An NHC cone and a JTWC swath are different things, and each says which it is.",
  "events": [
    "formed",
    "named",
    "strengthened",
    "weakened",
    "watch-issued",
    "warning-issued",
    "ended"
  ],
  "cones": {
    "nhc-track-error": "NHC and CPHC: the probable path of the centre, two-thirds of forecast errors. Not the storm's size.",
    "jtwc-34kt-swath": "JTWC: where 34-knot winds may reach, from its forecast wind radii."
  },
  "bulletins": "advisory.text, on /storms/{id} only: the centre's own bulletin, verbatim but for its transmission header. Line breaks kept; show it in monospace.",
  "imagery": {
    "what": "On each active storm a satellite sees: a NASA GIBS picture centred on it, a thumbnail, its bounds, map tiles of the same frame, and NOAA STAR's floater for NHC and CPHC storms. None over the west Indian Ocean.",
    "onAMap": "Lay imagery.tiles under your map as an ordinary XYZ tile layer: Web Mercator, {z}/{y}/{x}, the projection of Leaflet, MapKit, Google and Mapbox maps, so your track, cone and markers line up with no maths. Set its maximum native zoom to imagery.tileMaxZoom, so deeper zooms scale the last tiles. Leaflet: L.tileLayer(imagery.tiles, { maxNativeZoom: imagery.tileMaxZoom }). Outside the satellite's view the tiles are transparent.",
    "onThePicture": "imagery.image (800 px) and imagery.thumbnail (256 px) are plain latitude and longitude, evenly spaced in degrees across imagery.bounds: x = (lon - west) / (east - west) * width, y = (north - lat) / (north - south) * height. Don't lay them on a Web Mercator map: they are off by up to about 9 km there; use the tiles.",
    "floater": "A picture only: labels burned in, and no bounds."
  },
  "winds": "Knots, sustained over one minute (windAveragingPeriodInMinutes), as all three centres give them.",
  "sources": [
    "NOAA National Hurricane Center: Atlantic and East Pacific (CurrentStorms.json and its tropical map service)",
    "NOAA Central Pacific Hurricane Center, through NHC's feeds",
    "Joint Typhoon Warning Center: West Pacific, North Indian Ocean and Southern Hemisphere",
    "NASA GIBS: satellite pictures from GOES-East, GOES-West and Himawari"
  ],
  "freshness": "Read from the centres every 15 minutes. Answers are cached 5 minutes.",
  "auth": "None. CORS is open, so a browser can call this directly.",
  "terms": "Free, unsupported, not for volume, and as is. Send a User-Agent that names your app. https://almanac.observer/#use",
  "repository": "https://github.com/gshaw/almanac/tree/main/services/stormq"
}
