Lightning Flashes

Satellite-detected lightning as point data. Every flash is its own point, with exact coordinates, its own detection time and the satellite that detected it, ready to plot, style and animate however your product needs. Each point is one lightning flash seen from orbit — total lightning, covering both in-cloud and cloud-to-ground activity. Positions are accurate to roughly 8–15 km, a little coarser toward the edge of each satellite's view. New data arrives about every 10 minutes, typically 5–15 minutes after the flash, and roughly the last 24 hours stay available.

Get an API key OpenAPI spec for AI assistantsJSON · 115 KB

Full API reference — quickstart, authentication, request limits and attribution.

Satellite-detected lightning as point data. Every flash is its own point, with exact coordinates, its own detection time and the satellite that detected it, ready to plot, style and animate however your product needs. Each point is one lightning flash seen from orbit — total lightning, covering both in-cloud and cloud-to-ground activity. Positions are accurate to roughly 8–15 km, a little coarser toward the edge of each satellite's view. New data arrives about every 10 minutes, typically 5–15 minutes after the flash, and roughly the last 24 hours stay available.

Coverage

Two longitude bands, 180°W–100°E and 160°E–180°, between latitudes 60°S and 75°N — the Americas, Europe, Africa and the Middle East. A request for any other area is answered normally with an empty list of flashes.

Endpoints

Nearby flashes

Lightning flashes within radius of a point during the last 30 minutes, sorted nearest first. Each flash comes with its distance and compass bearing from the point, so an alert can say how close the lightning is and from which direction.

For a lightning-safety all-clear check, request limit=1: an empty strikes list is your all-clear for that radius over the last 30 minutes.

Values above a maximum are treated as the maximum.

Path Parameters

locationType: stringrequired

"Longitude,latitude" of the point, for example -98.0,42.0

Query Parameters

radiusType: string

Search radius in kilometres (default 40, maximum 100). A radius of 10 km or more matches the 8–15 km position accuracy.

limitType: string

Maximum number of flashes returned, nearest first (default 1000, maximum 1000)

GET/api/v1/lightning/{location}Shell Curl
curl 'https://weatherapi.foreca.net/api/v1/lightning/{location}' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
200
{
  "strikes": [
    {
      "lat": 42.0126,
      "lon": -98.0056,
      "time": "2026-08-25T12:22:18Z",
      "distance": 1.5,
      "bearing": "N",
      "source": "GOES19"
    }
  ]
}
{
  "type": "object",
  "properties": {
    "strikes": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "lat": {
            "type": "number",
            "example": 42.0126,
            "description": "Latitude of the flash, in degrees"
          },
          "lon": {
            "type": "number",
            "example": -98.0056,
            "description": "Longitude of the flash, in degrees"
          },
          "time": {
            "type": "string",
            "example": "2026-08-25T12:22:18Z",
            "description": "Detection time, ISO 8601 UTC"
          },
          "distance": {
            "type": "number",
            "example": 1.5,
            "description": "Distance from the point, in kilometres"
          },
          "bearing": {
            "type": "string",
            "example": "N",
            "description": "Compass direction from the point to the flash: N, NE, E, SE, S, SW, W or NW"
          },
          "source": {
            "type": "string",
            "example": "GOES19",
            "description": "Satellite that detected the flash: GOES19, GOES18 or EUMETSAT"
          }
        }
      }
    }
  }
}
Success

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.

Path Parameters

bboxType: stringrequired

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

timeType: string

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)

formatType: string

"full" (default) returns a list of flash objects; "compact" returns one array per field

GET/api/v1/lightning/bbox/{bbox}Shell Curl
curl 'https://weatherapi.foreca.net/api/v1/lightning/bbox/{bbox}' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
200
{
  "frame": "2026-08-25T12:10:00Z",
  "prev": "2026-08-25T12:00:00Z",
  "next": null,
  "strikes": [
    {
      "lat": 42.0126,
      "lon": -98.0056,
      "time": "2026-08-25T12:04:31Z",
      "source": "GOES19"
    }
  ]
}
{
  "type": "object",
  "properties": {
    "frame": {
      "type": "string",
      "example": "2026-08-25T12:10:00Z",
      "description": "End time of the frame served, ISO 8601 UTC"
    },
    "prev": {
      "type": "string",
      "example": "2026-08-25T12:00:00Z",
      "description": "The frame before, or null at the oldest frame still available"
    },
    "next": {
      "type": "string",
      "nullable": true,
      "description": "The frame after, or null at the newest frame"
    },
    "strikes": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "lat": {
            "type": "number",
            "example": 42.0126,
            "description": "Latitude of the flash, in degrees"
          },
          "lon": {
            "type": "number",
            "example": -98.0056,
            "description": "Longitude of the flash, in degrees"
          },
          "time": {
            "type": "string",
            "example": "2026-08-25T12:04:31Z",
            "description": "Detection time, ISO 8601 UTC"
          },
          "source": {
            "type": "string",
            "example": "GOES19",
            "description": "Satellite that detected the flash: GOES19, GOES18 or EUMETSAT"
          }
        }
      }
    }
  }
}
Success