Hint

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

Queryables#

To know which query parameters can be used to filter the search result, the list_queryables() method from the gateway can be used. It has two optional arguments, provider and collection, additional keyword arguments to filter the queryable values can be added. The method returns a QueryablesDict which is a dictionary with an additional attribute additional_properties which indicates if additional properties (properties not in the queryables) can be added to the search.

If the function is called without any arguments, the basic queryables that are available for all providers and collections will be returned:

[1]:
# Switch to minimal mode for the exception handlers
%xmode Minimal

from eodag import EODataAccessGateway
dag = EODataAccessGateway()
dag.list_queryables()
Exception reporting mode: Minimal
[1]:
QueryablesDict (1) - additional_properties=True
'collection':  typing.Annotated[str,  FieldInfo( 'required': True, ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=True)
]
[2]:
queryables = dag.list_queryables()
queryables.additional_properties
[2]:
True

If the function is called for a specific collection, the queryables available for this collection, i.e., the basic queryables and collection specific queryables, are shown. Only parameters available for all providers offering the product are returned.

[3]:
queryables = dag.list_queryables(provider="cop_ads", collection="CAMS_SOLAR_RADIATION")
queryables
[3]:
QueryablesDict (9) - additional_properties=False
'ecmwf_altitude':  typing.Annotated[str,  FieldInfo('default': '-999',  'alias': 'AliasChoices(choices=[''ecmwf:altitude", "altitude''])',  ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default='-999', alias_priority=2, validation_alias=AliasChoices(choices=['ecmwf:altitude', 'altitude']), serialization_alias='ecmwf:altitude', title='Altitude', description='Enter altitude in meters. Use -999 for an automated look-up from the NASA SRTM database', metadata=['json_schema_required'])
]
'ecmwf_data_format':  typing.Annotated[Literal['csv', ...],  FieldInfo( 'required': True, 'alias': 'AliasChoices(choices=[''ecmwf:data_format", "data_format''])',  ... )] typing.Annotated[
typing.Literal['csv', 'csv_expert', 'netcdf'],
FieldInfo(annotation=NoneType, required=True, alias_priority=2, validation_alias=AliasChoices(choices=['ecmwf:data_format', 'data_format']), serialization_alias='ecmwf:data_format', title='Data format', description='CSV (expert mode) is only available for a 1 minute time step and universal time', metadata=['json_schema_required'])
]
'ecmwf_date':  typing.Annotated[Literal['2004-01-01/2026-10-08', ...],  FieldInfo( 'required': True, 'alias': 'AliasChoices(choices=[''ecmwf:date", "date''])',  ... )] typing.Annotated[
typing.Literal['2004-01-01/2026-10-08', '2004-02-01/2026-10-08'],
FieldInfo(annotation=NoneType, required=True, alias_priority=2, validation_alias=AliasChoices(choices=['ecmwf:date', 'date']), serialization_alias='ecmwf:date', title='Date', description='date formatted like yyyy-mm-dd/yyyy-mm-dd', metadata=['json_schema_required'])
]
'ecmwf_location':  typing.Annotated[location_object,  FieldInfo( 'required': True, 'alias': 'AliasChoices(choices=[''ecmwf:location", "location''])',  ... )] typing.Annotated[
eodag.types.location_object,
FieldInfo(annotation=NoneType, required=True, alias_priority=2, validation_alias=AliasChoices(choices=['ecmwf:location', 'location']), serialization_alias='ecmwf:location', title='Location', description='For cloud-free conditions only, location may be anywhere. For actual weather conditions, location must be within either the Meteosat or Himawari field of view.', metadata=['json_schema_required'])
]
'ecmwf_sky_type':  typing.Annotated[Literal['clear', ...],  FieldInfo( 'required': True, 'alias': 'AliasChoices(choices=[''ecmwf:sky_type", "sky_type''])',  ... )] typing.Annotated[
typing.Literal['clear', 'observed_cloud'],
FieldInfo(annotation=NoneType, required=True, alias_priority=2, validation_alias=AliasChoices(choices=['ecmwf:sky_type', 'sky_type']), serialization_alias='ecmwf:sky_type', title='Sky type', metadata=['json_schema_required'])
]
'ecmwf_time_reference':  typing.Annotated[Literal['true_solar_time', ...],  FieldInfo( 'required': True, 'alias': 'AliasChoices(choices=[''ecmwf:time_reference", "time_reference''])',  ... )] typing.Annotated[
typing.Literal['true_solar_time', 'universal_time'],
FieldInfo(annotation=NoneType, required=True, alias_priority=2, validation_alias=AliasChoices(choices=['ecmwf:time_reference', 'time_reference']), serialization_alias='ecmwf:time_reference', title='Time reference', metadata=['json_schema_required'])
]
'ecmwf_time_step':  typing.Annotated[Literal['15minute', ...],  FieldInfo( 'required': True, 'alias': 'AliasChoices(choices=[''ecmwf:time_step", "time_step''])',  ... )] typing.Annotated[
typing.Literal['15minute', '1day', '1hour', '1minute', '1month'],
FieldInfo(annotation=NoneType, required=True, alias_priority=2, validation_alias=AliasChoices(choices=['ecmwf:time_step', 'time_step']), serialization_alias='ecmwf:time_step', title='Time step', metadata=['json_schema_required'])
]
'end':  typing.Annotated[str,  FieldInfo( 'alias': 'end_datetime',  ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None, alias='end_datetime', alias_priority=2, description="Date/time as string in ISO 8601 format (e.g. '2024-06-10T12:00:00Z')")
]
'start':  typing.Annotated[str,  FieldInfo( 'alias': 'AliasChoices(choices=[''start_datetime", "datetime''])',  ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None, alias=AliasChoices(choices=['start_datetime', 'datetime']), alias_priority=2, description="Date/time as string in ISO 8601 format (e.g. '2024-06-10T12:00:00Z')")
]

Queryables values: typing.Annotated#

Queryables values are returned using typing.Annotated format. It contains parameter expected type, allowed alias for query, constraints and other metadata:

[4]:
queryables["ecmwf_data_format"]
[4]:
typing.Annotated[typing.Literal['csv', 'csv_expert', 'netcdf'], FieldInfo(annotation=NoneType, required=True, alias_priority=2, validation_alias=AliasChoices(choices=['ecmwf:data_format', 'data_format']), serialization_alias='ecmwf:data_format', title='Data format', description='CSV (expert mode) is only available for a 1 minute time step and universal time', metadata=['json_schema_required'])]
[5]:
from typing import get_args

queryable_type, *queryable_metadata= get_args(queryables["ecmwf_data_format"])
queryable_type
[5]:
typing.Literal['csv', 'csv_expert', 'netcdf']
[6]:
queryable_metadata[0].validation_alias
[6]:
AliasChoices(choices=['ecmwf:data_format', 'data_format'])
[7]:
queryable_metadata[0].is_required()
[7]:
True

We can see that ecmwf_data_format is required, it accepts values csv, csv_expert or netcdf, and can also be queried using ecmwf:data_format or data_format keys.

Queryables json schema#

Sometimes, expected type is not explicit (e.g. location_object for ecmwf_location). The method get_model_json_schema() can be used then to see its whole definition in the key $def of the queryables model JSON schema, which matches the $ref given in the queryables details.

[8]:
model_schema = queryables.get_model_json_schema()
[9]:
# json schema overview
from pprint import pprint

pprint({
    k: {
        k2: "..." if isinstance(v2, dict) else v2
        for k2, v2 in v.items()
    } if isinstance(v, dict) else v
    for k, v in model_schema.items()
})
{'$defs': {'location_object': '...'},
 'additionalProperties': False,
 'aliases': {'ecmwf_altitude': ['ecmwf:altitude', 'altitude'],
             'ecmwf_data_format': ['ecmwf:data_format', 'data_format'],
             'ecmwf_date': ['ecmwf:date', 'date'],
             'ecmwf_location': ['ecmwf:location', 'location'],
             'ecmwf_sky_type': ['ecmwf:sky_type', 'sky_type'],
             'ecmwf_time_reference': ['ecmwf:time_reference', 'time_reference'],
             'ecmwf_time_step': ['ecmwf:time_step', 'time_step'],
             'end': ['end_datetime'],
             'start': ['start_datetime', 'datetime']},
 'properties': {'ecmwf_altitude': '...',
                'ecmwf_data_format': '...',
                'ecmwf_date': '...',
                'ecmwf_location': '...',
                'ecmwf_sky_type': '...',
                'ecmwf_time_reference': '...',
                'ecmwf_time_step': '...',
                'end': '...',
                'start': '...'},
 'required': ['ecmwf_altitude',
              'ecmwf_data_format',
              'ecmwf_date',
              'ecmwf_location',
              'ecmwf_sky_type',
              'ecmwf_time_reference',
              'ecmwf_time_step'],
 'title': 'Queryables',
 'type': 'object'}

Now check properties.ecmwf_location and the associated object definition.

[10]:
model_schema["properties"]["ecmwf_location"]
[10]:
{'$ref': '#/$defs/location_object',
 'description': 'For cloud-free conditions only, location may be anywhere. For actual weather conditions, location must be within either the Meteosat or Himawari field of view.',
 'title': 'Location'}
[11]:
model_schema["$defs"]["location_object"]
[11]:
{'properties': {'longitude': {'maximum': 180,
   'minimum': -180,
   'title': 'Longitude',
   'type': 'number'},
  'latitude': {'maximum': 90,
   'minimum': -90,
   'title': 'Latitude',
   'type': 'number'}},
 'required': ['longitude', 'latitude'],
 'title': 'location_object',
 'type': 'object'}

Queryables filtering#

The queryables can also be retrieved for a specific provider. These queryables are either taken from the queryables endpoint of the provider (if available), the constraints for the query parameter values defined by the provider (if available) or the provider configuration in EODAG. In the example below we use a provider offering a queryables endpoint.

[12]:
dag.list_queryables(collection="S1_SAR_GRD", provider="planetary_computer")
[12]:
QueryablesDict (32) - additional_properties=True
'constellation':  typing.Annotated[str,  FieldInfo( ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None)
]
'end':  typing.Annotated[str,  FieldInfo( 'alias': 'end_datetime',  ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None, alias='end_datetime', alias_priority=2, title='End datetime', description='End datetime')
]
'geom':  typing.Annotated[str | dict[str, ...] | BaseGeometry,  FieldInfo( 'alias': 'AliasChoices(choices=[''geometry", "intersects''])',  ... )] typing.Annotated[
str | dict[str, float] | shapely.geometry.base.BaseGeometry,
FieldInfo(annotation=NoneType, required=False, default=None, alias=AliasChoices(choices=['geometry', 'intersects']), alias_priority=2, title='Item Geometry', description='Item Geometry', json_schema_extra={'$ref': 'https://geojson.org/schema/Feature.json'})
]
'id':  typing.Annotated[str,  FieldInfo( ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None, title='Item ID', description='Item identifier', json_schema_extra={'$ref': 'https://schemas.stacspec.org/v1.0.0/item-spec/json-schema/item.json#/definitions/core/allOf/2/properties/id'})
]
'platform':  typing.Annotated[Literal['SENTINEL-1A', ...],  FieldInfo( ... )] typing.Annotated[
typing.Literal['SENTINEL-1A', 'SENTINEL-1B', 'SENTINEL-1C'],
FieldInfo(annotation=NoneType, required=False, default=None, title='Platform')
]
'start':  typing.Annotated[str,  FieldInfo( 'alias': 'AliasChoices(choices=[''start_datetime", "datetime''])',  ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None, alias=AliasChoices(choices=['start_datetime', 'datetime']), alias_priority=2, title='Start datetime', description='Start datetime')
]
'processing_level':  typing.Annotated[str,  FieldInfo( 'alias': 'processing:level',  ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None, alias='processing:level', alias_priority=2, metadata=[{'extension': 'ProcessingExtension'}])
]
's1:datatake_id':  typing.Annotated[str,  FieldInfo( ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None, title='Datatake ID')
]
's1:instrument_configuration_ID':  typing.Annotated[str,  FieldInfo( ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None)
]
's1:orbit_source':  typing.Annotated[Literal['DOWNLINK', ...],  FieldInfo( ... )] typing.Annotated[
typing.Literal['DOWNLINK', 'POEORB', 'PREORB', 'RESORB'],
FieldInfo(annotation=NoneType, required=False, default=None, title='Orbit Source')
]
's1:product_timeliness':  typing.Annotated[Literal['Fast-24h', ...],  FieldInfo( ... )] typing.Annotated[
typing.Literal['Fast-24h', 'NRT-10m', 'NRT-1h', 'NRT-3h', 'Off-line', 'Reprocessing'],
FieldInfo(annotation=NoneType, required=False, default=None, title='Product Timeliness')
]
's1:resolution':  typing.Annotated[Literal['full', ...],  FieldInfo( ... )] typing.Annotated[
typing.Literal['full', 'high', 'medium'],
FieldInfo(annotation=NoneType, required=False, default=None, title='Resolution')
]
's1:shape':  typing.Annotated[list,  FieldInfo( ... )] typing.Annotated[
list,
FieldInfo(annotation=NoneType, required=False, default=None)
]
's1:slice_number':  typing.Annotated[str,  FieldInfo( ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None, title='Slice Number')
]
's1:total_slices':  typing.Annotated[str,  FieldInfo( ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None, title='Total Slices')
]
'sar:product_type':  typing.Annotated[str,  FieldInfo( ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None, title='Product type')
]
'sar_center_frequency':  typing.Annotated[float,  FieldInfo( 'alias': 'sar:center_frequency',  ... )] typing.Annotated[
float,
FieldInfo(annotation=NoneType, required=False, default=None, alias='sar:center_frequency', alias_priority=2, title='Center Frequency (GHz)', metadata=[{'extension': 'SarExtension'}])
]
'sar_frequency_band':  typing.Annotated[Literal['C', ...],  FieldInfo( 'alias': 'sar:frequency_band',  ... )] typing.Annotated[
typing.Literal['C', 'K', 'Ka', 'Ku', 'L', 'P', 'S', 'X'],
FieldInfo(annotation=NoneType, required=False, default=None, alias='sar:frequency_band', alias_priority=2, title='Frequency Band', metadata=[{'extension': 'SarExtension'}])
]
'sar_instrument_mode':  typing.Annotated[str,  FieldInfo( 'alias': 'sar:instrument_mode',  ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None, alias='sar:instrument_mode', alias_priority=2, title='Instrument Mode', metadata=[{'extension': 'SarExtension'}])
]
'sar_looks_azimuth':  typing.Annotated[int,  FieldInfo( 'alias': 'sar:looks_azimuth',  ... )] typing.Annotated[
int,
FieldInfo(annotation=NoneType, required=False, default=None, alias='sar:looks_azimuth', alias_priority=2, title='Looks azimuth', metadata=[{'extension': 'SarExtension'}])
]
'sar_looks_equivalent_number':  typing.Annotated[float,  FieldInfo( 'alias': 'sar:looks_equivalent_number',  ... )] typing.Annotated[
float,
FieldInfo(annotation=NoneType, required=False, default=None, alias='sar:looks_equivalent_number', alias_priority=2, title='Equivalent number of looks (ENL)', metadata=[{'extension': 'SarExtension'}])
]
'sar_looks_range':  typing.Annotated[int,  FieldInfo( 'alias': 'sar:looks_range',  ... )] typing.Annotated[
int,
FieldInfo(annotation=NoneType, required=False, default=None, alias='sar:looks_range', alias_priority=2, title='Looks range', metadata=[{'extension': 'SarExtension'}])
]
'sar_observation_direction':  typing.Annotated[Literal['left', ...],  FieldInfo( 'alias': 'sar:observation_direction',  ... )] typing.Annotated[
typing.Literal['left', 'right'],
FieldInfo(annotation=NoneType, required=False, default=None, alias='sar:observation_direction', alias_priority=2, title='Antenna pointing direction', metadata=[{'extension': 'SarExtension'}])
]
'sar_pixel_spacing_azimuth':  typing.Annotated[float,  FieldInfo( 'alias': 'sar:pixel_spacing_azimuth',  ... )] typing.Annotated[
float,
FieldInfo(annotation=NoneType, required=False, default=None, alias='sar:pixel_spacing_azimuth', alias_priority=2, title='Pixel spacing azimuth (m)', metadata=[{'extension': 'SarExtension'}])
]
'sar_pixel_spacing_range':  typing.Annotated[float,  FieldInfo( 'alias': 'sar:pixel_spacing_range',  ... )] typing.Annotated[
float,
FieldInfo(annotation=NoneType, required=False, default=None, alias='sar:pixel_spacing_range', alias_priority=2, title='Pixel spacing range (m)', metadata=[{'extension': 'SarExtension'}])
]
'sar_polarizations':  typing.Annotated[list[Literal['HH', ...]],  FieldInfo( 'alias': 'sar:polarizations',  ... )] typing.Annotated[
list[typing.Literal['HH', 'HV', 'VH', 'VV']],
FieldInfo(annotation=NoneType, required=False, default=None, alias='sar:polarizations', alias_priority=2, title='Polarizations', metadata=[{'extension': 'SarExtension'}])
]
'sar_resolution_azimuth':  typing.Annotated[float,  FieldInfo( 'alias': 'sar:resolution_azimuth',  ... )] typing.Annotated[
float,
FieldInfo(annotation=NoneType, required=False, default=None, alias='sar:resolution_azimuth', alias_priority=2, title='Resolution azimuth (m)', metadata=[{'extension': 'SarExtension'}])
]
'sar_resolution_range':  typing.Annotated[float,  FieldInfo( 'alias': 'sar:resolution_range',  ... )] typing.Annotated[
float,
FieldInfo(annotation=NoneType, required=False, default=None, alias='sar:resolution_range', alias_priority=2, title='Resolution range (m)', metadata=[{'extension': 'SarExtension'}])
]
'sat_absolute_orbit':  typing.Annotated[int,  FieldInfo( 'alias': 'sat:absolute_orbit',  ... )] typing.Annotated[
int,
FieldInfo(annotation=NoneType, required=False, default=None, alias='sat:absolute_orbit', alias_priority=2, title='Absolute Orbit', json_schema_extra={'$ref': 'https://stac-extensions.github.io/sat/v1.0.0/schema.json#/definitions/fields/properties/sat:absolute_orbit'}, metadata=[{'extension': 'SatelliteExtension'}])
]
'sat_orbit_state':  typing.Annotated[Literal['ascending', ...],  FieldInfo( 'alias': 'sat:orbit_state',  ... )] typing.Annotated[
typing.Literal['ascending', 'descending', 'geostationary'],
FieldInfo(annotation=NoneType, required=False, default=None, alias='sat:orbit_state', alias_priority=2, title='Orbit State', metadata=[{'extension': 'SatelliteExtension'}])
]
'sat_platform_international_designator':  typing.Annotated[Literal['0000-000A', ...],  FieldInfo( 'alias': 'sat:platform_international_designator',  ... )] typing.Annotated[
typing.Literal['0000-000A', '2014-016A', '2016-025A'],
FieldInfo(annotation=NoneType, required=False, default=None, alias='sat:platform_international_designator', alias_priority=2, title='Platform Designation', metadata=[{'extension': 'SatelliteExtension'}])
]
'sat_relative_orbit':  typing.Annotated[int,  FieldInfo( 'alias': 'sat:relative_orbit',  ... )] typing.Annotated[
int,
FieldInfo(annotation=NoneType, required=False, default=None, alias='sat:relative_orbit', alias_priority=2, title='Relative Orbit', json_schema_extra={'$ref': 'https://stac-extensions.github.io/sat/v1.0.0/schema.json#/definitions/fields/properties/sat:relative_orbit'}, metadata=[{'extension': 'SatelliteExtension'}])
]

For each queryable the possible values will be included in the result if they are available from either the provider queryables or the constraints. If constraints are available for a provider, the queryables can be filtered by the value of a specific parameter. E.g. if the queryables month and day are available, we can set the month to a specific value to get only the days available for that month.

[13]:
dag.list_queryables(
    collection="ERA5_SL",
    provider="cop_cds",
    ecmwf_month=["02"]
)
[13]:
QueryablesDict (11) - additional_properties=False
'ecmwf_area':  typing.Annotated[tuple[Annotated[float, FieldInfo(annotation=NoneType, required=True, description='North border of the bounding box', metadata=[Ge(ge=-90), ...])], Annotated[float, FieldInfo(annotation=NoneType, required=True, description='West border of the bounding box', metadata=[Ge(ge=-180), ...])], Annotated[float, FieldInfo(annotation=NoneType, required=True, description='South border of the bounding box', metadata=[Ge(ge=-90), ...])], Annotated[float, FieldInfo(annotation=NoneType, required=True, description='East border of the bounding box', metadata=[Ge(ge=-180), ...])]],  FieldInfo('default': '[90, -90, 180, -180]',  'alias': 'AliasChoices(choices=[''ecmwf:area", "area''])',  ... )] typing.Annotated[
tuple[typing.Annotated[float, FieldInfo(annotation=NoneType, required=True, description='North border of the bounding box', metadata=[Ge(ge=-90), Le(le=90)])], typing.Annotated[float, FieldInfo(annotation=NoneType, required=True, description='West border of the bounding box', metadata=[Ge(ge=-180), Le(le=180)])], typing.Annotated[float, FieldInfo(annotation=NoneType, required=True, description='South border of the bounding box', metadata=[Ge(ge=-90), Le(le=90)])], typing.Annotated[float, FieldInfo(annotation=NoneType, required=True, description='East border of the bounding box', metadata=[Ge(ge=-180), Le(le=180)])]],
FieldInfo(annotation=NoneType, required=False, default=[90, -90, 180, -180], alias_priority=2, validation_alias=AliasChoices(choices=['ecmwf:area', 'area']), serialization_alias='ecmwf:area', title='Area selection', description='Select a sub-region of the available area by providing its limits on latitude and longitude.')
]
'ecmwf_data_format':  typing.Annotated[Literal['grib', ...],  FieldInfo('default': 'grib',  'alias': 'AliasChoices(choices=[''ecmwf:data_format", "data_format''])',  ... )] typing.Annotated[
typing.Literal['grib', 'netcdf'],
FieldInfo(annotation=NoneType, required=False, default='grib', alias_priority=2, validation_alias=AliasChoices(choices=['ecmwf:data_format', 'data_format']), serialization_alias='ecmwf:data_format', title='Data format', description='Select a format for the data files, the native format of MARS datasets is GRIB, and this format is recommended for any operational use, such as deriving downstream products.

Please note that to ensure accuracy and sufficient metadata is included in the output, your request may be split into multiple files when converted to netCDF.', metadata=['json_schema_required'])
]
'ecmwf_day':  typing.Annotated[list[Literal['01', ...]],  FieldInfo( 'required': True, 'alias': 'AliasChoices(choices=[''ecmwf:day", "day''])',  ... )] typing.Annotated[
list[typing.Literal['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29']],
FieldInfo(annotation=NoneType, required=True, alias_priority=2, validation_alias=AliasChoices(choices=['ecmwf:day', 'day']), serialization_alias='ecmwf:day', title='Day', metadata=['json_schema_required'])
]
'ecmwf_download_format':  typing.Annotated[Literal['unarchived', ...],  FieldInfo('default': 'unarchived',  'alias': 'AliasChoices(choices=[''ecmwf:download_format", "download_format''])',  ... )] typing.Annotated[
typing.Literal['unarchived', 'zip'],
FieldInfo(annotation=NoneType, required=False, default='unarchived', alias_priority=2, validation_alias=AliasChoices(choices=['ecmwf:download_format', 'download_format']), serialization_alias='ecmwf:download_format', title='Download format', description="If you select 'Zip' the files will always be zipped into a single file.

If you select 'Unarchived' then the files will be returned unzipped if there is only one file, and zipped if there are multiple files.

Please note that in some circumstances the conversion from GRIB to NetCDF can result in multiple files.", metadata=['json_schema_required'])
]
'ecmwf_month':  typing.Annotated[list[Literal['02']],  FieldInfo('default': '['02']',  'alias': 'AliasChoices(choices=[''ecmwf:month", "month''])',  ... )] typing.Annotated[
list[typing.Literal['02']],
FieldInfo(annotation=NoneType, required=False, default=['02'], alias_priority=2, validation_alias=AliasChoices(choices=['ecmwf:month', 'month']), serialization_alias='ecmwf:month', title='Month', metadata=['json_schema_required'])
]
'ecmwf_product_type':  typing.Annotated[list[Literal['ensemble_mean', ...]],  FieldInfo('default': '['reanalysis', 'reanalysis']',  'alias': 'AliasChoices(choices=[''ecmwf:product_type", "product_type''])',  ... )] typing.Annotated[
list[typing.Literal['ensemble_mean', 'ensemble_members', 'ensemble_spread', 'reanalysis']],
FieldInfo(annotation=NoneType, required=False, default=['reanalysis', 'reanalysis'], alias_priority=2, validation_alias=AliasChoices(choices=['ecmwf:product_type', 'product_type']), serialization_alias='ecmwf:product_type', title='Product type', metadata=['json_schema_required'])
]
'ecmwf_time':  typing.Annotated[list[Literal['00:00', ...]],  FieldInfo( 'required': True, 'alias': 'AliasChoices(choices=[''ecmwf:time", "time''])',  ... )] typing.Annotated[
list[typing.Literal['00:00', '01:00', '02:00', '03:00', '04:00', '05:00', '06:00', '07:00', '08:00', '09:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', '18:00', '19:00', '20:00', '21:00', '22:00', '23:00']],
FieldInfo(annotation=NoneType, required=True, alias_priority=2, validation_alias=AliasChoices(choices=['ecmwf:time', 'time']), serialization_alias='ecmwf:time', title='Time', description='UTC time standard. UTC stands for Universal Time Coordinated as well as for Coordinated Universal Time.', metadata=['json_schema_required'])
]
'ecmwf_variable':  typing.Annotated[list[Literal['100m_u_component_of_wind', ...]],  FieldInfo( 'required': True, 'alias': 'AliasChoices(choices=[''ecmwf:variable", "variable''])',  ... )] typing.Annotated[
list[typing.Literal['100m_u_component_of_wind', '100m_v_component_of_wind', '10m_u_component_of_neutral_wind', '10m_u_component_of_wind', '10m_v_component_of_neutral_wind', '10m_v_component_of_wind', '10m_wind_gust_since_previous_post_processing', '2m_dewpoint_temperature', '2m_temperature', 'air_density_over_the_oceans', 'angle_of_sub_gridscale_orography', 'anisotropy_of_sub_gridscale_orography', 'benjamin_feir_index', 'boundary_layer_dissipation', 'boundary_layer_height', 'charnock', 'clear_sky_direct_solar_radiation_at_surface', 'cloud_base_height', 'coefficient_of_drag_with_waves', 'convective_available_potential_energy', 'convective_inhibition', 'convective_precipitation', 'convective_rain_rate', 'convective_snowfall', 'convective_snowfall_rate_water_equivalent', 'downward_uv_radiation_at_the_surface', 'duct_base_height', 'eastward_gravity_wave_surface_stress', 'eastward_turbulent_surface_stress', 'evaporation', 'forecast_albedo', 'forecast_logarithm_of_surface_roughness_for_heat', 'forecast_surface_roughness', 'free_convective_velocity_over_the_oceans', 'friction_velocity', 'geopotential', 'gravity_wave_dissipation', 'high_cloud_cover', 'high_vegetation_cover', 'ice_temperature_layer_1', 'ice_temperature_layer_2', 'ice_temperature_layer_3', 'ice_temperature_layer_4', 'instantaneous_10m_wind_gust', 'instantaneous_eastward_turbulent_surface_stress', 'instantaneous_large_scale_surface_precipitation_fraction', 'instantaneous_moisture_flux', 'instantaneous_northward_turbulent_surface_stress', 'instantaneous_surface_sensible_heat_flux', 'k_index', 'lake_bottom_temperature', 'lake_cover', 'lake_depth', 'lake_ice_depth', 'lake_ice_temperature', 'lake_mix_layer_depth', 'lake_mix_layer_temperature', 'lake_shape_factor', 'lake_total_layer_temperature', 'land_sea_mask', 'large_scale_precipitation', 'large_scale_precipitation_fraction', 'large_scale_rain_rate', 'large_scale_snowfall', 'large_scale_snowfall_rate_water_equivalent', 'leaf_area_index_high_vegetation', 'leaf_area_index_low_vegetation', 'low_cloud_cover', 'low_vegetation_cover', 'maximum_2m_temperature_since_previous_post_processing', 'maximum_individual_wave_height', 'maximum_total_precipitation_rate_since_previous_post_processing', 'mean_boundary_layer_dissipation', 'mean_convective_precipitation_rate', 'mean_convective_snowfall_rate', 'mean_direction_of_total_swell', 'mean_direction_of_wind_waves', 'mean_eastward_gravity_wave_surface_stress', 'mean_eastward_turbulent_surface_stress', 'mean_evaporation_rate', 'mean_gravity_wave_dissipation', 'mean_large_scale_precipitation_fraction', 'mean_large_scale_precipitation_rate', 'mean_large_scale_snowfall_rate', 'mean_northward_gravity_wave_surface_stress', 'mean_northward_turbulent_surface_stress', 'mean_period_of_total_swell', 'mean_period_of_wind_waves', 'mean_potential_evaporation_rate', 'mean_runoff_rate', 'mean_sea_level_pressure', 'mean_snow_evaporation_rate', 'mean_snowfall_rate', 'mean_snowmelt_rate', 'mean_square_slope_of_waves', 'mean_sub_surface_runoff_rate', 'mean_surface_direct_short_wave_radiation_flux', 'mean_surface_direct_short_wave_radiation_flux_clear_sky', 'mean_surface_downward_long_wave_radiation_flux', 'mean_surface_downward_long_wave_radiation_flux_clear_sky', 'mean_surface_downward_short_wave_radiation_flux', 'mean_surface_downward_short_wave_radiation_flux_clear_sky', 'mean_surface_downward_uv_radiation_flux', 'mean_surface_latent_heat_flux', 'mean_surface_net_long_wave_radiation_flux', 'mean_surface_net_long_wave_radiation_flux_clear_sky', 'mean_surface_net_short_wave_radiation_flux', 'mean_surface_net_short_wave_radiation_flux_clear_sky', 'mean_surface_runoff_rate', 'mean_surface_sensible_heat_flux', 'mean_top_downward_short_wave_radiation_flux', 'mean_top_net_long_wave_radiation_flux', 'mean_top_net_long_wave_radiation_flux_clear_sky', 'mean_top_net_short_wave_radiation_flux', 'mean_top_net_short_wave_radiation_flux_clear_sky', 'mean_total_precipitation_rate', 'mean_vertical_gradient_of_refractivity_inside_trapping_layer', 'mean_vertically_integrated_moisture_divergence', 'mean_wave_direction', 'mean_wave_direction_of_first_swell_partition', 'mean_wave_direction_of_second_swell_partition', 'mean_wave_direction_of_third_swell_partition', 'mean_wave_period', 'mean_wave_period_based_on_first_moment', 'mean_wave_period_based_on_first_moment_for_swell', 'mean_wave_period_based_on_first_moment_for_wind_waves', 'mean_wave_period_based_on_second_moment_for_swell', 'mean_wave_period_based_on_second_moment_for_wind_waves', 'mean_wave_period_of_first_swell_partition', 'mean_wave_period_of_second_swell_partition', 'mean_wave_period_of_third_swell_partition', 'mean_zero_crossing_wave_period', 'medium_cloud_cover', 'minimum_2m_temperature_since_previous_post_processing', 'minimum_total_precipitation_rate_since_previous_post_processing', 'minimum_vertical_gradient_of_refractivity_inside_trapping_layer', 'model_bathymetry', 'near_ir_albedo_for_diffuse_radiation', 'near_ir_albedo_for_direct_radiation', 'normalized_energy_flux_into_ocean', 'normalized_energy_flux_into_waves', 'normalized_stress_into_ocean', 'northward_gravity_wave_surface_stress', 'northward_turbulent_surface_stress', 'ocean_surface_stress_equivalent_10m_neutral_wind_direction', 'ocean_surface_stress_equivalent_10m_neutral_wind_speed', 'peak_wave_period', 'period_corresponding_to_maximum_individual_wave_height', 'potential_evaporation', 'precipitation_type', 'runoff', 'sea_ice_cover', 'sea_surface_temperature', 'significant_height_of_combined_wind_waves_and_swell', 'significant_height_of_total_swell', 'significant_height_of_wind_waves', 'significant_wave_height_of_first_swell_partition', 'significant_wave_height_of_second_swell_partition', 'significant_wave_height_of_third_swell_partition', 'skin_reservoir_content', 'skin_temperature', 'slope_of_sub_gridscale_orography', 'snow_albedo', 'snow_density', 'snow_depth', 'snow_evaporation', 'snowfall', 'snowmelt', 'soil_temperature_level_1', 'soil_temperature_level_2', 'soil_temperature_level_3', 'soil_temperature_level_4', 'soil_type', 'standard_deviation_of_filtered_subgrid_orography', 'standard_deviation_of_orography', 'sub_surface_runoff', 'surface_latent_heat_flux', 'surface_net_solar_radiation', 'surface_net_solar_radiation_clear_sky', 'surface_net_thermal_radiation', 'surface_net_thermal_radiation_clear_sky', 'surface_pressure', 'surface_runoff', 'surface_sensible_heat_flux', 'surface_solar_radiation_downward_clear_sky', 'surface_solar_radiation_downwards', 'surface_thermal_radiation_downward_clear_sky', 'surface_thermal_radiation_downwards', 'temperature_of_snow_layer', 'toa_incident_solar_radiation', 'top_net_solar_radiation', 'top_net_solar_radiation_clear_sky', 'top_net_thermal_radiation', 'top_net_thermal_radiation_clear_sky', 'total_cloud_cover', 'total_column_cloud_ice_water', 'total_column_cloud_liquid_water', 'total_column_ozone', 'total_column_rain_water', 'total_column_snow_water', 'total_column_supercooled_liquid_water', 'total_column_water', 'total_column_water_vapour', 'total_precipitation', 'total_sky_direct_solar_radiation_at_surface', 'total_totals_index', 'trapping_layer_base_height', 'trapping_layer_top_height', 'type_of_high_vegetation', 'type_of_low_vegetation', 'u_component_stokes_drift', 'uv_visible_albedo_for_diffuse_radiation', 'uv_visible_albedo_for_direct_radiation', 'v_component_stokes_drift', 'vertical_integral_of_divergence_of_cloud_frozen_water_flux', 'vertical_integral_of_divergence_of_cloud_liquid_water_flux', 'vertical_integral_of_divergence_of_geopotential_flux', 'vertical_integral_of_divergence_of_kinetic_energy_flux', 'vertical_integral_of_divergence_of_mass_flux', 'vertical_integral_of_divergence_of_moisture_flux', 'vertical_integral_of_divergence_of_ozone_flux', 'vertical_integral_of_divergence_of_thermal_energy_flux', 'vertical_integral_of_divergence_of_total_energy_flux', 'vertical_integral_of_eastward_cloud_frozen_water_flux', 'vertical_integral_of_eastward_cloud_liquid_water_flux', 'vertical_integral_of_eastward_geopotential_flux', 'vertical_integral_of_eastward_heat_flux', 'vertical_integral_of_eastward_kinetic_energy_flux', 'vertical_integral_of_eastward_mass_flux', 'vertical_integral_of_eastward_ozone_flux', 'vertical_integral_of_eastward_total_energy_flux', 'vertical_integral_of_eastward_water_vapour_flux', 'vertical_integral_of_energy_conversion', 'vertical_integral_of_kinetic_energy', 'vertical_integral_of_mass_of_atmosphere', 'vertical_integral_of_mass_tendency', 'vertical_integral_of_northward_cloud_frozen_water_flux', 'vertical_integral_of_northward_cloud_liquid_water_flux', 'vertical_integral_of_northward_geopotential_flux', 'vertical_integral_of_northward_heat_flux', 'vertical_integral_of_northward_kinetic_energy_flux', 'vertical_integral_of_northward_mass_flux', 'vertical_integral_of_northward_ozone_flux', 'vertical_integral_of_northward_total_energy_flux', 'vertical_integral_of_northward_water_vapour_flux', 'vertical_integral_of_potential_and_internal_energy', 'vertical_integral_of_potential_internal_and_latent_energy', 'vertical_integral_of_temperature', 'vertical_integral_of_thermal_energy', 'vertical_integral_of_total_energy', 'vertically_integrated_moisture_divergence', 'volumetric_soil_water_layer_1', 'volumetric_soil_water_layer_2', 'volumetric_soil_water_layer_3', 'volumetric_soil_water_layer_4', 'wave_spectral_directional_width', 'wave_spectral_directional_width_for_swell', 'wave_spectral_directional_width_for_wind_waves', 'wave_spectral_kurtosis', 'wave_spectral_peakedness', 'wave_spectral_skewness', 'zero_degree_level']],
FieldInfo(annotation=NoneType, required=True, alias_priority=2, validation_alias=AliasChoices(choices=['ecmwf:variable', 'variable']), serialization_alias='ecmwf:variable', title='Variable', description='Please, consult the product user guide in the documentation section for more information on these variables.', metadata=['json_schema_required'])
]
'ecmwf_year':  typing.Annotated[list[Literal['1940', ...]],  FieldInfo( 'required': True, 'alias': 'AliasChoices(choices=[''ecmwf:year", "year''])',  ... )] typing.Annotated[
list[typing.Literal['1940', '1941', '1942', '1943', '1944', '1945', '1946', '1947', '1948', '1949', '1950', '1951', '1952', '1953', '1954', '1955', '1956', '1957', '1958', '1959', '1960', '1961', '1962', '1963', '1964', '1965', '1966', '1967', '1968', '1969', '1970', '1971', '1972', '1973', '1974', '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983', '1984', '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992', '1993', '1994', '1995', '1996', '1997', '1998', '1999', '2000', '2001', '2002', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015', '2016', '2017', '2018', '2019', '2020', '2021', '2022', '2023', '2024', '2025', '2026']],
FieldInfo(annotation=NoneType, required=True, alias_priority=2, validation_alias=AliasChoices(choices=['ecmwf:year', 'year']), serialization_alias='ecmwf:year', title='Year', metadata=['json_schema_required'])
]
'end':  typing.Annotated[str,  FieldInfo( 'alias': 'end_datetime',  ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None, alias='end_datetime', alias_priority=2, description="Date/time as string in ISO 8601 format (e.g. '2024-06-10T12:00:00Z')")
]
'start':  typing.Annotated[str,  FieldInfo( 'alias': 'AliasChoices(choices=[''start_datetime", "datetime''])',  ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None, alias=AliasChoices(choices=['start_datetime', 'datetime']), alias_priority=2, description="Date/time as string in ISO 8601 format (e.g. '2024-06-10T12:00:00Z')")
]

Queryables validation#

The result returned by the list_queryables method can also be used to validate input parameters using the get_model method of the QueryablesDict object and the pydantic method model_validate:

[14]:
queryables = dag.list_queryables(
    collection="ERA5_SL",
    provider="cop_cds",
)
queryables.get_model().model_validate(
    {
        "collection": "ERA5_SL",
        "ecmwf:product_type": ["reanalysis"],
        "ecmwf:variable": ["2m_temperature"],
        "ecmwf:data_format": "grib",
        "ecmwf:download_format": "unarchived",
        "ecmwf:year": ["2025"],
        "ecmwf:month": ["02"],
        "ecmwf:day": ["05"],
        "ecmwf:time": ["00:00"]
    }
)
[14]:
Queryables(ecmwf_area=[90, -90, 180, -180], ecmwf_data_format='grib', ecmwf_day=['05'], ecmwf_download_format='unarchived', ecmwf_month=['02'], ecmwf_product_type=['reanalysis'], ecmwf_time=['00:00'], ecmwf_variable=['2m_temperature'], ecmwf_year=['2025'], end=None, start=None)

In this example, we gave expected search parameters to pydantic.BaseModel.model_validate method to check if they match with queryables constraints.

No error occured because ["2025"] is a valid value for the parameter ecmwf:year and a model object is returned. If we change ecmwf:year to an invalid value, we can see that an error is raised:

[15]:
queryables.get_model().model_validate(
    {
        "collection": "ERA5_SL",
        "ecmwf:product_type": ["reanalysis"],
        "ecmwf:variable": ["2m_temperature"],
        "ecmwf:data_format": "grib",
        "ecmwf:download_format": "unarchived",
        "ecmwf:year": ["3025"],
        "ecmwf:month": ["02"],
        "ecmwf:day": ["05"],
        "ecmwf:time": ["00:00"]
    }
)
ValidationError: 1 validation error for Queryables
ecmwf:year.0
  Input should be '1940', '1941', '1942', '1943', '1944', '1945', '1946', '1947', '1948', '1949', '1950', '1951', '1952', '1953', '1954', '1955', '1956', '1957', '1958', '1959', '1960', '1961', '1962', '1963', '1964', '1965', '1966', '1967', '1968', '1969', '1970', '1971', '1972', '1973', '1974', '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983', '1984', '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992', '1993', '1994', '1995', '1996', '1997', '1998', '1999', '2000', '2001', '2002', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015', '2016', '2017', '2018', '2019', '2020', '2021', '2022', '2023', '2024', '2025' or '2026' [type=literal_error, input_value='3025', input_type=str]
    For further information visit https://errors.pydantic.dev/2.13/v/literal_error

The same validation can also be directly performed through search() method (validate parameter is set to True by default). It checks queryables before performing the request:

[16]:
dag.search(**{
    "collection": "ERA5_SL",
    "ecmwf:product_type": ["reanalysis"],
    "ecmwf:variable": ["2m_temperature"],
    "ecmwf:data_format": "grib",
    "ecmwf:download_format": "unarchived",
    "ecmwf:year": ["3025"],
    "ecmwf:month": ["02"],
    "ecmwf:day": ["05"],
    "ecmwf:time": ["00:00"],
    "raise_errors": True
})
ValidationError: ("ecmwf:year=['3025'] is not available with ecmwf:product_type=['reanalysis'], ecmwf:variable=['2m_temperature']. Allowed values are 2014, 1968, 2023, 2005, 1956, 1973, 1986, 1949, 1981, 1966, 2025, 2022, 1984, 1983, 1990, 1998, 1965, 1987, 1988, 1960, 1953, 1980, 1955, 2013, 2015, 2008, 1989, 1969, 2018, 1961, 1996, 1944, 2017, 1941, 1971, 1962, 2007, 1967, 1954, 1977, 2024, 2002, 2006, 1982, 1976, 1964, 2001, 1959, 1985, 2026, 2011, 1972, 1979, 1958, 1951, 1992, 1974, 2004, 2012, 2016, 1970, 1952, 2021, 1993, 1945, 1946, 2003, 1975, 2009, 2000, 1940, 1943, 1997, 1995, 2010, 2020, 1963, 1942, 1950, 1991, 1978, 1957, 1999, 1994, 1947, 2019, 1948.", {'variable', 'product_type', 'ecmwf:year'})

Queryables from Collection#

As mentioned respectively in this section and in this one, since v4.0.0, list_collections() and guess_collection() return a list of Collection instances, each of it exposing the same list_queryables() method. Here is an example with list_collections().

[17]:
cop_dataspace_internal_catalog = dag.list_collections(provider="cop_dataspace", fetch_providers=False)
a_collection = cop_dataspace_internal_catalog[0]
a_collection
[17]:
Collection("S1_AUX_GNSSRD")
id: 'S1_AUX_GNSSRD',
title: 'SENTINEL1 Auxiliary Product',
description: 'The Auxiliary (AUX) product contains the precise orbit ephemerides and the GNSS-Raw Data (GNSSRD) data. The precise orbit ephemerides are provided as a text file in the format of the International GNSS Service (IGS). The GNSS-Raw Data (GNSSRD) data is provided as a binary file in a specific format. SAFE formatted product, see https://sentinel.esa.int/web/sentinel/user-guides/sentinel-1-sar/data-formats/safe-specification ',
extent: { 'spatial': { 'bbox': [[-180.0 , -90.0 , 180.0 , 90.0 ] ] } , 'temporal': { 'interval': [[2014-04-06 00:00:00+00:00 , None ] ] } },
keywords: ['SAR' , 'SENTINEL' , 'SENTINEL1' , 'S1' , 'S1A' , 'S1B' , 'S1C' , 'AUX' , 'GNSSRD' , 'SAFE' ],
license: 'other',
providers: [{ 'name': 'European Space Agency (ESA)' , 'roles': ['producer' , 'processor' , 'licensor' ] , 'url': 'https://earth.esa.int' } ],
constellation: 'SENTINEL1',
instruments: ['SAR' ],
platform: 'S1A,S1B,S1C',
processing:level: 'AUX',
eodag:sensor_type: 'RADAR',
[18]:
a_collection.list_queryables(provider="cop_dataspace")
[18]:
QueryablesDict (21) - additional_properties=True
'collection':  typing.Annotated[str,  FieldInfo('default': 'S1_AUX_GNSSRD',  ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default='S1_AUX_GNSSRD')
]
'constellation':  typing.Annotated[str,  FieldInfo( ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None)
]
'end':  typing.Annotated[str,  FieldInfo( 'alias': 'end_datetime',  ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None, alias='end_datetime', alias_priority=2, description="Date/time as string in ISO 8601 format (e.g. '2024-06-10T12:00:00Z')")
]
'geom':  typing.Annotated[str | dict[str, ...] | BaseGeometry,  FieldInfo( 'alias': 'AliasChoices(choices=[''geometry", "intersects''])',  ... )] typing.Annotated[
str | dict[str, float] | shapely.geometry.base.BaseGeometry,
FieldInfo(annotation=NoneType, required=False, default=None, alias=AliasChoices(choices=['geometry', 'intersects']), alias_priority=2, description='Read EODAG documentation for all supported geometry format.')
]
'gsd':  typing.Annotated[float,  FieldInfo( ... )] typing.Annotated[
float,
FieldInfo(annotation=NoneType, required=False, default=None, metadata=[Gt(gt=0)])
]
'id':  typing.Annotated[str,  FieldInfo( ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None)
]
'instruments':  typing.Annotated[list[str],  FieldInfo( ... )] typing.Annotated[
list[str],
FieldInfo(annotation=NoneType, required=False, default=None)
]
'platform':  typing.Annotated[str,  FieldInfo( ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None)
]
'providers':  typing.Annotated[list[Provider],  FieldInfo( ... )] typing.Annotated[
list[stac_pydantic.shared.Provider],
FieldInfo(annotation=NoneType, required=False, default=None)
]
'start':  typing.Annotated[str,  FieldInfo( 'alias': 'AliasChoices(choices=[''start_datetime", "datetime''])',  ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None, alias=AliasChoices(choices=['start_datetime', 'datetime']), alias_priority=2, description="Date/time as string in ISO 8601 format (e.g. '2024-06-10T12:00:00Z')")
]
'updated':  typing.Annotated[datetime,  FieldInfo( ... )] typing.Annotated[
datetime.datetime,
FieldInfo(annotation=NoneType, required=False, default=None)
]
'grid_code':  typing.Annotated[str,  FieldInfo( 'alias': 'grid:code',  ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None, alias='grid:code', metadata=[{'extension': 'GridExtension'}, _PydanticGeneralMetadata(pattern='^[A-Z0-9]+-[-_.A-Za-z0-9]+$')])
]
'processing_facility':  typing.Annotated[str,  FieldInfo( 'alias': 'processing:facility',  ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None, alias='processing:facility', metadata=[{'extension': 'ProcessingExtension'}])
]
'processing_level':  typing.Annotated[str,  FieldInfo( 'alias': 'processing:level',  ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None, alias='processing:level', metadata=[{'extension': 'ProcessingExtension'}])
]
'product_timeliness':  typing.Annotated[str,  FieldInfo( 'alias': 'product:timeliness',  ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None, alias='product:timeliness', metadata=[{'extension': 'ProductExtension'}])
]
'product_type':  typing.Annotated[str,  FieldInfo( 'alias': 'product:type',  ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None, alias='product:type', metadata=[{'extension': 'ProductExtension'}])
]
'sar_instrument_mode':  typing.Annotated[str,  FieldInfo( 'alias': 'sar:instrument_mode',  ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None, alias='sar:instrument_mode', metadata=[{'extension': 'SarExtension'}])
]
'sar_polarizations':  typing.Annotated[list[str],  FieldInfo( 'alias': 'sar:polarizations',  ... )] typing.Annotated[
list[str],
FieldInfo(annotation=NoneType, required=False, default=None, alias='sar:polarizations', metadata=[{'extension': 'SarExtension'}])
]
'sat_absolute_orbit':  typing.Annotated[int,  FieldInfo( 'alias': 'sat:absolute_orbit',  ... )] typing.Annotated[
int,
FieldInfo(annotation=NoneType, required=False, default=None, alias='sat:absolute_orbit', metadata=[{'extension': 'SatelliteExtension'}])
]
'sat_orbit_state':  typing.Annotated[str,  FieldInfo( 'alias': 'sat:orbit_state',  ... )] typing.Annotated[
str,
FieldInfo(annotation=NoneType, required=False, default=None, alias='sat:orbit_state', metadata=[{'extension': 'SatelliteExtension'}])
]
'sat_relative_orbit':  typing.Annotated[int,  FieldInfo( 'alias': 'sat:relative_orbit',  ... )] typing.Annotated[
int,
FieldInfo(annotation=NoneType, required=False, default=None, alias='sat:relative_orbit', metadata=[{'extension': 'SatelliteExtension'}])
]