Collection Discovery: searching for collections across multiple APIs using the Federated Collection Discovery tools
Author: Henry Rodman (Development Seed)
Date: December 18, 2025
Description: These examples show how to use the Federated Collection Discovery STAC API to search for collections across multiple STAC APIs. There is also an interactive search application for using the API which you can use at https://discover.maap-project.org.
Background
It can be challenging to find the data that you need for an analysis when any of the following are true:
you don’t know the collection ID for a collection that you know exists
you don’t know which exact API the data can be accessed from
you don’t know which collections you even need
Fear not! The Federated STAC Collection Discovery application (and the underlying API) can help you find the data you need by running your search for collections across multiple catalogs simultaneously.

Using discover.maap-project.org
The Federated Collection Discovery web application is a great place to browse for datasets that may be relevant to your work. The application allows you to apply free-text, spatial, and temporal filters to the collections that are housed in a set of configured catalogs. By default, the application will search through the following catalogs:
NASA MAAP STAC: https://stac.maap-project.org/
ESA MAAP STAC: https://catalog.maap.eo.esa.int/catalogue/
VEDA STAC: https://openveda.cloud/api/stac/
NASA CMR STAC: https://cmr.earthdata.nasa.gov/stac/ALL
You can toggle any of these APIs on/off and add new STAC APIs to the list in the ‘Settings’ menu:

Note: Any custom STAC API that you provide must have the free-text and collection-search STAC API extensions enabled. If those extensions are not available then the application will warn you that those search features are not available.
The search form allows you to apply text, temporal, and spatial filters to the collections:

text search
Perform a search with a free-text filter for collections that include ‘elevation’ OR ‘DEM’ but not ‘biomass’. The API will scan the ‘title’, ‘description’, and ‘keywords’ attributes of all of the collections in the catalogs.
The free-text query parameter will follow the logic outlined in the STAC API free-text extension. Here is a table that outlines the types of queries that are possible (borrowed from the STAC API free-text extension readme): | q | Summary | Detail | | ———– | ——- | —— | | sentinel | Free-text query against all properties | This will search for any matching items that CONTAIN "sentinel"
| | "climate model" | Free-text search using exact | This will search for any matching items that CONTAIN the exact phrase "climate model" | |climate model| Using OR term match (Default) | This will search for any matching items that CONTAIN "climate" OR "model"| |climate OR model| Using OR term match (Default) | This will search for any matching items that CONTAIN "climate" OR "model"| |climate AND model| Using
AND term match | This will search for any matching items that CONTAIN "climate" AND "model"| | (quick OR brown) AND fox | Parentheses can be used to group terms | This will search for matching items that CONTAIN "quick" OR "brown" AND "fox" | | quick +brown -fox | Indicate included and excluded terms using +/- | This will search for items that INCLUDES "brown" EXCLUDES "fox" OR CONTAIN "quick" |
spatial search
You can apply a spatial filter to your search by typing the bounding box coordinates (xmin, ymin, xmax, ymax) or by drawing one on the provided map interface. The bounding box filter will return collections where the spatial extent intersects the provided bounding box.

temporal search
You can apply a temporal filter to your search by entering a start/end date range in the provided input boxes.
Inspect the search results
The matching collections from your search query will be printed in a table. If you click on a row, the collection details will pop up showing the description, the spatial and temporal extents, the source catalog, and data provider entries.

If the collection seems like a good match for your needs, you can scroll down to the ‘STAC Item Code Hints’ to get the Python and R code you need to do an item-level search in a notebook or script.

Users can also follow links to the original STAC collection JSON in its home API and browse for items there.
Federated STAC Collection Discovery API
The web application is powered by the Federated STAC Collection Discovery API which is a STAC API that can be used to run collection searches across multiple upstream STAC APIs simultaneously.
For fully capable upstream STAC APIs, the following parameters are available on the /collections endpoint:
search parameters:
bbox: bounding box coordinates (EPSG:4326)datetime: datetime extentq: free-text searchfilter: cql2 filteringsortby: sort results by some field
Note: The API uses the collection-search STAC API extension which can be paired with several other extensions to create a robust search interface for collections across multiple STAC APIs. However, the functionality of the Federated STAC Collection Discovery API is limited to the capabilities of the least capable upstream API. For example, if you try to use it with an upstream STAC API that does not implement the collection-search extension or the free-text search extension, the advanced search capabilities will not be available at all.
Searching for collections with pystac-client
Since the Federated Collection Discovery API is a valid STAC API we can use pystac-client to run searches and interact with the results.
This section uses the CollectionSearch client from pystac-client which was added in version 0.8.4 so you will need to install pystac-client>=0.8.4.
Note: The MAAP ADE has a lower version installed by default so you will need to upgrade the package in your workspace to follow the examples in this notebook!
You can install the required version like this:
pip install pystac-client>=0.8.4
[1]:
from pystac_client import Client
from requests import Request
API_URL = "https://discover-api.maap-project.org"
client = Client.open(API_URL)
search = client.collection_search(
q="GEDI",
limit=1,
max_collections=4,
)
for i, collection in enumerate(search.collections()):
print(f"\n- {collection.id}")
print(f" Title: {collection.title}")
print(f" Upstream API link: {collection.get_self_href()}")
description = (
collection.description[:100] + "..."
if len(collection.description) > 100
else collection.description
)
print(f" Description: {description}")
- GEDI_CalVal_Field_Data
Title: Global Ecosystem Dynamics Investigation (GEDI) Calibration/Validation Field Survey Dataset
Upstream API link: https://stac.maap-project.org/collections/GEDI_CalVal_Field_Data
Description: The Global Ecosystem Dynamics Investigation (GEDI) Forest Structure and Biomass Database (FSBD) is a...
- GEDI_ISS_L3_Canopy_Height_Mean_RH100_201904-202303
Title: GEDI Mean Canopy Height AGL
Upstream API link: https://staging.openveda.cloud/api/stac/collections/GEDI_ISS_L3_Canopy_Height_Mean_RH100_201904-202303
Description: The Global Ecosystem Dynamics Investigation ([GEDI](https://gedi.umd.edu/)) mission aims to characte...
- C2141081749-LPCLOUD
Title: GEDI L1B Geolocated Waveform Data Global Footprint Level V001
Upstream API link: https://catalog.maap.eo.esa.int/catalogue/collections/C2141081749-LPCLOUD
Description: GEDI Version 1 data products were decommissioned on February 15, 2022. Users are advised to use the ...
- GEDI02_A_002
Title: GEDI L2A Elevation and Height Metrics Data Global Footprint Level V002
Upstream API link: https://cmr.earthdata.nasa.gov/stac/LPCLOUD/collections/GEDI02_A_002
Description: The Global Ecosystem Dynamics Investigation ([GEDI](https://gedi.umd.edu/)) mission aims to characte...
Searching Specific APIs with pystac-client
You can also specify which upstream APIs to query by supplying the apis parameter in a request_modifier function:
[2]:
def add_apis(request: Request):
"""Add the `apis` parameter to all requests to this STAC API client"""
request.params.update(
{
"apis": [
"https://stac.eoapi.dev",
"https://stac.maap-project.org",
]
}
)
return request
specific_client = Client.open(API_URL, request_modifier=add_apis)
# Search for biomass collections from specific APIs only
search = specific_client.collection_search(
q="biomass",
limit=1,
max_collections=4,
)
print("Searching specific APIs for biomass collections:")
# Show collection details
for i, collection in enumerate(search.collections()):
print(f"\n- {collection.id}")
print(f" Title: {collection.title}")
print(f" Upstream API link: {collection.get_self_href()}")
description = (
collection.description[:100] + "..."
if len(collection.description) > 100
else collection.description
)
print(f" Description: {description}")
Searching specific APIs for biomass collections:
- AFRISAR_DLR
Title: AFRISAR_DLR
Upstream API link: https://stac.maap-project.org/collections/AFRISAR_DLR
Description: The ESA BIOMASS mission was selected in 2013 as the 7th Earth Explorer mission. BIOMAS...
- AFRISAR_DLR2
Title: AFRISAR_DLR2
Upstream API link: https://stac.maap-project.org/collections/AFRISAR_DLR2
Description: The ESA BIOMASS mission was selected in 2013 as the 7th Earth Explorer mission. BIOMASS will provide...
- AfriSAR_UAVSAR_Geocoded_Covariance
Title: AfriSAR UAVSAR Geocoded Covariance Matrix product Generated Using NISAR Tools
Upstream API link: https://stac.maap-project.org/collections/AfriSAR_UAVSAR_Geocoded_Covariance
Description: The Geocoded Covariance Matrix dataset is the 4x4 Native Covariance Matrix geocoded to a spatial res...
- AfriSAR_UAVSAR_Geocoded_SLC
Title: AfriSAR UAVSAR Geocoded SLCs Generated Using NISAR Tools
Upstream API link: https://stac.maap-project.org/collections/AfriSAR_UAVSAR_Geocoded_SLC
Description: The Geocoded SLC (single-look-complex) dataset contains the geolocated SLC magnitude of a particular...
Searching for collections using an http client
[3]:
from datetime import datetime, timezone
import httpx
import pandas as pd
from IPython.display import display, HTML
The API is configured to search across several STAC APIs by default, you can use the /_mgmt/health endpoint to see the collection-search capabilities to see the collection-search capabilities of each of the configured upstream STAC APIs.
[4]:
api_status = httpx.get(f"{API_URL}/_mgmt/health", timeout=20).json()
api_status
[4]:
{'status': 'UP',
'lifespan': {'status': 'UP'},
'upstream_apis': {'https://stac.maap-project.org': {'healthy': True,
'collection_search_conformance': ['collection-search',
'collection-search#fields',
'collection-search#filter',
'collection-search#free-text',
'collection-search#query',
'collection-search#sort']},
'https://staging.openveda.cloud/api/stac': {'healthy': True,
'collection_search_conformance': ['collection-search',
'collection-search#fields',
'collection-search#filter',
'collection-search#free-text',
'collection-search#query',
'collection-search#sort']},
'https://catalog.maap.eo.esa.int/catalogue': {'healthy': True,
'collection_search_conformance': ['collection-search',
'collection-search#filter',
'collection-search#free-text']},
'https://cmr.earthdata.nasa.gov/stac/ALL': {'healthy': True,
'collection_search_conformance': ['collection-search',
'collection-search#free-text',
'collection-search#sort']}}}
[5]:
search_request = httpx.get(
f"{API_URL}/collections",
params={
"q": "(elevation OR DEM) -biomass",
},
timeout=20,
)
search_request.raise_for_status()
search_results = search_request.json()
results_df = (
pd.DataFrame(search_results["collections"])
.assign(
catalog_url=lambda df: df["links"].apply(
lambda links_list: next(
(link["href"] for link in links_list if link["rel"] == "root"),
None
)
)
)
)
display(HTML(results_df[["id", "catalog_url", "title"]].to_html()))
| id | catalog_url | title | |
|---|---|---|---|
| 0 | ABoVE_UAVSAR_PALSAR | https://stac.maap-project.org/ | Arctic-Boreal Vulnerability Experiment Uninhabited Aerial Vehicle Synthetic Aperture Radar Polarimetric SAR |
| 1 | SRTMGL1_COD | https://stac.maap-project.org/ | NASA Shuttle Radar Topography Mission Global 1 |
| 2 | la-fires-slope | https://staging.openveda.cloud/api/stac/ | Eaton and Palisades Fires (2025) Slope |
| 3 | la-fires-slope-test-march6 | https://staging.openveda.cloud/api/stac/ | Eaton and Palisades Fires (2025) Slope-Test-March6 |
The results contain a list of collection-level metadata with some basic properties that you can review further.
[6]:
collection_info = results_df.iloc[0]
print(collection_info)
print("\ndescription:\n", collection_info.description)
id ABoVE_UAVSAR_PALSAR
type Collection
links [{'rel': 'items', 'type': 'application/geo+jso...
title Arctic-Boreal Vulnerability Experiment Uninhab...
extent {'spatial': {'bbox': [[-166.788382, 59.729364,...
license CC0-1.0
providers [{'url': 'https://above.nasa.gov/', 'name': 'N...
description The Arctic-Boreal Vulnerability Experiment (AB...
item_assets {}
stac_version 1.1.0
keywords NaN
stac_extensions NaN
assets NaN
renders NaN
summaries NaN
datetime_range NaN
dashboard:is_periodic NaN
dashboard:time_density NaN
catalog_url https://stac.maap-project.org/
Name: 0, dtype: object
description:
The Arctic-Boreal Vulnerability Experiment (ABoVE) is a NASA Terrestrial Ecology Program field campaign conducted from June through September 2017 over Alaska and Western Canada. ABoVE is a large-scale study of environmental change and to assess the vulnerability and resilience of Arctic and boreal ecosystems and provide scientific bases for societal response decision making. ABoVE utilized the Uninhabited Aerial Vehicle Synthetic Aperture Radar (UAVSAR) Polarimetric SAR (PALSAR) instrument to provide image transects to survey the land surface, hydrological systems and vegetation. SAR products in this collection include the Digital Elevation Model (DEM), the local incidence angle, the terrain slope product, ground projected complex cross products, the compressed stokes matrix, pauli decompositions, multi-look cross products, and scene annotation files.
bounding box filter
Perform a search for collections that intersect Finland’s bounding box with a free-text filter for ‘biomass’
[7]:
finland_bbox = (18.061, 59.348, 31.181, 70.576)
search_request = httpx.get(
f"{API_URL}/collections",
params={
"q": "biomass",
"bbox": ",".join(str(coord) for coord in finland_bbox),
},
timeout=20,
)
search_request.raise_for_status()
search_results = search_request.json()
results_df = (
pd.DataFrame(search_results["collections"])
.assign(
catalog_url=lambda df: df["links"].apply(
lambda links_list: next(
(link["href"] for link in links_list if link["rel"] == "root"),
None
)
)
)
)
display(HTML(results_df[["id", "catalog_url", "title"]].to_html()))
| id | catalog_url | title | |
|---|---|---|---|
| 0 | BIOSAR1 | https://stac.maap-project.org/ | BIOSAR1 |
| 1 | ESACCI_Biomass_L4_AGB_V4_100m | https://stac.maap-project.org/ | ESA CCI Above-Ground Biomass Product Level 4 Version 4 |
| 2 | GEDI_CalVal_Field_Data | https://stac.maap-project.org/ | Global Ecosystem Dynamics Investigation (GEDI) Calibration/Validation Field Survey Dataset |
| 3 | GEDI_CalVal_Lidar_Data_Compressed | https://stac.maap-project.org/ | Global Ecosystem Dynamics Investigation (GEDI) Calibration/Validation Airborne Lidar Dataset (Compressed) |
| 4 | icesat2-boreal | https://stac.maap-project.org/ | Circumpolar boreal forest structure from ICESat-2 & HLS (2020 v1.0): 30m aboveground woody biomass density |
| 5 | ICESat2_Boreal_AGB_tindex_average | https://stac.maap-project.org/ | ICESat2-Boreal Above Ground Biomass T-Index Average |
| 6 | icesat2-boreal-v2.1-agb | https://stac.maap-project.org/ | Circumpolar boreal forest structure from ICESat-2 & HLS (2020 v2.1): 30m aboveground woody biomass density |
| 7 | icesat2-boreal-v2.1-ht | https://stac.maap-project.org/ | Circumpolar boreal forest structure from ICESat-2 & HLS (2020 v2.1): 30m vegetation height |
| 8 | icesat2-boreal-v3.0-agb | https://stac.maap-project.org/ | Circumpolar boreal forest structure from ICESat-2 & HLS (2020 v3.0): 30m aboveground woody biomass density |
| 9 | icesat2-boreal-v3.0-ht | https://stac.maap-project.org/ | Circumpolar boreal forest structure from ICESat-2 & HLS (2020 v3.0): 30m vegetation height |
| 10 | BiomassLevel2a | https://catalog.maap.eo.esa.int/catalogue/ | Biomass Level 2A |
| 11 | BiomassLevel1bIOC | https://catalog.maap.eo.esa.int/catalogue/ | Biomass Level 1B (IOC) |
| 12 | BiomassLevel1aIOC | https://catalog.maap.eo.esa.int/catalogue/ | Biomass Level 1A (IOC) |
| 13 | C3327359101-FEDEO | https://catalog.maap.eo.esa.int/catalogue/ | ESA Biomass Climate Change Initiative (Biomass_cci): Global datasets of forest above-ground biomass for the years 2010, 2015, 2016, 2017, 2018, 2019, 2020 and 2021, v5.01 |
| 14 | C3327359400-FEDEO | https://catalog.maap.eo.esa.int/catalogue/ | ESA Biomass Climate Change Initiative (Biomass_cci): Global datasets of forest above-ground biomass for the years 2010, 2017, 2018, 2019 and 2020, v4 |
| 15 | BiomassLevel2aIOC | https://catalog.maap.eo.esa.int/catalogue/ | Biomass Level 2A (IOC) |
| 16 | BiomassAuxRest | https://catalog.maap.eo.esa.int/catalogue/ | Biomass Auxiliary Restricted |
| 17 | BiomassLevel1b | https://catalog.maap.eo.esa.int/catalogue/ | Biomass Level 1B |
| 18 | BiomassCalVal10 | https://catalog.maap.eo.esa.int/catalogue/ | Biomass Cal/Val |
| 19 | BiomassSimulated | https://catalog.maap.eo.esa.int/catalogue/ | Biomass Simulated data |
| 20 | 95913ffb6467447ca72c4e9d8cf30501_NA | https://cmr.earthdata.nasa.gov/stac | ESA Biomass Climate Change Initiative (Biomass_cci): Global datasets of forest above-ground biomass for the years 2007, 2010, 2015, 2016, 2017, 2018, 2019, 2020, 2021 and 2022, v6.0 |
| 21 | bf535053562141c6bb7ad831f5998d77_NA | https://cmr.earthdata.nasa.gov/stac | ESA Biomass Climate Change Initiative (Biomass_cci): Global datasets of forest above-ground biomass for the years 2010, 2015, 2016, 2017, 2018, 2019, 2020 and 2021, v5.01 |
| 22 | 5f331c418e9f4935b8eb1b836f8a91b8_NA | https://cmr.earthdata.nasa.gov/stac | ESA Biomass Climate Change Initiative (Biomass_cci): Global datasets of forest above-ground biomass for the years 2010, 2017 and 2018, v3 |
| 23 | 84403d09cef3485883158f4df2989b0c_NA | https://cmr.earthdata.nasa.gov/stac | ESA Biomass Climate Change Initiative (Biomass_cci): Global datasets of forest above-ground biomass for the years 2010, 2017 and 2018, v2 |
| 24 | af60720c1e404a9e9d2c145d2b2ead4e_NA | https://cmr.earthdata.nasa.gov/stac | ESA Biomass Climate Change Initiative (Biomass_cci): Global datasets of forest above-ground biomass for the years 2010, 2017, 2018, 2019 and 2020, v4 |
| 25 | Global_Biomass_1950-2010_1296_1 | https://cmr.earthdata.nasa.gov/stac | Global 1-degree Maps of Forest Area, Carbon Stocks, and Biomass, 1950-2010 |
| 26 | Boreal_AGB_Density_ICESat2_2186_1 | https://cmr.earthdata.nasa.gov/stac | Aboveground Biomass Density for High Latitude Forests from ICESat-2, 2020 |
| 27 | IS2ATBABD_1 | https://cmr.earthdata.nasa.gov/stac | ICESat-2 Derived 30 m Along-Track Boreal Aboveground Biomass Density V001 |
| 28 | Boreal_AGB_Density_ICESat2_V3_2437_3 | https://cmr.earthdata.nasa.gov/stac | Circumpolar Boreal Forest Aboveground Biomass Density and Vegetation Height, V3 |
| 29 | CMS_Global_Forest_Age_2345_1 | https://cmr.earthdata.nasa.gov/stac | Classification of Global Forests for IPCC Aboveground Biomass Tier 1 Estimates, 2020 |
pagination
The results returned by the API are paginated, so you can use the next link from the /collections response to access the next page. Pagination state is handled with the token parameter.
[8]:
next_link = next((link["href"] for link in search_results["links"] if link["rel"] == "next"), None)
print(next_link)
next_results = httpx.get(next_link).json()
results_df = (
pd.DataFrame(next_results["collections"])
.assign(
catalog_url=lambda df: df["links"].apply(
lambda links_list: next(
(link["href"] for link in links_list if link["rel"] == "root"),
None
)
)
)
)
display(HTML(results_df[["id", "catalog_url", "title"]].to_html()))
https://discover-api.maap-project.org/collections?token=eyJjdXJyZW50Ijp7Imh0dHBzOi8vc3RhYy5tYWFwLXByb2plY3Qub3JnIjoiaHR0cHM6Ly9zdGFjLm1hYXAtcHJvamVjdC5vcmcvY29sbGVjdGlvbnM_YmJveD0xOC4wNjElMkM1OS4zNDglMkMzMS4xODElMkM3MC41NzYmbGltaXQ9MTAmZmlsdGVyX2xhbmc9Y3FsMi10ZXh0JnE9YmlvbWFzcyZvZmZzZXQ9MTAiLCJodHRwczovL2NhdGFsb2cubWFhcC5lby5lc2EuaW50L2NhdGFsb2d1ZSI6Imh0dHBzOi8vY2F0YWxvZy5tYWFwLmVvLmVzYS5pbnQvY2F0YWxvZ3VlL2NvbGxlY3Rpb25zP2Jib3g9MTguMDYxLDU5LjM0OCwzMS4xODEsNzAuNTc2JmxpbWl0PTEwJmZpbHRlcl9sYW5nPWNxbDItdGV4dCZxPWJpb21hc3Mmc3RhcnRSZWNvcmQ9MTEiLCJodHRwczovL2Ntci5lYXJ0aGRhdGEubmFzYS5nb3Yvc3RhYy9BTEwiOiJodHRwczovL2Ntci5lYXJ0aGRhdGEubmFzYS5nb3Yvc3RhYy9BTEwvY29sbGVjdGlvbnM_YmJveD0xOC4wNjElMkM1OS4zNDglMkMzMS4xODElMkM3MC41NzYmZmlsdGVyX2xhbmc9Y3FsMi10ZXh0JmxpbWl0PTEwJnE9YmlvbWFzcyZjdXJzb3I9ZXlKcWMyOXVJam9pV3pFdU5Dd3dMakFzTUM0d0xERTJNRGswTlRreE9UazVPVGtzWENJeklDMGdaM0pwWkdSbFpDQnZZbk5sY25aaGRHbHZibk5jSWl4Y0lrTk5VMTlIYkc5aVlXeGZSbTl5WlhOMFgwRm5aVjh5TXpRMVhDSXNYQ0l4WENJc016QTVNVEUxTXpNM09Td3hORjBpTENKMWJXMGlPaUpiTVM0MExEQXVNQ3d3TGpBc01UWXdPVFExT1RFNU9UazVPU3hjSWpNZ0xTQm5jbWxrWkdWa0lHOWljMlZ5ZG1GMGFXOXVjMXdpTEZ3aVEwMVRYMGRzYjJKaGJGOUdiM0psYzNSZlFXZGxYekl6TkRWY0lpeGNJakZjSWl3ek1Ea3hNVFV6TXpjNUxERTBYU0o5In0sImlzX2ZpcnN0X3BhZ2UiOmZhbHNlfQ==
| id | catalog_url | title | |
|---|---|---|---|
| 0 | icesat2-boreal-v3.1-agb | https://stac.maap-project.org/ | Circumpolar boreal forest structure from ICESat-2 & HLS (2020 v3.1): 30m aboveground woody biomass density |
| 1 | icesat2-boreal-v3.1-ht | https://stac.maap-project.org/ | Circumpolar boreal forest structure from ICESat-2 & HLS (2020 v3.1): 30m vegetation height |
| 2 | BiomassLevel2bIOC | https://catalog.maap.eo.esa.int/catalogue/ | Biomass Level 2B (IOC) |
| 3 | BiomassLevel0 | https://catalog.maap.eo.esa.int/catalogue/ | Biomass Level 0 |
| 4 | CCIBiomassV5.01 | https://catalog.maap.eo.esa.int/catalogue/ | CCI Biomass V5.01 |
| 5 | BiomassLevel2b | https://catalog.maap.eo.esa.int/catalogue/ | Biomass Level 2B |
| 6 | BiomassAuxIOC | https://catalog.maap.eo.esa.int/catalogue/ | Biomass Auxiliary (IOC) |
| 7 | BiomassLevel0IOC | https://catalog.maap.eo.esa.int/catalogue/ | Biomass Level 0 (IOC) |
| 8 | BiomassLevel1a | https://catalog.maap.eo.esa.int/catalogue/ | Biomass Level 1A |
| 9 | C3904051179-ORNL_CLOUD | https://catalog.maap.eo.esa.int/catalogue/ | Circumpolar Boreal Forest Aboveground Biomass Density and Vegetation Height, V3 |
| 10 | C2756302505-ORNL_CLOUD | https://catalog.maap.eo.esa.int/catalogue/ | Aboveground Biomass Density for High Latitude Forests from ICESat-2, 2020 |
| 11 | BiomassLevel1cIOC | https://catalog.maap.eo.esa.int/catalogue/ | Biomass Level 1C (IOC) |
| 12 | Global_Maps_C_Density_2010_1763_1 | https://cmr.earthdata.nasa.gov/stac | Global Aboveground and Belowground Biomass Carbon Density Maps for the Year 2010 |
| 13 | Eurasia_Biomass_1278_1 | https://cmr.earthdata.nasa.gov/stac | LiDAR-based Biomass Estimates, Boreal Forest Biome, Eurasia, 2005-2006 |
| 14 | gov.noaa.nodc:0049894_Not Applicable | https://cmr.earthdata.nasa.gov/stac | Size-fractioned zooplankton biomass data sampled during the Institute of Marine Research Norwegian Sea survey from 1995 to 2005 (NCEI Accession 0049894) |
| 15 | biomass_allocation_703_1 | https://cmr.earthdata.nasa.gov/stac | Biomass Allocation and Growth Data of Seeded Plants |
| 16 | gov.noaa.nodc:0049499_Not Applicable | https://cmr.earthdata.nasa.gov/stac | Zooplankton biomass measurements collected using bottle from various platforms in the North Pacific Ocean from 1954 to 2001 (NCEI Accession 0049499) |
| 17 | root_biomass_658_1 | https://cmr.earthdata.nasa.gov/stac | Global Distribution of Fine Root Biomass in Terrestrial Ecosystems |
| 18 | NPP_Grassland_31_654_2 | https://cmr.earthdata.nasa.gov/stac | NPP Grassland: NPP Estimates from Biomass Dynamics for 31 Sites, 1948-1994, R1 |
| 19 | FluxSatMGPP_L3_Daily_p05deg_2.2 | https://cmr.earthdata.nasa.gov/stac | Daily FluxSat GPP of biomass over Land, Based on MODIS Terra and Aqua adjusted reflectance Collection 6.1, on a Global 0.05 by 0.05 Degree Grid, Level 3 Version 2.2 |
| 20 | FluxSatMGPP_L3_Daily_p5deg_2.2 | https://cmr.earthdata.nasa.gov/stac | Daily FluxSat GPP of biomass over Land, Based on MODIS Terra and Aqua adjusted reflectance Collection 6.1, on a Global 0.5 by 0.625 Degree Grid, Level 3 Version 2.2 |
| 21 | TRPSCRECOBM2D_1 | https://cmr.earthdata.nasa.gov/stac | TROPESS Chemical Reanalysis Surface Biomass Burning CO emissions Monthly 2-dimensional Product V1 (TRPSCRECOBM2D) at GES DISC |
temporal filter
You can use the datetime parameter to filter down to collections with temporal extents that overlap a provided range. For example, to find collections with a temporal extent that includes the term ‘spectral’ and has data as recent as September 15, 2024, you can run the following search:
[9]:
recent_date = datetime(year=2024, month=9, day=15, tzinfo=timezone.utc)
search_request = httpx.get(
f"{API_URL}/collections",
params={
"datetime": f"{recent_date.isoformat().replace('+00:00', 'Z')}/..",
"q": "spectral",
},
timeout=20,
)
search_request.raise_for_status()
search_results = search_request.json()
results_df = (
pd.DataFrame(search_results["collections"])
.assign(
catalog_url=lambda df: df["links"].apply(
lambda links_list: next(
(link["href"] for link in links_list if link["rel"] == "root"),
None
)
)
)
)
display(HTML(results_df[["id", "catalog_url", "title"]].to_html()))
| id | catalog_url | title | |
|---|---|---|---|
| 0 | EOP:ESA:Sentinel-2 | https://catalog.maap.eo.esa.int/catalogue/ | Sentinel-2 |
| 1 | ResourceSat-2.archive.and.tasking | https://catalog.maap.eo.esa.int/catalogue/ | ResourceSat-2 full archive and tasking |
| 2 | EarthCAREL0L1Products | https://catalog.maap.eo.esa.int/catalogue/ | EarthCARE L0 and L1 Products for the Commissioning Team |
| 3 | Pleiades.HiRI.archive.and.new | https://catalog.maap.eo.esa.int/catalogue/ | Pleiades full archive and tasking |
| 4 | WorldView-3.full.archive.and.tasking | https://catalog.maap.eo.esa.int/catalogue/ | WorldView-3 full archive and tasking |
| 5 | WorldView-2.full.archive.and.tasking | https://catalog.maap.eo.esa.int/catalogue/ | WorldView-2 full archive and tasking |
| 6 | Vision-1.full.archive.and.tasking | https://catalog.maap.eo.esa.int/catalogue/ | Vision-1 full archive and tasking |
| 7 | EarthCAREL1InstChecked_MAAP | https://catalog.maap.eo.esa.int/catalogue/ | EarthCARE L1 Products for Cal/Val Users |
| 8 | EarthCAREL0L1Products_MAAP | https://catalog.maap.eo.esa.int/catalogue/ | EarthCARE L0 and L1 Products for the Commissioning Team |
| 9 | EarthCAREL1Validated_MAAP | https://catalog.maap.eo.esa.int/catalogue/ | EarthCARE L1 Products |
| 10 | GLHYVI_001 | https://cmr.earthdata.nasa.gov/stac | G-LiHT Hyperspectral Vegetative Indices V001 |
| 11 | GLRADS_001 | https://cmr.earthdata.nasa.gov/stac | G-LiHT Hyperspectral Radiance V001 |
| 12 | GLREFL_001 | https://cmr.earthdata.nasa.gov/stac | G-LiHT Hyperspectral Reflectance V001 |
| 13 | TSIS_SSI_L3_12HR_13 | https://cmr.earthdata.nasa.gov/stac | TSIS SIM Level 3 Solar Spectral Irradiance 12-Hour Means V13 (TSIS_SSI_L3_12HR) at GES DISC |
| 14 | TSIS_SSI_L3_24HR_13 | https://cmr.earthdata.nasa.gov/stac | TSIS SIM Level 3 Solar Spectral Irradiance 24-Hour Means V13 (TSIS_SSI_L3_24HR) at GES DISC |
| 15 | f920473c-15a2-490c-8b24-b48f9b8a0226_NA | https://cmr.earthdata.nasa.gov/stac | Firebird MSC - Level 0 Multispectral Images |
| 16 | HLSS30_2.0 | https://cmr.earthdata.nasa.gov/stac | HLS Sentinel-2 Multi-spectral Instrument Surface Reflectance Daily Global 30m v2.0 |
| 17 | HLSS30_VI_2.0 | https://cmr.earthdata.nasa.gov/stac | HLS Sentinel-2 Multi-spectral Instrument Vegetation Indices Daily Global 30 m V2.0 |
| 18 | SOR3SIMD_027 | https://cmr.earthdata.nasa.gov/stac | SORCE SIM Level 3 Solar Spectral Irradiance Daily Means V027 (SOR3SIMD) at GES DISC |
| 19 | FORMOSAT-2 | https://cmr.earthdata.nasa.gov/stac | FORMOSAT-2 Panchromatic and Multispectral imagery |
Note: For open datetime ranges, use .. to represent either the beginning or ending timestamp.
Specify APIs with urls
You can specify a specific set of STAC APIs to search through with the apis parameter. This will override the default STAC API URLs.
[10]:
stac_api_urls = [
"https://stac.eoapi.dev",
]
search_request = httpx.get(
f"{API_URL}/collections",
params={
"apis": ",".join(stac_api_urls),
"q": "fire"
},
timeout=30,
)
search_request.raise_for_status()
search_results = search_request.json()
results_df = (
pd.DataFrame(search_results["collections"])
.assign(
catalog_url=lambda df: df["links"].apply(
lambda links_list: next(
(link["href"] for link in links_list if link["rel"] == "root"),
None
)
)
)
)
display(HTML(results_df[["id", "catalog_url", "title"]].to_html()))
| id | catalog_url | title | |
|---|---|---|---|
| 0 | MAXAR_Marshall_Fire_21_Update | https://stac.eoapi.dev/ | Marshall Fire |
| 1 | MAXAR_Maui_Hawaii_fires_Aug_23 | https://stac.eoapi.dev/ | Maui Fires |
| 2 | MAXAR_McDougallCreekWildfire_BC_Canada_Aug_23 | https://stac.eoapi.dev/ | McDougall Creek Wildfire |
| 3 | MAXAR_NWT_Canada_Aug_23 | https://stac.eoapi.dev/ | Northwest Territories Fires |
Note: The collection discovery API will only provide search functionality that is provided by ALL of the upstream APIS. If one of the APIs that you want tos earch does not provide the free-text extension, then the q parameter will not do anything!