Merge two decades of active-fire detections from MODIS and VIIRS into one consistent record, then build a web app that shows a burning-activity calendar for any area.
Returns MODIS, VIIRS and Landsat fire detections as CSV for a bounding box and day range, including standard-processing archive sources (MODIS_SP, VIIRS_SNPP_SP, VIIRS_NOAA20_SP) as well as near-real-time feeds. The quickest way to get point detections for a fire calendar without handling swath files. Needs a free MAP_KEY.
The Terra MODIS active-fire swath product, with fire masks, detection confidence and fire radiative power back to 2000. This is the long MODIS side of a MODIS-VIIRS harmonized record; the Aqua twin is MYD14.
CMR short name MOD14, concept ID C2271754179-LPCLOUD, GIBS layer MODIS_Terra_Thermal_Anomalies_All
Suomi NPP VIIRS active-fire detections at 375 m, finer than MODIS and available since 2012. The overlap years with MODIS are where harmonization work happens.
CMR short name VNP14IMG, concept ID C2734202914-LPCLOUD, GIBS layer VIIRS_SNPP_Thermal_Anomalies_375m_All
Ready-made map tiles for more than 1,000 NASA Earth layers (true color, fires, soil moisture, precipitation, night lights and more) served over WMTS with no login. The fastest way to put NASA Earth imagery on a web map or in a visualization.
import earthaccess
# VIIRS 375 m active fire swaths over California, one week
results = earthaccess.search_data(
short_name="VNP14IMG",
bounding_box=(-124.5, 32.5, -114.0, 42.0),
temporal=("2025-08-01", "2025-08-07"),
count=5,
)
print(len(results), "granules")
for g in results:
print(g["umm"]["GranuleUR"])
# Swap short_name to "MOD14" for the Terra MODIS record (2000 onward).
# Downloads need Earthdata Login:
# earthaccess.login()
# earthaccess.download(results, "./fires")
Pull fire detections for a bounding boxPython, needs login or key
import os, io
import requests
import pandas as pd
# Get a free MAP_KEY at https://firms.modaps.eosdis.nasa.gov/api/map_key/
key = os.environ["FIRMS_MAP_KEY"]
source = "VIIRS_SNPP_SP" # or MODIS_SP for the MODIS archive
bbox = "-124.5,32.5,-114.0,42.0" # west,south,east,north
url = f"https://firms.modaps.eosdis.nasa.gov/api/area/csv/{key}/{source}/{bbox}/5/2025-08-01"
r = requests.get(url, timeout=60)
r.raise_for_status()
df = pd.read_csv(io.StringIO(r.text))
print(len(df), "detections")
print(df[["latitude", "longitude", "acq_date", "confidence"]].head())
Fetch a GIBS true-color tileJavaScript
// Build a GIBS WMTS tile URL (no key, CORS enabled) for a given day.
// Layer names come from the GIBS capabilities document.
const layer = "MODIS_Terra_CorrectedReflectance_TrueColor";
const date = "2026-10-01";
const [zoom, row, col] = [2, 1, 2];
const url = `https://gibs.earthdata.nasa.gov/wmts/epsg4326/best/${layer}` +
`/default/${date}/250m/${zoom}/${row}/${col}.jpg`;
const res = await fetch(url);
console.log(res.status, res.headers.get("content-type"), url);
// In a map library (Leaflet, OpenLayers) use the same template with
// {z}/{y}/{x}. Fire layers such as VIIRS_SNPP_Thermal_Anomalies_375m_All
// are vector tiles (.mvt, 500m matrix set); check the capabilities XML.
Try a live search
Ask NASA's Common Metadata Repository for the five newest files in MODIS/Terra Thermal Anomalies/Fire 5-Min L2 Swath 1km (MOD14) V061. This runs in your browser and needs no login.