Repository: CS-SI/eodag

Issue:
Typo in queryable error message
When doing a request similar to http://127.0.0.1:5000/collections/DT_CLIMATE_ADAPTATION/queryables?provider=dedt_lumi&foo=bar we get this error message:

```json
{"description":"foo in not a queryable parameter"}
```

it should be:
```json
{"description":"foo is not a queryable parameter"}
```
This message is formatted in `eodag/plugins/search/build_search_result.py`

Hints from issue comments:
@sbrunato: fixed with #1462 

Solution patch:
diff --git a/eodag/api/product/metadata_mapping.py b/eodag/api/product/metadata_mapping.py
index 4ebcacd7f..4f04ce2cd 100644
--- a/eodag/api/product/metadata_mapping.py
+++ b/eodag/api/product/metadata_mapping.py
@@ -849,7 +849,7 @@ def convert_get_hydrological_year(date: str):
             date_object = datetime.strptime(utc_date, "%Y-%m-%dT%H:%M:%S.%fZ")
             date_object_second_year = date_object + relativedelta(years=1)
             return [
-                f'{date_object.strftime("%Y")}_{date_object_second_year.strftime("%y")}'
+                f"{date_object.strftime('%Y')}_{date_object_second_year.strftime('%y')}"
             ]
 
         @staticmethod
@@ -1546,23 +1546,6 @@ def get_provider_queryable_key(
         return eodag_key
 
 
-def eodag_key_from_provider_key(
-    provider_key: str,
-    metadata_mapping: Dict[str, Union[List[Any], str]],
-) -> str:
-    """Get eodag key  for provider key based on the metadata mapping if the provider key
-    appears in the metadata mapping, otherwise the provider key is returned
-
-    :param provider_key: name of the variable received from the provider
-    :param metadata_mapping: metadata mapping of the provider
-    :returns: eodag key
-    """
-    for mm, mv in metadata_mapping.items():
-        if isinstance(mv, list) and len(mv) > 1 and provider_key == mv[0]:
-            return mm
-    return provider_key
-
-
 # Keys taken from OpenSearch extension for Earth Observation http://docs.opengeospatial.org/is/13-026r9/13-026r9.html
 # For a metadata to be queryable, The way to query it must be specified in the
 # provider metadata_mapping configuration parameter. It will be automatically
diff --git a/eodag/plugins/crunch/filter_property.py b/eodag/plugins/crunch/filter_property.py
index e699828ea..ff83812c3 100644
--- a/eodag/plugins/crunch/filter_property.py
+++ b/eodag/plugins/crunch/filter_property.py
@@ -78,10 +78,9 @@ def proceed(
         for product in products:
             if property_key not in product.properties.keys():
                 logger.warning(
-                    "%s not found in product.properties, filtering disabled.",
-                    property_key,
+                    f"{property_key} not found in {product}.properties, product skipped",
                 )
-                return products
+                continue
             if operator_method(product.properties[property_key], property_value):
                 add_to_filtered(product)
 
diff --git a/eodag/plugins/search/build_search_result.py b/eodag/plugins/search/build_search_result.py
index 5fabcf1db..0c059cb52 100644
--- a/eodag/plugins/search/build_search_result.py
+++ b/eodag/plugins/search/build_search_result.py
@@ -52,7 +52,6 @@
 from eodag.api.product.metadata_mapping import (
     NOT_AVAILABLE,
     NOT_MAPPED,
-    eodag_key_from_provider_key,
     format_metadata,
     format_query_params,
     mtd_cfg_as_conversion_and_querypath,
@@ -317,6 +316,11 @@ def _update_properties_from_element(
         prop["description"] = description
 
 
+def ecmwf_format(v: str) -> str:
+    """Add ECMWF prefix to value v if v is a ECMWF keyword."""
+    return "ecmwf:" + v if v in ECMWF_KEYWORDS + COP_DS_KEYWORDS else v
+
+
 class ECMWFSearch(PostJsonSearch):
     """ECMWF search plugin.
 
@@ -879,15 +883,11 @@ def queryables_by_form(
             if default and prop["type"] == "string" and isinstance(default, list):
                 default = ",".join(default)
 
-            # rename keywords from form with metadata mapping.
-            # needed to map constraints like "xxxx" to eodag parameter "cop_cds:xxxx"
-            key = eodag_key_from_provider_key(name, self.config.metadata_mapping)
-
             is_required = bool(element.get("required"))
             if is_required:
                 required_list.append(name)
 
-            queryables[key] = Annotated[
+            queryables[ecmwf_format(name)] = Annotated[
                 get_args(
                     json_field_definition_to_python(
                         prop,
@@ -916,16 +916,13 @@ def queryables_by_values(
         """
         # Rename keywords from form with metadata mapping.
         # Needed to map constraints like "xxxx" to eodag parameter "ecmwf:xxxx"
-        required = [
-            eodag_key_from_provider_key(k, self.config.metadata_mapping)
-            for k in required_keywords
-        ]
+        required = [ecmwf_format(k) for k in required_keywords]
 
         queryables: Dict[str, Annotated[Any, FieldInfo]] = {}
         for name, values in available_values.items():
             # Rename keywords from form with metadata mapping.
             # Needed to map constraints like "xxxx" to eodag parameter "ecmwf:xxxx"
-            key = eodag_key_from_provider_key(name, self.config.metadata_mapping)
+            key = ecmwf_format(name)
 
             default = defaults.get(key)
 
@@ -1231,12 +1228,22 @@ def normalize_results(
         :param kwargs: Search arguments
         :returns: list of single :class:`~eodag.api.product._product.EOProduct`
         """
+
+        # formating of orderLink requires access to the productType value.
+        results.data = [
+            {**result, **results.product_type_def_params} for result in results
+        ]
+
         normalized = QueryStringSearch.normalize_results(self, results, **kwargs)
 
-        if len(normalized) > 0:
-            normalized[0].properties["_dc_qs"] = quote_plus(
-                orjson.dumps(results.query_params)
-            )
+        if not normalized:
+            return normalized
+
+        query_params_encoded = quote_plus(orjson.dumps(results.query_params))
+        for product in normalized:
+            properties = {**product.properties, **results.query_params}
+            properties["_dc_qs"] = query_params_encoded
+            product.properties = {ecmwf_format(k): v for k, v in properties.items()}
 
         return normalized
 
@@ -1258,6 +1265,15 @@ def build_query_string(
         :param kwargs: keyword arguments to be used in the query string
         :return: formatted query params and encode query string
         """
+        # Reorder kwargs to make sure year/month/day/time if set overwrite default datetime.
+        # strip_quotes to remove duplicated quotes like "'1_1'" produced by convertors like to_geojson.
+        priority_keys = [
+            "startTimeFromAscendingNode",
+            "completionTimeFromAscendingNode",
+        ]
+        ordered_kwargs = {k: kwargs[k] for k in priority_keys if k in kwargs}
+        ordered_kwargs.update({k: strip_quotes(v) for k, v in kwargs.items()})
+
         return QueryStringSearch.build_query_string(
-            self, product_type=product_type, **kwargs
+            self, product_type=product_type, **ordered_kwargs
         )
diff --git a/eodag/resources/product_types.yml b/eodag/resources/product_types.yml
index a05cd6888..95ffa4a2c 100644
--- a/eodag/resources/product_types.yml
+++ b/eodag/resources/product_types.yml
@@ -4097,8 +4097,8 @@ GLOFAS_REFORECAST:
   sensorType: ATMOSPHERIC
   license: proprietary
   title: Reforecasts of river discharge and related data by the Global Flood Awareness System
-  missionStartDate: "2003-03-27T00:00:00Z"
-  missionEndDate: "2018-12-30T23:59:00Z"
+  missionStartDate: "1999-01-03T00:00:00Z"
+  missionEndDate: "2023-11-25T23:59:59Z"
 
 GLOFAS_SEASONAL:
   abstract: |
@@ -4128,7 +4128,7 @@ GLOFAS_SEASONAL:
   sensorType: ATMOSPHERIC
   license: proprietary
   title: Seasonal forecasts of river discharge and related data by the Global Flood Awareness System
-  missionStartDate: "2021-06-01T00:00:00Z"
+  missionStartDate: "2020-12-01T00:00:00Z"
 
 GLOFAS_SEASONAL_REFORECAST:
   abstract: |
@@ -4233,7 +4233,7 @@ EFAS_HISTORICAL:
   sensorType: ATMOSPHERIC
   license: proprietary
   title: River discharge and related historical data from the European Flood Awareness System
-  missionStartDate: "1992-01-02T00:00:00Z"
+  missionStartDate: "1991-01-01T00:00:00Z"
 
 EFAS_REFORECAST:
   abstract: |
@@ -4269,8 +4269,8 @@ EFAS_REFORECAST:
   sensorType: ATMOSPHERIC
   license: proprietary
   title: Reforecasts of river discharge and related data by the European Flood Awareness System
-  missionStartDate: "2003-03-27T00:00:00Z"
-  missionEndDate: "2018-12-30T00:00:00Z"
+  missionStartDate: "1999-01-03T00:00:00Z"
+  missionEndDate: "2023-11-21T23:59:59Z"
 
 EFAS_SEASONAL:
   abstract: |
diff --git a/eodag/resources/providers.yml b/eodag/resources/providers.yml
index 10724a231..2a3bb617a 100644
--- a/eodag/resources/providers.yml
+++ b/eodag/resources/providers.yml
@@ -2033,7 +2033,7 @@
         "latitude": 0
         "longitude": 0
       "ecmwf:altitude": -999
-      "ecmwf:data_format": csv
+      "ecmwf:format": csv
       metadata_mapping:
         "ecmwf:latitude":
           - '{{"location": {{"latitude": {"ecmwf:latitude"}, "longitude": {"ecmwf:longitude"}}}}}'
@@ -2295,11 +2295,11 @@
       "ecmwf:dataset": satellite-fire-burned-area
       "ecmwf:origin": esa_cci
       "ecmwf:sensor": modis
-      "ecmwf:variable": grid_variables
+      "ecmwf:variable": pixel_variables
       "ecmwf:version": '5_1_1cds'
-      "ecmwf:nominal_day": '01'
+      "ecmwf:region": "europe"
       metadata_mapping:
-        <<: *month_year
+        <<: *day_month_year
     SATELLITE_METHANE:
       "ecmwf:dataset": satellite-methane
       "ecmwf:processing_level": level_2
@@ -3429,9 +3429,6 @@
       satellite:
         - '{{"satellite": {satellite}}}'
         - '$.null'
-      sensor:
-        - '{{"sensor": "{sensor}"}}'
-        - '$.null'
   products:
     S1_SAR_GRD:
       productType: EO:ESA:DAT:SENTINEL-1
@@ -3684,7 +3681,7 @@
       productType: EO:EEA:DAT:CLMS_HRVPP_VI
       metadata_mapping:
         id:
-          - '{{"uid": {id}}}'
+          - '{{"uid": "{id}"}}'
           - '$.id'
         <<: *clms_dates
         relativeOrbitNumber:
@@ -3834,6 +3831,17 @@
   description: WEkEO - ECMWF data
   url: https://www.wekeo.eu/
   # anchors to avoid duplications
+  anchor_time_day_month_year: &time_day_month_year
+    startTimeFromAscendingNode:
+      - |
+        {{
+          "year": {startTimeFromAscendingNode#to_datetime_dict(list)}["year"],
+          "month": {startTimeFromAscendingNode#to_datetime_dict(list)}["month"],
+          "day": {startTimeFromAscendingNode#to_datetime_dict(list)}["day"],
+          "time": {startTimeFromAscendingNode#get_ecmwf_time}
+        }}
+      - $.properties.startdate
+    completionTimeFromAscendingNode: $.properties.enddate
   anchor_day_month_year: &day_month_year
     startTimeFromAscendingNode:
       - |
@@ -3853,10 +3861,6 @@
         }}
       - $.properties.startdate
     completionTimeFromAscendingNode: $.properties.enddate
-  anchor_variable_list: &variable_list
-    variable:
-      - '{{"variable": {variable}}}'
-      - '$.null'
   search: !plugin
     type: WekeoECMWFSearch
     api_endpoint: https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/search
@@ -3875,483 +3879,177 @@
     metadata_mapping:
       productType:
         - '{{"dataset_id": "{productType}"}}'
-        - '$.null'
+        - $.productType
       geometry:
         - '{{"bbox": {geometry#to_bounds}}}'
-        - '$.geometry'
-      defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-      id:
-        - '{{"productIdentifier": "{id}"}}'
-        - '{$.id#remove_extension}'
+        - $.geometry
+      defaultGeometry: POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))
+      id: $.id
       startTimeFromAscendingNode:
         - '{{"startdate": "{startTimeFromAscendingNode#to_iso_utc_datetime}"}}'
-        - '$.properties.startdate'
+        - $.properties.startdate
       completionTimeFromAscendingNode:
         - '{{"enddate": "{completionTimeFromAscendingNode#to_iso_utc_datetime}"}}'
-        - '$.properties.enddate'
-      downloadLink: '$.properties.location'
-      title: '$.id'
-      storageStatus: 'OFFLINE'
-      processingLevel:
-        - '{{"processingLevel": "{processingLevel}"}}'
-        - '$.null'
-      providerProductType:
-        - '{{"productType": "{providerProductType}"}}'
-        - '$.null'
-      variable:
-        - '{{"variable": {variable}}}'
-        - '$.null'
-      leadtime_hour:
-        - '{{"leadtime_hour": {leadtime_hour}}}'
-        - '$.null'
-      leadtime_month:
-        - '{{"leadtime_month": {leadtime_month}}}'
-        - '$.null'
-      origin:
-        - '{{"origin": "{origin}"}}'
-        - '$.null'
-      system:
-        - '{{"system": "{system}"}}'
-        - '$.null'
-      format:
-        - '{{"data_format": "{format}"}}'
-        - '$.null'
-      pressure_level:
-        - '{{"pressure_level": {pressure_level}}}'
-        - '$.null'
-      model_level:
-        - '{{"model_level": {model_level}}}'
-        - '$.null'
-      sensor_and_algorithm:
-        - '{{"sensor_and_algorithm": "{sensor_and_algorithm}"}}'
-        - '$.null'
-      version:
-        - '{{"version": {version}}}'
-        - '$.null'
-      time:
-        - '{{"time": {time}}}'
-        - '$.null'
-      region:
-        - '{{"region": "{region}"}}'
-        - '$.null'
-      type:
-        - '{{"type": "{type}"}}'
-        - '$.null'
-      source:
-        - '{{"source": {source}}}'
-        - '$.null'
-      quantity:
-        - '{{"quantity": "{quantity}"}}'
-        - '$.null'
-      input_observations:
-        - '{{"input_observations": "{input_observations}"}}'
-        - '$.null'
-      aggregation:
-        - '{{"aggregation": "{aggregation}"}}'
-        - '$.null'
-      model:
-        - '{{"model": {model}}}'
-        - '$.null'
-      level:
-        - '{{"level": {level}}}'
-        - '$.null'
-      forcing_type:
-        - '{{"forcing_type": "{forcing_type}"}}'
-        - '$.null'
-      sky_type:
-        - '{{"sky_type": {sky_type}}}'
-        - '$.null'
-      band:
-        - '{{"band": {band}}}'
-        - '$.null'
-      aerosol_type:
-        - '{{"aerosol_type": {aerosol_type}}}'
-        - '$.null'
-      step:
-        - '{{"step": {step}}}'
-        - '$.null'
-      longitude:
-        - '{{"longitude": "{longitude}"}}'
-        - '$.null'
-      latitude:
-        - '{{"latitude": "{latitude}"}}'
-        - '$.null'
-      altitude:
-        - '{{"altitude": "{altitude}"}}'
-        - '$.null'
-      time_reference:
-        - '{{"time_reference": "{time_reference}"}}'
-        - '$.null'
-      grid:
-        - '{{"grid": "{grid}"}}'
-        - '$.null'
-      soil_level:
-        - '{{"soil_level": {soil_level}}}'
-        - '$.null'
-      year:
-        - '{{"year": {year}}}'
-        - '$.null'
-      month:
-        - '{{"month": {month}}}'
-        - '$.null'
-      day:
-        - '{{"day": {day}}}'
-        - '$.null'
-      hyear:
-        - '{{"year": {hyear}}}'
-        - '$.null'
-      hmonth:
-        - '{{"month": {hmonth}}}'
-        - '$.null'
-      hday:
-        - '{{"day": {hday}}}'
-        - '$.null'
-      satellite:
-        - '{{"satellite": {satellite}}}'
-        - '$.null'
-      cdr_type:
-        - '{{"cdr_type": "{cdr_type}"}}'
-        - '$.null'
-      statistic:
-        - '{{"statistic": {statistic}}}'
-        - '$.null'
-      hydrological_year:
-        - '{{"hydrological_year": {hydrological_year}}}'
-        - '$.null'
-      download_format:
-        - '{{"download_format": "{download_format}"}}'
-        - '$.null'
+        - $.properties.enddate
+      downloadLink: $.properties.location
+      title: $.id
+      storageStatus: OFFLINE
+      orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "{productType}"}}'
   products:
     SATELLITE_CARBON_DIOXIDE:
       productType: EO:ECMWF:DAT:SATELLITE_CARBON_DIOXIDE
-      processingLevel:
-        - level_2
-      version:
-        - "4_0"
-      variable: xco2
-      sensor_and_algorithm: sciamachy_wfmd
-      format: zip
+      ecmwf:processing_level: level_2
+      ecmwf:version: '4_5'
+      ecmwf:variable: xco2
+      ecmwf:sensor_and_algorithm: merged_emma
       metadata_mapping:
-        id: '$.id'
         <<: *day_month_year
-        variable:
-          - '{{"variable": "{variable}"}}'
-          - '$.null'
-        processingLevel:
-          - '{{"processing_level": {processingLevel}}}'
-          - '$.null'
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:SATELLITE_CARBON_DIOXIDE"}}'
     SATELLITE_FIRE_BURNED_AREA:
       productType: EO:ECMWF:DAT:SATELLITE_FIRE_BURNED_AREA
-      origin: c3s
-      sensor: modis
-      variable: grid_variables
-      version: 5_1_1cds
-      region:
-        - europe
-      format: zip
+      ecmwf:origin: esa_cci
+      ecmwf:sensor: modis
+      ecmwf:variable: pixel_variables
+      ecmwf:version: 5_1_1cds
+      ecmwf:region: europe
       metadata_mapping:
-        variable:
-          - '{{"variable": "{variable}"}}'
-          - '$.null'
-        version:
-          - '{{"version": "{version}"}}'
-          - '$.null'
         startTimeFromAscendingNode:
           - |
             {{
               "year": {startTimeFromAscendingNode#to_datetime_dict(list)}["year"],
               "month": {startTimeFromAscendingNode#to_datetime_dict(list)}["month"],
-              "day": {startTimeFromAscendingNode#to_datetime_dict(list)}["day"]
+              "nominal_day": {startTimeFromAscendingNode#to_datetime_dict(list)}["day"]
             }}
           - $.properties.startdate
         completionTimeFromAscendingNode: $.properties.enddate
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:SATELLITE_FIRE_BURNED_AREA"}}'
     SATELLITE_METHANE:
       productType: EO:ECMWF:DAT:SATELLITE_METHANE
-      processingLevel:
-        - level_2
-      version:
-        - "4_0"
-      variable: xch4
-      sensor_and_algorithm: sciamachy_wfmd
-      format: zip
+      ecmwf:processing_level: level_2
+      ecmwf:version: '4_0'
+      ecmwf:variable: xch4
+      ecmwf:sensor_and_algorithm: sciamachy_wfmd
       metadata_mapping:
-        id: '$.id'
         <<: *day_month_year
-        processingLevel:
-          - '{{"processing_level": {processingLevel}}}'
-          - '$.null'
-        variable:
-          - '{{"variable": "{variable}"}}'
-          - '$.null'
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:SATELLITE_METHANE"}}'
     SATELLITE_SEA_ICE_EDGE_TYPE:
       productType: EO:ECMWF:DAT:SATELLITE_SEA_ICE_EDGE_TYPE
-      variable:
-        - sea_ice_type
-      region: northern_hemisphere
-      cdr_type: cdr
-      version: '3_0'
-      format: zip
+      ecmwf:variable: sea_ice_type
+      ecmwf:region: northern_hemisphere
+      ecmwf:cdr_type: cdr
+      ecmwf:version: '3_0'
       metadata_mapping:
-        id: '$.id'
         <<: *day_month_year
-        region:
-          - '{{"region": "{region}"}}'
-          - '$.null'
-        version:
-          - '{{"version": "{version}"}}'
-          - '$.null'
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:SATELLITE_SEA_ICE_EDGE_TYPE"}}'
     SATELLITE_SEA_ICE_THICKNESS:
       productType: EO:ECMWF:DAT:SATELLITE_SEA_ICE_THICKNESS
-      satellite:
-        - envisat
-      cdr_type: cdr
-      variable: all
-      version: '3_0'
-      format: zip
+      ecmwf:satellite: envisat
+      ecmwf:cdr_type: cdr
+      ecmwf:variable: all
+      ecmwf:version: '3_0'
       metadata_mapping:
-        id: '$.id'
-        variable:
-          - '{{"variable": "{variable}"}}'
-          - '$.null'
-        version:
-          - '{{"version": "{version}"}}'
-          - '$.null'
         <<: *month_year
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:SATELLITE_SEA_ICE_THICKNESS"}}'
     SATELLITE_SEA_ICE_CONCENTRATION:
       productType: EO:ECMWF:DAT:SATELLITE_SEA_ICE_CONCENTRATION
-      cdr_type:
-        - cdr
-      variable: all
-      version: v3
-      sensor: ssmis
-      origin: ESA CCI
-      region:
+      ecmwf:cdr_type: cdr
+      ecmwf:origin: eumetsat_osi_saf
+      ecmwf:region:
         - northern_hemisphere
-      temporal_aggregation: daily
-      format: zip
+        - southern_hemisphere
+      ecmwf:sensor: ssmis
+      ecmwf:temporal_aggregation: daily
+      ecmwf:variable: all
+      ecmwf:version: v3
       metadata_mapping:
-        id: '$.id'
         <<: *day_month_year
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:SATELLITE_SEA_ICE_CONCENTRATION"}}'
     SATELLITE_SEA_LEVEL_GLOBAL:
       productType: EO:ECMWF:DAT:SATELLITE_SEA_LEVEL_GLOBAL
-      variable:
-        - daily
-      format: zip
-      version: vDT2021
+      ecmwf:variable: daily
+      ecmwf:version: vdt2021
       metadata_mapping:
-        id: '$.id'
         <<: *day_month_year
-        version:
-          - '{{"version": "{version}"}}'
-          - '$.null'
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:SATELLITE_SEA_LEVEL_GLOBAL"}}'
     SEASONAL_ORIGINAL_SL:
       productType: EO:ECMWF:DAT:SEASONAL_ORIGINAL_SINGLE_LEVELS
-      variable:
-        - land_sea_mask
-      leadtime_hour:
-        - "0"
-      origin: ecmwf
-      system: "51"
-      format: grib
+      ecmwf:variable: land_sea_mask
+      ecmwf:leadtime_hour: 0
+      ecmwf:originating_centre: ecmwf
+      ecmwf:system: 5
+      ecmwf:data_format: grib
       metadata_mapping:
-        id: '$.id'
         <<: *day_month_year
-        origin:
-          - '{{"originating_centre": "{origin}"}}'
-          - '$.null'
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:SEASONAL_ORIGINAL_SINGLE_LEVELS"}}'
     SEASONAL_ORIGINAL_PL:
       productType: EO:ECMWF:DAT:SEASONAL_ORIGINAL_PRESSURE_LEVELS
-      variable:
-        - geopotential
-      pressure_level:
-        - "10"
-      leadtime_hour:
-        - "12"
-      origin: ecmwf
-      system: "51"
-      format: grib
+      ecmwf:variable: geopotential
+      ecmwf:pressure_level: 10
+      ecmwf:leadtime_hour: 12
+      ecmwf:originating_centre: ecmwf
+      ecmwf:system: 5
+      ecmwf:data_format: grib
       metadata_mapping:
-        id: '$.id'
         <<: *day_month_year
-        origin:
-          - '{{"originating_centre": "{origin}"}}'
-          - '$.null'
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:SEASONAL_ORIGINAL_PRESSURE_LEVELS"}}'
     SEASONAL_POSTPROCESSED_SL:
       productType: EO:ECMWF:DAT:SEASONAL_POSTPROCESSED_SINGLE_LEVELS
-      providerProductType:
-        - ensemble_mean
-      variable:
-        - 10m_u_component_of_wind_anomaly
-      leadtime_month:
-        - "1"
-      origin: ecmwf
-      system: "51"
-      format: grib
+      ecmwf:product_type: ensemble_mean
+      ecmwf:originating_centre: ecmwf
+      ecmwf:variable: 2m_dewpoint_temperature_anomaly
+      ecmwf:leadtime_month: 1
+      ecmwf:origin: ecmwf
+      ecmwf:system: 5
+      ecmwf:data_format: grib
       metadata_mapping:
-        id: '$.id'
-        providerProductType:
-          - '{{"product_type": {providerProductType}}}'
-          - '$.null'
         <<: *month_year
-        origin:
-          - '{{"originating_centre": "{origin}"}}'
-          - '$.null'
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:SEASONAL_POSTPROCESSED_SINGLE_LEVELS"}}'
     SEASONAL_POSTPROCESSED_PL:
       productType: EO:ECMWF:DAT:SEASONAL_POSTPROCESSED_PRESSURE_LEVELS
-      providerProductType:
-        - ensemble_mean
-      variable:
-        - geopotential_anomaly
-      pressure_level:
-        - "10"
-      leadtime_month:
-        - "1"
-      origin: ecmwf
-      system: "5"
-      format: grib
+      ecmwf:product_type: ensemble_mean
+      ecmwf:variable: geopotential_anomaly
+      ecmwf:pressure_level: 10
+      ecmwf:leadtime_month: 1
+      ecmwf:originating_centre: ecmwf
+      ecmwf:system: 5
+      ecmwf:data_format: grib
       metadata_mapping:
-        id: '$.id'
-        providerProductType:
-          - '{{"product_type": {providerProductType}}}'
-          - '$.null'
         <<: *month_year
-        origin:
-          - '{{"originating_centre": "{origin}"}}'
-          - '$.null'
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:SEASONAL_POSTPROCESSED_PRESSURE_LEVELS"}}'
     SEASONAL_MONTHLY_SL:
       productType: EO:ECMWF:DAT:SEASONAL_MONTHLY_SINGLE_LEVELS
-      variable:
-        - 10m_u_component_of_wind
-      providerProductType:
-        - ensemble_mean
-      leadtime_month:
-        - "1"
-      origin: ecmwf
-      system: "51"
-      format: grib
+      ecmwf:variable: 10m_u_component_of_wind
+      ecmwf:product_type: monthly_mean
+      ecmwf:leadtime_month: 1
+      ecmwf:originating_centre: ecmwf
+      ecmwf:system: 5
+      ecmwf:data_format: grib
       metadata_mapping:
-        id: '$.id'
-        providerProductType:
-          - '{{"product_type": {providerProductType}}}'
-          - '$.null'
         <<: *month_year
-        origin:
-          - '{{"originating_centre": "{origin}"}}'
-          - '$.null'
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:SEASONAL_MONTHLY_SINGLE_LEVELS"}}'
     SEASONAL_MONTHLY_PL:
       productType: EO:ECMWF:DAT:SEASONAL_MONTHLY_PRESSURE_LEVELS
-      variable:
-        - geopotential
-        - temperature
-      providerProductType:
-        - ensemble_mean
-      leadtime_month:
-        - "1"
-      pressure_level:
-        - "10"
-      origin: ecmwf
-      system: "51"
-      format: grib
+      ecmwf:variable: geopotential
+      ecmwf:product_type: monthly_mean
+      ecmwf:leadtime_month: 1
+      ecmwf:pressure_level: 10
+      ecmwf:originating_centre: ecmwf
+      ecmwf:system: 5
+      ecmwf:data_format: grib
       metadata_mapping:
-        id: '$.id'
-        providerProductType:
-          - '{{"product_type": {providerProductType}}}'
-          - '$.null'
         <<: *month_year
-        origin:
-          - '{{"originating_centre": "{origin}"}}'
-          - '$.null'
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:SEASONAL_MONTHLY_PRESSURE_LEVELS"}}'
     GLACIERS_DIST_RANDOLPH:
       productType: EO:ECMWF:DAT:INSITU_GLACIERS_EXTENT
-      variable:
-        - glacier_area
-      providerProductType:
-        - gridded
-      format: zip
-      version: rgi_6_0
+      ecmwf:variable: glacier_area
+      ecmwf:product_type: gridded
+      ecmwf:data_format: zip
+      ecmwf:version: rgi_6_0
       metadata_mapping:
-        id: '$.id'
         <<: *day_month_year
-        providerProductType:
-          - '{{"product_type": {providerProductType}}}'
-          - '$.null'
-        version:
-          - '{{"version": "{version}"}}'
-          - '$.null'
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:INSITU_GLACIERS_EXTENT"}}'
     FIRE_HISTORICAL:
       productType: EO:ECMWF:DAT:CEMS_FIRE_HISTORICAL_V1
-      providerProductType: reanalysis
-      variable:
-        - fire_weather_index
-      version:
-        - "4_1"
-      format: grib
-      grid: original_grid
-      type: consolidated_dataset
+      ecmwf:product_type: reanalysis
+      ecmwf:variable: fire_weather_index
+      ecmwf:system_version: '4_1'
+      ecmwf:data_format: grib
+      ecmwf:grid: original_grid
+      ecmwf:dataset_type: consolidated_dataset
       metadata_mapping:
-        id: '$.id'
         <<: *day_month_year
-        providerProductType:
-          - '{{"product_type": "{providerProductType}"}}'
-          - '$.null'
-        version:
-          - '{{"system_version": {version}}}'
-          - '$.null'
-        format:
-          - '{{"data_format": "{format}"}}'
-          - '$.null'
-        type:
-          - '{{"dataset_type": "{type}"}}'
-          - '$.null'
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:CEMS_FIRE_HISTORICAL_V1"}}'
     GRIDDED_GLACIERS_MASS_CHANGE:
       productType: EO:ECMWF:DAT:DERIVED_GRIDDED_GLACIER_MASS_CHANGE
-      variable: glacier_mass_change
-      format: zip
-      version: "wgms_fog_2022_09"
+      ecmwf:variable: glacier_mass_change
+      ecmwf:data_format: zip
+      ecmwf:product_version: wgms_fog_2022_09
       metadata_mapping:
-        id: '$.id'
-        hydrological_year:
-          - '{{"hydrological_year": {hydrological_year}}}'
-          - '$.null'
         startTimeFromAscendingNode:
           - |
             {{
@@ -4359,228 +4057,107 @@
             }}
           - $.properties.startdate
         completionTimeFromAscendingNode: $.properties.enddate
-        version:
-          - '{{"product_version": "{version}"}}'
-          - '$.null'
-        variable:
-          - '{{"variable": "{variable}"}}'
-          - '$.null'
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:DERIVED_GRIDDED_GLACIER_MASS_CHANGE"}}'
     UERRA_EUROPE_SL:
       productType: EO:ECMWF:DAT:REANALYSIS_UERRA_EUROPE_SINGLE_LEVELS
-      variable: total_cloud_cover
-      origin: uerra_harmonie
-      format: grib # netcdf format may fail
+      ecmwf:variable: total_cloud_cover
+      ecmwf:origin: uerra_harmonie
+      ecmwf:data_format: grib # netcdf format may fail
       metadata_mapping:
-        id: '$.id'
-        <<: *day_month_year
-        variable:
-          - '{{"variable": "{variable}"}}'
-          - '$.null'
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:REANALYSIS_UERRA_EUROPE_SINGLE_LEVELS"}}'
+        <<: *time_day_month_year
     AG_ERA5:
       productType: EO:ECMWF:DAT:SIS_AGROMETEOROLOGICAL_INDICATORS
-      variable: cloud_cover
-      version: '1_1'
-      time:
-        - "06_00"
-      format: zip
-      statistic:
-        - 24_hour_mean
+      ecmwf:variable: cloud_cover
+      ecmwf:version: '1_1'
+      ecmwf:time: '06_00'
+      ecmwf:data_format: zip
+      ecmwf:statistic: 24_hour_mean
       metadata_mapping:
-        id: '$.id'
         <<: *day_month_year
-        version:
-          - '{{"version": "{version}"}}'
-          - '$.null'
-        variable:
-          - '{{"variable": "{variable}"}}'
-          - '$.null'
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:SIS_AGROMETEOROLOGICAL_INDICATORS"}}'
     ERA5_SL:
       productType: EO:ECMWF:DAT:REANALYSIS_ERA5_SINGLE_LEVELS
-      providerProductType:
-        - ensemble_mean
-      variable:
-        - 10m_u_component_of_wind
-      download_format: zip
-      format: grib # netcdf format may fail
+      ecmwf:product_type: ensemble_mean
+      ecmwf:variable: 10m_u_component_of_wind
+      ecmwf:download_format: unarchived
+      ecmwf:data_format: grib # netcdf format may fail
       metadata_mapping:
-        id: '$.id'
-        startTimeFromAscendingNode:
-          - |
-            {{
-              "year": {startTimeFromAscendingNode#to_datetime_dict(string)}["year"],
-              "month": {startTimeFromAscendingNode#to_datetime_dict(list)}["month"],
-              "day": {startTimeFromAscendingNode#to_datetime_dict(list)}["day"],
-              "time": {startTimeFromAscendingNode#get_ecmwf_time}
-            }}
-          - $.properties.startdate
-        completionTimeFromAscendingNode: $.properties.enddate
-        providerProductType:
-          - '{{"product_type": {providerProductType}}}'
-          - '$.null'
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:REANALYSIS_ERA5_SINGLE_LEVELS"}}'
+        <<: *time_day_month_year
     ERA5_PL:
       productType: EO:ECMWF:DAT:REANALYSIS_ERA5_PRESSURE_LEVELS
-      providerProductType:
-        - ensemble_mean
-      variable:
-        - temperature
-      pressure_level:
-        - "1"
-      format: grib
-      download_format: zip
+      ecmwf:product_type: ensemble_mean
+      ecmwf:variable: temperature
+      ecmwf:pressure_level: 1
+      ecmwf:data_format: grib
+      ecmwf:download_format: unarchived
       metadata_mapping:
-        id: '$.id'
-        startTimeFromAscendingNode:
-          - |
-            {{
-              "year": {startTimeFromAscendingNode#to_datetime_dict(string)}["year"],
-              "month": {startTimeFromAscendingNode#to_datetime_dict(list)}["month"],
-              "day": {startTimeFromAscendingNode#to_datetime_dict(list)}["day"],
-              "time": {startTimeFromAscendingNode#get_ecmwf_time}
-            }}
-          - $.properties.startdate
-        completionTimeFromAscendingNode: $.properties.enddate
-        providerProductType:
-          - '{{"product_type": {providerProductType}}}'
-          - '$.null'
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:REANALYSIS_ERA5_PRESSURE_LEVELS"}}'
+        <<: *time_day_month_year
     ERA5_SL_MONTHLY:
       productType: EO:ECMWF:DAT:REANALYSIS_ERA5_SINGLE_LEVELS_MONTHLY_MEANS
-      providerProductType:
-        - monthly_averaged_ensemble_members
-      variable:
-        - 10m_u_component_of_wind
-      format: grib
-      download_format: zip
-      time:
-        - "00:00"
+      ecmwf:product_type: monthly_averaged_ensemble_members
+      ecmwf:variable: 10m_u_component_of_wind
+      ecmwf:data_format: grib
+      ecmwf:download_format: unarchived
       metadata_mapping:
-        id: '$.id'
         startTimeFromAscendingNode:
           - |
             {{
               "year": {startTimeFromAscendingNode#to_datetime_dict(list)}["year"],
-              "month": {startTimeFromAscendingNode#to_datetime_dict(list)}["month"]
+              "month": {startTimeFromAscendingNode#to_datetime_dict(list)}["month"],
+              "time": {startTimeFromAscendingNode#get_ecmwf_time}
             }}
           - $.properties.startdate
         completionTimeFromAscendingNode: $.properties.enddate
-        providerProductType:
-          - '{{"product_type": {providerProductType}}}'
-          - '$.null'
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:REANALYSIS_ERA5_SINGLE_LEVELS_MONTHLY_MEANS"}}'
     ERA5_PL_MONTHLY:
       productType: EO:ECMWF:DAT:REANALYSIS_ERA5_PRESSURE_LEVELS_MONTHLY_MEANS
-      providerProductType:
-        - monthly_averaged_ensemble_members
-      variable:
-        - divergence
-      pressure_level:
-        - "1"
-      format: grib
-      download_format: zip
-      time:
-        - "00:00"
+      ecmwf:product_type: monthly_averaged_ensemble_members
+      ecmwf:variable: divergence
+      ecmwf:pressure_level: 1
+      ecmwf:data_format: grib
+      ecmwf:download_format: unarchived
       metadata_mapping:
-        id: '$.id'
         startTimeFromAscendingNode:
           - |
             {{
               "year": {startTimeFromAscendingNode#to_datetime_dict(list)}["year"],
-              "month": {startTimeFromAscendingNode#to_datetime_dict(list)}["month"]
+              "month": {startTimeFromAscendingNode#to_datetime_dict(list)}["month"],
+              "time": {startTimeFromAscendingNode#get_ecmwf_time}
             }}
           - $.properties.startdate
         completionTimeFromAscendingNode: $.properties.enddate
-        providerProductType:
-          - '{{"product_type": {providerProductType}}}'
-          - '$.null'
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:REANALYSIS_ERA5_PRESSURE_LEVELS_MONTHLY_MEANS"}}'
     ERA5_LAND:
       productType: EO:ECMWF:DAT:REANALYSIS_ERA5_LAND
-      variable:
-        - 2m_dewpoint_temperature
-      format: grib
-      download_format: zip
+      ecmwf:variable: 2m_dewpoint_temperature
+      ecmwf:data_format: grib
+      ecmwf:download_format: unarchived
       metadata_mapping:
-        id: '$.id'
-        month:
-          - '{{"month": "{month}"}}'
-          - '$.null'
-        startTimeFromAscendingNode:
-          - |
-            {{
-              "year": {startTimeFromAscendingNode#to_datetime_dict(string)}["year"],
-              "month": {startTimeFromAscendingNode#to_datetime_dict(string)}["month"],
-              "day": {startTimeFromAscendingNode#to_datetime_dict(list)}["day"],
-              "time": {startTimeFromAscendingNode#get_ecmwf_time}
-            }}
-          - $.properties.startdate
-        completionTimeFromAscendingNode: $.properties.enddate
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:REANALYSIS_ERA5_LAND"}}'
+        <<: *time_day_month_year
     ERA5_LAND_MONTHLY:
       productType: EO:ECMWF:DAT:REANALYSIS_ERA5_LAND_MONTHLY_MEANS
-      providerProductType:
-        - monthly_averaged_reanalysis
-      variable:
-        - 2m_dewpoint_temperature
-      format: grib
-      download_format: zip
-      time:
-        - "00:00"
+      ecmwf:product_type: monthly_averaged_reanalysis
+      ecmwf:variable: 2m_dewpoint_temperature
+      ecmwf:data_format: grib
+      ecmwf:download_format: unarchived
       metadata_mapping:
-        id: '$.id'
         startTimeFromAscendingNode:
           - |
             {{
               "year": {startTimeFromAscendingNode#to_datetime_dict(list)}["year"],
-              "month": {startTimeFromAscendingNode#to_datetime_dict(list)}["month"]
+              "month": {startTimeFromAscendingNode#to_datetime_dict(list)}["month"],
+              "time": {startTimeFromAscendingNode#get_ecmwf_time}
             }}
           - $.properties.startdate
         completionTimeFromAscendingNode: $.properties.enddate
-        providerProductType:
-          - '{{"product_type": {providerProductType}}}'
-          - '$.null'
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:REANALYSIS_ERA5_LAND_MONTHLY_MEANS"}}'
     CAMS_EAC4:
       productType: EO:ECMWF:DAT:CAMS_GLOBAL_REANALYSIS_EAC4
-      format: grib
-      variable:
-        - '2m_dewpoint_temperature'
-      time:
-        - '00:00'
-      metadata_mapping:
-        id: '$.id'
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:CAMS_GLOBAL_REANALYSIS_EAC4"}}'
+      ecmwf:data_format: grib
+      ecmwf:variable: 2m_dewpoint_temperature
+      ecmwf:time: 00:00
     CAMS_GLOBAL_EMISSIONS:
       productType: EO:ECMWF:DAT:CAMS_GLOBAL_EMISSION_INVENTORIES
-      version:
-        - latest
-      format: zip
-      variable:
-        - acids
-      source:
-        - anthropogenic
+      ecmwf:version: latest
+      ecmwf:data_format: zip
+      ecmwf:variable: acids
+      ecmwf:source: anthropogenic
       metadata_mapping:
-        id: '$.id'
         startTimeFromAscendingNode:
           - |
             {{
@@ -4588,218 +4165,101 @@
             }}
           - $.properties.startdate
         completionTimeFromAscendingNode: $.properties.enddate
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:CAMS_GLOBAL_EMISSION_INVENTORIES"}}'
     CAMS_EAC4_MONTHLY:
       productType: EO:ECMWF:DAT:CAMS_GLOBAL_REANALYSIS_EAC4_MONTHLY
-      format: grib
-      variable:
-        - 2m_dewpoint_temperature
-      api_product_type:
-        - monthly_mean
+      ecmwf:data_format: grib
+      ecmwf:variable: 2m_dewpoint_temperature
+      ecmwf:product_type: monthly_mean
       metadata_mapping:
-        id: '$.id'
         <<: *month_year
-        providerProductType:
-          - '{{"product_type": {providerProductType}}}'
-          - '$.null'
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:CAMS_GLOBAL_REANALYSIS_EAC4_MONTHLY"}}'
     CAMS_GREENHOUSE_INVERSION:
       productType: EO:ECMWF:DAT:CAMS_GLOBAL_GREENHOUSE_GAS_INVERSION
-      version: latest
-      variable: carbon_dioxide
-      quantity: mean_column
-      input_observations: surface
-      aggregation: instantaneous
+      ecmwf:version: latest
+      ecmwf:variable: carbon_dioxide
+      ecmwf:quantity: mean_column
+      ecmwf:input_observations: surface
+      ecmwf:time_aggregation: instantaneous
       metadata_mapping:
-        id: '$.id'
         <<: *month_year
-        aggregation:
-          - '{{"time_aggregation": "{aggregation}"}}'
-          - '$.null'
-        variable:
-          - '{{"variable": "{variable}"}}'
-          - '$.null'
-        version:
-          - '{{"version": "{version}"}}'
-          - '$.null'
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:CAMS_GLOBAL_GREENHOUSE_GAS_INVERSION"}}'
     CAMS_EU_AIR_QUALITY_RE:
       productType: EO:ECMWF:DAT:CAMS_EUROPE_AIR_QUALITY_REANALYSES
-      type:
-        - validated_reanalysis
-      format: zip
-      variable:
-       - nitrogen_dioxide
-      model:
-       - ensemble
-      level:
-        - '0'
+      ecmwf:type: validated_reanalysis
+      ecmwf:data_format: zip
+      ecmwf:variable: nitrogen_dioxide
+      ecmwf:model: ensemble
+      ecmwf:level: 0
       metadata_mapping:
-        id: '$.id'
         <<: *month_year
-        type:
-          - '{{"type": {type}}}'
-          - '$.null'
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:CAMS_EUROPE_AIR_QUALITY_REANALYSES"}}'
     CAMS_GRF:
       productType: EO:ECMWF:DAT:CAMS_GLOBAL_RADIATIVE_FORCINGS
-      format: zip
-      variable:
-        - radiative_forcing_of_carbon_dioxide
-      forcing_type: instantaneous
-      band:
-        - long_wave
-      sky_type:
-        - all_sky
-      level:
-        - surface
-      version:
-        - '2'
+      ecmwf:data_format: zip
+      ecmwf:variable: radiative_forcing_of_carbon_dioxide
+      ecmwf:forcing_type: instantaneous
+      ecmwf:band: long_wave
+      ecmwf:sky_type: all_sky
+      ecmwf:level: surface
+      ecmwf:version: 2
       metadata_mapping:
-        id: '$.id'
         <<: *month_year
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:CAMS_GLOBAL_RADIATIVE_FORCINGS"}}'
     CAMS_GRF_AUX:
       productType: EO:ECMWF:DAT:CAMS_GLOBAL_RADIATIVE_FORCING_AUXILLIARY_VARIABLES
-      band:
-        - short_wave
-      sky_type:
-        - clear_sky
-      version:
-        - '1.5'
-      format: zip
-      variable:
-        - aerosol_radiation_effect
-      aerosol_type:
-        - marine
-      level:
-        - surface
+      ecmwf:band: short_wave
+      ecmwf:sky_type: clear_sky
+      ecmwf:version: 1.5
+      ecmwf:data_format: zip
+      ecmwf:variable: aerosol_radiation_effect
+      ecmwf:aerosol_type: marine
+      ecmwf:level: surface
       metadata_mapping:
-        id: '$.id'
         <<: *month_year
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:CAMS_GLOBAL_RADIATIVE_FORCING_AUXILLIARY_VARIABLES"}}'
     CAMS_GREENHOUSE_EGG4:
       productType: EO:ECMWF:DAT:CAMS_GLOBAL_GHG_REANALYSIS_EGG4
-      format: grib
-      variable:
-        - snow_albedo
-      step:
-        - '0'
-      metadata_mapping:
-        id: '$.id'
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:CAMS_GLOBAL_GHG_REANALYSIS_EGG4"}}'
+      ecmwf:data_format: grib
+      ecmwf:variable: snow_albedo
+      ecmwf:step: 0
     CAMS_GREENHOUSE_EGG4_MONTHLY:
       productType: EO:ECMWF:DAT:CAMS_GLOBAL_GHG_REANALYSIS_EGG4_MONTHLY
-      format: grib
-      variable:
-        - snow_albedo
-      providerProductType:
-        - monthly_mean_by_hour_of_day
-      step:
-        - '3'
-      time:
-        - '00:00'
+      ecmwf:data_format: grib
+      ecmwf:variable: snow_albedo
+      ecmwf:product_type: monthly_mean_by_hour_of_day
+      ecmwf:step: 3
+      ecmwf:time: 00:00
       metadata_mapping:
-        id: '$.id'
         <<: *month_year
-        providerProductType:
-          - '{{"product_type": {providerProductType}}}'
-          - '$.null'
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:CAMS_GLOBAL_GHG_REANALYSIS_EGG4_MONTHLY"}}'
     CAMS_EU_AIR_QUALITY_FORECAST:
       productType: EO:ECMWF:DAT:CAMS_EUROPE_AIR_QUALITY_FORECASTS
-      model:
-        - ensemble
-      format: grib
-      variable:
-        - alder_pollen
-      type:
-        - forecast
-      time:
-        - '00:00'
-      level:
-        - '0'
-      leadtime_hour:
-        - '0'
-      metadata_mapping:
-        id: '$.id'
-        type:
-          - '{{"type": {type}}}'
-          - '$.null'
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:CAMS_EUROPE_AIR_QUALITY_FORECASTS"}}'
+      ecmwf:model: ensemble
+      ecmwf:data_format: grib
+      ecmwf:variable: alder_pollen
+      ecmwf:type: forecast
+      ecmwf:time: 00:00
+      ecmwf:level: 0
+      ecmwf:leadtime_hour: 0
     CAMS_GAC_FORECAST:
       productType: EO:ECMWF:DAT:CAMS_GLOBAL_ATMOSPHERIC_COMPOSITION_FORECASTS
-      type:
-        - forecast
-      format: grib
-      variable:
-        - 10m_u_component_of_wind
-      time:
-        - '00:00'
-      leadtime_hour:
-        - '0'
-      metadata_mapping:
-        id: '$.id'
-        type:
-          - '{{"type": {type}}}'
-          - '$.null'
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:CAMS_GLOBAL_ATMOSPHERIC_COMPOSITION_FORECASTS"}}'
+      ecmwf:type: forecast
+      ecmwf:data_format: grib
+      ecmwf:variable: 10m_u_component_of_wind
+      ecmwf:time: 00:00
+      ecmwf:leadtime_hour: 0
     CAMS_GFE_GFAS:
       productType: EO:ECMWF:DAT:CAMS_GLOBAL_FIRE_EMISSIONS_GFAS
-      format: grib
-      variable:
-        - wildfire_combustion_rate
-      time:
-        - '00:00'
-      leadtime_hour:
-        - '0'
-      metadata_mapping:
-        id: '$.id'
-        type:
-          - '{{"type": {type}}}'
-          - '$.null'
-        <<: *variable_list
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:CAMS_GLOBAL_FIRE_EMISSIONS_GFAS"}}'
+      ecmwf:data_format: grib
+      ecmwf:variable: wildfire_combustion_rate
+      ecmwf:time: 00:00
+      ecmwf:leadtime_hour: 0
     CAMS_SOLAR_RADIATION:
       productType: EO:ECMWF:DAT:CAMS_SOLAR_RADIATION_TIMESERIES
-      sky_type: clear
-      step: 1minute
-      time_reference: true_solar_time
-      altitude: -999
-      format: csv
+      ecmwf:sky_type: clear
+      ecmwf:time_step: 1minute
+      ecmwf:time_reference: true_solar_time
+      ecmwf:altitude: -999
+      ecmwf:format: csv
+      geometry: POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))
       metadata_mapping:
-        id: '$.id'
-        step:
-          - '{{"time_step": "{step}"}}'
-          - '$.null'
-        sky_type:
-          - '{{"sky_type": "{sky_type}"}}'
-          - '$.null'
         geometry:
           - '{{"longitude": {geometry#to_longitude_latitude}["lon"], "latitude": {geometry#to_longitude_latitude}["lat"]}}'
           - '$.null'
-        defaultGeometry: 'POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90))'
-        orderLink: 'https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/download?{{"location": "{downloadLink}","product_id":"{id}", "dataset_id": "EO:ECMWF:DAT:CAMS_SOLAR_RADIATION_TIMESERIES"}}'
   auth: !plugin
     type: TokenAuth
     matching_url: https://[-\w\.]+.wekeo2.eu
@@ -6443,7 +5903,7 @@
         - '{{"query":{{"spaceborne:satelliteSensor":{{"eq":"{instrument}"}}}}}}'
         - '$.properties."spaceborne:satelliteSensor"'
       # INSPIRE obligated OpenSearch Parameters for Collection Search (Table 4)
-      title: '{$.properties."accessService:endpointURL"#replace_str(r"^.*\/(\w+)\.zip$",r"\1")}'
+      title: '$.properties.identifier'
       keyword: '$.properties."spaceborne:keywords"'
       # OpenSearch Parameters for Product Search (Table 5)
       orbitNumber:
@@ -6476,15 +5936,15 @@
         - '{{"query":{{"identifier":{{"eq":"{id}"}}}}}}'
         - '$.properties.identifier'
       tileIdentifier:
-        - '{{"query":{{"spaceborne:tile":{{"eq":"T{tileIdentifier}"}}}}}}'
-        - '$.properties."spaceborne:tile".`sub(/^T(.*)$/, \\1)`'
+        - '{{"query":{{"spaceborne:tile":{{"contains":"{tileIdentifier}"}}}}}}'
+        - '{$.properties."spaceborne:tile"#replace_str(r"^T?(.*)$",r"\1")}'
       geometry:
         - '{{"intersects":{geometry#to_geojson}}}'
         - '($.geometry.`str()`.`sub(/^None$/, POLYGON((180 -90, 180 90, -180 90, -180 -90, 180 -90)))`)|($.geometry[*])'
       providerProductType:
         - '{{"query":{{"spaceborne:productType":{{"eq":"{providerProductType}"}}}}}}'
         - '$.null'
-      downloadLink: '$.assets[?(@.roles[0] == "data")].href'
+      downloadLink: '$.assets[?(@.roles[0] == "data") & (@.type != "application/xml")].href'
       quicklook: '$.assets[?(@.roles[0] == "overview")].href.`sub(/^(.*)$/, \\1?scope=gdh)`'
       thumbnail: '$.assets[?(@.roles[0] == "overview")].href.`sub(/^(.*)$/, \\1?scope=gdh)`'
       # storageStatus set to ONLINE for consistency between providers
@@ -6637,8 +6097,8 @@
       "ecmwf:download_format": zip
       "ecmwf:model_levels": surface_level
       "ecmwf:variable": snow_depth_water_equivalent
-      "ecmwf:system_version": version_5_0
-      "ecmwf:time": 00:00
+      "ecmwf:system_version": version_4_0
+      "ecmwf:time": 06:00
       metadata_mapping:
         <<: *hday_hmonth_hyear
     EFAS_FORECAST:
@@ -6668,14 +6128,14 @@
         <<: *month_year
     EFAS_REFORECAST:
       "ecmwf:dataset": efas-reforecast
-      "ecmwf:system_version": version_5_0
+      "ecmwf:system_version": version_4_0
       "ecmwf:data_format": grib
       "ecmwf:download_format": zip
       "ecmwf:product_type": control_forecast
       "ecmwf:variable": river_discharge_in_the_last_6_hours
       "ecmwf:model_levels": surface_level
-      "ecmwf:leadtime_hour": '6'
-      "ecmwf:day": '27'
+      "ecmwf:leadtime_hour": '0'
+      "ecmwf:hday": '03'
       metadata_mapping:
         <<: *hmonth_hyear
     EFAS_SEASONAL_REFORECAST:
@@ -6715,7 +6175,7 @@
       "ecmwf:data_format": grib2
       "ecmwf:download_format": zip
       "ecmwf:system_version": operational
-      "ecmwf:hydrological_model": lisflood
+      "ecmwf:hydrological_model": htessel_lisflood
       "ecmwf:leadtime_hour": '24'
       metadata_mapping:
         <<: *month_year
@@ -6727,7 +6187,7 @@
       "ecmwf:system_version": version_4_0
       "ecmwf:hydrological_model": lisflood
       "ecmwf:leadtime_hour": '24'
-      "ecmwf:day": '27'
+      "ecmwf:hday": '27'
       metadata_mapping:
         <<: *hmonth_hyear
     GLOFAS_REFORECAST:
@@ -6735,10 +6195,11 @@
       "ecmwf:variable": river_discharge_in_the_last_24_hours
       "ecmwf:data_format": grib2
       "ecmwf:download_format": zip
-      "ecmwf:system_version": version_4_0
+      "ecmwf:system_version": version_3_1
       "ecmwf:hydrological_model": lisflood
       "ecmwf:product_type": control_reforecast
       "ecmwf:leadtime_hour": '24'
+      "ecmwf:hday": '03'
       metadata_mapping:
         <<: *hmonth_hyear
     FIRE_HISTORICAL:


Test patch:
diff --git a/tests/integration/test_search_stac_static.py b/tests/integration/test_search_stac_static.py
index 21e7a3c06..dfc1fef86 100644
--- a/tests/integration/test_search_stac_static.py
+++ b/tests/integration/test_search_stac_static.py
@@ -382,6 +382,11 @@ def test_search_stac_static_crunch_filter_property(self):
         )
         self.assertEqual(len(filtered_items), 1)
 
+        with self.assertLogs(level="WARNING") as cm:
+            filtered_items = items.filter_property(foo="bar")
+            self.assertIn("foo not found in EOProduct", str(cm.output))
+            self.assertEqual(len(filtered_items), 0)
+
     @mock.patch(
         "eodag.api.core.EODataAccessGateway.fetch_product_types_list", autospec=True
     )
diff --git a/tests/units/test_search_plugins.py b/tests/units/test_search_plugins.py
index 662bbc167..59f2b5501 100644
--- a/tests/units/test_search_plugins.py
+++ b/tests/units/test_search_plugins.py
@@ -689,106 +689,6 @@ def test_plugins_search_querystringseach_timeout(self, mock__request):
                 auth=None,
             )
 
-    @mock.patch("eodag.utils.requests.requests.sessions.Session.get", autospec=True)
-    def test_plugins_search_ecmwf_search_wekeo_discover_queryables(
-        self, mock_requests_get
-    ):
-        # One of the providers that has discover_queryables() configured with QueryStringSearch
-        search_plugin = self.get_search_plugin(provider="wekeo_ecmwf")
-        self.assertEqual("WekeoECMWFSearch", search_plugin.__class__.__name__)
-        self.assertEqual(
-            "ECMWFSearch",
-            search_plugin.discover_queryables.__func__.__qualname__.split(".")[0],
-        )
-
-        constraints_path = os.path.join(TEST_RESOURCES_PATH, "constraints.json")
-        with open(constraints_path) as f:
-            constraints = json.load(f)
-        wekeo_ecmwf_constraints = {"constraints": constraints[0]}
-        mock_requests_get.return_value = MockResponse(
-            wekeo_ecmwf_constraints, status_code=200
-        )
-
-        provider_queryables_from_constraints_file = [
-            "ecmwf:year",
-            "ecmwf:month",
-            "ecmwf:day",
-            "ecmwf:time",
-            "ecmwf:variable",
-            "ecmwf:leadtime_hour",
-            "ecmwf:type",
-            "ecmwf:product_type",
-        ]
-
-        queryables = search_plugin.discover_queryables(productType="ERA5_SL_MONTHLY")
-        self.assertIsNotNone(queryables)
-
-        mock_requests_get.assert_called_once_with(
-            mock.ANY,
-            "https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/queryable/"
-            "EO:ECMWF:DAT:REANALYSIS_ERA5_SINGLE_LEVELS_MONTHLY_MEANS",
-            headers=USER_AGENT,
-            auth=None,
-            timeout=60,
-        )
-
-        # queryables from provider constraints file are added (here the ones of ERA5_SL_MONTHLY for wekeo_ecmwf)
-        for provider_queryable in provider_queryables_from_constraints_file:
-            provider_queryable = (
-                get_queryable_from_provider(
-                    provider_queryable,
-                    search_plugin.get_metadata_mapping("ERA5_SL_MONTHLY"),
-                )
-                or provider_queryable
-            )
-            self.assertIn(provider_queryable, queryables)
-
-        # default properties in provider config are added and must be default values of the queryables
-        for property, default_value in search_plugin.config.products[
-            "ERA5_SL_MONTHLY"
-        ].items():
-            queryable = queryables.get(property)
-            if queryable is not None:
-                self.assertEqual(default_value, queryable.__metadata__[0].get_default())
-                # queryables with default values are not required
-                self.assertFalse(queryable.__metadata__[0].is_required())
-
-        # queryables without default values are required
-        queryable = queryables.get("month")
-        if queryable is not None:
-            self.assertEqual(PydanticUndefined, queryable.__metadata__[0].get_default())
-            self.assertTrue(queryable.__metadata__[0].is_required())
-
-        # check that queryable constraints from the constraints file are in queryable info
-        # (here it is a case where all constraints of "variable" queryable can be taken into account)
-        queryable = queryables.get("variable")
-        if queryable is not None:
-            variable_constraints = []
-            for constraint in constraints:
-                if "variable" in constraint:
-                    variable_constraints.extend(constraint["variable"])
-            # remove queryable constraints duplicates to make the assertion works
-            self.assertSetEqual(
-                set(variable_constraints), set(queryable.__origin__.__args__)
-            )
-
-        # reset mock
-        mock_requests_get.reset_mock()
-
-        # with additional param
-        queryables = search_plugin.discover_queryables(
-            productType="ERA5_SL_MONTHLY",
-            **{"ecmwf:variable": "a"},
-        )
-        self.assertIsNotNone(queryables)
-
-        self.assertEqual(10, len(queryables))
-        # default properties called in function arguments are added and must be default values of the queryables
-        queryable = queryables.get("ecmwf:variable")
-        if queryable is not None:
-            self.assertEqual("a", queryable.__metadata__[0].get_default())
-            self.assertFalse(queryable.__metadata__[0].is_required())
-
 
 class TestSearchPluginPostJsonSearch(BaseSearchPluginTest):
     def setUp(self):
@@ -1032,23 +932,25 @@ def test_plugins_search_postjsonsearch_default_dates(
         search_plugin.query(
             prep=PreparedSearch(),
             productType="ERA5_SL",
-            year=2020,
-            month=["02"],
-            day=["20", "21"],
-            time=["01:00"],
+            **{
+                "ecmwf:year": "2020",
+                "ecmwf:month": ["02"],
+                "ecmwf:day": ["20", "21"],
+                "ecmwf:time": ["01:00"],
+            },
         )
         mock_request.assert_called_with(
             "https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/search",
             json={
-                "dataset_id": "EO:ECMWF:DAT:REANALYSIS_ERA5_SINGLE_LEVELS",
-                "year": 2020,
+                "year": "2020",
                 "month": ["02"],
                 "day": ["20", "21"],
                 "time": ["01:00"],
-                "product_type": ["ensemble_mean"],
-                "variable": ["10m_u_component_of_wind"],
+                "dataset_id": "EO:ECMWF:DAT:REANALYSIS_ERA5_SINGLE_LEVELS",
+                "product_type": "ensemble_mean",
+                "variable": "10m_u_component_of_wind",
+                "download_format": "unarchived",
                 "data_format": "grib",
-                "download_format": "zip",
                 "itemsPerPage": 20,
                 "startIndex": 0,
             },
@@ -1065,15 +967,15 @@ def test_plugins_search_postjsonsearch_default_dates(
         mock_request.assert_called_with(
             "https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/search",
             json={
-                "dataset_id": "EO:ECMWF:DAT:REANALYSIS_ERA5_SINGLE_LEVELS",
-                "year": "2021",
+                "year": ["2021"],
                 "month": ["02"],
                 "day": ["01"],
                 "time": ["03:00"],
-                "product_type": ["ensemble_mean"],
-                "variable": ["10m_u_component_of_wind"],
+                "dataset_id": "EO:ECMWF:DAT:REANALYSIS_ERA5_SINGLE_LEVELS",
+                "product_type": "ensemble_mean",
+                "variable": "10m_u_component_of_wind",
+                "download_format": "unarchived",
                 "data_format": "grib",
-                "download_format": "zip",
                 "itemsPerPage": 20,
                 "startIndex": 0,
             },
@@ -1104,15 +1006,15 @@ def test_plugins_search_postjsonsearch_default_dates(
         mock_request.assert_called_with(
             "https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/search",
             json={
-                "dataset_id": "EO:ECMWF:DAT:REANALYSIS_ERA5_SINGLE_LEVELS",
-                "year": "1940",
+                "year": ["1940"],
                 "month": ["01"],
                 "day": ["01"],
                 "time": ["00:00"],
-                "product_type": ["ensemble_mean"],
-                "variable": ["10m_u_component_of_wind"],
+                "dataset_id": "EO:ECMWF:DAT:REANALYSIS_ERA5_SINGLE_LEVELS",
+                "product_type": "ensemble_mean",
+                "variable": "10m_u_component_of_wind",
+                "download_format": "unarchived",
                 "data_format": "grib",
-                "download_format": "zip",
                 "itemsPerPage": 20,
                 "startIndex": 0,
             },
@@ -1143,12 +1045,12 @@ def test_plugins_search_postjsonsearch_default_dates(
         mock_request.assert_called_with(
             "https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/search",
             json={
-                "dataset_id": "EO:ECMWF:DAT:CAMS_GLOBAL_REANALYSIS_EAC4",
-                "data_format": "grib",
-                "variable": ["2m_dewpoint_temperature"],
-                "time": ["00:00"],
                 "startdate": "2003-01-01T00:00:00.000Z",
                 "enddate": "2003-01-02T00:00:00.000Z",
+                "dataset_id": "EO:ECMWF:DAT:CAMS_GLOBAL_REANALYSIS_EAC4",
+                "data_format": "grib",
+                "variable": "2m_dewpoint_temperature",
+                "time": "00:00",
                 "itemsPerPage": 20,
                 "startIndex": 0,
             },
@@ -1203,9 +1105,9 @@ def _test_query_params(search_criteria, raw_result, expected_query_params):
             "productType": product_type,
             "startTimeFromAscendingNode": "1980-01-01",
             "completionTimeFromAscendingNode": "1981-12-31",
-            "variable": "glacier_mass_change",
-            "format": "zip",
-            "version": "wgms_fog_2022_09",
+            "ecmwf:variable": "glacier_mass_change",
+            "ecmwf:data_format": "zip",
+            "ecmwf:product_version": "wgms_fog_2022_09",
         }
         expected_query_params = {
             "dataset_id": "EO:ECMWF:DAT:DERIVED_GRIDDED_GLACIER_MASS_CHANGE",
@@ -1221,10 +1123,10 @@ def _test_query_params(search_criteria, raw_result, expected_query_params):
         # Test #2: using parameter hydrological_year (single value)
         search_criteria = {
             "productType": product_type,
-            "variable": "glacier_mass_change",
-            "format": "zip",
-            "version": "wgms_fog_2022_09",
-            "hydrological_year": ["2020_21"],
+            "ecmwf:variable": "glacier_mass_change",
+            "ecmwf:data_format": "zip",
+            "ecmwf:product_version": "wgms_fog_2022_09",
+            "ecmwf:hydrological_year": ["2020_21"],
         }
         expected_query_params = {
             "dataset_id": "EO:ECMWF:DAT:DERIVED_GRIDDED_GLACIER_MASS_CHANGE",
@@ -1240,10 +1142,10 @@ def _test_query_params(search_criteria, raw_result, expected_query_params):
         # Test #3: using parameter hydrological_year (multiple values)
         search_criteria = {
             "productType": product_type,
-            "variable": "glacier_mass_change",
-            "format": "zip",
-            "version": "wgms_fog_2022_09",
-            "hydrological_year": ["1990_91", "2020_21"],
+            "ecmwf:variable": "glacier_mass_change",
+            "ecmwf:data_format": "zip",
+            "ecmwf:product_version": "wgms_fog_2022_09",
+            "ecmwf:hydrological_year": ["1990_91", "2020_21"],
         }
         expected_query_params = {
             "dataset_id": "EO:ECMWF:DAT:DERIVED_GRIDDED_GLACIER_MASS_CHANGE",
@@ -1888,7 +1790,11 @@ def test_plugins_search_buildpostsearchresult_count_and_search(
             products[0].properties["orderLink"],
             f"{endpoint}?"
             + json.dumps(
-                {"geometry": default_geom, "runOnJobQueue": True, **custom_query}
+                {
+                    "geometry": default_geom,
+                    "runOnJobQueue": True,
+                    **custom_query,
+                }
             ),
         )
 
@@ -2553,6 +2459,108 @@ def test_plugins_search_ecmwfsearch_discover_queryables(self, mock_requests_get)
             self.assertEqual("a", queryable.__metadata__[0].get_default())
             self.assertFalse(queryable.__metadata__[0].is_required())
 
+    @mock.patch("eodag.utils.requests.requests.sessions.Session.get", autospec=True)
+    def test_plugins_search_ecmwf_search_wekeo_discover_queryables(
+        self, mock_requests_get
+    ):
+        # One of the providers that has discover_queryables() configured with QueryStringSearch
+        search_plugin = self.get_search_plugin(provider="wekeo_ecmwf")
+        self.assertEqual("WekeoECMWFSearch", search_plugin.__class__.__name__)
+        self.assertEqual(
+            "ECMWFSearch",
+            search_plugin.discover_queryables.__func__.__qualname__.split(".")[0],
+        )
+
+        constraints_path = os.path.join(TEST_RESOURCES_PATH, "constraints.json")
+        with open(constraints_path) as f:
+            constraints = json.load(f)
+        wekeo_ecmwf_constraints = {"constraints": constraints[0]}
+        mock_requests_get.return_value = MockResponse(
+            wekeo_ecmwf_constraints, status_code=200
+        )
+
+        provider_queryables_from_constraints_file = [
+            "ecmwf:year",
+            "ecmwf:month",
+            "ecmwf:day",
+            "ecmwf:time",
+            "ecmwf:variable",
+            "ecmwf:leadtime_hour",
+            "ecmwf:type",
+            "ecmwf:product_type",
+        ]
+
+        queryables = search_plugin._get_product_type_queryables(
+            product_type="ERA5_SL_MONTHLY", alias=None, filters={}
+        )
+        self.assertIsNotNone(queryables)
+
+        mock_requests_get.assert_called_once_with(
+            mock.ANY,
+            "https://gateway.prod.wekeo2.eu/hda-broker/api/v1/dataaccess/queryable/"
+            "EO:ECMWF:DAT:REANALYSIS_ERA5_SINGLE_LEVELS_MONTHLY_MEANS",
+            headers=USER_AGENT,
+            auth=None,
+            timeout=60,
+        )
+
+        # queryables from provider constraints file are added (here the ones of ERA5_SL_MONTHLY for wekeo_ecmwf)
+        for provider_queryable in provider_queryables_from_constraints_file:
+            provider_queryable = (
+                get_queryable_from_provider(
+                    provider_queryable,
+                    search_plugin.get_metadata_mapping("ERA5_SL_MONTHLY"),
+                )
+                or provider_queryable
+            )
+            self.assertIn(provider_queryable, queryables)
+
+        # default properties in provider config are added and must be default values of the queryables
+        for property, default_value in search_plugin.config.products[
+            "ERA5_SL_MONTHLY"
+        ].items():
+            queryable = queryables.get(property)
+            if queryable is not None:
+                self.assertEqual(default_value, queryable.__metadata__[0].get_default())
+                # queryables with default values are not required
+                self.assertFalse(queryable.__metadata__[0].is_required())
+
+        # queryables without default values are required
+        queryable = queryables.get("month")
+        if queryable is not None:
+            self.assertEqual(PydanticUndefined, queryable.__metadata__[0].get_default())
+            self.assertTrue(queryable.__metadata__[0].is_required())
+
+        # check that queryable constraints from the constraints file are in queryable info
+        # (here it is a case where all constraints of "variable" queryable can be taken into account)
+        queryable = queryables.get("variable")
+        if queryable is not None:
+            variable_constraints = []
+            for constraint in constraints:
+                if "variable" in constraint:
+                    variable_constraints.extend(constraint["variable"])
+            # remove queryable constraints duplicates to make the assertion works
+            self.assertSetEqual(
+                set(variable_constraints), set(queryable.__origin__.__args__)
+            )
+
+        # reset mock
+        mock_requests_get.reset_mock()
+
+        # with additional param
+        queryables = search_plugin.discover_queryables(
+            productType="ERA5_SL_MONTHLY",
+            **{"ecmwf:variable": "a"},
+        )
+        self.assertIsNotNone(queryables)
+
+        self.assertEqual(10, len(queryables))
+        # default properties called in function arguments are added and must be default values of the queryables
+        queryable = queryables.get("ecmwf:variable")
+        if queryable is not None:
+            self.assertEqual("a", queryable.__metadata__[0].get_default())
+            self.assertFalse(queryable.__metadata__[0].is_required())
+
 
 class TestSearchPluginCopMarineSearch(BaseSearchPluginTest):
     def setUp(self):
@@ -2764,7 +2772,6 @@ def setUp(self):
 
     @mock.patch("eodag.plugins.search.cop_marine.requests.get")
     def test_plugins_search_cop_marine_query_with_dates(self, mock_requests_get):
-
         mock_requests_get.return_value.json.side_effect = [
             self.product_data,
             self.dataset1_data,