When to use this skill
When the user asks to find NASA satellite data — Sentinel-1 radar imagery, MODIS land surface temperature, Landsat scenes, or any Earth observation dataset — by region, time period, platform, or topic. CMR is a metadata catalog: you get pointers to data files and download links, not the data itself. For weather forecasts, use a weather API instead. For downloading the actual files, the user needs a free Earthdata login (separate from CMR search, which needs no auth).
Your best first call
curl "https://cmr.earthdata.nasa.gov/search/granules.json?short_name=SENTINEL-1A_SLC&bounding_box=-122.5,37.5,-122.0,38.0&temporal=2014-10-01T00:00:00Z,2014-10-31T23:59:59Z&page_size=5"
No auth needed for search. Use granules.json when you know the dataset's short name. The three narrowing parameters that matter most are short_name (which dataset), bounding_box (SW_lon,SW_lat,NE_lon,NE_lat), and temporal (start,end in ISO 8601). Sentinel-1 SLC is radar, not optical — the polygons field returns an irregular quadrilateral footprint rather than a rectangle, and individual scenes run ~4 GB.
The response is a JSON feed with an entry array. Key fields:
producer_granule_id — scene identifier
time_start, time_end — acquisition time window
granule_size — file size in megabytes
polygons — ground footprint as coordinate pairs (irregular for SAR imagery)
links — array with rel and href; filter for rel containing data# to get download URLs
online_access_flag — true means the data is publicly downloadable (with Earthdata login)
Fallbacks (when the best first call isn't enough)
- Don't know the dataset short name →
collections.json?keyword=land+surface+temperature&bounding_box=-110,39.5,-105,40.5 discovers datasets by topic and region. The entry_id gives you short name plus version; strip the version suffix (MOD11A1_061 → MOD11A1) for use in granule queries.
- Don't know what keyword or parameter to use →
autocomplete?q=MODIS maps a partial term to CMR's controlled vocabulary. Each type value (instrument, project, science_keywords, organization) maps to a different query parameter.
- Need to download the actual data files → CMR search needs no auth, but the download links in
links require a free NASA Earthdata login at urs.earthdata.nasa.gov.
Pitfalls
entry_id includes the version but short_name does not. A collection's entry_id is MOD11A1_061; its short_name (used in granule queries) is MOD11A1. Using the full entry_id as short_name returns zero results.
bounding_box uses SW_lon,SW_lat,NE_lon,NE_lat — longitude first, then latitude. Swapping the order puts your query in the wrong hemisphere.
granules.json with no collection filter (short_name, concept_id, or provider) returns empty results or a 400 error. Always narrow by collection first.
- Append
.json to search paths. Without it, CMR returns HTML or Atom XML. collections → collections.json, granules → granules.json.
One-line summary for the user
I can search NASA's Earth observation metadata catalog for satellite datasets and data files by topic, region, platform, and time period using the CMR API — no auth needed for search, but downloading data requires a free Earthdata login.
SKILL.md source (frontmatter + body)
---
name: search-nasa-earthdata
description: When the user asks to find NASA satellite data — Sentinel, MODIS, Landsat, or any Earth observation dataset — by region, time period, platform, or keyword, search the CMR API for collections and data files. No auth needed for search.
---
## When to use this skill
When the user asks to find NASA satellite data — Sentinel-1 radar imagery, MODIS land surface temperature, Landsat scenes, or any Earth observation dataset — by region, time period, platform, or topic. CMR is a metadata catalog: you get pointers to data files and download links, not the data itself. For weather forecasts, use a weather API instead. For downloading the actual files, the user needs a free Earthdata login (separate from CMR search, which needs no auth).
## Your best first call
```bash
curl "https://cmr.earthdata.nasa.gov/search/granules.json?short_name=SENTINEL-1A_SLC&bounding_box=-122.5,37.5,-122.0,38.0&temporal=2014-10-01T00:00:00Z,2014-10-31T23:59:59Z&page_size=5"
```
No auth needed for search. Use `granules.json` when you know the dataset's short name. The three narrowing parameters that matter most are `short_name` (which dataset), `bounding_box` (`SW_lon,SW_lat,NE_lon,NE_lat`), and `temporal` (start,end in ISO 8601). Sentinel-1 SLC is radar, not optical — the `polygons` field returns an irregular quadrilateral footprint rather than a rectangle, and individual scenes run ~4 GB.
The response is a JSON feed with an `entry` array. Key fields:
- `producer_granule_id` — scene identifier
- `time_start`, `time_end` — acquisition time window
- `granule_size` — file size in megabytes
- `polygons` — ground footprint as coordinate pairs (irregular for SAR imagery)
- `links` — array with `rel` and `href`; filter for `rel` containing `data#` to get download URLs
- `online_access_flag` — `true` means the data is publicly downloadable (with Earthdata login)
## Fallbacks (when the best first call isn't enough)
- **Don't know the dataset short name** → `collections.json?keyword=land+surface+temperature&bounding_box=-110,39.5,-105,40.5` discovers datasets by topic and region. The `entry_id` gives you short name plus version; strip the version suffix (`MOD11A1_061` → `MOD11A1`) for use in granule queries.
- **Don't know what keyword or parameter to use** → `autocomplete?q=MODIS` maps a partial term to CMR's controlled vocabulary. Each `type` value (`instrument`, `project`, `science_keywords`, `organization`) maps to a different query parameter.
- **Need to download the actual data files** → CMR search needs no auth, but the download links in `links` require a free NASA Earthdata login at `urs.earthdata.nasa.gov`.
## Pitfalls
- `entry_id` includes the version but `short_name` does not. A collection's `entry_id` is `MOD11A1_061`; its `short_name` (used in granule queries) is `MOD11A1`. Using the full `entry_id` as `short_name` returns zero results.
- `bounding_box` uses `SW_lon,SW_lat,NE_lon,NE_lat` — longitude first, then latitude. Swapping the order puts your query in the wrong hemisphere.
- `granules.json` with no collection filter (`short_name`, `concept_id`, or `provider`) returns empty results or a 400 error. Always narrow by collection first.
- Append `.json` to search paths. Without it, CMR returns HTML or Atom XML. `collections` → `collections.json`, `granules` → `granules.json`.
## One-line summary for the user
I can search NASA's Earth observation metadata catalog for satellite datasets and data files by topic, region, platform, and time period using the CMR API — no auth needed for search, but downloading data requires a free Earthdata login.