Flashes in a bounding box
Available as a separately agreed add-on — contact sales.
Every lightning flash inside a rectangle you choose — up to the entire world — in a single request, as coordinates you plot, animate and style yourself. A full map view costs one call rather than one call per map tile.
Give the corners as west,south,east,north, longitude first, in the GeoJSON order. The whole world is -180,-90,180,90. A rectangle whose west is greater than its east crosses the date line, for example 170,-10,-170,10.
Frames. Lightning arrives from the satellites every 10 minutes, and this endpoint returns it the same way: in fixed 10-minute frames. A frame is named by its end time, so frame 12:10:00Z holds the flashes detected after 12:00 up to and including 12:10. Once a frame has a next, it is finished and its flashes stay the same, which keeps animation loops simple.
Leave time out to get the newest frame. Every response names the frame it served in frame and the frames either side in prev and next. next is null at the newest frame, which is still filling: keep requesting the latest frame, and when frame moves on, there is new data to draw. prev is null at the oldest frame still available.
To fetch an earlier frame, pass its end time as time in the form YYYY-MM-DDTHH:MM:SSZ, seconds optional, for example ?time=2026-08-25T12:00:00Z. Frames sit exactly 10 minutes apart, so you can compute the timestamps of a whole animation loop and fetch the frames in parallel. A time between boundaries is rounded down to the boundary before it — 12:07 selects frame 12:00 — and the response always states the frame you received. Roughly the last 24 hours, about 140 frames, are available.
Every response holds every flash in the frame so far, uncapped: the 10-minute frame is the only bound, even for a whole-world request.
Compact format. With format=compact the same flashes come back column by column — one array per field instead of a list of objects — ready to copy into typed arrays or a graphics buffer:
{
"format": "compact",
"frame": "2026-08-25T12:10:00Z",
"prev": "2026-08-25T12:00:00Z",
"next": null,
"sources": ["GOES19", "GOES18", "EUMETSAT"],
"n": 3,
"lat": [52.476, 52.486, 52.496],
"lon": [-113.985, -113.975, -113.965],
"dt": [12, 274, 588],
"src": [0, 1, 2]
}
- lat and lon are rounded to three decimals, about 110 m — far finer than the 8–15 km position accuracy.
- dt is the number of seconds before frame that each flash was detected, from 0 to 599. It is the value to drive a fade or flash animation from, and frame minus dt gives the detection time.
- src is an index into sources, which is always ["GOES19", "GOES18", "EUMETSAT"] in that order, so an index means the same satellite in every frame.
- lat, lon, dt and src all have n entries and share the same order.
Response size. One frame in the default format, in compact, and in either one gzipped:
- Continental US, typical: 0.24 MB, 0.07 MB, 0.02 MB
- Worldwide, typical (7,000–10,400 flashes): 0.6–0.9 MB, 0.16–0.24 MB, 0.05–0.08 MB
- Worldwide, busiest frame measured (165,661 flashes): 13.9 MB, 3.9 MB, 1.2 MB
Compact is about a third of the default size before compression. With Accept-Encoding: gzip the two are within a few percent of each other over the wire, so the gain of compact is on your side: about 3.5× less JSON to parse and hold in memory.
Request
- Base URL: https://weatherapi.foreca.net
- URL: https://weatherapi.foreca.net/api/v1/lightning/bbox/{bbox}
- Auth: HTTP bearer
Path parameters
Bounding box as "west,south,east,north" (longitude, latitude, longitude, latitude), for example -125,24,-66,50. Use -180,-90,180,90 for the whole world.
Query parameters
End time of the frame as YYYY-MM-DDTHH:MM:SSZ (seconds optional), for example 2026-08-25T12:00:00Z, within roughly the last 24 hours (default: the newest frame)
"full" (default) returns a list of flash objects; "compact" returns one array per field
Response
Success
Example response
{
"frame": "2026-08-25T12:10:00Z",
"prev": "2026-08-25T12:00:00Z",
"strikes": [
{
"lat": 42.0126,
"lon": -98.0056,
"time": "2026-08-25T12:04:31Z",
"source": "GOES19"
}
]
}Changes
No recorded changes to this operation across all 1 revision of this API.