---
name: nasa-firms-ingestion
description: "How to get NASA FIRMS active fire data data into a pandas DataFrame and Parquet: access, the request, the format, limits, quirks and terms."
---

# Load a keyless NASA FIRMS 24-hour VIIRS file into pandas and Parquet

Source entry: https://signal-lab-jet.vercel.app/datasets/nasa-firms
Provider: https://www.earthdata.nasa.gov/data/tools/firms
Checked against the provider's documentation: 2026-10-30

## Access
- Observed 2026-10-30: the Suomi NPP VIIRS global 24-hour CSV downloaded without a key or login.
- FIRMS API and map services require a free MAP_KEY. The FAQ says some daily-fire download folders require Earthdata Login.

## Request
```bash
curl -O 'https://firms.modaps.eosdis.nasa.gov/data/active_fire/suomi-npp-viirs-c2/csv/SUOMI_VIIRS_C2_Global_24h.csv'
```

## Format
CSV detections with latitude, longitude, brightness, scan, track, acquisition date and HHMM time, satellite, confidence, version, fire radiative power and day/night flag.

## Load into pandas and Parquet
Needs Python 3 with requests, pandas and pyarrow.
```python
"""NASA FIRMS keyless Suomi NPP VIIRS global 24-hour CSV -> pandas -> Parquet."""
import io
import requests
import pandas as pd

URL = "https://firms.modaps.eosdis.nasa.gov/data/active_fire/suomi-npp-viirs-c2/csv/SUOMI_VIIRS_C2_Global_24h.csv"
r = requests.get(URL, timeout=120)
r.raise_for_status()
df = pd.read_csv(io.StringIO(r.text), dtype={"acq_time": "string"})
df["acq_time"] = df["acq_time"].str.zfill(4)
df["acquired_at"] = pd.to_datetime(df["acq_date"].astype(str) + " " + df["acq_time"],
                                    format="%Y-%m-%d %H%M", utc=True)
df.to_parquet("nasa_firms_viirs_global_24h.parquet", index=False)
print(len(df), "fire detections", df["acquired_at"].min().isoformat(), "to",
      df["acquired_at"].max().isoformat())
```
Run by us on 2026-10-30 (python 3.13.5 | pandas 3.1.0 | pyarrow 26.0.0 | requests 2.34.2). Result: 80102 fire detections 2026-10-29T00:01:00+00:00 to 2026-10-30T12:53:00+00:00

## Limits
- Keyless recent-file rate limit: Not stated.
- MAP_KEY limit: 5,000 transactions per 10-minute interval; larger transactions can count as multiple requests.
- The recent SHP, KML and CSV files cover 24 hours, 48 hours or seven days and update every 60 minutes.

## Quirks
- Read acq_time as text and zero-pad it before combining acq_date and acq_time as UTC.
- A detection is a satellite thermal anomaly, not a confirmed incident or a burned-area measurement. Cloud, canopy, revisit timing and confidence affect coverage.
- The FAQ's Earthdata Login statement applies to an updated-daily-fire folder. Observed 2026-10-30: the named 24-hour CSV path was keyless.

## Terms and attribution
- NASA promotes full and open sharing of FIRMS data.
- For image captions, cite NASA FIRMS. For scientific journals, use the NASA LANCE FIRMS acknowledgment stated in the FAQ.
- Terms page: https://www.earthdata.nasa.gov/data/tools/firms/faq

## Sources
- https://www.earthdata.nasa.gov/data/tools/firms/faq: "FIRMS fire maps are updated every 5 minutes, and the SHP, KML and CSV files (available for the last 24 hours, 48 hours, and 7 days) are updated every 60 minutes."
- https://www.earthdata.nasa.gov/data/tools/firms/faq: "you will need an Earthdata Login to download data from this folder."
- https://firms.modaps.eosdis.nasa.gov/api/map_key/: "MAP_KEY limit is 5000 transactions / 10-minute interval"
- https://www.earthdata.nasa.gov/data/tools/firms/faq: "NASA promotes full and open sharing of data"

Information for educational purposes only. Free tiers, limits and licenses belong to the providers and may change; check the provider's own terms before using the data.
