Hint

You can run this notebook in a live session with Binder.

Providers and products#

This section introduces the main features related to providers and product types available in eodag.
You will learn how to:

Only providers that do not need authentication for search will be listed here. This notebook is executed in CI/CD without providers credentials, and EODAG hides providers needing authentication for search that do not have credentials set.

[1]:
from eodag import EODataAccessGateway, setup_logging
setup_logging(2)

dag = EODataAccessGateway()
2025-10-13 09:35:02,396 eodag.config                     [INFO    ] Loading user configuration from: /home/docs/.config/eodag/eodag.yml
2025-10-13 09:35:02,417 eodag.core                       [INFO    ] usgs: provider needing auth for search has been pruned because no credentials could be found
2025-10-13 09:35:02,418 eodag.core                       [INFO    ] aws_eos: provider needing auth for search has been pruned because no credentials could be found
2025-10-13 09:35:02,418 eodag.core                       [INFO    ] cop_ads: provider needing auth for search has been pruned because no credentials could be found
2025-10-13 09:35:02,418 eodag.core                       [INFO    ] cop_cds: provider needing auth for search has been pruned because no credentials could be found
2025-10-13 09:35:02,418 eodag.core                       [INFO    ] meteoblue: provider needing auth for search has been pruned because no credentials could be found
2025-10-13 09:35:02,419 eodag.core                       [INFO    ] hydroweb_next: provider needing auth for search has been pruned because no credentials could be found
2025-10-13 09:35:02,419 eodag.core                       [INFO    ] wekeo_main: provider needing auth for search has been pruned because no credentials could be found
2025-10-13 09:35:02,421 eodag.core                       [INFO    ] wekeo_ecmwf: provider needing auth for search has been pruned because no credentials could be found
2025-10-13 09:35:02,421 eodag.core                       [INFO    ] wekeo_cmems: provider needing auth for search has been pruned because no credentials could be found
2025-10-13 09:35:02,421 eodag.core                       [INFO    ] creodias_s3: provider needing auth for search has been pruned because no credentials could be found
2025-10-13 09:35:02,421 eodag.core                       [INFO    ] dedt_lumi: provider needing auth for search has been pruned because no credentials could be found
2025-10-13 09:35:02,422 eodag.core                       [INFO    ] dedl: provider needing auth for search has been pruned because no credentials could be found
2025-10-13 09:35:02,424 eodag.core                       [INFO    ] geodes_s3: provider needing auth for search has been pruned because no credentials could be found
2025-10-13 09:35:02,425 eodag.core                       [INFO    ] cop_ewds: provider needing auth for search has been pruned because no credentials could be found
2025-10-13 09:35:02,428 eodag.core                       [INFO    ] Locations configuration loaded from /home/docs/.config/eodag/locations.yml

Providers available#

The method available_providers() returns a list of the pre-configured providers.

[2]:
available_providers = dag.available_providers()
available_providers
[2]:
['peps',
 'cop_dataspace',
 'cop_marine',
 'creodias',
 'earth_search',
 'earth_search_gcs',
 'ecmwf',
 'eumetsat_ds',
 'fedeo_ceda',
 'geodes',
 'planetary_computer',
 'sara',
 'usgs_satapi_aws']
[3]:
print(f"eodag has {len(available_providers)} providers already configured.")
eodag has 13 providers already configured.

It can take a product type as an argument and will return the providers known to eodag that offer this product.

[4]:
dag.available_providers("S2_MSI_L1C")
[4]:
['peps',
 'cop_dataspace',
 'creodias',
 'earth_search',
 'earth_search_gcs',
 'geodes',
 'sara']

Note

If a provider is configured to need authentication for search, and has no credentials set, it will be pruned on EODAG initialization, and will not appear in available providers list.

Product types available#

The method list_product_types() returns a dictionary that represents eodag’s internal product type catalog if used with fetch_providers=False. It will fetch providers for new product types and return an extended list if used with fetch_providers=True (default behavior).

[5]:
internal_catalog = dag.list_product_types(fetch_providers=False)
print(f"EODAG has {len(internal_catalog)} product types stored in its internal catalog.")
EODAG has 196 product types stored in its internal catalog.
[6]:
extended_catalog = dag.list_product_types()
print(f"EODAG has {len(extended_catalog)} product types stored in its extended catalog, after having fetched providers.")
2025-10-13 09:35:02,450 eodag.config                     [INFO    ] Fetching external product types from https://cs-si.github.io/eodag/eodag/resources/ext_product_types.json
EODAG has 1126 product types stored in its extended catalog, after having fetched providers.

When providers are fetched for new product types, eodag’s product types configuration is updated in EODataAccessGateway instance. Extended product types list is then returned independantly of fetch_providers option in list_product_types():

[7]:
called_again_catalog = dag.list_product_types(fetch_providers=False)
print(f"list_product_types() keeps returning {len(called_again_catalog)} product types.")
list_product_types() keeps returning 1126 product types.
[8]:
internal_catalog[0]
[8]:
{'ID': 'COP_DEM_GLO30_DGED',
 'abstract': 'Defence Gridded Elevation Data (DGED, 32 Bit floating point) formatted Copernicus DEM GLO-30 data.\nThe Copernicus Digital Elevation Model is a Digital Surface Model (DSM) that represents the surface of the Earth\nincluding buildings, infrastructure and vegetation. The Copernicus DEM is provided in 3 different instances: EEA-10,\nGLO-30 and GLO-90. GLO-30 provides worldwide coverage at 30 meters.Data were acquired through the TanDEM-X mission\nbetween 2011 and 2015. The datasets were made available for use in 2019 and will be maintained until 2026.\n',
 'instrument': None,
 'platform': 'TerraSAR',
 'platformSerialIdentifier': None,
 'processingLevel': None,
 'keywords': 'TerraSAR,TanDEM-X,DEM,surface,GLO-30,DSM,GDGED',
 'sensorType': 'ALTIMETRIC',
 'license': 'other',
 'title': 'Copernicus DEM GLO-30 DGED',
 'missionStartDate': '2010-06-21T00:00:00Z',
 '_id': 'COP_DEM_GLO30_DGED'}
[9]:
products_id = [p["ID"] for p in internal_catalog]
products_id
[9]:
['COP_DEM_GLO30_DGED',
 'COP_DEM_GLO30_DTED',
 'COP_DEM_GLO90_DGED',
 'COP_DEM_GLO90_DTED',
 'HIRS_FDR_1_MULTI',
 'L8_OLI_TIRS_C1L1',
 'LANDSAT_C2L1',
 'LANDSAT_C2L2',
 'LANDSAT_C2L2ALB_BT',
 'LANDSAT_C2L2ALB_SR',
 'LANDSAT_C2L2ALB_ST',
 'LANDSAT_C2L2ALB_TA',
 'LANDSAT_C2L2_SR',
 'LANDSAT_C2L2_ST',
 'METOP_AMSU_L1',
 'METOP_ASCSZF1B',
 'METOP_ASCSZFR02',
 'METOP_ASCSZO1B',
 'METOP_ASCSZOR02',
 'METOP_ASCSZR1B',
 'METOP_ASCSZRR02',
 'METOP_AVHRRGACR02',
 'METOP_AVHRRL1',
 'METOP_GLB_SST_NC',
 'METOP_GOMEL1',
 'METOP_GOMEL1R03',
 'METOP_HIRSL1',
 'METOP_IASIL1C_ALL',
 'METOP_IASSND02',
 'METOP_IASTHR011',
 'METOP_LSA_002',
 'METOP_MHSL1',
 'METOP_OSI_104',
 'METOP_OSI_150A',
 'METOP_OSI_150B',
 'METOP_SOMO12',
 'METOP_SOMO25',
 'MFG_GSA_57',
 'MFG_GSA_63',
 'MODIS_MCD43A4',
 'MO_GLOBAL_ANALYSISFORECAST_BGC_001_028',
 'MO_GLOBAL_ANALYSISFORECAST_PHY_001_024',
 'MO_GLOBAL_ANALYSISFORECAST_WAV_001_027',
 'MO_GLOBAL_MULTIYEAR_BGC_001_033',
 'MO_GLOBAL_MULTIYEAR_PHY_ENS_001_031',
 'MO_GLOBAL_MULTIYEAR_WAV_001_032',
 'MO_INSITU_GLO_PHY_TS_OA_MY_013_052',
 'MO_INSITU_GLO_PHY_TS_OA_NRT_013_002',
 'MO_INSITU_GLO_PHY_UV_DISCRETE_NRT_013_048',
 'MO_MULTIOBS_GLO_BGC_NUTRIENTS_CARBON_PROFILES_MYNRT_015_009',
 'MO_MULTIOBS_GLO_BIO_BGC_3D_REP_015_010',
 'MO_MULTIOBS_GLO_BIO_CARBON_SURFACE_MYNRT_015_008',
 'MO_MULTIOBS_GLO_PHY_MYNRT_015_003',
 'MO_MULTIOBS_GLO_PHY_S_SURFACE_MYNRT_015_013',
 'MO_MULTIOBS_GLO_PHY_TSUV_3D_MYNRT_015_012',
 'MO_MULTIOBS_GLO_PHY_W_3D_REP_015_007',
 'MO_OCEANCOLOUR_GLO_BGC_L3_MY_009_103',
 'MO_OCEANCOLOUR_GLO_BGC_L3_MY_009_107',
 'MO_OCEANCOLOUR_GLO_BGC_L3_NRT_009_101',
 'MO_OCEANCOLOUR_GLO_BGC_L4_MY_009_104',
 'MO_OCEANCOLOUR_GLO_BGC_L4_MY_009_108',
 'MO_OCEANCOLOUR_GLO_BGC_L4_NRT_009_102',
 'MO_SEAICE_GLO_SEAICE_L4_NRT_OBSERVATIONS_011_001',
 'MO_SEAICE_GLO_SEAICE_L4_NRT_OBSERVATIONS_011_006',
 'MO_SEAICE_GLO_SEAICE_L4_REP_OBSERVATIONS_011_009',
 'MO_SEALEVEL_GLO_PHY_L4_NRT_008_046',
 'MO_SEALEVEL_GLO_PHY_MDT_008_063',
 'MO_SST_GLO_SST_L3S_NRT_OBSERVATIONS_010_010',
 'MO_SST_GLO_SST_L4_NRT_OBSERVATIONS_010_001',
 'MO_SST_GLO_SST_L4_REP_OBSERVATIONS_010_011',
 'MO_SST_GLO_SST_L4_REP_OBSERVATIONS_010_024',
 'MO_WAVE_GLO_PHY_SPC_FWK_L3_NRT_014_002',
 'MO_WAVE_GLO_PHY_SWH_L3_NRT_014_001',
 'MO_WAVE_GLO_PHY_SWH_L4_NRT_014_003',
 'MO_WIND_GLO_PHY_CLIMATE_L4_MY_012_003',
 'MO_WIND_GLO_PHY_L3_MY_012_005',
 'MO_WIND_GLO_PHY_L3_NRT_012_002',
 'MO_WIND_GLO_PHY_L4_MY_012_006',
 'MO_WIND_GLO_PHY_L4_NRT_012_004',
 'MSG_AMVR02',
 'MSG_CLM',
 'MSG_CLM_IODC',
 'MSG_CTH',
 'MSG_CTH_IODC',
 'MSG_GSAL2R02',
 'MSG_HRSEVIRI',
 'MSG_HRSEVIRI_IODC',
 'MSG_LSA_FRM',
 'MSG_LSA_LSTDE',
 'MSG_LSA_LST_CDR',
 'MSG_MFG_GSA_0',
 'MSG_MSG15_RSS',
 'MSG_OCA_CDR',
 'MSG_RSS_CLM',
 'MTG_FCI_AMV_BUFR',
 'MTG_FCI_AMV_NETCDF',
 'MTG_FCI_ASR_BUFR',
 'MTG_FCI_ASR_NETCDF',
 'MTG_FCI_CLM',
 'MTG_FCI_FDHSI',
 'MTG_FCI_GII',
 'MTG_FCI_HRFI',
 'MTG_FCI_OCA',
 'MTG_FCI_OLR',
 'MTG_LI_AF',
 'MTG_LI_AFA',
 'MTG_LI_AFR',
 'MTG_LI_LEF',
 'MTG_LI_LFL',
 'MTG_LI_LGR',
 'NAIP',
 'S1_AUX_GNSSRD',
 'S1_AUX_MOEORB',
 'S1_AUX_POEORB',
 'S1_AUX_PREORB',
 'S1_AUX_PROQUA',
 'S1_AUX_RESORB',
 'S1_SAR_GRD',
 'S1_SAR_GRD_COG',
 'S1_SAR_L3_DH_MCM',
 'S1_SAR_L3_IW_MCM',
 'S1_SAR_OCN',
 'S1_SAR_RAW',
 'S1_SAR_SLC',
 'S2_MSI_L1C',
 'S2_MSI_L2A',
 'S2_MSI_L2A_COG',
 'S2_MSI_L2A_MAJA',
 'S2_MSI_L2B_MAJA_SNOW',
 'S2_MSI_L2B_MAJA_WATER',
 'S3_EFR',
 'S3_EFR_BC002',
 'S3_ERR',
 'S3_ERR_BC002',
 'S3_LAN',
 'S3_LAN_HY',
 'S3_LAN_LI',
 'S3_LAN_SI',
 'S3_OLCI_L2LFR',
 'S3_OLCI_L2LRR',
 'S3_OLCI_L2WFR',
 'S3_OLCI_L2WFR_BC003',
 'S3_OLCI_L2WRR',
 'S3_OLCI_L2WRR_BC003',
 'S3_RAC',
 'S3_SLSTR_L1RBT',
 'S3_SLSTR_L1RBT_BC003',
 'S3_SLSTR_L1RBT_BC004',
 'S3_SLSTR_L2AOD',
 'S3_SLSTR_L2FRP',
 'S3_SLSTR_L2LST',
 'S3_SLSTR_L2WST',
 'S3_SLSTR_L2WST_BC003',
 'S3_SRA',
 'S3_SRA_1A_BC004',
 'S3_SRA_1A_BC005',
 'S3_SRA_1B_BC004',
 'S3_SRA_1B_BC005',
 'S3_SRA_A',
 'S3_SRA_BS',
 'S3_SRA_BS_BC004',
 'S3_SRA_BS_BC005',
 'S3_SY_AOD',
 'S3_SY_SYN',
 'S3_SY_V10',
 'S3_SY_VG1',
 'S3_SY_VGP',
 'S3_WAT',
 'S3_WAT_BC004',
 'S3_WAT_BC005',
 'S5P_L1B_IR_SIR',
 'S5P_L1B_IR_UVN',
 'S5P_L1B_RA_BD1',
 'S5P_L1B_RA_BD2',
 'S5P_L1B_RA_BD3',
 'S5P_L1B_RA_BD4',
 'S5P_L1B_RA_BD5',
 'S5P_L1B_RA_BD6',
 'S5P_L1B_RA_BD7',
 'S5P_L1B_RA_BD8',
 'S5P_L2_AER_AI',
 'S5P_L2_AER_LH',
 'S5P_L2_CH4',
 'S5P_L2_CLOUD',
 'S5P_L2_CO',
 'S5P_L2_HCHO',
 'S5P_L2_NO2',
 'S5P_L2_NP_BD3',
 'S5P_L2_NP_BD6',
 'S5P_L2_NP_BD7',
 'S5P_L2_O3',
 'S5P_L2_O3_PR',
 'S5P_L2_O3_TCL',
 'S5P_L2_SO2',
 'S6_RADIO_OCCULTATION',
 'TIGGE_CF_SFC']

The method can take a provider name as an argument and will return the product types known to eodag that are offered by this provider.

[10]:
peps_products = dag.list_product_types("peps")
[p["ID"] for p in peps_products]
[10]:
['S1_SAR_GRD', 'S1_SAR_OCN', 'S1_SAR_SLC', 'S2_MSI_L1C']

Combine these two methods#

These two methods can be combined to find which product type is the most common in eodag’s catalog among all the providers.

[11]:
availability_per_product = []
for product in products_id:
    providers = dag.available_providers(product)
    availability_per_product.append((product, len(providers)))
availability_per_product = sorted(availability_per_product, key=lambda x: x[1], reverse=True)
most_common_p_type, nb_providers = availability_per_product[0]
print(f"The most common product type is '{most_common_p_type}' with {nb_providers} providers offering it.")
The most common product type is 'S1_SAR_GRD' with 7 providers offering it.

These can be also used to find out which provider (as configured by eodag) offers the hights number of different product types.

[12]:
availability_per_provider = []
for provider in dag.available_providers():
    provider_products_id = [
        p["ID"]
        for p in dag.list_product_types(provider, fetch_providers=False)
    ]
    availability_per_provider.append(
        (provider, len(provider_products_id))
    )
availability_per_provider = sorted(availability_per_provider, key=lambda x: x[1], reverse=True)
provider, nb_p_types = availability_per_provider[0]
print(f"The provider with the largest number of product types is '{provider}' with {nb_p_types}.")
The provider with the largest number of product types is 'cop_marine' with 342.

Product types discovery#

EODAG comes with a large list of pre-configured product types. Some others are available from providers catalogs but will not be configured, or are not yet configured in EODAG.

Some providers, like STAC providers, come in EODAG with a configuration describing how to discover these not-already-configured product types.

With the method discover_product_types() or CLI command eodag discover we can obtain a JSON configuration file that will be used as EODAG external product types configuration file.

In EODAG, the discovered EODAG external product types configuration file can be set to:

  • a file automatically built from github actions and stored in eodag/resources/ext_product_types.json (default settings)

  • a custom remote or local file by setting its path in EODAG_EXT_PRODUCT_TYPES_CFG_FILE environment variable (if the file is not readable, only user-modified providers will be fetched).

Then, when listing product types using list_product_types(fetch_providers=True), EODAG will first read the content of the EODAG external product types configuration file using fetch_product_types_list() then update EODataAccessGateway instance product types configuration, if needed.

The obtained product types list will contain both pre-configured and discovered product types.

Fetch product types schema