When to use this skill
When the user wants to find downloadable NASA Earth observation data files (granules) within a known dataset — satellite imagery tiles, climate reanalysis files, land surface temperature grids, atmospheric measurements. You need a collection short name (like MYD11A1) or concept ID (like C1748046084-LPCLOUD) to search granules; the API rejects bare queries. For discovering what datasets exist, use a collection search instead. For real-time satellite imagery or weather forecasts, this is the wrong skill.
Your best first call
curl "https://cmr.earthdata.nasa.gov/search/granules.json?short_name=MYD11A1&page_size=10"
No auth for search queries. Downloading the actual data files requires a free NASA Earthdata login with the relevant DAAC's data access policy accepted.
Results come wrapped in feed.entry[] — not a plain array. Key fields per granule:
producer_granule_id — full filename encoding date and tile (e.g. MYD11A1.A2002185.h20v05.061.2020128174702, where A2002185 = day 185 of 2002 and h20v05 is a sinusoidal tile over West Africa)
time_start, time_end — temporal coverage
cloud_cover — percentage of the tile obscured by clouds (optical/thermal sensors like MODIS only)
granule_size — file size in MB
online_access_flag — whether direct download links exist
links[].href — URLs pointing to data files on NASA's Earthdata Cloud (AWS S3)
Narrow further with temporal[] (ISO date range), bounding_box (lat/lon rectangle), or point (single coordinate).
Fallbacks (when the best call isn't enough)
- You don't know the collection short name yet → Search collections at
/search/collections.json?keyword=land+surface+temperature, then use the returned short_name or id to narrow your granule search.
- You need full collection metadata (processing level, platforms, organizations) → Use
/search/concepts/{concept_id}.json with the concept ID from a collection search.
Pitfalls
- Bare granule searches return 400. You must include at least one collection filter (
short_name, collection_concept_id, or provider). The API will not search across all granules in all collections.
- The
.json suffix is inconsistent. Search endpoints require .json for JSON output; metadata endpoints (/providers, /tags) return JSON by default and 404 if you append .json.
- Three endpoint families, three response shapes. Collections and granules wrap results in
feed.entry[]; concept lookups return the object directly; provider/tag listings use items[] with a separate hits count.
- Concept IDs encode entity type.
C prefix = collection, G = granule, V = variable. The suffix after the dash is the DAAC code (LPCLOUD, LAADS, GES_DISC).
One-line summary for the user
I can search NASA's Earthdata CMR for individual data files (granules) within a known collection by short name, with spatial and temporal filters — but you'll need a free Earthdata login to download the actual files.
SKILL.md source (frontmatter + body)
---
name: search-nasa-earthdata-granules
description: When the user wants to find downloadable NASA Earth observation data files (granules) within a known dataset — satellite imagery tiles, climate files, land surface temperature, atmospheric data — search NASA's CMR by collection short name with spatial and temporal filters.
---
## When to use this skill
When the user wants to find downloadable NASA Earth observation data files (granules) within a known dataset — satellite imagery tiles, climate reanalysis files, land surface temperature grids, atmospheric measurements. You need a collection short name (like `MYD11A1`) or concept ID (like `C1748046084-LPCLOUD`) to search granules; the API rejects bare queries. For discovering what datasets exist, use a collection search instead. For real-time satellite imagery or weather forecasts, this is the wrong skill.
## Your best first call
```bash
curl "https://cmr.earthdata.nasa.gov/search/granules.json?short_name=MYD11A1&page_size=10"
```
No auth for search queries. Downloading the actual data files requires a free NASA Earthdata login with the relevant DAAC's data access policy accepted.
Results come wrapped in `feed.entry[]` — not a plain array. Key fields per granule:
- `producer_granule_id` — full filename encoding date and tile (e.g. `MYD11A1.A2002185.h20v05.061.2020128174702`, where `A2002185` = day 185 of 2002 and `h20v05` is a sinusoidal tile over West Africa)
- `time_start`, `time_end` — temporal coverage
- `cloud_cover` — percentage of the tile obscured by clouds (optical/thermal sensors like MODIS only)
- `granule_size` — file size in MB
- `online_access_flag` — whether direct download links exist
- `links[].href` — URLs pointing to data files on NASA's Earthdata Cloud (AWS S3)
Narrow further with `temporal[]` (ISO date range), `bounding_box` (lat/lon rectangle), or `point` (single coordinate).
## Fallbacks (when the best call isn't enough)
- **You don't know the collection short name yet** → Search collections at `/search/collections.json?keyword=land+surface+temperature`, then use the returned `short_name` or `id` to narrow your granule search.
- **You need full collection metadata (processing level, platforms, organizations)** → Use `/search/concepts/{concept_id}.json` with the concept ID from a collection search.
## Pitfalls
- **Bare granule searches return 400.** You must include at least one collection filter (`short_name`, `collection_concept_id`, or `provider`). The API will not search across all granules in all collections.
- **The `.json` suffix is inconsistent.** Search endpoints require `.json` for JSON output; metadata endpoints (`/providers`, `/tags`) return JSON by default and 404 if you append `.json`.
- **Three endpoint families, three response shapes.** Collections and granules wrap results in `feed.entry[]`; concept lookups return the object directly; provider/tag listings use `items[]` with a separate `hits` count.
- **Concept IDs encode entity type.** `C` prefix = collection, `G` = granule, `V` = variable. The suffix after the dash is the DAAC code (`LPCLOUD`, `LAADS`, `GES_DISC`).
## One-line summary for the user
I can search NASA's Earthdata CMR for individual data files (granules) within a known collection by short name, with spatial and temporal filters — but you'll need a free Earthdata login to download the actual files.