{"openapi":"3.0.1","info":{"title":"DVAS API","description":"This is the DVAS metadata API. To access the protected endpoints, a user account is required.","contact":{"name":"DVAS admin","email":"ebas@nilu.no"},"version":"v3"},"servers":[{"url":"https://prod-actris-md.nilu.no"}],"tags":[{"name":"Facilities","description":"Operations related to facilities"},{"name":"Authentication","description":"Operations related to authentication"},{"name":"Compatibility","description":"Operations for clients that have special requirements"},{"name":"Version","description":"Operations related to versioning"},{"name":"Metadata","description":"Operations related to metadata"}],"paths":{"/api/provider/metadata/delete":{"post":{"tags":["Metadata"],"summary":"Delete metadata records in bulk.","description":"The user must have either the metadata_provider or metadata_admin roles. If the user has only the role metadata_provider the user can only delete metadata belonging to the metadata provider","operationId":"deleteBulk","requestBody":{"content":{"application/json":{"schema":{"type":"array","items":{"type":"string"}}}},"required":true},"responses":{"204":{"description":"Metadata records deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResultDto"}}}},"206":{"description":"Partially deleted. Some PIDs not deleted due to authorization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResultDto"}}}},"401":{"description":"Unauthorised. No metadata records deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResultDto"}}}}},"security":[{"bearerAuth":[]}]}},"/api/provider/metadata/add":{"post":{"tags":["Metadata"],"summary":"Add metadata to the repository in bulk","description":"This operation requires that the user has the metadata_provider role.","operationId":"addBulk","requestBody":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Metadata"}}}},"required":true},"responses":{"200":{"description":"OK"}},"security":[{"bearerAuth":[]}]}},"/api/provider/facilities/update":{"post":{"tags":["Facilities"],"summary":"Update a facility","description":"This operation requires that the user has the facility_admin role.","operationId":"updateFacility","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Facility"}}},"required":true},"responses":{"200":{"description":"OK"}},"security":[{"bearerAuth":[]}]}},"/api/provider/facilities/add":{"post":{"tags":["Facilities"],"summary":"Add a facility.","description":"This operation requires that the user has the facility_admin role.","operationId":"addFacility","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Facility"}}},"required":true},"responses":{"200":{"description":"OK"}},"security":[{"bearerAuth":[]}]}},"/api/metadata/search":{"get":{"tags":["Metadata"],"summary":"Search for metadata records using a query string","description":"Searches for metadata records that match a query. Does exactly the same as the POST variant.\n\nSimple example:\n```python\nfrom textwrap import shorten # 'shorten' is used to reduce the size of the source parameter\nfrom urllib.parse import quote\nimport requests\n\nquery=quote(shorten(\"\"\"{\n    \"query\": {\n        \"match\": {\n            \"facility.identifier\": \"9cxe\"\n        }\n    }\n}\"\"\", width=1024)) # 'width' must be large enough to fit the shortened string\n\nparams={\n    \"source\": query\n}\n\nr = requests.get(\"http://dvas.local/api/metadata/search\", params=params)\nprint(r.json())\n```\n\nPaginated example:\n```python\nfrom textwrap import shorten  # 'shorten' is used to reduce the size of the source parameter\nfrom urllib.parse import quote\nimport requests\n\n\ndef initial_query():\n    query = quote(shorten(\"\"\"{\n        \"query\": {\n            \"match\": {\n                \"facility.identifier\": \"9cxe\"\n            }\n        },\n        \"sort\": [\n            { \"field_name\": \"dataset_metadata.time_metadata_created\", \"order\": \"desc\" },\n            { \"field_name\": \"identification.identifier.pid.keyword\", \"order\": \"desc\" }\n        ]\n    }\"\"\", width=1024))  # 'width' must be large enough to fit the shortened string\n\n    params = {\n        \"source\": query\n    }\n\n    r = requests.get(\"http://dvas.local/api/metadata/search\", params=params)\n    r.raise_for_status()\n    return r.json()\n\n\ndef next_query(ts, pid):\n    query = quote(shorten(\"\"\"{\n        \"query\": {\n            \"match\": {\n                \"facility.identifier\": \"9cxe\"\n            }\n        },\n        \"search_after\": [\\\"%s\\\", \\\"%s\\\"],\n        \"sort\": [\n            { \"field_name\": \"dataset_metadata.time_metadata_created\", \"order\": \"desc\" },\n            { \"field_name\": \"identification.identifier.pid.keyword\", \"order\": \"desc\" }\n        ]\n    }\"\"\", width=1024))  # As before, 'width' must be large enough to fit the shortened string\n\n    params = {\n        \"source\": query % (ts, pid,)\n    }\n\n    r = requests.get(\"http://dvas.local/api/metadata/search\", params=params)\n    return r.json()\n\n\nr = initial_query()\n\nwhile len(r) > 0:\n    print(r)\n    r = next_query(\n        ts=r[-1][\"dataset_metadata\"][\"time_metadata_created\"],\n        pid=r[-1][\"identification\"][\"identifier\"][\"pid\"]\n    )\n\n```","operationId":"getSearch","parameters":[{"name":"source","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetadataResultDto"}}}}}},"post":{"tags":["Metadata"],"summary":"Search for metadata records","description":"Searches for metadata records that match a query. The query syntax is plain ElasticSearch queries. For information\non the syntax of ElasticSearch queries, see https://www.elastic.co/docs/reference\n\nTo allow for efficient pagination of large result sets it is recommended to use the search_after feature. For example,\nwe can start with following query: <br/>\n```json\n{\n  \"query\": {\n    \"bool\": {\n      \"must\": [\n        {\n          \"match\": {\n            \"dataset_metadata.repository.repository_id\": \"In-Situ\"\n          }\n        },\n        {\n          \"range\": {\n            \"temporal_extent.time_period_begin\": {\n              \"gte\": \"2013-01-01\",\n              \"lte\": \"2023-01-01\"\n            }\n          }\n        }\n      ]\n    }\n  },\n  \"sort\": [\n    {\n      \"dataset_metadata.time_file_created\": {\n        \"order\": \"desc\"\n      }\n    },\n    {\n      \"identification.identifier.pid.keyword\": {\n        \"order\": \"desc\"\n      }\n    }\n  ]\n}\n```\n\nYou would then continue to get more documents by using a modified query that would look like this:\n\n```json\n{\n  \"query\": {\n    \"bool\": {\n      \"must\": [\n        {\n          \"match\": {\n            \"dataset_metadata.repository.repository_id\": \"In-Situ\"\n          }\n        },\n        {\n          \"range\": {\n            \"temporal_extent.time_period_begin\": {\n              \"gte\": \"2013-01-01\",\n              \"lte\": \"2023-01-01\"\n            }\n          }\n        }\n      ]\n    }\n  },\n  \"sort\": [\n    {\"dataset_metadata.time_file_created\": {\"order\": \"desc\"}},\n    {\"identification.identifier.pid.keyword\": {\"order\": \"desc\"}}\n  ],\n  \"search_after\": [\n    1761572254869,\n    \"https://doi.org/10.48597/VKS6-7KCS\"\n  ]\n}\n```\nThis query is the same as the initial query with an addition field called \"search_after\". This contains the \"sort\"\nvalues from the ElasticSearch response object. Also, it is important to not change the search field or the order\nwhile paginating. The last sort value must be a tie-breaker, such as an id.\n\nCode sample:\n```python\n#!/usr/bin/env python3\n\nimport json\nimport requests\n\nurl = \"https://dev-actris-md.nilu.no/api\"\n\nq = {\n    \"search\": {\n        \"query\": {\n            \"bool\": {\n                \"must\": [\n                    {\"match\": {\"dataset_metadata.repository.repository_id\": \"In-Situ\"}},\n                    {\n                        \"range\": {\n                            \"temporal_extent.time_period_begin\": {\n                                \"gte\": \"2013-01-01\",\n                                \"lte\": \"2023-01-01\",\n                            }\n                        }\n                    },\n                ]\n            }\n        },\n        \"sort\": [\n            {\"dataset_metadata.time_file_created\": {\"order\": \"desc\"}},\n            {\"identification.identifier.pid.keyword\": {\"order\": \"desc\"}},\n        ],\n    }\n}\n\ntry:\n    r = requests.post(url + \"/metadata/search/new\", json=q, timeout=30)\n    r.raise_for_status()\n    result = r.json()\n\n    print(json.dumps(result, indent=2))\n\n    max_hits = result[\"response\"][\"hits\"][\"total\"][\"value\"]\n    total_processed = 0\n\n    while len(result[\"response\"][\"hits\"][\"hits\"]) > 0:\n        total_processed += len(result[\"response\"][\"hits\"][\"hits\"])\n        print(f\"Processed {total_processed} of {max_hits} hits...\")\n\n        q[\"search\"][\"search_after\"] = result[\"response\"][\"hits\"][\"hits\"][-1][\"sort\"]\n\n        r = requests.post(url + \"/metadata/search/new\", json=q, timeout=30)\n        r.raise_for_status()\n        result = r.json()\n\n        print(json.dumps(result, indent=2))\n    print(f\"Total processed: {total_processed}\")\nexcept requests.RequestException as e:\n    result = {\"error\": str(e)}\n\n```\nThe API wraps the ElasticSearch queries and responses in custom object to allow for potential future expansions. But\ntheir content is unmodified ElasticSearch objects.","operationId":"postSearch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryDto"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetadataResultDto"}}}}}}},"/api/auth/token":{"post":{"tags":["Authentication"],"summary":"Authenticate a user","description":"This operation authenticates a user. The operation will return access token\nthe expiry time. A session will be created that exists for the duration of the\ntoken's lifetime. If a user requires to use the API for longer than the token lifetime,\nit is up to the user to re-authenticate before the access token expires. The current lifetime\nof an access token is 5 minutes.\n\nCode example:\n```python\nimport asyncio\nimport httpx\n\nasync def login(username: str, password: str) -> dict[str, str | int]:\n    async with httpx.AsyncClient() as client:\n        result = await client.post(\n                    \"http://dvas.local/api/auth/token\",\n                    json={\n                        \"username\": username,\n                        \"password\": password,\n                    },\n                )\n                result.raise_for_status()\n                return result.json()\n\nasync def do_something(token):\n    facility_info = {...} # Imagine this contains information about a facility\n\n    async with httpx.AsyncClient() as client:\n        result = await client.post(\n            \"http://dvas.local/api/facilities/add\",\n            json=facility_info,\n            headers={\n                \"Authorization\": f\"Bearer {token['access_token']}\"\n            }\n        )\n\n        result.raise_for_status()\n        return result.json()\n\nasync def main():\n    token = await login(\"foo\", \"bar\")\n    await do_something(token)\n\nasyncio.run(main())\n```","operationId":"login","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginDto"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/version":{"get":{"tags":["Version"],"operationId":"getVersion","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"string"}}}}}}}},"/api/facilities":{"get":{"tags":["Facilities"],"summary":"Fetch a list of facilities","description":"Fetch a list of facilities","operationId":"getFacilities","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Facility"}}}}}}}},"/api/facilities/{facilityId}":{"get":{"tags":["Facilities"],"summary":"Fetch a facility","description":"Fetch a single facility with a given id","operationId":"getFacility","parameters":[{"name":"facilityId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Facility"}}}}}}},"/api/compat/metadata/search/envri":{"get":{"tags":["Compatibility"],"summary":"Search for metadata records","operationId":"envriSearch","parameters":[{"name":"time_range_start","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"time_range_end","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"variables","in":"query","required":true,"schema":{"type":"array","items":{"type":"string"}}},{"name":"north_bound_latitude","in":"query","required":true,"schema":{"type":"number","format":"double"}},{"name":"west_bound_longitude","in":"query","required":true,"schema":{"type":"number","format":"double"}},{"name":"south_bound_latitude","in":"query","required":true,"schema":{"type":"number","format":"double"}},{"name":"east_bound_longitude","in":"query","required":true,"schema":{"type":"number","format":"double"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompatMetadataResultDto"}}}}}}},"/api/provider/facilities/{facilityId}":{"delete":{"tags":["Facilities"],"summary":"Delete a facility","description":"This operation requires that the user has the facility_admin role.","operationId":"delete","parameters":[{"name":"facilityId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}},"security":[{"bearerAuth":[]}]}}},"components":{"schemas":{"DeleteResultDto":{"required":["deleted","notAllowedToDelete"],"type":"object","properties":{"deleted":{"uniqueItems":true,"type":"array","items":{"type":"string"}},"notAllowedToDelete":{"uniqueItems":true,"type":"array","items":{"type":"string"}}}},"AccessRestriction":{"required":["restricted"],"type":"object","properties":{"restricted":{"type":"boolean"},"description_url":{"type":"string"},"description":{"type":"string"}}},"Constraint":{"type":"object","properties":{"constraint":{"type":"string"}}},"DataQuality":{"type":"object","properties":{"validtime_start":{"type":"string","format":"date-time"},"validtime_end":{"type":"string","format":"date-time"},"approval":{"type":"string"},"compliance":{"type":"string"},"quality_control_extent":{"type":"string"},"quality_control_mechanism":{"type":"string"},"quality_control_outcome":{"type":"string"},"statement":{"type":"string"}}},"DatasetMetadata":{"required":["repository","time_content_revised"],"type":"object","properties":{"repository":{"$ref":"#/components/schemas/Repository"},"time_file_created":{"type":"string","format":"date-time"},"time_metadata_created":{"type":"string","format":"date-time"},"time_content_revised":{"type":"string","format":"date-time"},"version":{"$ref":"#/components/schemas/Version"}}},"DistributionInformation":{"type":"object","properties":{"data_format":{"type":"string"},"dataset_url":{"type":"string"},"protocol":{"type":"string"},"access_restriction":{"$ref":"#/components/schemas/AccessRestriction"},"transfersize":{"$ref":"#/components/schemas/TransferSize"}}},"Experiment":{"required":["experiment_type"],"type":"object","properties":{"experiment_type":{"type":"string"},"experiment_technique":{"type":"string"}}},"ExtraFacility":{"type":"object","properties":{"insitu":{"$ref":"#/components/schemas/ExtraFacilityInsitu"}}},"ExtraFacilityInsitu":{"required":["ebas_country_code","ebas_station_code","ebas_station_name"],"type":"object","properties":{"ebas_station_code":{"type":"string"},"ebas_station_name":{"type":"string"},"ebas_station_lat":{"type":"number","format":"double"},"ebas_station_lon":{"type":"number","format":"double"},"ebas_station_alt":{"type":"number","format":"double"},"ebas_country_code":{"type":"string"}}},"ExtraFramework":{"type":"object","properties":{"insitu":{"$ref":"#/components/schemas/ExtraFrameworkInsitu"}}},"ExtraFrameworkInsitu":{"required":["ebas_framework"],"type":"object","properties":{"ebas_framework":{"type":"string"}}},"ExtraInstrument":{"type":"object","properties":{"insitu":{"$ref":"#/components/schemas/ExtraInstrumentInsitu"}}},"ExtraInstrumentInsitu":{"required":["ebas_instrument_ref"],"type":"object","properties":{"ebas_instrument_ref":{"type":"string"},"ebas_instrument_type":{"type":"string"},"ebas_instrument_manufacturer":{"type":"string"},"ebas_instrument_model":{"type":"string"},"ebas_instrument_serialno":{"type":"string"}}},"ExtraMethod":{"type":"object","properties":{"insitu":{"$ref":"#/components/schemas/ExtraMethodInsitu"}}},"ExtraMethodInsitu":{"required":["ebas_method_ref"],"type":"object","properties":{"ebas_method_ref":{"type":"string"},"ebas_standard_method":{"type":"string"}}},"ExtraVariable":{"type":"object","properties":{"insitu":{"$ref":"#/components/schemas/ExtraVariableInsitu"}}},"ExtraVariableInsitu":{"required":["ebas_component_name","ebas_matrix","ebas_unit","nc_varname"],"type":"object","properties":{"ebas_matrix":{"type":"string"},"ebas_component_name":{"type":"string"},"ebas_unit":{"type":"string"},"nc_varname":{"type":"string"}}},"Facility":{"required":["identifier"],"type":"object","properties":{"identifier":{"type":"string"},"name":{"type":"string"},"facility_type":{"type":"array","items":{"type":"string"}},"location":{"$ref":"#/components/schemas/Point"},"country_code":{"type":"string"},"wmo_region":{"type":"string"},"uri":{"type":"string"},"identifier_type":{"type":"string"},"active":{"type":"boolean"},"actris_national_facility":{"type":"string"},"actris_nf_uri":{"type":"string"},"gawid_uri":{"type":"string"},"contact_person":{"$ref":"#/components/schemas/Person"},"contact_organisation":{"$ref":"#/components/schemas/OrganisationDetails"},"description":{"type":"string"},"surroundings":{"type":"string"},"operational_since":{"type":"string"},"extra_metadata":{"$ref":"#/components/schemas/ExtraFacility"}}},"Framework":{"type":"object","properties":{"validtime_start":{"type":"string","format":"date-time"},"validtime_end":{"type":"string","format":"date-time"},"framework":{"type":"string"},"extra_metadata":{"$ref":"#/components/schemas/ExtraFramework"}}},"Identification":{"required":["abstract","identifier","title"],"type":"object","properties":{"identifier":{"$ref":"#/components/schemas/Identifier"},"title":{"type":"string"},"abstract":{"type":"string"},"roles":{"type":"array","items":{"$ref":"#/components/schemas/Role"}},"organisations":{"type":"array","items":{"$ref":"#/components/schemas/OrganisationRole"}}}},"Identifier":{"required":["pid","pid_type"],"type":"object","properties":{"pid":{"type":"string"},"pid_type":{"type":"string"}}},"Instrument":{"required":["instrument_type"],"type":"object","properties":{"validtime_start":{"type":"string","format":"date-time"},"validtime_end":{"type":"string","format":"date-time"},"instrument_pid":{"type":"string"},"instrument_type":{"type":"string"},"instrument_manufacturer":{"type":"string"},"instrument_model":{"type":"string"},"instrument_name":{"type":"string"},"extra_metadata":{"$ref":"#/components/schemas/ExtraInstrument"}}},"LineString":{"required":["coordinates","type"],"type":"object","allOf":[{"$ref":"#/components/schemas/SpatialExtent"},{"type":"object","properties":{"type":{"type":"string"},"coordinates":{"type":"array","items":{"type":"array","items":{"type":"number","format":"double"}}},"bbox":{"type":"array","items":{"type":"number","format":"double"}}}}]},"Metadata":{"required":["dataset_metadata","distribution_information","identification","product_type","usage_information","variables"],"type":"object","properties":{"dataset_metadata":{"$ref":"#/components/schemas/DatasetMetadata"},"identification":{"$ref":"#/components/schemas/Identification"},"usage_information":{"$ref":"#/components/schemas/UsageInformation"},"product_type":{"type":"string"},"facility":{"$ref":"#/components/schemas/Facility"},"spatial_extent":{"oneOf":[{"$ref":"#/components/schemas/SpatialExtent"},{"$ref":"#/components/schemas/LineString"},{"$ref":"#/components/schemas/MultiPoint"},{"$ref":"#/components/schemas/Point"},{"$ref":"#/components/schemas/Polygon"}]},"temporal_extent":{"$ref":"#/components/schemas/TemporalExtent"},"variables":{"type":"array","items":{"$ref":"#/components/schemas/Variable"}},"distribution_information":{"type":"array","items":{"$ref":"#/components/schemas/DistributionInformation"}},"provenance":{"type":"array","items":{"$ref":"#/components/schemas/Provenance"}}}},"Method":{"type":"object","properties":{"title":{"type":"string"},"pid":{"type":"string"},"extra_metadata":{"$ref":"#/components/schemas/ExtraMethod"}}},"Model":{"required":["model_type"],"type":"object","properties":{"model_type":{"type":"string"}}},"MultiPoint":{"required":["coordinates","type"],"type":"object","allOf":[{"$ref":"#/components/schemas/SpatialExtent"},{"type":"object","properties":{"type":{"type":"string"},"coordinates":{"type":"array","items":{"type":"array","items":{"type":"number","format":"double"}}},"bbox":{"type":"array","items":{"type":"number","format":"double"}}}}]},"OrganisationDetails":{"required":["name"],"type":"object","properties":{"name":{"type":"string"},"pid":{"type":"string"},"pid_type":{"type":"string"},"country_code":{"type":"string"}}},"OrganisationRole":{"type":"object","properties":{"role_code":{"type":"string"},"organisation":{"$ref":"#/components/schemas/OrganisationDetails"}}},"Person":{"type":"object","properties":{"first_name":{"type":"string"},"last_name":{"type":"string"},"affiliation":{"$ref":"#/components/schemas/OrganisationDetails"},"orcid":{"type":"string"}}},"Point":{"required":["coordinates","type"],"type":"object","allOf":[{"$ref":"#/components/schemas/SpatialExtent"},{"type":"object","properties":{"type":{"type":"string"},"coordinates":{"type":"array","items":{"type":"number","format":"double"}},"bbox":{"type":"array","items":{"type":"number","format":"double"}}}}]},"Polygon":{"required":["coordinates","type"],"type":"object","allOf":[{"$ref":"#/components/schemas/SpatialExtent"},{"type":"object","properties":{"type":{"type":"string"},"coordinates":{"type":"array","items":{"type":"array","items":{"type":"array","items":{"type":"number","format":"double"}}}},"bbox":{"type":"array","items":{"type":"number","format":"double"}}}}]},"Provenance":{"type":"object","properties":{"title":{"type":"string"},"pid":{"type":"string"},"url":{"type":"string"}}},"Repository":{"required":["repository_id"],"type":"object","properties":{"repository_id":{"type":"string"},"repository_name":{"type":"string"},"repository_description":{"type":"string"},"repository_contact":{"type":"array","items":{"$ref":"#/components/schemas/Person"}}}},"Role":{"type":"object","properties":{"role_code":{"type":"array","items":{"type":"string"}},"person":{"$ref":"#/components/schemas/Person"}}},"SpatialExtent":{"required":["type"],"type":"object","properties":{"type":{"type":"string"}},"discriminator":{"propertyName":"type"}},"TemporalExtent":{"required":["time_period_begin","time_period_end"],"type":"object","properties":{"time_period_begin":{"type":"string","format":"date-time"},"time_period_end":{"type":"string","format":"date-time"}}},"TransferSize":{"required":["size","unit"],"type":"object","properties":{"size":{"type":"number","format":"double"},"unit":{"type":"string"}}},"UsageInformation":{"required":["citation"],"type":"object","properties":{"data_licence":{"type":"string"},"metadata_licence":{"type":"string"},"citation":{"type":"string"},"acknowledgement":{"type":"string"}}},"Variable":{"required":["variable_matrix","variable_name"],"type":"object","properties":{"variable_name":{"type":"string"},"variable_property_of_interest":{"type":"string"},"object_of_interest":{"type":"string"},"variable_matrix":{"type":"string"},"variable_statistical_property":{"type":"string"},"variable_geometry":{"type":"string"},"variable_constraints":{"type":"array","items":{"$ref":"#/components/schemas/Constraint"}},"timeliness":{"type":"string"},"instrument":{"type":"array","items":{"$ref":"#/components/schemas/Instrument"}},"experiment":{"$ref":"#/components/schemas/Experiment"},"model":{"$ref":"#/components/schemas/Model"},"data_quality_control":{"type":"array","items":{"$ref":"#/components/schemas/DataQuality"}},"framework":{"type":"array","items":{"$ref":"#/components/schemas/Framework"}},"method":{"$ref":"#/components/schemas/Method"},"temporal_resolution":{"type":"string"},"extra_metadata":{"$ref":"#/components/schemas/ExtraVariable"}}},"Version":{"type":"object","properties":{"number":{"type":"string"},"description":{"type":"string"}}},"JsonNode":{"type":"object"},"QueryDto":{"type":"object","properties":{"search":{"$ref":"#/components/schemas/JsonNode"}}},"MetadataResultDto":{"required":["response"],"type":"object","properties":{"response":{"$ref":"#/components/schemas/JsonNode"}}},"LoginDto":{"required":["password","username"],"type":"object","properties":{"username":{"type":"string"},"password":{"type":"string"}}},"CompatMetadataResultDto":{"required":["hitCount","hits","totalHits"],"type":"object","properties":{"hits":{"type":"array","items":{"$ref":"#/components/schemas/Metadata"}},"totalHits":{"type":"integer","format":"int32"},"hitCount":{"type":"integer","format":"int32"}}}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}}}