From 691d16c9b393c7aab9b61b0e9012653d0bc11b13 Mon Sep 17 00:00:00 2001 From: amarcozzi Date: Wed, 14 Jan 2026 10:10:12 -0700 Subject: [PATCH] update client library --- fastfuels_sdk/client_library/__init__.py | 10 + .../client_library/api/road_feature_api.py | 304 +++++++++++++++++- .../client_library/api/surface_grid_api.py | 6 +- .../client_library/api/water_feature_api.py | 304 +++++++++++++++++- fastfuels_sdk/client_library/api_spec.json | 2 +- .../client_library/models/__init__.py | 5 + .../models/feature_data_response.py | 119 +++++++ .../client_library/models/geometry1.py | 140 ++++++++ .../client_library/models/modifier.py | 2 +- .../client_library/models/operator.py | 2 +- .../client_library/models/spatial_operator.py | 38 +++ .../client_library/models/spatial_target.py | 37 +++ .../surface_grid_modification_condition.py | 115 ++++--- ...ace_grid_modification_spatial_condition.py | 108 +++++++ 14 files changed, 1132 insertions(+), 60 deletions(-) create mode 100644 fastfuels_sdk/client_library/models/feature_data_response.py create mode 100644 fastfuels_sdk/client_library/models/geometry1.py create mode 100644 fastfuels_sdk/client_library/models/spatial_operator.py create mode 100644 fastfuels_sdk/client_library/models/spatial_target.py create mode 100644 fastfuels_sdk/client_library/models/surface_grid_modification_spatial_condition.py diff --git a/fastfuels_sdk/client_library/__init__.py b/fastfuels_sdk/client_library/__init__.py index fbd772d..8660d0c 100644 --- a/fastfuels_sdk/client_library/__init__.py +++ b/fastfuels_sdk/client_library/__init__.py @@ -70,6 +70,7 @@ "Export", "ExportStatus", "FBFM40", + "FeatureDataResponse", "FeatureGrid", "FeatureGridAttribute", "FeatureType", @@ -83,6 +84,7 @@ "GeoJsonCRSProperties", "Geojson", "Geometry", + "Geometry1", "GridAttributeMetadataResponse", "Grids", "HTTPValidationError", @@ -105,6 +107,8 @@ "RoadFeature", "RoadFeatureSource", "Scope", + "SpatialOperator", + "SpatialTarget", "SurfaceGrid", "SurfaceGridAttribute", "SurfaceGridFBFMSource", @@ -128,6 +132,7 @@ "SurfaceGridModificationFuelLoadCondition", "SurfaceGridModificationFuelMoistureAction", "SurfaceGridModificationFuelMoistureCondition", + "SurfaceGridModificationSpatialCondition", "SurfaceGridSAVRSource", "SurfaceGridUniformFBFM40Value", "SurfaceGridUniformValue", @@ -235,6 +240,7 @@ from fastfuels_sdk.client_library.models.export import Export as Export from fastfuels_sdk.client_library.models.export_status import ExportStatus as ExportStatus from fastfuels_sdk.client_library.models.fbfm40 import FBFM40 as FBFM40 +from fastfuels_sdk.client_library.models.feature_data_response import FeatureDataResponse as FeatureDataResponse from fastfuels_sdk.client_library.models.feature_grid import FeatureGrid as FeatureGrid from fastfuels_sdk.client_library.models.feature_grid_attribute import FeatureGridAttribute as FeatureGridAttribute from fastfuels_sdk.client_library.models.feature_type import FeatureType as FeatureType @@ -248,6 +254,7 @@ from fastfuels_sdk.client_library.models.geo_json_crs_properties import GeoJsonCRSProperties as GeoJsonCRSProperties from fastfuels_sdk.client_library.models.geojson import Geojson as Geojson from fastfuels_sdk.client_library.models.geometry import Geometry as Geometry +from fastfuels_sdk.client_library.models.geometry1 import Geometry1 as Geometry1 from fastfuels_sdk.client_library.models.grid_attribute_metadata_response import GridAttributeMetadataResponse as GridAttributeMetadataResponse from fastfuels_sdk.client_library.models.grids import Grids as Grids from fastfuels_sdk.client_library.models.http_validation_error import HTTPValidationError as HTTPValidationError @@ -270,6 +277,8 @@ from fastfuels_sdk.client_library.models.road_feature import RoadFeature as RoadFeature from fastfuels_sdk.client_library.models.road_feature_source import RoadFeatureSource as RoadFeatureSource from fastfuels_sdk.client_library.models.scope import Scope as Scope +from fastfuels_sdk.client_library.models.spatial_operator import SpatialOperator as SpatialOperator +from fastfuels_sdk.client_library.models.spatial_target import SpatialTarget as SpatialTarget from fastfuels_sdk.client_library.models.surface_grid import SurfaceGrid as SurfaceGrid from fastfuels_sdk.client_library.models.surface_grid_attribute import SurfaceGridAttribute as SurfaceGridAttribute from fastfuels_sdk.client_library.models.surface_grid_fbfm_source import SurfaceGridFBFMSource as SurfaceGridFBFMSource @@ -293,6 +302,7 @@ from fastfuels_sdk.client_library.models.surface_grid_modification_fuel_load_condition import SurfaceGridModificationFuelLoadCondition as SurfaceGridModificationFuelLoadCondition from fastfuels_sdk.client_library.models.surface_grid_modification_fuel_moisture_action import SurfaceGridModificationFuelMoistureAction as SurfaceGridModificationFuelMoistureAction from fastfuels_sdk.client_library.models.surface_grid_modification_fuel_moisture_condition import SurfaceGridModificationFuelMoistureCondition as SurfaceGridModificationFuelMoistureCondition +from fastfuels_sdk.client_library.models.surface_grid_modification_spatial_condition import SurfaceGridModificationSpatialCondition as SurfaceGridModificationSpatialCondition from fastfuels_sdk.client_library.models.surface_grid_savr_source import SurfaceGridSAVRSource as SurfaceGridSAVRSource from fastfuels_sdk.client_library.models.surface_grid_uniform_fbfm40_value import SurfaceGridUniformFBFM40Value as SurfaceGridUniformFBFM40Value from fastfuels_sdk.client_library.models.surface_grid_uniform_value import SurfaceGridUniformValue as SurfaceGridUniformValue diff --git a/fastfuels_sdk/client_library/api/road_feature_api.py b/fastfuels_sdk/client_library/api/road_feature_api.py index c63a7d9..2072a7e 100644 --- a/fastfuels_sdk/client_library/api/road_feature_api.py +++ b/fastfuels_sdk/client_library/api/road_feature_api.py @@ -16,9 +16,12 @@ from typing import Any, Dict, List, Optional, Tuple, Union from typing_extensions import Annotated -from pydantic import StrictStr, field_validator +from pydantic import Field, StrictStr, field_validator +from typing import Optional +from typing_extensions import Annotated from fastfuels_sdk.client_library.models.create_road_feature_request import CreateRoadFeatureRequest from fastfuels_sdk.client_library.models.export import Export +from fastfuels_sdk.client_library.models.feature_data_response import FeatureDataResponse from fastfuels_sdk.client_library.models.road_feature import RoadFeature from fastfuels_sdk.client_library.api_client import ApiClient, RequestSerialized @@ -1142,6 +1145,305 @@ def _get_road_feature_serialize( + @validate_call + def get_road_feature_data( + self, + domain_id: StrictStr, + page: Annotated[Optional[Annotated[int, Field(strict=True, ge=0)]], Field(description="The page number to retrieve. Page number is zero-indexed.")] = None, + size: Annotated[Optional[Annotated[int, Field(le=1000, strict=True, ge=1)]], Field(description="The number of resources to retrieve per page.")] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> FeatureDataResponse: + """Get Road Feature Data + + # Get Road Feature Data This endpoint retrieves paginated road feature data for a specific domain. Road feature data represents individual road segments and their attributes (e.g., road type, surface condition) in GeoJSON format. The road feature resource must be created and fully processed (status \"completed\") before data can be retrieved through this endpoint. ## Endpoint ``` GET /v1/domains/{domainId}/features/road/data ``` ## Path Parameters - `domainId` (string, required): The unique identifier of the domain for which you want to retrieve road feature data. ## Query Parameters - `page` (integer, optional): Zero-indexed page number. Must be greater than or equal to 0. Defaults to `0`. - `size` (integer, optional): Number of features to return per page. Valid range: `1` to `1000`. Defaults to `50`. ## Response If the request is successful, the endpoint will return a `200 OK` status code and a GeoJSON FeatureCollection with pagination metadata. The response body will contain: - `type` (string): Always \"FeatureCollection\". - `features` (array): Array of GeoJSON Feature objects representing individual road segments. - `currentPage` (integer): The current page number returned. - `pageSize` (integer): The number of features per page. - `totalItems` (integer): The total number of road features available in the domain. - `crs` (object, optional): Coordinate reference system information for the domain. ## Error Responses - `404 Not Found`: The specified domain does not exist, the user does not have access to it, or no road feature resource exists for this domain. - `422 Unprocessable Entity`: The road feature resource does not have status 'completed', or validation failed for query parameters. - `401 Unauthorized`: The request lacks valid authentication credentials. - `403 Forbidden`: The authenticated user does not have permission to access this domain. ## Usage Notes - The road feature resource must be created and have status 'completed' before data can be retrieved. - Use the pagination parameters to retrieve large datasets efficiently. - The `totalItems` field can be used to calculate the total number of pages available. + + :param domain_id: (required) + :type domain_id: str + :param page: The page number to retrieve. Page number is zero-indexed. + :type page: int + :param size: The number of resources to retrieve per page. + :type size: int + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._get_road_feature_data_serialize( + domain_id=domain_id, + page=page, + size=size, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "FeatureDataResponse", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def get_road_feature_data_with_http_info( + self, + domain_id: StrictStr, + page: Annotated[Optional[Annotated[int, Field(strict=True, ge=0)]], Field(description="The page number to retrieve. Page number is zero-indexed.")] = None, + size: Annotated[Optional[Annotated[int, Field(le=1000, strict=True, ge=1)]], Field(description="The number of resources to retrieve per page.")] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[FeatureDataResponse]: + """Get Road Feature Data + + # Get Road Feature Data This endpoint retrieves paginated road feature data for a specific domain. Road feature data represents individual road segments and their attributes (e.g., road type, surface condition) in GeoJSON format. The road feature resource must be created and fully processed (status \"completed\") before data can be retrieved through this endpoint. ## Endpoint ``` GET /v1/domains/{domainId}/features/road/data ``` ## Path Parameters - `domainId` (string, required): The unique identifier of the domain for which you want to retrieve road feature data. ## Query Parameters - `page` (integer, optional): Zero-indexed page number. Must be greater than or equal to 0. Defaults to `0`. - `size` (integer, optional): Number of features to return per page. Valid range: `1` to `1000`. Defaults to `50`. ## Response If the request is successful, the endpoint will return a `200 OK` status code and a GeoJSON FeatureCollection with pagination metadata. The response body will contain: - `type` (string): Always \"FeatureCollection\". - `features` (array): Array of GeoJSON Feature objects representing individual road segments. - `currentPage` (integer): The current page number returned. - `pageSize` (integer): The number of features per page. - `totalItems` (integer): The total number of road features available in the domain. - `crs` (object, optional): Coordinate reference system information for the domain. ## Error Responses - `404 Not Found`: The specified domain does not exist, the user does not have access to it, or no road feature resource exists for this domain. - `422 Unprocessable Entity`: The road feature resource does not have status 'completed', or validation failed for query parameters. - `401 Unauthorized`: The request lacks valid authentication credentials. - `403 Forbidden`: The authenticated user does not have permission to access this domain. ## Usage Notes - The road feature resource must be created and have status 'completed' before data can be retrieved. - Use the pagination parameters to retrieve large datasets efficiently. - The `totalItems` field can be used to calculate the total number of pages available. + + :param domain_id: (required) + :type domain_id: str + :param page: The page number to retrieve. Page number is zero-indexed. + :type page: int + :param size: The number of resources to retrieve per page. + :type size: int + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._get_road_feature_data_serialize( + domain_id=domain_id, + page=page, + size=size, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "FeatureDataResponse", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + + @validate_call + def get_road_feature_data_without_preload_content( + self, + domain_id: StrictStr, + page: Annotated[Optional[Annotated[int, Field(strict=True, ge=0)]], Field(description="The page number to retrieve. Page number is zero-indexed.")] = None, + size: Annotated[Optional[Annotated[int, Field(le=1000, strict=True, ge=1)]], Field(description="The number of resources to retrieve per page.")] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Get Road Feature Data + + # Get Road Feature Data This endpoint retrieves paginated road feature data for a specific domain. Road feature data represents individual road segments and their attributes (e.g., road type, surface condition) in GeoJSON format. The road feature resource must be created and fully processed (status \"completed\") before data can be retrieved through this endpoint. ## Endpoint ``` GET /v1/domains/{domainId}/features/road/data ``` ## Path Parameters - `domainId` (string, required): The unique identifier of the domain for which you want to retrieve road feature data. ## Query Parameters - `page` (integer, optional): Zero-indexed page number. Must be greater than or equal to 0. Defaults to `0`. - `size` (integer, optional): Number of features to return per page. Valid range: `1` to `1000`. Defaults to `50`. ## Response If the request is successful, the endpoint will return a `200 OK` status code and a GeoJSON FeatureCollection with pagination metadata. The response body will contain: - `type` (string): Always \"FeatureCollection\". - `features` (array): Array of GeoJSON Feature objects representing individual road segments. - `currentPage` (integer): The current page number returned. - `pageSize` (integer): The number of features per page. - `totalItems` (integer): The total number of road features available in the domain. - `crs` (object, optional): Coordinate reference system information for the domain. ## Error Responses - `404 Not Found`: The specified domain does not exist, the user does not have access to it, or no road feature resource exists for this domain. - `422 Unprocessable Entity`: The road feature resource does not have status 'completed', or validation failed for query parameters. - `401 Unauthorized`: The request lacks valid authentication credentials. - `403 Forbidden`: The authenticated user does not have permission to access this domain. ## Usage Notes - The road feature resource must be created and have status 'completed' before data can be retrieved. - Use the pagination parameters to retrieve large datasets efficiently. - The `totalItems` field can be used to calculate the total number of pages available. + + :param domain_id: (required) + :type domain_id: str + :param page: The page number to retrieve. Page number is zero-indexed. + :type page: int + :param size: The number of resources to retrieve per page. + :type size: int + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._get_road_feature_data_serialize( + domain_id=domain_id, + page=page, + size=size, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "FeatureDataResponse", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _get_road_feature_data_serialize( + self, + domain_id, + page, + size, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = { + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + if domain_id is not None: + _path_params['domainId'] = domain_id + # process the query parameters + if page is not None: + + _query_params.append(('page', page)) + + if size is not None: + + _query_params.append(('size', size)) + + # process the header parameters + # process the form parameters + # process the body parameter + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + + # authentication setting + _auth_settings: List[str] = [ + 'APIKeyHeader', + 'HTTPBearer' + ] + + return self.api_client.param_serialize( + method='GET', + resource_path='/v1/domains/{domainId}/features/road/data', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + + + @validate_call def get_road_feature_export( self, diff --git a/fastfuels_sdk/client_library/api/surface_grid_api.py b/fastfuels_sdk/client_library/api/surface_grid_api.py index 79089fe..8e647bf 100644 --- a/fastfuels_sdk/client_library/api/surface_grid_api.py +++ b/fastfuels_sdk/client_library/api/surface_grid_api.py @@ -60,7 +60,7 @@ def create_surface_grid( ) -> SurfaceGrid: """Create Surface Grid - # Create Surface Grid Creates a new surface grid containing fuel attributes for a domain. Surface fuels are represented through five key attributes: fuel load, fuel depth, fuel moisture, surface area-to-volume ratio (SAVR), and fire behavior fuel models (FBFM). ## Path Parameters - `domainId` (string, required): Domain identifier ## Request Body Structure ### Required Fields - `attributes` (array[string]): One or more surface fuel attributes to include: - `fuelLoad`: Fuel loading per unit area (kg/m²) - `fuelDepth`: Depth of fuel bed above surface (m) - `fuelMoisture`: Mass of water per unit mass of dry fuel (%) - `SAVR`: Surface area-to-volume ratio (m²/m³) - `FBFM`: Fire behavior fuel model classification ### Data Sources Each attribute requires a data source. Available sources vary by attribute: #### 1. LANDFIRE Source (`source: \"LANDFIRE\"`) Available for: fuelLoad, fuelDepth, SAVR, FBFM Base configuration: - `product`: \"FBFM40\" (Scott & Burgan 40 Fuel Models), \"FBFM13\" (Anderson 13 Fuel Models), or \"FCCS\" (Fuel Characteristic Classification System) - `version`: \"2022\" (FBFM40/FBFM13) or \"2023\" (FCCS) - `interpolationMethod`: \"nearest\", \"linear\", \"cubic\", or \"zipper\" - `featureMasks`: Array of feature types to mask (optional) - `removeNonBurnable`: Array of non-burnable codes to replace (FBFM40 only) Fuel Load: - Without groups: Computes total dead fuel load (1hr + 10hr + 100hr + dead herbaceous + dead woody) - With groups: Values for specific size classes: - `oneHour`: 1-hour dead fuels + dead herbaceous + dead woody - `tenHour`: 10-hour dead fuels - `hundredHour`: 100-hour dead fuels - `liveHerbaceous`: Live herbaceous fuels - `liveWoody`: Live woody fuels - Additional fields: - `curingLiveHerbaceous`: 0-1 - `curingLiveWoody`: 0-1 SAVR: - Without groups: Computes weighted average SAVR of dead fuels - With groups: Values for specific size classes: - `oneHour`: 1-hour dead fuels - `tenHour`: 10-hour dead fuels - `hundredHour`: 100-hour dead fuels - `liveHerbaceous`: Live herbaceous fuels - `liveWoody`: Live woody fuels Fuel Depth: - Groups field is ignored - returns single fuel bed depth value For FCCS product (Fuel Characteristic Classification System): Fuel Load: - Supports `oneHour`, `tenHour`, and `hundredHour` groups only - No curing parameters needed (no curingLiveHerbaceous or curingLiveWoody fields) - No live fuel groups (liveHerbaceous, liveWoody) - Returns: Dead fuel loads (1hr, 10hr, 100hr) from FCCS lookup table Fuel Depth: - Groups field is ignored - returns single fuel bed depth value from FCCS lookup table SAVR: - Not supported for FCCS product #### 2. Uniform Value Source (`source: \"uniform\"`) Available for: all attributes Configuration: - `value`: Single numeric value applied across entire grid - `featureMasks`: Array of feature types to mask (optional) #### 3. Uniform By Size Class Source (`source: \"uniformBySizeClass\"`) Available for: fuelMoisture only Configuration: - `groups` (required): Array of size classes to include. Values must be a subset of: - `oneHour`: 1-hour dead fuels - `tenHour`: 10-hour dead fuels - `hundredHour`: 100-hour dead fuels - `liveHerbaceous`: Live herbaceous fuels - `liveWoody`: Live woody fuels - Must provide corresponding value for each specified group: - `oneHour`: Value for 1-hour fuels (if in groups) - `tenHour`: Value for 10-hour fuels (if in groups) - `hundredHour`: Value for 100-hour fuels (if in groups) - `liveHerbaceous`: Value for live herbaceous fuels (if in groups) - `liveWoody`: Value for live woody fuels (if in groups) - `featureMasks`: Array of feature types to mask (optional) ### Feature Enhancement Options #### Feature Masks (`featureMasks`) - Overlays high-resolution features from OpenStreetMap - Available features: \"road\", \"water\", \"building\" - Applies to any attribute source type #### Non-Burnable Replacement (`removeNonBurnable`) - Removes specified LANDFIRE non-burnable classes - Available codes: - \"NB1\": Urban/developed - \"NB2\": Snow/ice - \"NB3\": Agricultural - \"NB8\": Water - \"NB9\": Bare ground - Replaced using majority filter of surrounding burnable fuels - Only available for LANDFIRE sources ### Modifications Optional list of modifications to apply to computed values: ```python modifications: [ { \"conditions\": [ { \"attribute\": string, # Must be in attributes array \"operator\": string, # Comparison operator \"value\": any # Target value } ], \"actions\": [ { \"attribute\": string, # Must be in attributes array \"modifier\": string, # Modification type \"value\": any # New value } ] } ] ``` ## Response Returns SurfaceGrid object containing: - Request body fields - `status`: Job status - `createdOn`: Creation timestamp - `modifiedOn`: Last modified timestamp - `checksum`: Resource checksum ## Errors - 404: Domain not found - 422: Invalid request or incompatible data sources - 429: Too many requests + # Create Surface Grid Creates a new surface grid containing fuel attributes for a domain. Surface fuels are represented through five key attributes: fuel load, fuel depth, fuel moisture, surface area-to-volume ratio (SAVR), and fire behavior fuel models (FBFM). ## Path Parameters - `domainId` (string, required): Domain identifier ## Request Body Structure ### Required Fields - `attributes` (array[string]): One or more surface fuel attributes to include: - `fuelLoad`: Fuel loading per unit area (kg/m²) - `fuelDepth`: Depth of fuel bed above surface (m) - `fuelMoisture`: Mass of water per unit mass of dry fuel (%) - `SAVR`: Surface area-to-volume ratio (m²/m³) - `FBFM`: Fire behavior fuel model classification ### Data Sources Each attribute requires a data source. Available sources vary by attribute: #### 1. LANDFIRE Source (`source: \"LANDFIRE\"`) Available for: fuelLoad, fuelDepth, SAVR, FBFM Base configuration: - `product`: \"FBFM40\" (Scott & Burgan 40 Fuel Models), \"FBFM13\" (Anderson 13 Fuel Models), or \"FCCS\" (Fuel Characteristic Classification System) - `version`: \"2022\" (FBFM40/FBFM13) or \"2023\" (FCCS) - `interpolationMethod`: \"nearest\", \"linear\", \"cubic\", or \"zipper\" - `featureMasks`: Array of feature types to mask (optional) - `removeNonBurnable`: Array of non-burnable codes to replace (FBFM40 only) Fuel Load: - Without groups: Computes total dead fuel load (1hr + 10hr + 100hr + dead herbaceous + dead woody) - With groups: Values for specific size classes: - `oneHour`: 1-hour dead fuels + dead herbaceous + dead woody - `tenHour`: 10-hour dead fuels - `hundredHour`: 100-hour dead fuels - `liveHerbaceous`: Live herbaceous fuels - `liveWoody`: Live woody fuels - Additional fields: - `curingLiveHerbaceous`: 0-1 - `curingLiveWoody`: 0-1 SAVR: - Without groups: Computes weighted average SAVR of dead fuels - With groups: Values for specific size classes: - `oneHour`: 1-hour dead fuels - `tenHour`: 10-hour dead fuels - `hundredHour`: 100-hour dead fuels - `liveHerbaceous`: Live herbaceous fuels - `liveWoody`: Live woody fuels Fuel Depth: - Groups field is ignored - returns single fuel bed depth value For FCCS product (Fuel Characteristic Classification System): Fuel Load: - Supports `oneHour`, `tenHour`, and `hundredHour` groups only - No curing parameters needed (no curingLiveHerbaceous or curingLiveWoody fields) - No live fuel groups (liveHerbaceous, liveWoody) - Returns: Dead fuel loads (1hr, 10hr, 100hr) from FCCS lookup table Fuel Depth: - Groups field is ignored - returns single fuel bed depth value from FCCS lookup table SAVR: - Not supported for FCCS product #### 2. Uniform Value Source (`source: \"uniform\"`) Available for: all attributes Configuration: - `value`: Single numeric value applied across entire grid - `featureMasks`: Array of feature types to mask (optional) #### 3. Uniform By Size Class Source (`source: \"uniformBySizeClass\"`) Available for: fuelMoisture only Configuration: - `groups` (required): Array of size classes to include. Values must be a subset of: - `oneHour`: 1-hour dead fuels - `tenHour`: 10-hour dead fuels - `hundredHour`: 100-hour dead fuels - `liveHerbaceous`: Live herbaceous fuels - `liveWoody`: Live woody fuels - Must provide corresponding value for each specified group: - `oneHour`: Value for 1-hour fuels (if in groups) - `tenHour`: Value for 10-hour fuels (if in groups) - `hundredHour`: Value for 100-hour fuels (if in groups) - `liveHerbaceous`: Value for live herbaceous fuels (if in groups) - `liveWoody`: Value for live woody fuels (if in groups) - `featureMasks`: Array of feature types to mask (optional) ### Feature Enhancement Options #### Feature Masks (`featureMasks`) - Overlays high-resolution features from OpenStreetMap - Available features: \"road\", \"water\", \"building\" - Applies to any attribute source type #### Non-Burnable Replacement (`removeNonBurnable`) - Removes specified LANDFIRE non-burnable classes - Available codes: - \"NB1\": Urban/developed - \"NB2\": Snow/ice - \"NB3\": Agricultural - \"NB8\": Water - \"NB9\": Bare ground - Replaced using majority filter of surrounding burnable fuels - Only available for LANDFIRE sources ### Modifications Optional list of modifications to apply to computed values. Each modification consists of conditions and actions. #### Attribute Conditions Check attribute values before applying modifications: ```python { \"attribute\": string, # Must be in attributes array \"operator\": string, # \"eq\", \"ne\", \"gt\", \"lt\", \"ge\", \"le\" \"value\": any # Target value } ``` #### Spatial Conditions Target cells based on geographic location: ```python { \"operator\": string, # \"within\", \"outside\", or \"intersects\" \"target\": string, # \"centroid\" (default) or \"cell\" \"geometry\": { # GeoJSON Polygon or MultiPolygon \"type\": \"Polygon\", \"coordinates\": [[[lon, lat], ...]] }, \"crs\": { # Optional, defaults to domain CRS \"type\": \"name\", \"properties\": {\"name\": \"EPSG:4326\"} } } ``` Spatial operators: - `within`: Select cells inside the geometry - `outside`: Select cells outside the geometry - `intersects`: Select cells that overlap with the geometry Target options: - `centroid`: Test cell center point (default) - `cell`: Test entire cell bounds #### Actions Modify attribute values when conditions are met: ```python { \"attribute\": string, # Must be in attributes array \"modifier\": string, # \"multiply\", \"divide\", \"add\", \"subtract\", \"replace\" \"value\": any # Modification value } ``` #### Example: Spatial Modification ```python modifications: [ { \"conditions\": [ { \"operator\": \"within\", \"geometry\": { \"type\": \"Polygon\", \"coordinates\": [[[-120.5, 39.0], [-120.5, 39.5], [-120.0, 39.5], [-120.0, 39.0], [-120.5, 39.0]]] } } ], \"actions\": [ {\"attribute\": \"fuelLoad\", \"modifier\": \"multiply\", \"value\": 2.0} ] } ] ``` #### Example: Combined Spatial and Attribute Conditions ```python modifications: [ { \"conditions\": [ { \"operator\": \"within\", \"geometry\": {\"type\": \"Polygon\", \"coordinates\": [...]} }, { \"attribute\": \"FBFM\", \"operator\": \"eq\", \"value\": \"GR1\" } ], \"actions\": [ {\"attribute\": \"fuelLoad\", \"modifier\": \"multiply\", \"value\": 1.5} ] } ] ``` ## Response Returns SurfaceGrid object containing: - Request body fields - `status`: Job status - `createdOn`: Creation timestamp - `modifiedOn`: Last modified timestamp - `checksum`: Resource checksum ## Errors - 404: Domain not found - 422: Invalid request or incompatible data sources - 429: Too many requests :param domain_id: (required) :type domain_id: str @@ -132,7 +132,7 @@ def create_surface_grid_with_http_info( ) -> ApiResponse[SurfaceGrid]: """Create Surface Grid - # Create Surface Grid Creates a new surface grid containing fuel attributes for a domain. Surface fuels are represented through five key attributes: fuel load, fuel depth, fuel moisture, surface area-to-volume ratio (SAVR), and fire behavior fuel models (FBFM). ## Path Parameters - `domainId` (string, required): Domain identifier ## Request Body Structure ### Required Fields - `attributes` (array[string]): One or more surface fuel attributes to include: - `fuelLoad`: Fuel loading per unit area (kg/m²) - `fuelDepth`: Depth of fuel bed above surface (m) - `fuelMoisture`: Mass of water per unit mass of dry fuel (%) - `SAVR`: Surface area-to-volume ratio (m²/m³) - `FBFM`: Fire behavior fuel model classification ### Data Sources Each attribute requires a data source. Available sources vary by attribute: #### 1. LANDFIRE Source (`source: \"LANDFIRE\"`) Available for: fuelLoad, fuelDepth, SAVR, FBFM Base configuration: - `product`: \"FBFM40\" (Scott & Burgan 40 Fuel Models), \"FBFM13\" (Anderson 13 Fuel Models), or \"FCCS\" (Fuel Characteristic Classification System) - `version`: \"2022\" (FBFM40/FBFM13) or \"2023\" (FCCS) - `interpolationMethod`: \"nearest\", \"linear\", \"cubic\", or \"zipper\" - `featureMasks`: Array of feature types to mask (optional) - `removeNonBurnable`: Array of non-burnable codes to replace (FBFM40 only) Fuel Load: - Without groups: Computes total dead fuel load (1hr + 10hr + 100hr + dead herbaceous + dead woody) - With groups: Values for specific size classes: - `oneHour`: 1-hour dead fuels + dead herbaceous + dead woody - `tenHour`: 10-hour dead fuels - `hundredHour`: 100-hour dead fuels - `liveHerbaceous`: Live herbaceous fuels - `liveWoody`: Live woody fuels - Additional fields: - `curingLiveHerbaceous`: 0-1 - `curingLiveWoody`: 0-1 SAVR: - Without groups: Computes weighted average SAVR of dead fuels - With groups: Values for specific size classes: - `oneHour`: 1-hour dead fuels - `tenHour`: 10-hour dead fuels - `hundredHour`: 100-hour dead fuels - `liveHerbaceous`: Live herbaceous fuels - `liveWoody`: Live woody fuels Fuel Depth: - Groups field is ignored - returns single fuel bed depth value For FCCS product (Fuel Characteristic Classification System): Fuel Load: - Supports `oneHour`, `tenHour`, and `hundredHour` groups only - No curing parameters needed (no curingLiveHerbaceous or curingLiveWoody fields) - No live fuel groups (liveHerbaceous, liveWoody) - Returns: Dead fuel loads (1hr, 10hr, 100hr) from FCCS lookup table Fuel Depth: - Groups field is ignored - returns single fuel bed depth value from FCCS lookup table SAVR: - Not supported for FCCS product #### 2. Uniform Value Source (`source: \"uniform\"`) Available for: all attributes Configuration: - `value`: Single numeric value applied across entire grid - `featureMasks`: Array of feature types to mask (optional) #### 3. Uniform By Size Class Source (`source: \"uniformBySizeClass\"`) Available for: fuelMoisture only Configuration: - `groups` (required): Array of size classes to include. Values must be a subset of: - `oneHour`: 1-hour dead fuels - `tenHour`: 10-hour dead fuels - `hundredHour`: 100-hour dead fuels - `liveHerbaceous`: Live herbaceous fuels - `liveWoody`: Live woody fuels - Must provide corresponding value for each specified group: - `oneHour`: Value for 1-hour fuels (if in groups) - `tenHour`: Value for 10-hour fuels (if in groups) - `hundredHour`: Value for 100-hour fuels (if in groups) - `liveHerbaceous`: Value for live herbaceous fuels (if in groups) - `liveWoody`: Value for live woody fuels (if in groups) - `featureMasks`: Array of feature types to mask (optional) ### Feature Enhancement Options #### Feature Masks (`featureMasks`) - Overlays high-resolution features from OpenStreetMap - Available features: \"road\", \"water\", \"building\" - Applies to any attribute source type #### Non-Burnable Replacement (`removeNonBurnable`) - Removes specified LANDFIRE non-burnable classes - Available codes: - \"NB1\": Urban/developed - \"NB2\": Snow/ice - \"NB3\": Agricultural - \"NB8\": Water - \"NB9\": Bare ground - Replaced using majority filter of surrounding burnable fuels - Only available for LANDFIRE sources ### Modifications Optional list of modifications to apply to computed values: ```python modifications: [ { \"conditions\": [ { \"attribute\": string, # Must be in attributes array \"operator\": string, # Comparison operator \"value\": any # Target value } ], \"actions\": [ { \"attribute\": string, # Must be in attributes array \"modifier\": string, # Modification type \"value\": any # New value } ] } ] ``` ## Response Returns SurfaceGrid object containing: - Request body fields - `status`: Job status - `createdOn`: Creation timestamp - `modifiedOn`: Last modified timestamp - `checksum`: Resource checksum ## Errors - 404: Domain not found - 422: Invalid request or incompatible data sources - 429: Too many requests + # Create Surface Grid Creates a new surface grid containing fuel attributes for a domain. Surface fuels are represented through five key attributes: fuel load, fuel depth, fuel moisture, surface area-to-volume ratio (SAVR), and fire behavior fuel models (FBFM). ## Path Parameters - `domainId` (string, required): Domain identifier ## Request Body Structure ### Required Fields - `attributes` (array[string]): One or more surface fuel attributes to include: - `fuelLoad`: Fuel loading per unit area (kg/m²) - `fuelDepth`: Depth of fuel bed above surface (m) - `fuelMoisture`: Mass of water per unit mass of dry fuel (%) - `SAVR`: Surface area-to-volume ratio (m²/m³) - `FBFM`: Fire behavior fuel model classification ### Data Sources Each attribute requires a data source. Available sources vary by attribute: #### 1. LANDFIRE Source (`source: \"LANDFIRE\"`) Available for: fuelLoad, fuelDepth, SAVR, FBFM Base configuration: - `product`: \"FBFM40\" (Scott & Burgan 40 Fuel Models), \"FBFM13\" (Anderson 13 Fuel Models), or \"FCCS\" (Fuel Characteristic Classification System) - `version`: \"2022\" (FBFM40/FBFM13) or \"2023\" (FCCS) - `interpolationMethod`: \"nearest\", \"linear\", \"cubic\", or \"zipper\" - `featureMasks`: Array of feature types to mask (optional) - `removeNonBurnable`: Array of non-burnable codes to replace (FBFM40 only) Fuel Load: - Without groups: Computes total dead fuel load (1hr + 10hr + 100hr + dead herbaceous + dead woody) - With groups: Values for specific size classes: - `oneHour`: 1-hour dead fuels + dead herbaceous + dead woody - `tenHour`: 10-hour dead fuels - `hundredHour`: 100-hour dead fuels - `liveHerbaceous`: Live herbaceous fuels - `liveWoody`: Live woody fuels - Additional fields: - `curingLiveHerbaceous`: 0-1 - `curingLiveWoody`: 0-1 SAVR: - Without groups: Computes weighted average SAVR of dead fuels - With groups: Values for specific size classes: - `oneHour`: 1-hour dead fuels - `tenHour`: 10-hour dead fuels - `hundredHour`: 100-hour dead fuels - `liveHerbaceous`: Live herbaceous fuels - `liveWoody`: Live woody fuels Fuel Depth: - Groups field is ignored - returns single fuel bed depth value For FCCS product (Fuel Characteristic Classification System): Fuel Load: - Supports `oneHour`, `tenHour`, and `hundredHour` groups only - No curing parameters needed (no curingLiveHerbaceous or curingLiveWoody fields) - No live fuel groups (liveHerbaceous, liveWoody) - Returns: Dead fuel loads (1hr, 10hr, 100hr) from FCCS lookup table Fuel Depth: - Groups field is ignored - returns single fuel bed depth value from FCCS lookup table SAVR: - Not supported for FCCS product #### 2. Uniform Value Source (`source: \"uniform\"`) Available for: all attributes Configuration: - `value`: Single numeric value applied across entire grid - `featureMasks`: Array of feature types to mask (optional) #### 3. Uniform By Size Class Source (`source: \"uniformBySizeClass\"`) Available for: fuelMoisture only Configuration: - `groups` (required): Array of size classes to include. Values must be a subset of: - `oneHour`: 1-hour dead fuels - `tenHour`: 10-hour dead fuels - `hundredHour`: 100-hour dead fuels - `liveHerbaceous`: Live herbaceous fuels - `liveWoody`: Live woody fuels - Must provide corresponding value for each specified group: - `oneHour`: Value for 1-hour fuels (if in groups) - `tenHour`: Value for 10-hour fuels (if in groups) - `hundredHour`: Value for 100-hour fuels (if in groups) - `liveHerbaceous`: Value for live herbaceous fuels (if in groups) - `liveWoody`: Value for live woody fuels (if in groups) - `featureMasks`: Array of feature types to mask (optional) ### Feature Enhancement Options #### Feature Masks (`featureMasks`) - Overlays high-resolution features from OpenStreetMap - Available features: \"road\", \"water\", \"building\" - Applies to any attribute source type #### Non-Burnable Replacement (`removeNonBurnable`) - Removes specified LANDFIRE non-burnable classes - Available codes: - \"NB1\": Urban/developed - \"NB2\": Snow/ice - \"NB3\": Agricultural - \"NB8\": Water - \"NB9\": Bare ground - Replaced using majority filter of surrounding burnable fuels - Only available for LANDFIRE sources ### Modifications Optional list of modifications to apply to computed values. Each modification consists of conditions and actions. #### Attribute Conditions Check attribute values before applying modifications: ```python { \"attribute\": string, # Must be in attributes array \"operator\": string, # \"eq\", \"ne\", \"gt\", \"lt\", \"ge\", \"le\" \"value\": any # Target value } ``` #### Spatial Conditions Target cells based on geographic location: ```python { \"operator\": string, # \"within\", \"outside\", or \"intersects\" \"target\": string, # \"centroid\" (default) or \"cell\" \"geometry\": { # GeoJSON Polygon or MultiPolygon \"type\": \"Polygon\", \"coordinates\": [[[lon, lat], ...]] }, \"crs\": { # Optional, defaults to domain CRS \"type\": \"name\", \"properties\": {\"name\": \"EPSG:4326\"} } } ``` Spatial operators: - `within`: Select cells inside the geometry - `outside`: Select cells outside the geometry - `intersects`: Select cells that overlap with the geometry Target options: - `centroid`: Test cell center point (default) - `cell`: Test entire cell bounds #### Actions Modify attribute values when conditions are met: ```python { \"attribute\": string, # Must be in attributes array \"modifier\": string, # \"multiply\", \"divide\", \"add\", \"subtract\", \"replace\" \"value\": any # Modification value } ``` #### Example: Spatial Modification ```python modifications: [ { \"conditions\": [ { \"operator\": \"within\", \"geometry\": { \"type\": \"Polygon\", \"coordinates\": [[[-120.5, 39.0], [-120.5, 39.5], [-120.0, 39.5], [-120.0, 39.0], [-120.5, 39.0]]] } } ], \"actions\": [ {\"attribute\": \"fuelLoad\", \"modifier\": \"multiply\", \"value\": 2.0} ] } ] ``` #### Example: Combined Spatial and Attribute Conditions ```python modifications: [ { \"conditions\": [ { \"operator\": \"within\", \"geometry\": {\"type\": \"Polygon\", \"coordinates\": [...]} }, { \"attribute\": \"FBFM\", \"operator\": \"eq\", \"value\": \"GR1\" } ], \"actions\": [ {\"attribute\": \"fuelLoad\", \"modifier\": \"multiply\", \"value\": 1.5} ] } ] ``` ## Response Returns SurfaceGrid object containing: - Request body fields - `status`: Job status - `createdOn`: Creation timestamp - `modifiedOn`: Last modified timestamp - `checksum`: Resource checksum ## Errors - 404: Domain not found - 422: Invalid request or incompatible data sources - 429: Too many requests :param domain_id: (required) :type domain_id: str @@ -204,7 +204,7 @@ def create_surface_grid_without_preload_content( ) -> RESTResponseType: """Create Surface Grid - # Create Surface Grid Creates a new surface grid containing fuel attributes for a domain. Surface fuels are represented through five key attributes: fuel load, fuel depth, fuel moisture, surface area-to-volume ratio (SAVR), and fire behavior fuel models (FBFM). ## Path Parameters - `domainId` (string, required): Domain identifier ## Request Body Structure ### Required Fields - `attributes` (array[string]): One or more surface fuel attributes to include: - `fuelLoad`: Fuel loading per unit area (kg/m²) - `fuelDepth`: Depth of fuel bed above surface (m) - `fuelMoisture`: Mass of water per unit mass of dry fuel (%) - `SAVR`: Surface area-to-volume ratio (m²/m³) - `FBFM`: Fire behavior fuel model classification ### Data Sources Each attribute requires a data source. Available sources vary by attribute: #### 1. LANDFIRE Source (`source: \"LANDFIRE\"`) Available for: fuelLoad, fuelDepth, SAVR, FBFM Base configuration: - `product`: \"FBFM40\" (Scott & Burgan 40 Fuel Models), \"FBFM13\" (Anderson 13 Fuel Models), or \"FCCS\" (Fuel Characteristic Classification System) - `version`: \"2022\" (FBFM40/FBFM13) or \"2023\" (FCCS) - `interpolationMethod`: \"nearest\", \"linear\", \"cubic\", or \"zipper\" - `featureMasks`: Array of feature types to mask (optional) - `removeNonBurnable`: Array of non-burnable codes to replace (FBFM40 only) Fuel Load: - Without groups: Computes total dead fuel load (1hr + 10hr + 100hr + dead herbaceous + dead woody) - With groups: Values for specific size classes: - `oneHour`: 1-hour dead fuels + dead herbaceous + dead woody - `tenHour`: 10-hour dead fuels - `hundredHour`: 100-hour dead fuels - `liveHerbaceous`: Live herbaceous fuels - `liveWoody`: Live woody fuels - Additional fields: - `curingLiveHerbaceous`: 0-1 - `curingLiveWoody`: 0-1 SAVR: - Without groups: Computes weighted average SAVR of dead fuels - With groups: Values for specific size classes: - `oneHour`: 1-hour dead fuels - `tenHour`: 10-hour dead fuels - `hundredHour`: 100-hour dead fuels - `liveHerbaceous`: Live herbaceous fuels - `liveWoody`: Live woody fuels Fuel Depth: - Groups field is ignored - returns single fuel bed depth value For FCCS product (Fuel Characteristic Classification System): Fuel Load: - Supports `oneHour`, `tenHour`, and `hundredHour` groups only - No curing parameters needed (no curingLiveHerbaceous or curingLiveWoody fields) - No live fuel groups (liveHerbaceous, liveWoody) - Returns: Dead fuel loads (1hr, 10hr, 100hr) from FCCS lookup table Fuel Depth: - Groups field is ignored - returns single fuel bed depth value from FCCS lookup table SAVR: - Not supported for FCCS product #### 2. Uniform Value Source (`source: \"uniform\"`) Available for: all attributes Configuration: - `value`: Single numeric value applied across entire grid - `featureMasks`: Array of feature types to mask (optional) #### 3. Uniform By Size Class Source (`source: \"uniformBySizeClass\"`) Available for: fuelMoisture only Configuration: - `groups` (required): Array of size classes to include. Values must be a subset of: - `oneHour`: 1-hour dead fuels - `tenHour`: 10-hour dead fuels - `hundredHour`: 100-hour dead fuels - `liveHerbaceous`: Live herbaceous fuels - `liveWoody`: Live woody fuels - Must provide corresponding value for each specified group: - `oneHour`: Value for 1-hour fuels (if in groups) - `tenHour`: Value for 10-hour fuels (if in groups) - `hundredHour`: Value for 100-hour fuels (if in groups) - `liveHerbaceous`: Value for live herbaceous fuels (if in groups) - `liveWoody`: Value for live woody fuels (if in groups) - `featureMasks`: Array of feature types to mask (optional) ### Feature Enhancement Options #### Feature Masks (`featureMasks`) - Overlays high-resolution features from OpenStreetMap - Available features: \"road\", \"water\", \"building\" - Applies to any attribute source type #### Non-Burnable Replacement (`removeNonBurnable`) - Removes specified LANDFIRE non-burnable classes - Available codes: - \"NB1\": Urban/developed - \"NB2\": Snow/ice - \"NB3\": Agricultural - \"NB8\": Water - \"NB9\": Bare ground - Replaced using majority filter of surrounding burnable fuels - Only available for LANDFIRE sources ### Modifications Optional list of modifications to apply to computed values: ```python modifications: [ { \"conditions\": [ { \"attribute\": string, # Must be in attributes array \"operator\": string, # Comparison operator \"value\": any # Target value } ], \"actions\": [ { \"attribute\": string, # Must be in attributes array \"modifier\": string, # Modification type \"value\": any # New value } ] } ] ``` ## Response Returns SurfaceGrid object containing: - Request body fields - `status`: Job status - `createdOn`: Creation timestamp - `modifiedOn`: Last modified timestamp - `checksum`: Resource checksum ## Errors - 404: Domain not found - 422: Invalid request or incompatible data sources - 429: Too many requests + # Create Surface Grid Creates a new surface grid containing fuel attributes for a domain. Surface fuels are represented through five key attributes: fuel load, fuel depth, fuel moisture, surface area-to-volume ratio (SAVR), and fire behavior fuel models (FBFM). ## Path Parameters - `domainId` (string, required): Domain identifier ## Request Body Structure ### Required Fields - `attributes` (array[string]): One or more surface fuel attributes to include: - `fuelLoad`: Fuel loading per unit area (kg/m²) - `fuelDepth`: Depth of fuel bed above surface (m) - `fuelMoisture`: Mass of water per unit mass of dry fuel (%) - `SAVR`: Surface area-to-volume ratio (m²/m³) - `FBFM`: Fire behavior fuel model classification ### Data Sources Each attribute requires a data source. Available sources vary by attribute: #### 1. LANDFIRE Source (`source: \"LANDFIRE\"`) Available for: fuelLoad, fuelDepth, SAVR, FBFM Base configuration: - `product`: \"FBFM40\" (Scott & Burgan 40 Fuel Models), \"FBFM13\" (Anderson 13 Fuel Models), or \"FCCS\" (Fuel Characteristic Classification System) - `version`: \"2022\" (FBFM40/FBFM13) or \"2023\" (FCCS) - `interpolationMethod`: \"nearest\", \"linear\", \"cubic\", or \"zipper\" - `featureMasks`: Array of feature types to mask (optional) - `removeNonBurnable`: Array of non-burnable codes to replace (FBFM40 only) Fuel Load: - Without groups: Computes total dead fuel load (1hr + 10hr + 100hr + dead herbaceous + dead woody) - With groups: Values for specific size classes: - `oneHour`: 1-hour dead fuels + dead herbaceous + dead woody - `tenHour`: 10-hour dead fuels - `hundredHour`: 100-hour dead fuels - `liveHerbaceous`: Live herbaceous fuels - `liveWoody`: Live woody fuels - Additional fields: - `curingLiveHerbaceous`: 0-1 - `curingLiveWoody`: 0-1 SAVR: - Without groups: Computes weighted average SAVR of dead fuels - With groups: Values for specific size classes: - `oneHour`: 1-hour dead fuels - `tenHour`: 10-hour dead fuels - `hundredHour`: 100-hour dead fuels - `liveHerbaceous`: Live herbaceous fuels - `liveWoody`: Live woody fuels Fuel Depth: - Groups field is ignored - returns single fuel bed depth value For FCCS product (Fuel Characteristic Classification System): Fuel Load: - Supports `oneHour`, `tenHour`, and `hundredHour` groups only - No curing parameters needed (no curingLiveHerbaceous or curingLiveWoody fields) - No live fuel groups (liveHerbaceous, liveWoody) - Returns: Dead fuel loads (1hr, 10hr, 100hr) from FCCS lookup table Fuel Depth: - Groups field is ignored - returns single fuel bed depth value from FCCS lookup table SAVR: - Not supported for FCCS product #### 2. Uniform Value Source (`source: \"uniform\"`) Available for: all attributes Configuration: - `value`: Single numeric value applied across entire grid - `featureMasks`: Array of feature types to mask (optional) #### 3. Uniform By Size Class Source (`source: \"uniformBySizeClass\"`) Available for: fuelMoisture only Configuration: - `groups` (required): Array of size classes to include. Values must be a subset of: - `oneHour`: 1-hour dead fuels - `tenHour`: 10-hour dead fuels - `hundredHour`: 100-hour dead fuels - `liveHerbaceous`: Live herbaceous fuels - `liveWoody`: Live woody fuels - Must provide corresponding value for each specified group: - `oneHour`: Value for 1-hour fuels (if in groups) - `tenHour`: Value for 10-hour fuels (if in groups) - `hundredHour`: Value for 100-hour fuels (if in groups) - `liveHerbaceous`: Value for live herbaceous fuels (if in groups) - `liveWoody`: Value for live woody fuels (if in groups) - `featureMasks`: Array of feature types to mask (optional) ### Feature Enhancement Options #### Feature Masks (`featureMasks`) - Overlays high-resolution features from OpenStreetMap - Available features: \"road\", \"water\", \"building\" - Applies to any attribute source type #### Non-Burnable Replacement (`removeNonBurnable`) - Removes specified LANDFIRE non-burnable classes - Available codes: - \"NB1\": Urban/developed - \"NB2\": Snow/ice - \"NB3\": Agricultural - \"NB8\": Water - \"NB9\": Bare ground - Replaced using majority filter of surrounding burnable fuels - Only available for LANDFIRE sources ### Modifications Optional list of modifications to apply to computed values. Each modification consists of conditions and actions. #### Attribute Conditions Check attribute values before applying modifications: ```python { \"attribute\": string, # Must be in attributes array \"operator\": string, # \"eq\", \"ne\", \"gt\", \"lt\", \"ge\", \"le\" \"value\": any # Target value } ``` #### Spatial Conditions Target cells based on geographic location: ```python { \"operator\": string, # \"within\", \"outside\", or \"intersects\" \"target\": string, # \"centroid\" (default) or \"cell\" \"geometry\": { # GeoJSON Polygon or MultiPolygon \"type\": \"Polygon\", \"coordinates\": [[[lon, lat], ...]] }, \"crs\": { # Optional, defaults to domain CRS \"type\": \"name\", \"properties\": {\"name\": \"EPSG:4326\"} } } ``` Spatial operators: - `within`: Select cells inside the geometry - `outside`: Select cells outside the geometry - `intersects`: Select cells that overlap with the geometry Target options: - `centroid`: Test cell center point (default) - `cell`: Test entire cell bounds #### Actions Modify attribute values when conditions are met: ```python { \"attribute\": string, # Must be in attributes array \"modifier\": string, # \"multiply\", \"divide\", \"add\", \"subtract\", \"replace\" \"value\": any # Modification value } ``` #### Example: Spatial Modification ```python modifications: [ { \"conditions\": [ { \"operator\": \"within\", \"geometry\": { \"type\": \"Polygon\", \"coordinates\": [[[-120.5, 39.0], [-120.5, 39.5], [-120.0, 39.5], [-120.0, 39.0], [-120.5, 39.0]]] } } ], \"actions\": [ {\"attribute\": \"fuelLoad\", \"modifier\": \"multiply\", \"value\": 2.0} ] } ] ``` #### Example: Combined Spatial and Attribute Conditions ```python modifications: [ { \"conditions\": [ { \"operator\": \"within\", \"geometry\": {\"type\": \"Polygon\", \"coordinates\": [...]} }, { \"attribute\": \"FBFM\", \"operator\": \"eq\", \"value\": \"GR1\" } ], \"actions\": [ {\"attribute\": \"fuelLoad\", \"modifier\": \"multiply\", \"value\": 1.5} ] } ] ``` ## Response Returns SurfaceGrid object containing: - Request body fields - `status`: Job status - `createdOn`: Creation timestamp - `modifiedOn`: Last modified timestamp - `checksum`: Resource checksum ## Errors - 404: Domain not found - 422: Invalid request or incompatible data sources - 429: Too many requests :param domain_id: (required) :type domain_id: str diff --git a/fastfuels_sdk/client_library/api/water_feature_api.py b/fastfuels_sdk/client_library/api/water_feature_api.py index 176e8ca..9ebd87e 100644 --- a/fastfuels_sdk/client_library/api/water_feature_api.py +++ b/fastfuels_sdk/client_library/api/water_feature_api.py @@ -16,9 +16,12 @@ from typing import Any, Dict, List, Optional, Tuple, Union from typing_extensions import Annotated -from pydantic import StrictStr, field_validator +from pydantic import Field, StrictStr, field_validator +from typing import Optional +from typing_extensions import Annotated from fastfuels_sdk.client_library.models.create_water_feature_request import CreateWaterFeatureRequest from fastfuels_sdk.client_library.models.export import Export +from fastfuels_sdk.client_library.models.feature_data_response import FeatureDataResponse from fastfuels_sdk.client_library.models.water_feature import WaterFeature from fastfuels_sdk.client_library.api_client import ApiClient, RequestSerialized @@ -1142,6 +1145,305 @@ def _get_water_feature_serialize( + @validate_call + def get_water_feature_data( + self, + domain_id: StrictStr, + page: Annotated[Optional[Annotated[int, Field(strict=True, ge=0)]], Field(description="The page number to retrieve. Page number is zero-indexed.")] = None, + size: Annotated[Optional[Annotated[int, Field(le=1000, strict=True, ge=1)]], Field(description="The number of resources to retrieve per page.")] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> FeatureDataResponse: + """Get Water Feature Data + + # Get Water Feature Data This endpoint retrieves paginated water feature data for a specific domain. Water feature data represents individual water bodies and their attributes (e.g., lakes, rivers, streams) in GeoJSON format. The water feature resource must be created and fully processed (status \"completed\") before data can be retrieved through this endpoint. ## Endpoint ``` GET /v1/domains/{domainId}/features/water/data ``` ## Path Parameters - `domainId` (string, required): The unique identifier of the domain for which you want to retrieve water feature data. ## Query Parameters - `page` (integer, optional): Zero-indexed page number. Must be greater than or equal to 0. Defaults to `0`. - `size` (integer, optional): Number of features to return per page. Valid range: `1` to `1000`. Defaults to `50`. ## Response If the request is successful, the endpoint will return a `200 OK` status code and a GeoJSON FeatureCollection with pagination metadata. The response body will contain: - `type` (string): Always \"FeatureCollection\". - `features` (array): Array of GeoJSON Feature objects representing individual water bodies. - `currentPage` (integer): The current page number returned. - `pageSize` (integer): The number of features per page. - `totalItems` (integer): The total number of water features available in the domain. - `crs` (object, optional): Coordinate reference system information for the domain. ## Error Responses - `404 Not Found`: The specified domain does not exist, the user does not have access to it, or no water feature resource exists for this domain. - `422 Unprocessable Entity`: The water feature resource does not have status 'completed', or validation failed for query parameters. - `401 Unauthorized`: The request lacks valid authentication credentials. - `403 Forbidden`: The authenticated user does not have permission to access this domain. ## Usage Notes - The water feature resource must be created and have status 'completed' before data can be retrieved. - Use the pagination parameters to retrieve large datasets efficiently. - The `totalItems` field can be used to calculate the total number of pages available. + + :param domain_id: (required) + :type domain_id: str + :param page: The page number to retrieve. Page number is zero-indexed. + :type page: int + :param size: The number of resources to retrieve per page. + :type size: int + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._get_water_feature_data_serialize( + domain_id=domain_id, + page=page, + size=size, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "FeatureDataResponse", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def get_water_feature_data_with_http_info( + self, + domain_id: StrictStr, + page: Annotated[Optional[Annotated[int, Field(strict=True, ge=0)]], Field(description="The page number to retrieve. Page number is zero-indexed.")] = None, + size: Annotated[Optional[Annotated[int, Field(le=1000, strict=True, ge=1)]], Field(description="The number of resources to retrieve per page.")] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[FeatureDataResponse]: + """Get Water Feature Data + + # Get Water Feature Data This endpoint retrieves paginated water feature data for a specific domain. Water feature data represents individual water bodies and their attributes (e.g., lakes, rivers, streams) in GeoJSON format. The water feature resource must be created and fully processed (status \"completed\") before data can be retrieved through this endpoint. ## Endpoint ``` GET /v1/domains/{domainId}/features/water/data ``` ## Path Parameters - `domainId` (string, required): The unique identifier of the domain for which you want to retrieve water feature data. ## Query Parameters - `page` (integer, optional): Zero-indexed page number. Must be greater than or equal to 0. Defaults to `0`. - `size` (integer, optional): Number of features to return per page. Valid range: `1` to `1000`. Defaults to `50`. ## Response If the request is successful, the endpoint will return a `200 OK` status code and a GeoJSON FeatureCollection with pagination metadata. The response body will contain: - `type` (string): Always \"FeatureCollection\". - `features` (array): Array of GeoJSON Feature objects representing individual water bodies. - `currentPage` (integer): The current page number returned. - `pageSize` (integer): The number of features per page. - `totalItems` (integer): The total number of water features available in the domain. - `crs` (object, optional): Coordinate reference system information for the domain. ## Error Responses - `404 Not Found`: The specified domain does not exist, the user does not have access to it, or no water feature resource exists for this domain. - `422 Unprocessable Entity`: The water feature resource does not have status 'completed', or validation failed for query parameters. - `401 Unauthorized`: The request lacks valid authentication credentials. - `403 Forbidden`: The authenticated user does not have permission to access this domain. ## Usage Notes - The water feature resource must be created and have status 'completed' before data can be retrieved. - Use the pagination parameters to retrieve large datasets efficiently. - The `totalItems` field can be used to calculate the total number of pages available. + + :param domain_id: (required) + :type domain_id: str + :param page: The page number to retrieve. Page number is zero-indexed. + :type page: int + :param size: The number of resources to retrieve per page. + :type size: int + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._get_water_feature_data_serialize( + domain_id=domain_id, + page=page, + size=size, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "FeatureDataResponse", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + + @validate_call + def get_water_feature_data_without_preload_content( + self, + domain_id: StrictStr, + page: Annotated[Optional[Annotated[int, Field(strict=True, ge=0)]], Field(description="The page number to retrieve. Page number is zero-indexed.")] = None, + size: Annotated[Optional[Annotated[int, Field(le=1000, strict=True, ge=1)]], Field(description="The number of resources to retrieve per page.")] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Get Water Feature Data + + # Get Water Feature Data This endpoint retrieves paginated water feature data for a specific domain. Water feature data represents individual water bodies and their attributes (e.g., lakes, rivers, streams) in GeoJSON format. The water feature resource must be created and fully processed (status \"completed\") before data can be retrieved through this endpoint. ## Endpoint ``` GET /v1/domains/{domainId}/features/water/data ``` ## Path Parameters - `domainId` (string, required): The unique identifier of the domain for which you want to retrieve water feature data. ## Query Parameters - `page` (integer, optional): Zero-indexed page number. Must be greater than or equal to 0. Defaults to `0`. - `size` (integer, optional): Number of features to return per page. Valid range: `1` to `1000`. Defaults to `50`. ## Response If the request is successful, the endpoint will return a `200 OK` status code and a GeoJSON FeatureCollection with pagination metadata. The response body will contain: - `type` (string): Always \"FeatureCollection\". - `features` (array): Array of GeoJSON Feature objects representing individual water bodies. - `currentPage` (integer): The current page number returned. - `pageSize` (integer): The number of features per page. - `totalItems` (integer): The total number of water features available in the domain. - `crs` (object, optional): Coordinate reference system information for the domain. ## Error Responses - `404 Not Found`: The specified domain does not exist, the user does not have access to it, or no water feature resource exists for this domain. - `422 Unprocessable Entity`: The water feature resource does not have status 'completed', or validation failed for query parameters. - `401 Unauthorized`: The request lacks valid authentication credentials. - `403 Forbidden`: The authenticated user does not have permission to access this domain. ## Usage Notes - The water feature resource must be created and have status 'completed' before data can be retrieved. - Use the pagination parameters to retrieve large datasets efficiently. - The `totalItems` field can be used to calculate the total number of pages available. + + :param domain_id: (required) + :type domain_id: str + :param page: The page number to retrieve. Page number is zero-indexed. + :type page: int + :param size: The number of resources to retrieve per page. + :type size: int + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._get_water_feature_data_serialize( + domain_id=domain_id, + page=page, + size=size, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "FeatureDataResponse", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _get_water_feature_data_serialize( + self, + domain_id, + page, + size, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = { + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + if domain_id is not None: + _path_params['domainId'] = domain_id + # process the query parameters + if page is not None: + + _query_params.append(('page', page)) + + if size is not None: + + _query_params.append(('size', size)) + + # process the header parameters + # process the form parameters + # process the body parameter + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + + # authentication setting + _auth_settings: List[str] = [ + 'APIKeyHeader', + 'HTTPBearer' + ] + + return self.api_client.param_serialize( + method='GET', + resource_path='/v1/domains/{domainId}/features/water/data', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + + + @validate_call def get_water_feature_export( self, diff --git a/fastfuels_sdk/client_library/api_spec.json b/fastfuels_sdk/client_library/api_spec.json index 1be038a..275ab29 100644 --- a/fastfuels_sdk/client_library/api_spec.json +++ b/fastfuels_sdk/client_library/api_spec.json @@ -1 +1 @@ -{"openapi":"3.1.0","info":{"title":"FastFuels API","description":"A JSON API for creating, editing, and retrieving 3D fuels data for next generation fire behavior models.","version":"0.1.0"},"servers":[{"url":"https://api.fastfuels.silvxlabs.com"}],"paths":{"/":{"get":{"tags":["Index"],"summary":"Index","operationId":"index","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/cookies":{"get":{"tags":["Cookies"],"summary":"Create session cookie","description":"Create a session cookie for authentication","operationId":"get_cookie","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"delete":{"tags":["Cookies"],"summary":"Delete session cookie","description":"Remove session cookie for logout","operationId":"delete_cookie","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/keys":{"post":{"tags":["API Keys"],"summary":"Create API key","description":"Create a new API key for authentication","operationId":"create_key","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["API Keys"],"summary":"List API keys","description":"Get paginated list of accessible API keys","operationId":"list_keys","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":100,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListKeysResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/keys/{keyId}":{"get":{"tags":["API Keys"],"summary":"Get API key","description":"Get API key details by ID","operationId":"get_key_by_id","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"keyId","in":"path","required":true,"schema":{"type":"string","title":"Keyid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["API Keys"],"summary":"Delete API key","description":"Permanently delete an API key by ID","operationId":"delete_key","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"keyId","in":"path","required":true,"schema":{"type":"string","title":"Keyid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications":{"post":{"tags":["Applications"],"summary":"Create application","description":"Create a new application for API access","operationId":"create_application","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApplicationRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Application"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Applications"],"summary":"List applications","description":"Get paginated list of user's applications","operationId":"list_applications","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":100,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListApplicationsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{applicationId}":{"get":{"tags":["Applications"],"summary":"Get application","description":"Get application details by ID","operationId":"get_application","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"applicationId","in":"path","required":true,"schema":{"type":"string","title":"Applicationid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Application"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Applications"],"summary":"Update application","description":"Update application details","operationId":"update_application","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"applicationId","in":"path","required":true,"schema":{"type":"string","title":"Applicationid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApplicationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Application"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Applications"],"summary":"Delete application","description":"Delete an application by ID","operationId":"delete_application","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"applicationId","in":"path","required":true,"schema":{"type":"string","title":"Applicationid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains":{"post":{"tags":["Domains"],"summary":"Create Domain","description":"# Create Domain Endpoint\n\nThis endpoint creates a new domain resource based on a spatial extent and additional details provided by the user. The domain resource acts as the spatial container for all other resources that create data within the system.\n\n## What is a Domain Resource?\n\nA domain resource is a spatial container that represents a specific geographical area. It includes metadata such as the name, description, creation date, and the spatial extent defined by geographic coordinates. Domains are used to organize and manage spatial data and operations within a defined area. The data can be vectorized, such as holding features or trees in an inventory, or rasterized, such as a 3D canopy fuel grid or a Digital Elevation Model (DEM).\n\n## Endpoint: `POST /domains`\n\n### Request Body\n\nThe request body should be a GeoJSON object defined by the [GeoJSON specification (RFC 7946)](https://datatracker.ietf.org/doc/html/rfc7946). It can be either a Feature or a FeatureCollection. The required fields differ slightly between these two types, but there are some shared fields as well.\n\n#### Shared Fields\n\nThese fields are required for both Feature and FeatureCollection inputs:\n\n- **type**: (string) Must be either \"Feature\" or \"FeatureCollection\".\n- **name**: (string, optional) The name of the domain.\n- **description**: (string, optional) A brief description of the domain.\n- **horizontalResolution**: (float) The horizontal resolution in meters of a regular grid representation of the domain.\n- **verticalResolution**: (float) The vertical resolution in meters of a regular grid representation of the domain.\n- **crs**: (GeoJsonCRS) The GeoJSON specification formatted coordinate reference system (CRS) of the domain.\n - **type**: (string) Must be \"name\".\n - **properties**: (object) The properties object containing the CRS details.\n - **name**: (string) The name of the CRS, e.g., \"EPSG:4326\". Must be either 'local' or a valid authority string.\n\n#### Feature-specific Fields\n\nWhen the input type is \"Feature\", the following additional field is required:\n\n- **geometry**: (GeoJSON Geometry object) A GeoJSON geometry object defining the spatial location of the domain.\n - **type**: (string) Must be a valid GeoJSON type, e.g., \"Polygon\".\n - **coordinates**: (array) An array of coordinates defining the geometry.\n\n#### FeatureCollection-specific Fields\n\nWhen the input type is \"FeatureCollection\", the following additional field is required:\n\n- **features**: (array of Feature objects) An array of Feature objects. Each Feature object should have:\n - **type**: (string) Must be \"Feature\".\n - **geometry**: (GeoJSON Geometry object) As described in the Feature-specific fields.\n\n### Response\n\nOn successful creation, the endpoint returns the newly created domain resource with the following fields:\n\n- **id**: (string) A unique identifier for the domain.\n- **name**: (string) The name of the domain.\n- **description**: (string) A brief description of the domain.\n- **createdOn**: (datetime) The date and time the domain was created.\n- **modifiedOn**: (datetime) The date and time the domain was last modified.\n- **type**: (string) Will be \"FeatureCollection\".\n- **features**: (array) An array of two Feature objects:\n 1. The domain feature (padded bounding box):\n - **type**: (string) Will be \"Feature\".\n - **geometry**: (GeoJSON) The GeoJSON geometry representing the padded spatial extent of the domain.\n - **properties**: (object) Additional properties of the domain feature.\n - **name**: (string) Will be \"domain\".\n - **area**: (float) The area of the domain in square meters.\n - **perimeter**: (float) The perimeter of the domain in meters.\n 2. The input feature:\n - **type**: (string) Will be \"Feature\".\n - **geometry**: (GeoJSON) The GeoJSON geometry representing the original input geometry.\n - **properties**: (object) Additional properties of the input feature.\n - **name**: (string) Will be \"input\".\n - **area**: (float) The area of the input geometry in square meters.\n - **perimeter**: (float) The perimeter of the input geometry in meters.\n- **horizontalResolution**: (float) The horizontal resolution of the domain.\n- **verticalResolution**: (float) The vertical resolution of the domain.\n- **crs**: (GeoJsonCRS) The coordinate reference system of the domain.\n- **utmAuthorityString**: (string, optional) The UTM authority string if the input was projected to UTM.\n\n### Processing from Request to Response\n\nThe system performs several processing steps to convert the Request Body into the Response Body:\n\n1. **CRS Handling and Projection**:\n - If the input CRS is geographic (e.g., EPSG:4326), the geometry is automatically projected to the appropriate UTM zone.\n - If the input CRS is already projected, the domain will keep that CRS.\n - If the input CRS is 'local', the spatial data is assumed to be NOT geo-referenced, and no projection is performed.\n\n2. **Bounding Box Calculation**:\n - The system calculates the bounding box of the input geometry (or the combined geometries for a FeatureCollection).\n\n3. **Resolution-based Padding**:\n - The bounding box is padded out to the nearest multiple of the user-provided horizontal resolution.\n\n4. **FeatureCollection Creation**:\n - The system creates a FeatureCollection with two features: the padded bounding box (domain) and the original input geometry.\n\nThese steps ensure that the domain's extent is regularized, aligned with the specified resolution, and in a suitable projected coordinate system (when applicable), which allows for subsequent grid-based operations.\n\n### Important Notes\n\n1. **Projection**: The domain will always be stored in a projected coordinate system if the input is geographic. This ensures consistency and accuracy for spatial operations within the domain.\n\n2. **UTM Zone Selection**: When projecting from a geographic CRS, the system automatically selects the appropriate UTM zone based on the centroid of the input geometry.\n\n3. **FeatureCollection Handling**: When a FeatureCollection is provided as input, the domain will be created based on the combined extent of all features in the collection.\n\n4. **Zero Area Handling**: If the spatial extent has zero area (e.g., a point or line), the endpoint will raise an error.\n\n5. **Resolution Alignment**: The spatial extent is padded out to the nearest multiple of horizontal and vertical resolution (in meters) to ensure grid alignment.\n\n6. **Maximum Area**: Currently, the maximum area for a domain is 16 square kilometers. We are planning to increase this limit in the future. If this limitation is an issue for your use case, please contact us for assistance.\n\n7. **CRS Preservation**: If you provide data in a specific projected CRS, that CRS will be preserved in the domain. This is useful for maintaining consistency with existing data sources or specific regional requirements.\n\n### Error Responses\n\n- **422 Unprocessable Entity**: The spatial extent is invalid.\n - **Detail**: \"Invalid spatial extent. The area of the spatial extent must be greater than zero meters.\"\n - **Detail**: \"Invalid spatial extent. The area of the spatial extent must be less than sixteen square kilometers.\"\n- **500 Internal Server Error**: An error occurred while creating the domain resource.","operationId":"create_domain","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDomainRequest"},"examples":{"feature collection WGS84":{"value":{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"coordinates":[[[-114.09545796676623,46.8324794598619],[-114.11217537297199,46.8324794598619],[-114.11217537297199,46.82496749915157],[-114.09545796676623,46.82496749915157],[-114.09545796676623,46.8324794598619]]],"type":"Polygon"}}],"name":"Example","description":"This is an example domain.","horizontalResolution":2,"verticalResolution":1},"summary":"Example WGS84 FeatureCollection","description":"This example creates a domain from a FeatureCollection GeoJSON object. The GeoJSON represents an approximately 1 square kilometer area in the Blue Mountain Recreation Area outside of Missoula, Montana. The CRS of the FeatureCollection is not provided so it is assumed to be 'EPSG:4326'."},"feature collection EPSG:5070":{"value":{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-1377797.8087433458,2780720.35945401],[-1379055.2389321132,2780962.840146559],[-1379212.7978295316,2780146.1745799617],[-1377955.2239776908,2779903.6661836714],[-1377797.8087433458,2780720.35945401]]]}}],"name":"Example","description":"This is an example domain.","horizontalResolution":2,"verticalResolution":1,"crs":{"properties":{"name":"EPSG:5070"},"type":"name"}},"summary":"Example EPSG:5070 FeatureCollection","description":"This example creates a domain from a FeatureCollection GeoJSON object with a CRS of 'EPSG:5070'. Note that the CRS is explicitly set in the GeoJSON object. Because the CRS is a projected coordinate system, FastFuels uses the provided CRS for the domain instead of reprojecting."},"feature UTM":{"value":{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[721502.7544906491,5190645.048516054],[720227.9398802927,5190598.00908098],[720258.6480286171,5189763.323999467],[721533.6406826023,5189810.364218195],[721502.7544906491,5190645.048516054]]]},"crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:EPSG::32611"}},"name":"Example","description":"This is an example domain.","horizontalResolution":2,"verticalResolution":1},"summary":"Example UTM Feature","description":"This example creates a domain from a polygon feature GeoJSON object with UTM coordinates."},"feature local":{"value":{"type":"Feature","geometry":{"coordinates":[[[0,0],[0,100],[100,100],[100,0],[0,0]]],"type":"Polygon"},"properties":{},"name":"Example","description":"This is an example domain.","horizontalResolution":2,"verticalResolution":1,"crs":{"properties":{"name":"local"},"type":"name"}},"summary":"Example Local Feature","description":"Example of a domain with spatial data in a local coordinate system (with meter units). The crs field is set to 'local' to indicate that the coordinates are in a local coordinate system."},"feature 3DEP":{"value":{"type":"Feature","geometry":{"coordinates":[[[-114.19991252294375,46.7747518267752],[-114.19991252294375,46.77023218168779],[-114.19133479742844,46.77023218168779],[-114.19133479742844,46.7747518267752],[-114.19991252294375,46.7747518267752]]],"type":"Polygon"},"properties":{},"name":"3DEP Example","description":"Small 3DEP example domain behind blue mountain","horizontalResolution":2,"verticalResolution":1,"crs":{"properties":{"name":"EPSG:4326"},"type":"name"}},"summary":"Example 3DEP Feature","description":"Example of a domain with spatial data from the 3DEP point cloud resource."}}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Domains"],"summary":"List Domains","description":"# List Domains Endpoint\n\nThis endpoint retrieves a paginated list of domain resources based on the\nquery parameters provided by the user.\n\n## Endpoint: `GET /domains`\n\n### Query Parameters\n\nTo retrieve a list of domains, the following query parameters can be used:\n\n- **page**: (integer, optional) The page number to retrieve. Page number is zero-indexed. Default is 0.\n- **size**: (integer, optional) The number of resources to retrieve per page. Minimum is 1 and maximum is 1000. Default is 100.\n- **sortBy**: (string, optional) The field by which to sort the domains. Valid values are:\n - \"createdOn\"\n - \"modifiedOn\"\n - \"name\"\n- **sortOrder**: (string, optional) The order in which to sort the results. Valid values are:\n - \"ascending\"\n - \"descending\"\n\n### Response\n\nThe response is a paginated list of domain resources, including metadata about the current page and the size of each page.\n\n- **domains**: (array) A list of Domain objects.\n- **currentPage**: (integer) The current page number.\n- **pageSize**: (integer) The number of domains per page.\n- **totalItems**: (integer) The total number of domain resources that belong to the user.\n\nEach Domain object in the list follows the Domain schema.\n\n### Example Request\n\n```http\nGET /domains?page=0&size=10&sortBy=createdOn&sortOrder=ascending\n```\n\n### Important Notes\n\n1. The `page` parameter is zero-indexed, meaning that the first page is `0`.\n2. The `size` parameter determines the number of domains returned per page, with a minimum of 1 and a maximum of 1000.\n3. The `sortBy` parameter allows sorting by specific fields, and the `sortOrder` parameter determines the order of sorting (ascending or descending).\n\n### Error Responses\n\n- **422 Unprocessable Entity**: Invalid query parameters.\n - **Detail**: \"Invalid value for query parameter 'page'. Must be a non-negative integer.\"\n - **Detail**: \"Invalid value for query parameter 'size'. Must be an integer between 1 and 1000.\"\n- **500 Internal Server Error**: An error occurred while listing the domain resources.","operationId":"list_domains","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"The page number to retrieve. Page number is zero-indexed.","default":0,"title":"Page"},"description":"The page number to retrieve. Page number is zero-indexed."},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"The number of resources to retrieve per page.","default":100,"title":"Size"},"description":"The number of resources to retrieve per page."},{"name":"sortBy","in":"query","required":false,"schema":{"$ref":"#/components/schemas/DomainSortField"}},{"name":"sortOrder","in":"query","required":false,"schema":{"$ref":"#/components/schemas/DomainSortOrder"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListDomainResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}":{"get":{"tags":["Domains"],"summary":"Get Domain","description":"# Get Domain Endpoint\n\nThis endpoint retrieves a specific domain resource based on the provided domain ID.\n\n## Endpoint: `GET /domains/{domainId}`\n\n### Path Parameters\n\nTo retrieve a specific domain, the following path parameter is required:\n\n- **domainId**: (string) The unique identifier of the domain to retrieve.\n\n### Response\n\nThe response returns the details of the requested domain resource, including its metadata and spatial information.\n\n- **id**: (string) A unique identifier for the domain.\n- **name**: (string) The name of the domain.\n- **description**: (string) A brief description of the domain.\n- **createdOn**: (datetime) The date and time the domain was created.\n- **modifiedOn**: (datetime) The date and time the domain was last modified.\n- **type**: (string) Always \"FeatureCollection\".\n- **features**: (array) An array of two Feature objects:\n 1. The domain feature (padded bounding box):\n - **type**: (string) Will be \"Feature\".\n - **geometry**: (GeoJSON) The GeoJSON geometry representing the padded spatial extent of the domain.\n - **properties**: (object) Additional properties of the domain feature.\n - **name**: (string) Will be \"domain\".\n - **area**: (float) The area of the domain in square meters.\n - **perimeter**: (float) The perimeter of the domain in meters.\n 2. The input feature:\n - **type**: (string) Will be \"Feature\".\n - **geometry**: (GeoJSON) The GeoJSON geometry representing the original input geometry.\n - **properties**: (object) Additional properties of the input feature.\n - **name**: (string) Will be \"input\".\n - **area**: (float) The area of the input geometry in square meters.\n - **perimeter**: (float) The perimeter of the input geometry in meters.\n- **horizontalResolution**: (float) The horizontal resolution of the domain in meters.\n- **verticalResolution**: (float) The vertical resolution of the domain in meters.\n- **crs**: (GeoJsonCRS) The coordinate reference system of the domain.\n- **utmAuthorityString**: (string, optional) The UTM authority string if the input was projected to UTM.\n\n### Error Responses\n\n- **404 Not Found**: The specified domain does not exist or the user does not have access to it.\n - **Detail**: \"Resource not found.\"\n- **500 Internal Server Error**: An error occurred while retrieving the domain resource.\n - **Detail**: \"An error occurred while getting the domain resource.\"","operationId":"get_domain","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Domains"],"summary":"Update Domain","description":"# Update Domain Endpoint\n\nThis endpoint updates an existing domain resource based on the provided domain ID and request body. Users can modify specific fields of the domain, while other fields remain unchanged.\n\n## Endpoint: `PATCH /domains/{domainId}`\n\n### Path Parameters\n\nTo update a specific domain, the following path parameter is required:\n\n- **domainId**: (string) The unique identifier of the domain to update.\n\n### Request Body\n\nTo update a domain, the request body should include one or more of the following fields:\n\n- **name**: (string, optional) The name of the domain.\n- **description**: (string, optional) A brief description of the domain.\n- **tags**: (array of strings, optional) A list of tags associated with the domain.\n\n### Fields that Can Be Updated\n\n- **name**: The name of the domain.\n- **description**: A brief description of the domain.\n- **tags**: The list of tags associated with the domain.\n\n### Fields that Cannot Be Updated\n\nThe following fields cannot be updated. If you wish to change these fields, you need to create a new domain resource with the desired values:\n\n- **id**: The unique identifier for the domain.\n- **createdOn**: The date and time the domain was created.\n- **type**: Always \"FeatureCollection\".\n- **features**: The FeatureCollection containing the domain and input geometries.\n- **horizontalResolution**: The horizontal resolution of the domain.\n- **verticalResolution**: The vertical resolution of the domain.\n- **crs**: The coordinate reference system of the domain.\n- **utmAuthorityString**: The UTM authority string of the domain.\n\n### Response\n\nThe response returns the updated domain resource with the following fields:\n\n- **id**: (string) A unique identifier for the domain.\n- **name**: (string) The name of the domain.\n- **description**: (string) A brief description of the domain.\n- **createdOn**: (datetime) The date and time the domain was created.\n- **modifiedOn**: (datetime) The date and time the domain was last modified.\n- **type**: (string) Always \"FeatureCollection\".\n- **features**: (array) An array of two Feature objects:\n 1. The domain feature (padded bounding box):\n - **type**: (string) Will be \"Feature\".\n - **geometry**: (GeoJSON) The GeoJSON geometry representing the padded spatial extent of the domain.\n - **properties**: (object) Additional properties of the domain feature.\n - **name**: (string) Will be \"domain\".\n - **area**: (float) The area of the domain in square meters.\n - **perimeter**: (float) The perimeter of the domain in meters.\n 2. The input feature:\n - **type**: (string) Will be \"Feature\".\n - **geometry**: (GeoJSON) The GeoJSON geometry representing the original input geometry.\n - **properties**: (object) Additional properties of the input feature.\n - **name**: (string) Will be \"input\".\n - **area**: (float) The area of the input geometry in square meters.\n - **perimeter**: (float) The perimeter of the input geometry in meters.\n- **horizontalResolution**: (float) The horizontal resolution of the domain.\n- **verticalResolution**: (float) The vertical resolution of the domain.\n- **crs**: (GeoJsonCRS) The coordinate reference system of the domain.\n- **utmAuthorityString**: (string, optional) The UTM authority string if the input was projected to UTM.\n- **tags**: (array of strings) A list of tags associated with the domain.\n\n### Important Notes\n\n1. Only the **name**, **description**, and **tags** fields can be updated. If you wish to change any other fields (such as features, horizontalResolution, verticalResolution, crs, etc.), you must create a new domain resource with the desired values.\n2. The **modifiedOn** field will be automatically updated to the current date and time whenever any updatable field is changed.\n\n### Error Responses\n\n- **404 Not Found**: The specified domain does not exist or the user does not have access to it.\n - **Detail**: \"Resource not found.\"\n- **500 Internal Server Error**: An error occurred while updating the domain resource.\n - **Detail**: \"An error occurred while updating the domain resource.\"","operationId":"update_domain","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDomainRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Domains"],"summary":"Delete Domain","description":"# Delete Domain Endpoint\n\nThis endpoint deletes an existing domain resource based on the provided domain ID.\n\n## Endpoint: `DELETE /domains/{domainId}`\n\n### Path Parameters\n\nTo delete a specific domain, the following path parameter is required:\n\n- **domainId**: (string) The unique identifier of the domain to delete.\n\n### Response\n\nThe response does not return any content on a successful deletion and will have a status code of 204 No Content.\n\n### Example Request\n\n```http\nDELETE /domains/1e7d8d3c9f8b4c3ba9e7c3b4f8d7a9c1\n```\n\n### Example Response\n\n```\nHTTP/1.1 204 No Content\n```\n\n### Important Notes\n\n1. Deleting a domain is a permanent action and cannot be undone. Once a domain is deleted, it is removed from the database and cannot be recovered.\n2. Ensure that you have the correct domain ID before making the delete request to avoid accidentally deleting the wrong domain.\n\n### Error Responses\n\n- **404 Not Found**: The specified domain does not exist or the user does not have access to it.\n - **Detail**: \"Resource not found.\"\n- **500 Internal Server Error**: An error occurred while deleting the domain resource.\n - **Detail**: \"An error occurred while deleting the domain resource.\"\n\n### Example Error Response\n\n```json\n{\n \"detail\": \"Resource not found.\"\n}\n```\n\n### Example Internal Server Error Response\n\n```json\n{\n \"detail\": \"An error occurred while deleting the domain resource.\"\n}\n```","operationId":"delete_domain","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/preview":{"post":{"tags":["Domains"],"summary":"Preview Domain","description":"# Preview Domain Endpoint\n\nThis endpoint processes a CreateDomainRequest and returns a Domain object without saving the data to the database. It allows users to preview what their domain will look like before actually creating it.\n\n## Endpoint: `POST /domains/preview`\n\n### Request Body\n\nThe request body should be a GeoJSON object defined by the [GeoJSON specification (RFC 7946)](https://datatracker.ietf.org/doc/html/rfc7946). It can be either a Feature or a FeatureCollection. The structure is identical to the Create Domain endpoint's request body.\n\n#### Shared Fields\n\n- **type**: (string) Must be either \"Feature\" or \"FeatureCollection\".\n- **name**: (string, optional) The name of the domain.\n- **description**: (string, optional) A brief description of the domain.\n- **horizontalResolution**: (float) The horizontal resolution in meters of a regular grid representation of the domain.\n- **verticalResolution**: (float) The vertical resolution in meters of a regular grid representation of the domain.\n- **crs**: (GeoJsonCRS) The GeoJSON specification formatted coordinate reference system (CRS) of the domain.\n - **type**: (string) Must be \"name\".\n - **properties**: (object) The properties object containing the CRS details.\n - **name**: (string) The name of the CRS, e.g., \"EPSG:4326\". Must be either 'local' or a valid authority string.\n- **tags**: (array of strings, optional) A list of tags associated with the domain.\n\n#### Feature-specific Fields\n\nWhen the input type is \"Feature\", the following additional field is required:\n\n- **geometry**: (GeoJSON Geometry object) A GeoJSON geometry object defining the spatial location of the domain.\n - **type**: (string) Must be a valid GeoJSON type, e.g., \"Polygon\".\n - **coordinates**: (array) An array of coordinates defining the geometry.\n\n#### FeatureCollection-specific Fields\n\nWhen the input type is \"FeatureCollection\", the following additional field is required:\n\n- **features**: (array of Feature objects) An array of Feature objects. Each Feature object should have:\n - **type**: (string) Must be \"Feature\".\n - **geometry**: (GeoJSON Geometry object) As described in the Feature-specific fields.\n\n### Response\n\nThe response returns a preview of the domain resource with the following fields:\n\n- **id**: (string) Will always be \"preview\" for this endpoint.\n- **name**: (string) The name of the domain.\n- **description**: (string) A brief description of the domain.\n- **createdOn**: (datetime) The current date and time.\n- **modifiedOn**: (datetime) The current date and time.\n- **type**: (string) Always \"FeatureCollection\".\n- **features**: (array) An array of two Feature objects:\n 1. The domain feature (padded bounding box):\n - **type**: (string) Will be \"Feature\".\n - **geometry**: (GeoJSON) The GeoJSON geometry representing the padded spatial extent of the domain.\n - **properties**: (object) Additional properties of the domain feature.\n - **name**: (string) Will be \"domain\".\n - **area**: (float) The area of the domain in square meters.\n - **perimeter**: (float) The perimeter of the domain in meters.\n 2. The input feature:\n - **type**: (string) Will be \"Feature\".\n - **geometry**: (GeoJSON) The GeoJSON geometry representing the original input geometry.\n - **properties**: (object) Additional properties of the input feature.\n - **name**: (string) Will be \"input\".\n - **area**: (float) The area of the input geometry in square meters.\n - **perimeter**: (float) The perimeter of the input geometry in meters.\n- **horizontalResolution**: (float) The horizontal resolution of the domain.\n- **verticalResolution**: (float) The vertical resolution of the domain.\n- **crs**: (GeoJsonCRS) The coordinate reference system of the domain.\n- **utmAuthorityString**: (string, optional) The UTM authority string if the input was projected to UTM.\n- **tags**: (array of strings) A list of tags associated with the domain.\n\n### Processing\n\nThe preview endpoint performs the same processing steps as the create endpoint:\n\n1. **CRS Handling and Projection**: Projects the geometry to UTM if necessary.\n2. **Bounding Box Calculation**: Calculates the bounding box of the input geometry.\n3. **Resolution-based Padding**: Pads the bounding box to align with the specified resolution.\n4. **FeatureCollection Creation**: Creates a FeatureCollection with the padded domain and original input geometries.\n\n### Important Notes\n\n1. This endpoint does not save any data to the database. It's purely for preview purposes.\n2. The `id` field will always be \"preview\" in the response.\n3. The `createdOn` and `modifiedOn` fields will be set to the current time but are not persisted.\n4. All the same validations and checks applied in the create endpoint are also applied here, including area limitations and CONUS checks.\n\n### Error Responses\n\n- **422 Unprocessable Entity**: The spatial extent is invalid.\n - **Detail**: \"Invalid spatial extent. The area of the spatial extent must be greater than zero meters.\"\n - **Detail**: \"Invalid spatial extent. The area of the spatial extent must be less than sixteen square kilometers.\"\n - **Detail**: \"Invalid spatial extent. The spatial extent must be entirely within CONUS.\"\n- **500 Internal Server Error**: An error occurred while previewing the domain resource.\n - **Detail**: \"An error occurred while previewing the domain resource.\"","operationId":"preview_domain","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDomainRequest"},"examples":{"feature collection WGS84":{"summary":"Example WGS84 FeatureCollection","description":"This example creates a domain from a FeatureCollection GeoJSON object. The GeoJSON represents an approximately 1 square kilometer area in the Blue Mountain Recreation Area outside of Missoula, Montana. The CRS of the FeatureCollection is not provided so it is assumed to be 'EPSG:4326'.","value":{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"coordinates":[[[-114.09545796676623,46.8324794598619],[-114.11217537297199,46.8324794598619],[-114.11217537297199,46.82496749915157],[-114.09545796676623,46.82496749915157],[-114.09545796676623,46.8324794598619]]],"type":"Polygon"}}],"name":"Example","description":"This is an example domain.","horizontalResolution":2,"verticalResolution":1}},"feature collection EPSG:5070":{"summary":"Example EPSG:5070 FeatureCollection","description":"This example creates a domain from a FeatureCollection GeoJSON object with a CRS of 'EPSG:5070'. Note that the CRS is explicitly set in the GeoJSON object. Because the CRS is a projected coordinate system, FastFuels uses the provided CRS for the domain instead of reprojecting.","value":{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-1377797.8087433458,2780720.35945401],[-1379055.2389321132,2780962.840146559],[-1379212.7978295316,2780146.1745799617],[-1377955.2239776908,2779903.6661836714],[-1377797.8087433458,2780720.35945401]]]}}],"name":"Example","description":"This is an example domain.","horizontalResolution":2,"verticalResolution":1,"crs":{"properties":{"name":"EPSG:5070"},"type":"name"}}},"feature UTM":{"summary":"Example UTM Feature","description":"This example creates a domain from a polygon feature GeoJSON object with UTM coordinates.","value":{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[721502.7544906491,5190645.048516054],[720227.9398802927,5190598.00908098],[720258.6480286171,5189763.323999467],[721533.6406826023,5189810.364218195],[721502.7544906491,5190645.048516054]]]},"crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:EPSG::32611"}},"name":"Example","description":"This is an example domain.","horizontalResolution":2,"verticalResolution":1}},"feature local":{"summary":"Example Local Feature","description":"Example of a domain with spatial data in a local coordinate system (with meter units). The crs field is set to 'local' to indicate that the coordinates are in a local coordinate system.","value":{"type":"Feature","geometry":{"coordinates":[[[0,0],[0,100],[100,100],[100,0],[0,0]]],"type":"Polygon"},"properties":{},"name":"Example","description":"This is an example domain.","horizontalResolution":2,"verticalResolution":1,"crs":{"properties":{"name":"local"},"type":"name"}}},"feature 3DEP":{"summary":"Example 3DEP Feature","description":"Example of a domain with spatial data from the 3DEP point cloud resource.","value":{"type":"Feature","geometry":{"coordinates":[[[-114.19991252294375,46.7747518267752],[-114.19991252294375,46.77023218168779],[-114.19133479742844,46.77023218168779],[-114.19133479742844,46.7747518267752],[-114.19991252294375,46.7747518267752]]],"type":"Polygon"},"properties":{},"name":"3DEP Example","description":"Small 3DEP example domain behind blue mountain","horizontalResolution":2,"verticalResolution":1,"crs":{"properties":{"name":"EPSG:4326"},"type":"name"}}}}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/v1/domains/reproject":{"post":{"tags":["Domains"],"summary":"Reproject Geojson","description":"# Reproject GeoJSON Endpoint\n\nThis endpoint reprojects a GeoJSON FeatureCollection to a different coordinate reference system (CRS) using the specified EPSG code.\n\n## Endpoint: `POST /domains/reproject`\n\n### Query Parameters\n\nTo reproject a GeoJSON, the following query parameter is required:\n\n- **targetEPSG**: (integer, optional) The EPSG code of the target coordinate reference system. Default is 4362.\n\n### Request Body\n\nThe request body should be a GeoJSON FeatureCollection object that includes:\n\n- **type**: (string) Must be \"FeatureCollection\".\n- **features**: (array) An array of Feature objects, each containing:\n - **type**: (string) Must be \"Feature\".\n - **geometry**: (object) A GeoJSON geometry object.\n - **properties**: (object, optional) Properties associated with the feature.\n\n### Response\n\nThe response returns the reprojected GeoJSON FeatureCollection with all geometries transformed to the target coordinate reference system while preserving the original properties of each feature.\n\n### Example Request\n\n```http\nPOST /domains/reproject?targetEPSG=32633\nContent-Type: application/json\n\n{\n \"type\": \"FeatureCollection\",\n \"features\": [\n {\n \"type\": \"Feature\",\n \"geometry\": {\n \"type\": \"Polygon\",\n \"coordinates\": [[[...coordinates in source CRS...]]]\n },\n \"properties\": {\n \"name\": \"Example Feature\"\n }\n }\n ]\n}\n```\n\n### Example Response\n\n```json\n{\n \"type\": \"FeatureCollection\",\n \"features\": [\n {\n \"type\": \"Feature\",\n \"geometry\": {\n \"type\": \"Polygon\",\n \"coordinates\": [[[...coordinates in target CRS...]]]\n },\n \"properties\": {\n \"name\": \"Example Feature\"\n }\n }\n ]\n}\n```","operationId":"reproject_geojson","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"targetEPSG","in":"query","required":false,"schema":{"type":"integer","description":"The target EPSG code to reproject the GeoJSON to.","default":4362,"title":"Targetepsg"},"description":"The target EPSG code to reproject the GeoJSON to."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeoJSONFeatureCollection"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeoJSONFeatureCollection"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/features/{featureName}/style":{"patch":{"tags":["Domains"],"summary":"Update Feature Style","description":"# Update Feature Style\n\nUpdates the style properties of a specific feature in a domain while preserving its geometry. This endpoint allows you to customize the visual appearance of either the domain boundary or input geometry features.\n\n## Endpoint\n\n```\nPATCH /domains/{domainId}/features/{featureName}/style\n```\n\n## Path Parameters\n\n- `domainId` (string, required)\n - The unique identifier of the domain containing the feature to update\n\n- `featureName` (string, required)\n - The name of the feature to update\n - Must be either \"domain\" or \"input\"\n - \"domain\" refers to the padded bounding box feature\n - \"input\" refers to the original input geometry feature\n\n## Request Body\n\nThe request body should contain style properties to update. All properties are optional:\n\n```json\n{\n \"strokeColor\": string, // The color of line/boundary (e.g., \"#555555\")\n \"strokeOpacity\": number, // The opacity of lines/boundaries (0-1)\n \"strokeWidth\": number, // The width of lines/boundaries\n \"fillColor\": string, // The fill color for polygons (e.g., \"#555555\")\n \"fillOpacity\": number // The opacity of polygon fills (0-1)\n}\n```\n\n## Response\n\nReturns the updated feature with the new style properties. The response includes:\n\n- `type`: Always \"Feature\"\n- `geometry`: The unchanged GeoJSON geometry of the feature\n- `properties`: Object containing:\n - `name`: The feature name (\"domain\" or \"input\")\n - `area`: The area of the feature in square meters\n - `perimeter`: The perimeter of the feature in meters\n - `style`: The updated style properties\n\n## Example Request\n\n```http\nPATCH /domains/abc123/features/domain/style\nContent-Type: application/json\n\n{\n \"strokeColor\": \"#FF0000\",\n \"strokeWidth\": 3,\n \"strokeOpacity\": 0.8,\n \"fillColor\": \"#FFA500\",\n \"fillOpacity\": 0.3\n}\n```\n\n## Example Response\n\n```json\n{\n \"type\": \"Feature\",\n \"geometry\": {\n \"type\": \"Polygon\",\n \"coordinates\": [/* ... */]\n },\n \"properties\": {\n \"name\": \"domain\",\n \"area\": 10000.0,\n \"perimeter\": 400.0,\n \"style\": {\n \"strokeColor\": \"#FF0000\",\n \"strokeWidth\": 3,\n \"strokeOpacity\": 0.8,\n \"fillColor\": \"#FFA500\",\n \"fillOpacity\": 0.3\n }\n }\n}\n```\n\n## Error Responses\n\n- **404 Not Found**\n - The specified domain or feature does not exist\n - The user does not have access to the specified domain\n\n- **500 Internal Server Error**\n - An error occurred while updating the feature style\n - Response includes an error message in the detail field\n\n## Notes\n\n- Style properties are merged with existing styles - only specified properties are updated\n- Unspecified style properties retain their existing values\n- The geometry and other feature properties remain unchanged\n- Style changes are persistent and will be saved to the database","operationId":"update_feature_style","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"featureName","in":"path","required":true,"schema":{"enum":["domain","input"],"type":"string","title":"Featurename"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeoJSONStyleProperties"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeoJSONFeature"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/export":{"get":{"tags":["Domains"],"summary":"Export Domain Data","description":"# Export Domain Data Endpoint\n\nThis endpoint exports all metadata for a domain including features, grids, and inventories.\nReturns domain configuration and metadata for all resources without including large data payloads.\n\n## Endpoint: `GET /domains/{domainId}/export`\n\n### Path Parameters\n\n- **domainId**: (string) The unique identifier of the domain to export.\n\n### Response\n\nThe response returns a JSON object containing metadata for the domain and all its resources:\n\n- **domain**: (object) Full domain metadata including:\n - **id**: Domain identifier\n - **name**: Domain name\n - **description**: Domain description\n - **horizontalResolution**: Grid horizontal resolution in meters\n - **verticalResolution**: Grid vertical resolution in meters\n - **crs**: Coordinate reference system\n - **features**: Domain boundary geometry\n - **createdOn**: Creation timestamp\n - **modifiedOn**: Last modification timestamp\n - **tags**: Associated tags\n\n- **features**: (object) Feature metadata (excluding GeoJSON data):\n - **road**: Road feature configuration, sources, status, timestamps\n - **water**: Water feature configuration, sources, status, timestamps\n\n- **grids**: (object) Grid metadata (excluding array data):\n - **tree**: Tree grid configuration, attributes, sources, status\n - **surface**: Surface grid configuration, attributes, sources, modifications\n - **topography**: Topography grid configuration, attributes, sources\n - **feature**: Feature grid configuration, attributes\n\n- **inventories**: (object) Inventory metadata (excluding tree records):\n - **tree**: Tree inventory configuration, sources, modifications, treatments\n\n### What is Excluded\n\nThe following large data payloads are excluded to keep the response size manageable.\nUse dedicated endpoints to access this data:\n\n- **Feature GeoJSON**: Use `/features/{type}/exports/geojson`\n- **Grid array data**: Use `/grids/exports/zarr` or `/grids/{type}/{attribute}/data`\n- **Tree inventory records**: Use `/inventories/tree/exports/{format}`\n\n### Use Cases\n\n- Backup domain configuration and settings\n- Audit domain state and resource creation\n- Compare domains and their configurations\n- Debug configuration issues\n- Export for documentation or sharing\n\n### Error Responses\n\n- **404 Not Found**: The specified domain does not exist or the user does not have access to it.\n - **Detail**: \"Resource not found: domains/{domainId}\"\n - **Detail**: \"Unauthorized access for: domains/{domainId}\"\n\n### Example Response\n\n```json\n{\n \"domain\": {\n \"id\": \"abc123\",\n \"name\": \"My Domain\",\n \"description\": \"Test domain\",\n \"horizontalResolution\": 10.0,\n \"verticalResolution\": 2.0,\n ...\n },\n \"features\": {\n \"road\": {\n \"status\": \"completed\",\n \"sources\": [\"OSM\"],\n ...\n }\n },\n \"grids\": {\n \"tree\": {\n \"status\": \"completed\",\n \"attributes\": [\"bulkDensity\", \"fuelMoisture\"],\n ...\n }\n },\n \"inventories\": {\n \"tree\": {\n \"status\": \"completed\",\n \"sources\": [\"TreeMap\"],\n ...\n }\n }\n}\n```","operationId":"export_domain_data","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Export Domain Data V1 Domains Domainid Export Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/features":{"get":{"tags":["Features"],"summary":"Get Features","description":"# Get Features Endpoint\n\nThis endpoint retrieves the features resource associated with a domain\nbelonging to the user based on the provided domain ID.\n\nA features resource is a container for the various types of feature\ndata that can exist with the spatial context of the domain. Currently,\nonly road and water features are supported, though other forms of feature\nwill be added soon.\n\n## Endpoint: `GET /v1/domains/{domainId}/features`\n\n### Path Parameters\n\nTo retrieve the features of a domain, the following path parameter is required:\n\n- **domainId**: (string) The unique identifier of the domain belonging to the user whose features are to be retrieved.\n\n### Response\n\nThe response returns the members of the specified features resource\nfollowing the Features schema.\n\n- **road**: (RoadFeature)\n- **water**: (WaterFeature)\n\n### Example Request\n\n```http\nGET /v1/domains/1e7d8d3c9f8b4c3ba9e7c3b4f8d7a9c1/features\n```\n\n### Error Responses\n\n- **404 Not Found**: The specified domain does not exist or the user does not have access to it.\n - **Detail**: \"Domain not found.\"\n- **500 Internal Server Error**: An error occurred while retrieving the feature resources.\n - **Detail**: \"An error occurred while getting the feature resources.\"","operationId":"get_features","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Features"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/features/exports/{exportFormat}":{"post":{"tags":["Features"],"summary":"Create Feature Export","description":"# Create Feature Export\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/features/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint initiates the creation of an export file for the feature data (road and water) of a specific domain, in the specified format.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format in which to export the feature data. Possible value:\n - `\"geojson\"`: Export the feature data in GeoJSON format.\n\n## Response\n\nIf successful, returns a `201 Created` status code and a JSON object with:\n\n- `status` (string): Initially set to `\"pending\"`.\n- `createdOn` (string): Timestamp of the export request creation.\n- `modifiedOn` (string): Timestamp of the last modification.\n- `expiresOn` (string): Expiration timestamp (7 days from creation).\n- `signedUrl` (string, optional): Initially `null`, populated when export is completed.\n\n## Error Responses\n\n- `404 Not Found`: If the domain is not found, or there are no water or road features created.\n- `429 Too Many Requests`: Error submitting the export job due to resource exhaustion.\n\n## Usage Notes\n\n- Ensure that the road and water feature data for the domain have been created before initiating an export. If neither feature exists, the request will result in a `404 Not Found` error.\n- The export will be processed as a background job, and the status will initially be set to `\"pending\"`.\n- Check the export status using a separate endpoint to monitor progress.\n- Once the export is complete, use the `signedUrl` to download the GeoJSON file.","operationId":"create_feature_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"const":"geojson","type":"string","title":"Exportformat"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Features"],"summary":"Get Feature Export","description":"# Get Feature Export\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/features/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint retrieves the details of a feature export request (for road and water features) for a specific domain.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format of the export. Possible value:\n - `\"geojson\"`: Export the feature data in GeoJSON format.\n\n## Response\n\nIf successful, returns a `200 OK` status code and a JSON object with:\n\n- `status` (string): Current status of the export (`\"pending\"`, `\"running\"`, `\"completed\"`, `\"failed\"`, or `\"expired\"`).\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of the last modification.\n- `expiresOn` (string): Expiration timestamp.\n- `signedUrl` (string, optional): URL to download the exported file, if status is `\"completed\"`.\n\n## Error Responses\n\n- `404 Not Found`: Export not found or no feature data exists for the specified export format.\n\n## Usage Notes\n\n- Use this endpoint to check the status of a feature export request.\n- Once the status is `\"completed\"`, you can use the `signedUrl` to download the exported GeoJSON file.\n- The signed URL expires 7 days after creation.","operationId":"get_feature_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"const":"geojson","type":"string","title":"Exportformat"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Features"],"summary":"Delete Feature Export","description":"# Delete Feature Export\n\n## Endpoint\n\n```\nDELETE /v1/domains/{domainId}/features/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint deletes a feature export request and its associated files for a specific domain.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format of the export to delete. Possible values are:\n - `\"geojson\"`: Delete the export in the geojson format.\n\n## Response\n\nIf successful, returns a `204 No Content` status code.\n\n## Error Responses\n\n- `404 Not Found`: Domain or export request not found.\n\n## Usage Notes\n\n- Use this endpoint to delete an existing feature export request and its related data.\n- The export request is removed from Firestore, and the associated files are deleted from Google Cloud Storage asynchronously.","operationId":"delete_feature_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"const":"geojson","type":"string","title":"Exportformat"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/features/road":{"post":{"tags":["Road Feature"],"summary":"Create Road Feature","description":"# Create Road Feature\n\nThis endpoint creates a new road feature resource for a specific domain.\nRoad features represent various road attributes (e.g., type, condition) within the spatial context of a domain.\nThe road feature data can be generated using various data sources (e.g., OSM, user-provided GeoJSON).\n\nOn resource creation, the road feature data is set to a status of \"pending\".\nThe road feature data is generated in the background using the specified methods and data sources.\nOnce the road feature data is generated and available for user access, the status is updated to \"completed\".\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/features/road\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to create the road feature.\n\n## Request Body\n\nThe request body should be a JSON object containing the following fields:\n\n- `sources` (array of strings, required): List of sources to include in the road feature. Possible values include:\n - `\"OSM\"`: OpenStreetMap data source. Not supported for domains with local coordinate systems.\n - `\"geojson\"`: User-provided GeoJSON data. Supported for all coordinate systems including local.\n- `geojson` (object, optional): GeoJSON Feature or FeatureCollection object. Required when source is `\"geojson\"`.\n Must contain only Polygon or MultiPolygon geometries (area-based features).\n\n## Response\n\nIf the request is successful, the endpoint will return a `201 Created` status code and the created road feature resource in the response body. The response body will be a JSON object with the following fields:\n\n- `status` (string): The status of the road feature. Will be set to `\"pending\"` initially.\n- `createdOn` (string): The timestamp when the road feature was created.\n- `modifiedOn` (string): The timestamp when the road feature was last modified.\n- `checksum` (string): A unique checksum for the road feature resource.\n- `sources` (array of strings): The list of sources used for the road feature.\n- `geojson` (object, optional): The GeoJSON data if provided.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `422 Unprocessable Entity`: Invalid request body (e.g., OSM source with local CRS, missing geojson field, invalid geometry types).\n- `503 Service Unavailable`: The service is temporarily unavailable (OSM source only).\n\n## Usage Notes\n\n- OSM source is not supported for domains with \"local\" coordinate systems.\n- geojson source is supported for all coordinate systems, including local.\n- When using geojson source, the provided GeoJSON will be clipped to the domain boundary.\n- For non-local CRS, the GeoJSON will be automatically transformed to match the domain's CRS.\n- The endpoint updates the road feature data in the database and logs relevant information for monitoring and debugging.","operationId":"create_road_feature","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRoadFeatureRequest"},"examples":{"OSM source":{"value":{"sources":["OSM"]},"summary":"OSM Source Example","description":"This example creates a road feature using OpenStreetMap data. The road data will be automatically fetched from OSM based on the domain boundary. Note: OSM source is not supported for domains with local coordinate systems."},"GeoJSON source":{"value":{"sources":["geojson"],"geojson":{"type":"FeatureCollection","name":"road","crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:OGC:1.3:CRS84"}},"features":[{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-114.10642793064184,46.83276641015527],[-114.10601673996699,46.83205398685405],[-114.10557181862677,46.83168108130049],[-114.10481856162541,46.83156628534552],[-114.10398620803223,46.83148139151754],[-114.10383371860418,46.83143498343838],[-114.1019381969797,46.832386812410306],[-114.10154897057593,46.83241949539097],[-114.1011173123978,46.832376644929134],[-114.09969047951152,46.832106463373236],[-114.09824592361048,46.832165550706954],[-114.09788135714261,46.832315850119066],[-114.09686270290597,46.83223681341092],[-114.09667926299389,46.83218961010543],[-114.09661334539341,46.83226239332075],[-114.09729838549353,46.832492515303045],[-114.09735857865687,46.83252595300362],[-114.0969412563536,46.83250472391239],[-114.09646946744755,46.83234383393762],[-114.09538030113876,46.832135353896334],[-114.0950569932669,46.83209523226897],[-114.09506329436755,46.83197838904346],[-114.09643105075425,46.83219394537029],[-114.09659097833102,46.83210227559111],[-114.09762453468636,46.83219232957655],[-114.09779993777798,46.83210105084325],[-114.0987658347815,46.83200855432987],[-114.0996652437212,46.83199945681341],[-114.1015225878364,46.83233373350426],[-114.10377523573847,46.83136968249515],[-114.10439547172474,46.83136411431307],[-114.10560905169886,46.831565020384055],[-114.10604248947286,46.83186317863551],[-114.10640546268593,46.83231910223805],[-114.10658327904652,46.83275970380685],[-114.10642793064184,46.83276641015527]]]]}}]}},"summary":"GeoJSON Source Example","description":"This example creates a road feature using user-provided GeoJSON data. The GeoJSON must contain Polygon or MultiPolygon geometries representing road areas. The provided GeoJSON will be clipped to the domain boundary and transformed to match the domain's CRS if necessary. This source is supported for all coordinate systems including local."}}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoadFeature"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Road Feature"],"summary":"Get Road Feature","description":"# Get Road Feature\n\nThis endpoint retrieves the details of an existing road feature resource\nfor a specific domain. Users can access the status and metadata of the\nroad feature that has been created.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/features/road\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to retrieve the road feature.\n\n## Response\n\nIf the request is successful, the endpoint will return a `200 OK` status code and the road feature resource in the response body. The response body will be a JSON object with the following fields:\n\n- `status` (string): The status of the road feature.\n- `createdOn` (string): The timestamp when the road feature was created.\n- `modifiedOn` (string): The timestamp when the road feature was last modified.\n- `checksum` (string): A unique checksum for the road feature resource.\n- `sources` (array of strings): The list of sources used for the road feature.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `404 Not Found`: The road feature for the specified domain does not exist or is empty.\n\n## Usage Notes\n\n- Ensure that the domain ID provided in the request path is valid and that the user has access to the specified domain.\n- If the road feature data is empty or invalid, the endpoint will raise a `404 Not Found` error with a detail message indicating the issue.","operationId":"get_road_feature","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoadFeature"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Road Feature"],"summary":"Delete Road Feature","description":"# Delete Road Feature\n\nThis endpoint deletes an existing road feature resource for a specific\ndomain. This action removes the road feature data from the database and\ncancels any ongoing job execution related to the road feature.\n\n## Endpoint\n\n```\nDELETE /v1/domains/{domainId}/features/road\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to delete the road feature.\n\n## Response\n\nIf the request is successful, the endpoint will return a `204 No Content` status code. This indicates that the road feature has been successfully deleted and no content is returned in the response body.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n - **Detail**: \"Domain not found\"\n\n## Usage Notes\n\n- Deleting a road feature is a permanent action and cannot be undone. Ensure that you have the correct domain ID before making the delete request.\n- The endpoint will also cancel any ongoing job execution related to the road feature and remove the associated data from the cache and cloud storage.","operationId":"delete_road_feature","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/features/road/exports/{exportFormat}":{"post":{"tags":["Road Feature"],"summary":"Create Road Feature Export","description":"# Create Road Feature Export\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/features/road/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint initiates the creation of an export file for the road feature data of a specific domain, in the specified format.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format in which to export the road feature data. Possible value:\n - `\"geojson\"`: Export the feature data in GeoJSON format.\n\n## Response\n\nIf successful, returns a `201 Created` status code and a JSON object with:\n\n- `status` (string): Initially set to `\"pending\"`.\n- `createdOn` (string): Timestamp of the export request creation.\n- `modifiedOn` (string): Timestamp of the last modification.\n- `expiresOn` (string): Expiration timestamp (7 days from creation).\n- `signedUrl` (string, optional): Initially `null`, populated when export is completed.\n\n## Error Responses\n\n- `404 Not Found`: If the domain is not found, or there are no water or road features created.\n- `429 Too Many Requests`: Error submitting the export job due to resource exhaustion.\n\n## Usage Notes\n\n- The export will be processed as a background job, and the status will initially be set to `\"pending\"`.\n- Check the export status using a separate endpoint to monitor progress.\n- Once the export is complete, use the `signedUrl` to download the GeoJSON file.","operationId":"create_road_feature_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"const":"geojson","type":"string","title":"Exportformat"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Road Feature"],"summary":"Get Road Feature Export","description":"# Get Road Feature Export\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/features/road/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint retrieves the details of a feature export request (for road features) for a specific domain.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format of the export. Possible value:\n - `\"geojson\"`: Export the feature data in GeoJSON format.\n\n## Response\n\nIf successful, returns a `200 OK` status code and a JSON object with:\n\n- `status` (string): Current status of the export (`\"pending\"`, `\"running\"`, `\"completed\"`, `\"failed\"`, or `\"expired\"`).\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of the last modification.\n- `expiresOn` (string): Expiration timestamp.\n- `signedUrl` (string, optional): URL to download the exported file, if status is `\"completed\"`.\n\n## Error Responses\n\n- `404 Not Found`: Export not found or no feature data exists for the specified export format.\n\n## Usage Notes\n\n- Use this endpoint to check the status of a road feature export request.\n- Once the status is `\"completed\"`, you can use the `signedUrl` to download the exported GeoJSON file.\n- The signed URL expires 7 days after creation.","operationId":"get_road_feature_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"const":"geojson","type":"string","title":"Exportformat"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/features/water":{"post":{"tags":["Water Feature"],"summary":"Create Water Feature","description":"# Create Water Feature\n\nThis endpoint creates a new water feature resource for a specific domain.\nWater feature data represents various water-related attributes (e.g.,\nlakes, rivers) that exist within the spatial context of a domain. The\nwater feature data can be sourced from different data sources (e.g., OSM)\nand can include various details about water features in the domain.\n\nOn resource creation, the water feature data is set to a status of \"pending\".\nThe data is processed in the background, and once it is available for user\naccess, the status is updated to \"completed\".\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/features/water\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for\n which you want to create the water feature.\n\n## Request Body\n\nThe request body should be a JSON object containing the following fields:\n\n- `sources` (array of strings, required): List of sources from which the\n water feature data should be collected. Currently, `\"OSM\"` is a supported source.\n- Additional fields might be included based on the source. For example,\n if the source is `\"OSM\"`, the request can specify additional parameters\n related to how the data should be fetched.\n\n## Response\n\nIf the request is successful, the endpoint will return a `201 Created` status code\nand the created water feature resource in the response body. The response body will\nbe a JSON object with the following fields:\n\n- `status` (string): The status of the water feature. Initially set to `\"pending\"`.\n- `createdOn` (string): The timestamp when the water feature was created.\n- `modifiedOn` (string): The timestamp when the water feature was last modified.\n- `checksum` (string): A unique checksum for the water feature resource.\n- `sources` (array of strings): The list of sources used to gather the water feature data.\n\n## Error Responses\n\n- `422 Unprocessable Entity`: The domain is in a local coordinate system which\n does not support water features.\n - **Detail**: \"WaterFeature is not supported for local coordinate systems.\"\n- `429 Too Many Requests`: An error occurred while running the job for processing\n the water feature data.\n - **Detail**: An error message related to job submission.\n\n## Usage Notes\n\n- Ensure that the domain ID provided in the request path is valid and that the user\n has access to the specified domain.\n- If using `\"OSM\"` as a source, additional parameters can be specified as needed.\n- The process of creating and updating the water feature data involves background\n job execution, and the endpoint will return the initial resource with a pending status.","operationId":"create_water_feature","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWaterFeatureRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaterFeature"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Water Feature"],"summary":"Get Water Feature","description":"# Get Water Feature\n\nThis endpoint retrieves the details of an existing water feature resource\nfor a specific domain. The water feature data represents various water-related\nattributes (e.g., lakes, rivers) that have been created and stored for the\ngiven domain.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/features/water\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for\n which you want to retrieve the water feature.\n\n## Response\n\nIf the request is successful, the endpoint will return a `200 OK` status code\nand the water feature resource in the response body. The response body will\nbe a JSON object with the following fields:\n\n- `status` (string): The status of the water feature.\n- `createdOn` (string): The timestamp when the water feature was created.\n- `modifiedOn` (string): The timestamp when the water feature was last modified.\n- `checksum` (string): A unique checksum for the water feature resource.\n- `sources` (array of strings): The list of sources used to gather the water feature data.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `404 Not Found`: The water feature for the specified domain does not exist or is empty.\n - **Detail**: \"water feature empty.\"\n\n## Usage Notes\n\n- Ensure that the domain ID provided in the request path is valid and that the user\n has access to the specified domain.\n- If the water feature data does not exist or is empty, a `404 Not Found` error will be raised.","operationId":"get_water_feature","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaterFeature"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Water Feature"],"summary":"Delete Water Feature","description":"# Delete Water Feature\n\nThis endpoint deletes an existing water feature resource for a specific domain.\nThis action removes the water feature data from the database and cancels any ongoing\njob execution related to the water feature.\n\n## Endpoint\n\n```\nDELETE /v1/domains/{domainId}/features/water\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to delete the water feature.\n\n## Response\n\nIf the request is successful, the endpoint will return a `204 No Content` status code.\nThis indicates that the water feature has been successfully deleted and no content is returned\nin the response body.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n - **Detail**: \"Domain not found\"\n- `404 Not Found`: The water feature for the specified domain does not exist.\n - **Detail**: \"Water feature not found\"\n\n## Usage Notes\n\n- Deleting a water feature is a permanent action and cannot be undone. Ensure that you have\n the correct domain ID before making the delete request.\n- The endpoint will also cancel any ongoing job execution related to the water feature and\n remove the associated data from the cache and cloud storage.","operationId":"delete_water_feature","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/features/water/exports/{exportFormat}":{"post":{"tags":["Water Feature"],"summary":"Create Water Feature Export","description":"# Create Water Feature Export\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/features/water/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint initiates the creation of an export file for the water feature data of a specific domain, in the specified format.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format in which to export the water feature data. Possible value:\n - `\"geojson\"`: Export the feature data in GeoJSON format.\n\n## Response\n\nIf successful, returns a `201 Created` status code and a JSON object with:\n\n- `status` (string): Initially set to `\"pending\"`.\n- `createdOn` (string): Timestamp of the export request creation.\n- `modifiedOn` (string): Timestamp of the last modification.\n- `expiresOn` (string): Expiration timestamp (7 days from creation).\n- `signedUrl` (string, optional): Initially `null`, populated when export is completed.\n\n## Error Responses\n\n- `404 Not Found`: If the domain is not found, or there are no water or water features created.\n- `429 Too Many Requests`: Error submitting the export job due to resource exhaustion.\n\n## Usage Notes\n\n- The export will be processed as a background job, and the status will initially be set to `\"pending\"`.\n- Check the export status using a separate endpoint to monitor progress.\n- Once the export is complete, use the `signedUrl` to download the GeoJSON file.","operationId":"create_water_feature_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"const":"geojson","type":"string","title":"Exportformat"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Water Feature"],"summary":"Get Water Feature Export","description":"# Get Water Feature Export\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/features/water/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint retrieves the details of a feature export request (for water features) for a specific domain.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format of the export. Possible value:\n - `\"geojson\"`: Export the feature data in GeoJSON format.\n\n## Response\n\nIf successful, returns a `200 OK` status code and a JSON object with:\n\n- `status` (string): Current status of the export (`\"pending\"`, `\"running\"`, `\"completed\"`, `\"failed\"`, or `\"expired\"`).\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of the last modification.\n- `expiresOn` (string): Expiration timestamp.\n- `signedUrl` (string, optional): URL to download the exported file, if status is `\"completed\"`.\n\n## Error Responses\n\n- `404 Not Found`: Export not found or no feature data exists for the specified export format.\n\n## Usage Notes\n\n- Use this endpoint to check the status of a water feature export request.\n- Once the status is `\"completed\"`, you can use the `signedUrl` to download the exported GeoJSON file.\n- The signed URL expires 7 days after creation.","operationId":"get_water_feature_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"const":"geojson","type":"string","title":"Exportformat"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/inventories":{"get":{"tags":["Inventories"],"summary":"Get Inventories","description":"# Get Inventories Endpoint\n\nThis endpoint retrieves the inventories resource associated with a domain\nbelonging to the user based on the provided domain ID.\n\nAn inventories resource is a container for the various types of inventory\ndata that can exist with the spatial context of the domain. Currently,\nonly tree inventories are supported, though other forms of inventory will\nbe added soon.\n\n## Endpoint: `GET /v1/domains/{domainId}/inventories`\n\n### Path Parameters\n\nTo retrieve the inventories of a domain, the following path parameter is required:\n\n- **domainId**: (string) The unique identifier of the domain belonging to the user whose inventories are to be retrieved.\n\n### Response\n\nThe response returns the members of the specified inventories resource\nfollowing the Inventories schema.\n\n- **tree**: (TreeInventory)\n\n\n### Example Request\n\n```http\nGET /v1/domains/1e7d8d3c9f8b4c3ba9e7c3b4f8d7a9c1/inventories\n```\n\n### Error Responses\n\n- **404 Not Found**: The specified domain does not exist or the user does not have access to it.\n - **Detail**: \"Domain not found.\"\n- **500 Internal Server Error**: An error occurred while retrieving the inventory resources.\n - **Detail**: \"An error occurred while getting the inventory resources.\"","operationId":"get_inventories","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Inventories"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/inventories/tree":{"post":{"tags":["Tree Inventory"],"summary":"Create Tree Inventory","description":"# Create Tree Inventory\n\nThis endpoint creates a new tree inventory resource for a specific domain. Tree Inventory data represents a complete forest inventory that exists within the spatial context of a domain. The tree inventory data can be generated using various data products and models that provide either national coverage (e.g., TreeMap) or local coverage.\n\nOn resource creation, the tree inventory data is set to a status of \"pending\". The tree inventory data is generated in the background using the specified method (e.g., TreeMap). Once the tree inventory data is generated and available for user access, the status is updated to \"completed\".\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/inventories/tree\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for\n which you want to create the tree inventory.\n\n## Request Body\n\nThe request body should be a JSON object containing the following fields:\n\n- `sources` (array of strings, required): List of data sources to be used for building the tree inventory. Currently, only one data source at a time is supported. Possible values are:\n - `\"TreeMap\"`: Indicates that the tree inventory should be created using the TreeMap raster product. This approach generates a tree inventory with national coverage.\n - `\"file\"`: Indicates that you will upload a file via a signed url. Please see File Source Configuration for more info.\n - `\"pointcloud\"`: Indicates that the tree inventory should be created from the domain's ALS point cloud resource. This resource must exist and be in a \"completed\" state.\n\n- `modifications` (array of objects, optional): List of modifications to apply to the tree inventory data. Maximum 1000 modifications allowed. See the Modifications section below for details.\n\n- `treatments` (array of objects, optional): List of silvicultural treatments to apply to the tree inventory. Maximum 1000 treatments allowed. See the Treatments section below for details.\n\n- `featureMasks` (array of strings, optional): List of Features to mask tree inventory data. Referenced features must exist and be completed before creating the tree inventory.\n\n### TreeMap Source Configuration\n\nIf `\"TreeMap\"` is included in the `sources`, the request body can include additional configurations for `TreeMap`:\n\n- `TreeMap` (object, optional): Advanced configurations for the TreeMap data source.\n - `version` (string, optional): The version of TreeMap to use. Default is `\"2022\"`. Possible values are:\n - `\"2014\"`: Use the 2014 version of TreeMap.\n - `\"2016\"`: Use the 2016 version of TreeMap.\n - `\"2020\"`: Use the 2020 version of TreeMap.\n - `\"2022\"`: Use the 2022 version of TreeMap.\n - `seed` (integer, optional): The random seed to use for generating the tree inventory. If not provided, a random seed will be generated.\n - `canopyHeightMapConfiguration` (object, optional): Canopy height map configuration for TreeMap data source. If provided, the canopy height map will be used to segment and impute the coarse 30m TreeMap data with high-resolution canopy height data. Details of this approach will be provided in an upcoming publication. Please contact support.fastfuels@silvxlabs.com for more information.\n - `source` (string, required): The source of the canopy height map data. Possible values are:\n - `\"Meta2024\"`: Use the Meta2024 canopy height map data. More information about this data source can be found here: https://www.sciencedirect.com/science/article/pii/S003442572300439X\n\n### File Source Configuration\nGenerate Signed URL for Tree Inventory Upload\n\nIf the source is `\"file\"`, this endpoint generates a signed URL that allows users to upload a CSV file representing the tree inventory data.\nThe signed URL is valid for 1 hour and has a maximum upload size of 500 MB.\n\nThe full work flow consists of the following steps:\n1. Call this endpoint to get a signed URL\n2. Perform a put request to send your file to the signed url. Here is a python example:\n\n```[python]\nwith open(\"your_file_goes_here.csv\", \"rb\") as file:\n upload_response = requests.put(\n signed_url_response[\"file\"][\"url\"],\n data=file,\n headers=signed_url_response[\"file\"][\"headers\"],\n )\n```\n**Note**: the signed_url_response has a field named \"file\" with the relevant info for the put request.\n\n3. Your file will be validated and processed in the background\n4. The status of your upload can be retrieved via and inventory get() request\n\n#### Required Columns\n\nThe CSV file must include the following columns with their specified data types and constraints:\n\n1. **SPCD** (Integer)\n - FIA species code\n - Must be an integer\n - Represents standard FIA species classifications\n\n2. **STATUSCD** (Integer)\n - Tree status code\n - Must be one of these values:\n - 0: No status\n - 1: Live\n - 2: Dead\n - 3: Missing\n\n3. **DIA** (Float)\n - Diameter at breast height (DBH)\n - Unit: centimeters (cm)\n - Range: 0 to 1200 cm\n - Measured at 1.37 meters above ground\n\n4. **HT** (Float)\n - Tree height\n - Unit: meters (m)\n - Range: 0 to 116 meters\n - Measured from ground to tree top\n\n5. **CR** (Float)\n - Crown ratio\n - Unit: ratio (dimensionless)\n - Range: 0 to 1\n - Represents the ratio of crown length to total tree height\n\n6. **X** (Float)\n - X coordinate in projected coordinate system\n - Unit: meters (m)\n - Range: Must fall within domain bounds (west to east)\n - Required: Yes\n - Used for spatial positioning\n\n7. **Y** (Float)\n - Y coordinate in projected coordinate system\n - Unit: meters (m)\n - Range: Must fall within domain bounds (south to north)\n - Required: Yes\n - Used for spatial positioning\n\n### Point Cloud Source Configuration\n\nIf `\"pointcloud\"` is included in the `sources`, the endpoint will:\n1. Verify that a completed ALS point cloud resource exists for the domain.\n2. Perform a spatial check to ensure the domain's bounding box intersects with the operational area of the tree generation model.\n3. If validation passes, it will schedule a background job (`treecondenser`) to generate the tree inventory from the point cloud data.\n### Modifications\n\nThe `modifications` field allows you to filter and adjust tree inventory data before it's finalized. Modifications are applied sequentially in the order they appear in the array, and each modification consists of:\n\n1. **Conditions**: Criteria for selecting which trees to modify (AND logic)\n2. **Actions**: Operations to perform on selected trees\n\n#### Modification Structure\n\n```json\n{\n \"conditions\": [\n {/* condition 1 */},\n {/* condition 2 */}\n ],\n \"actions\": [\n {/* action 1 */},\n {/* action 2 */}\n ]\n}\n```\n\nAll conditions must be true (AND logic) for a tree to be selected. Actions are then applied to all selected trees.\n\n#### Condition Types\n\n**1. Simple Field Conditions**\n\nFilter trees based on individual field values:\n\n- **Available Fields**: `HT` (height), `DIA` (diameter), `CR` (crown ratio), `SPCD` (species code)\n- **Operators**: `eq` (equals), `ne` (not equals), `gt` (greater than), `lt` (less than), `ge` (greater than or equal), `le` (less than or equal)\n\n**Example**: Select trees taller than 20 meters\n```json\n{\n \"attribute\": \"HT\",\n \"operator\": \"gt\",\n \"value\": 20\n}\n```\n\n**2. Expression-Based Conditions**\n\nFilter trees based on arithmetic expressions combining multiple fields. This enables complex filtering logic in a single API call, replacing download-modify-upload workflows.\n\n- **Available Fields**: `HT`, `DIA`, `CR`\n- **Operators**: `+`, `-`, `*`, `/`, `()`\n- **Comparison Operators**: Same as simple conditions (`eq`, `ne`, `gt`, `lt`, `ge`, `le`)\n\n**Example**: Select trees where crown length (HT × CR) is less than 1 meter\n```json\n{\n \"attribute\": \"expression\",\n \"expression\": \"HT * CR\",\n \"operator\": \"lt\",\n \"value\": 1.0\n}\n```\n\n**Common Expression Use Cases:**\n\n- **Crown length**: `HT * CR` (vertical extent of crown)\n- **Crown base height**: `HT * (1 - CR)` (height where crown begins)\n- **Height-to-diameter ratio**: `HT / DIA` (slenderness ratio)\n- **Average metrics**: `(HT + DIA) / 2`\n\n**Security Notes:**\n- Only arithmetic operations permitted\n- No function calls, imports, or code execution\n- Validated at API level for safety\n\n**Multiple Conditions:**\n\nCombine multiple conditions with AND logic:\n```json\n{\n \"conditions\": [\n {\n \"attribute\": \"expression\",\n \"expression\": \"HT * CR\",\n \"operator\": \"gt\",\n \"value\": 5.0\n },\n {\n \"attribute\": \"SPCD\",\n \"operator\": \"eq\",\n \"value\": 202\n }\n ],\n \"actions\": [...]\n}\n```\nThis selects Douglas-fir trees (SPCD=202) with crown length > 5m.\n\n#### Action Types\n\n**1. Modify Field Values**\n\nAdjust tree attributes for selected trees:\n\n- **Available Fields**: `HT`, `DIA`, `CR`, `SPCD`\n- **Modifiers**:\n - `multiply`: Multiply by value\n - `divide`: Divide by value\n - `add`: Add value\n - `subtract`: Subtract value\n - `replace`: Replace with value\n\n**Example**: Reduce height of tall trees by 10%\n```json\n{\n \"attribute\": \"HT\",\n \"modifier\": \"multiply\",\n \"value\": 0.9\n}\n```\n\n**Value Constraints**: Modifications automatically enforce valid ranges:\n- `HT` ≥ 0 (height cannot be negative)\n- `DIA` ≥ 0 (diameter cannot be negative)\n- `CR`: 0 ≤ CR ≤ 1 (crown ratio must be between 0 and 1)\n\n**2. Remove Trees**\n\nRemove selected trees from the inventory.\n\n**New simplified syntax** (recommended):\n```json\n{\n \"modifier\": \"remove\"\n}\n```\n\n**Legacy syntax** (still supported):\n```json\n{\n \"attribute\": \"all\",\n \"modifier\": \"remove\"\n}\n```\n\nBoth syntaxes produce identical results and are fully backwards compatible.\n\n**Important**: Remove action must be the only action in the actions array. Multiple actions cannot be combined with remove.\n\n#### Complete Modification Examples\n\n**Example 1: Remove trees with short crowns**\n\nReplace pandas workflow:\n```python\n# Old workflow: download CSV, filter in pandas\ndf = df[df['HT'] * df['CR'] >= 1]\n# ...then re-upload\n```\n\nWith single API call:\n```json\n{\n \"modifications\": [\n {\n \"conditions\": [\n {\n \"attribute\": \"expression\",\n \"expression\": \"HT * CR\",\n \"operator\": \"lt\",\n \"value\": 1.0\n }\n ],\n \"actions\": [\n {\"modifier\": \"remove\"}\n ]\n }\n ]\n}\n```\n\n**Example 2: Remove unrealistic trees**\n\nRemove trees with abnormal height-to-diameter ratio:\n```json\n{\n \"modifications\": [\n {\n \"conditions\": [\n {\n \"attribute\": \"expression\",\n \"expression\": \"HT / DIA\",\n \"operator\": \"gt\",\n \"value\": 100.0\n }\n ],\n \"actions\": [\n {\"modifier\": \"remove\"}\n ]\n }\n ]\n}\n```\n\n**Example 3: Modify and filter**\n\nReduce height of tall trees, then remove small diameter trees:\n```json\n{\n \"modifications\": [\n {\n \"conditions\": [\n {\"attribute\": \"HT\", \"operator\": \"gt\", \"value\": 30}\n ],\n \"actions\": [\n {\"attribute\": \"HT\", \"modifier\": \"multiply\", \"value\": 0.9}\n ]\n },\n {\n \"conditions\": [\n {\"attribute\": \"DIA\", \"operator\": \"lt\", \"value\": 10}\n ],\n \"actions\": [\n {\"modifier\": \"remove\"}\n ]\n }\n ]\n}\n```\n\n**Processing Order:**\n1. Modifications are applied before treatments\n2. Modifications within the array are applied sequentially\n3. All conditions must be true (AND logic) for trees to be selected\n4. Actions are applied to all selected trees\n\n### Treatments\n\nThe `treatments` field is an array of treatment objects. Each treatment object represents a silvicultural treatment to be applied to the tree inventory. Currently, there are two types of treatment types available:\n\n1. Proportional Thinning\n2. Directional Thinning\n\n#### Proportional Thinning\n\n- `method`: \"proportionalThinning\" (string, required)\n- `targetMetric`: \"basalArea\" (string, required)\n- `targetValue`: float (required)\n - Unit: square meters per hectare (m²/ha)\n - Represents the target basal area after thinning\n\n#### Directional Thinning\n\n- `method`: \"directionalThinning\" (string, required)\n- `direction`: (string, required)\n - Possible values: \"below\" or \"above\"\n - Indicates whether to thin from below (smallest to largest) or above (largest to smallest)\n- `targetMetric`: (string, required)\n - Possible values: \"diameter\" or \"basalArea\"\n- `targetValue`: float (required)\n - Units of the targetValue quantity depends on the targetMetric:\n - For \"diameter\": centimeters (cm)\n - For \"basalArea\": square meters per hectare (m²/ha)\n - Represents the threshold for thinning (diameter) or the target basal area after thinning\n\nNote: The order of treatments in the array determines the sequence in which they will be applied to the tree inventory.\n\n## Response\n\nIf the request is successful, the endpoint will return a `201 Created` status code and the created tree inventory resource in the response body. The response body will be a JSON object with the following fields:\n\n- `status` (string): The status of the tree inventory. Will be set to `\"pending\"` initially.\n- `createdOn` (string): The timestamp when the tree inventory was created.\n- `modifiedOn` (string): The timestamp when the tree inventory was last modified.\n- `checksum` (string): A unique checksum for the tree inventory resource.\n\n## Error Responses\n\n- `404 Not Found`: If the specified domain does not exist or the user does not have access to it.\n- `422 Unprocessable Entity`: If `TreeMap` is specified as a source for a domain with a \"local\" coordinate system.\n- `422 Unprocessable Entity`: If `featureMasks` are provided but the required features resource is not in a \"completed\" state.\n- `422 Unprocessable Entity`: If `pointcloud` is specified as a source but the domain's 'als' pointcloud resource is not in a \"completed\" state.\n- `422 Unprocessable Entity`: If `pointcloud` is specified and the domain is outside the model's operational area.\n- `422 Unprocessable Entity`: If an unexpected error occurs during the point cloud spatial bound check.\n- `500 Internal Server Error`: If the point cloud model configuration is missing required data (e.g., spatial bounds).\n- `503 Service Unavailable`: If the background job service (e.g., StandGen or TreeCondenser) is temporarily unavailable or exhausted.","operationId":"create_tree_inventory","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTreeInventoryRequest"},"examples":{"treemap_defaults":{"value":{"sources":["TreeMap"]},"summary":"TreeMap example with defaults","description":"This example creates a tree inventory using data from the TreeMap raster product. In this example, the user only provides 'TreeMap' as an element in the 'sources' list. The 'TreeMap' source is then populated with default values for the 'version' and 'seed' fields."},"treemap_advanced":{"value":{"sources":["TreeMap"],"TreeMap":{"version":"2022","seed":123456789}},"summary":"TreeMap example with advanced options","description":"This example creates a tree inventory using data from the TreeMap raster product. In this example, the user provides 'TreeMap' as an element in the 'sources' list. The 'TreeMap' source is then populated with the specified 'version' and 'seed' values."},"treemap_with_meta_canopy_height_model_configuration":{"value":{"sources":["TreeMap"],"TreeMap":{"version":"2022","seed":123456789,"canopyHeightMapConfiguration":{"source":"Meta2024"}}},"summary":"TreeMap example with canopy height map configuration","description":"Shows how to use TreeMap data product with a imputation and segmentation from a high resolution canopy height map."},"treemap_with_feature_masks":{"value":{"sources":["TreeMap"],"featureMasks":["road","water"]},"summary":"TreeMap example with feature masks","description":"This example creates a tree inventory using data from the TreeMap raster product. In this example, the user provides 'TreeMap' as an element in the 'sources' list. The 'TreeMap' source is then populated with default values for the 'version' and 'seed' fields. The 'featureMasks' list is also provided with 'road' and 'water' elements to mask out these features from the inventory."},"file_upload":{"value":{"sources":["file"]},"summary":"File upload","description":"Upload custom tree inventory data via CSV file.\n\nThis initiates a two-step upload process:\n1. The API returns a signed URL with required headers\n2. Upload your CSV file using a PUT request to the signed URL\n\nRequired CSV columns:\n- SPCD (Integer): FIA species code\n- STATUSCD (Integer): Tree status code (0=alive, 1=dead, 2=cut, 3=removed)\n- DIA (Float): Diameter at breast height in centimeters (0-1200)\n- HT (Float): Tree height in meters (0-116)\n- CR (Float): Crown ratio as a decimal (0-1)\n- X (Float): X coordinate in meters (within domain bounds)\n- Y (Float): Y coordinate in meters (within domain bounds)\n\nMaximum file size: 500 MB"},"treemap_ht_modification":{"value":{"sources":["TreeMap"],"modifications":[{"conditions":{"attribute":"HT","operator":"gt","value":20},"actions":{"attribute":"HT","modifier":"multiply","value":0.9}}]},"summary":"TreeMap height modification example","description":"This example creates a tree inventory using data from the TreeMap raster product. It applies a modification to reduce the height of all trees taller than 20 meters by 10%."},"treemap_dia_modification":{"value":{"sources":["TreeMap"],"modifications":[{"conditions":{"attribute":"DIA","operator":"lt","value":20.32},"actions":{"attribute":"all","modifier":"remove"}}]},"summary":"TreeMap remove trees modification example","description":"This example creates a tree inventory using data from the TreeMap raster product. It applies a modification to remove all trees with a diameter at breast height less than 20.32cm (8 inches)."},"treemap_remove_short_crown":{"value":{"sources":["TreeMap"],"modifications":[{"conditions":[{"attribute":"expression","expression":"HT * CR","operator":"lt","value":1.0}],"actions":[{"modifier":"remove"}]}]},"summary":"Remove trees with crown length < 1m using expression","description":"Remove trees where crown length (CL = HT * CR) is less than 1 meter.\n\nThis example demonstrates:\n- Expression-based conditions that combine multiple fields\n- Simplified remove action syntax (no 'attribute' field required)\n- Single API call replaces download-modify-upload workflow\n\nCrown Length (CL) represents the vertical extent of the tree crown, computed as height times crown ratio.\n\nEquivalent pandas operation: df = df[df['HT'] * df['CR'] >= 1]"},"treemap_remove_high_slenderness":{"value":{"sources":["TreeMap"],"modifications":[{"conditions":[{"attribute":"expression","expression":"HT / DIA","operator":"gt","value":100.0}],"actions":[{"modifier":"remove"}]}]},"summary":"Remove trees with height/diameter ratio > 100","description":"Remove trees where the height-to-diameter ratio exceeds 100.\n\nThis filters out unrealistically thin trees that may be data artifacts. The expression 'HT / DIA' computes the slenderness ratio for each tree.\n\nExample: A tree with HT=20m and DIA=0.15cm would have a ratio of 133, and would be removed."},"treemap_complex_expression_filtering":{"value":{"sources":["TreeMap"],"modifications":[{"conditions":[{"attribute":"expression","expression":"HT * CR","operator":"gt","value":2.0},{"attribute":"expression","expression":"HT / DIA","operator":"lt","value":80.0}],"actions":[{"modifier":"remove"}]}]},"summary":"Complex filtering with multiple expressions","description":"Remove trees matching multiple expression-based criteria (AND logic).\n\nRemoves trees where:\n- Crown length (HT * CR) > 2 meters AND\n- Height/diameter ratio (HT / DIA) < 80\n\nAll conditions must be true for a tree to be removed. This demonstrates combining multiple computed metrics for sophisticated filtering."},"treemap_mixed_conditions":{"value":{"sources":["TreeMap"],"modifications":[{"conditions":[{"attribute":"expression","expression":"HT * (1 - CR)","operator":"lt","value":5.0},{"attribute":"SPCD","operator":"eq","value":202}],"actions":[{"modifier":"remove"}]}]},"summary":"Mixed expression and field conditions","description":"Remove Douglas-fir trees with low crown base height.\n\nConditions (all must be true):\n- Crown base height (HT * (1 - CR)) < 5 meters\n- Species code (SPCD) equals 202 (Douglas-fir)\n\nCrown base height represents the height at which the tree crown begins. This example demonstrates combining expression-based filtering with traditional field filtering."},"treemap_remove_simplified_syntax":{"value":{"sources":["TreeMap"],"modifications":[{"conditions":[{"attribute":"DIA","operator":"lt","value":20.32}],"actions":[{"modifier":"remove"}]}]},"summary":"Remove trees with simplified syntax","description":"Remove trees with diameter less than 20.32cm using simplified remove syntax.\n\nNew simplified syntax: {\"modifier\": \"remove\"}\nLegacy syntax (still works): {\"attribute\": \"all\", \"modifier\": \"remove\"}\n\nBoth syntaxes produce identical results and are fully backwards compatible."},"treemap_proportional_thinning":{"value":{"sources":["TreeMap"],"treatments":[{"method":"proportionalThinning","targetMetric":"basalArea","targetValue":25}]},"summary":"TreeMap proportional thinning example","description":"This example creates a tree inventory using data from the TreeMap raster product. It applies a silvicultural treatment to thin the forest to 25 square meters of basal area per hectare."},"treemap_directional_thinning":{"value":{"sources":["TreeMap"],"treatments":[{"method":"directionalThinning","direction":"below","targetMetric":"diameter","targetValue":30.48}]},"summary":"TreeMap directional thinning example","description":"This example creates a tree inventory using data from the TreeMap raster product. It applies a silvicultural treatment to remove from below all trees with a diameter at breast height less than 30.48cm (12 inches)."},"pointcloud_default":{"value":{"sources":["pointcloud"]},"summary":"Point cloud example","description":"Create a tree inventory from a point cloud source utilizing GDAM."}}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreeInventory"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Tree Inventory"],"summary":"Get Tree Inventory","description":"# Get Tree Inventory\n\nThis endpoint retrieves the details of an existing tree inventory\nresource for a specific domain. Users can access the status and metadata\nof the tree inventory that has been created.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/inventories/tree\n```\n\n### Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to retrieve the tree inventory.\n\n### Response\n\nIf the request is successful, the endpoint will return a `200 OK` status code and the tree inventory resource in the response body. The response body will be a JSON object with the following fields:\n\n- `status` (string): The status of the tree inventory. Possible values are \"pending\", \"running\", \"completed\", and \"failed\".\n- `createdOn` (string): The timestamp when the tree inventory was created.\n- `modifiedOn` (string): The timestamp when the tree inventory was last modified.\n- `checksum` (string): A unique checksum for the tree inventory resource.\n- `treeInventory` (object): The tree inventory data, as provided in the request body when the tree inventory was created.\n\n### Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n - **Detail**: \"Domain not found\"\n- `404 Not Found`: The tree inventory for the specified domain does not exist.\n - **Detail**: \"Tree inventory not created\"","operationId":"get_tree_inventory","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreeInventory"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Tree Inventory"],"summary":"Delete Tree Inventory","description":"# Delete Tree Inventory\n\nThis endpoint deletes an existing tree inventory resource for a specific\ndomain. This action removes the tree inventory data from the database and\ncancels any ongoing job execution related to the tree inventory.\n\n## Endpoint\n\n```\nDELETE /v1/domains/{domainId}/inventories/tree\n```\n\n### Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to delete the tree inventory.\n\n### Response\n\nIf the request is successful, the endpoint will return a `204 No Content` status code. This indicates that the tree inventory has been successfully deleted and no content is returned in the response body.\n\n### Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n - **Detail**: \"Domain not found\"\n\n### Usage Notes\n\n- Deleting a tree inventory is a permanent action and cannot be undone. Ensure that you have the correct domain ID before making the delete request.\n- The endpoint will also cancel any ongoing job execution related to the tree inventory and remove the associated data from the cache and cloud storage.","operationId":"delete_tree_inventory","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/inventories/tree/exports/{exportFormat}":{"post":{"tags":["Tree Inventory"],"summary":"Create Tree Inventory Export","description":"# Create Tree Inventory Export\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/inventories/tree/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint initiates the creation of an export file for the tree inventory data of a specific domain. The data can be exported in various formats including CSV, Parquet, and GeoJSON. The export process runs in the background.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to create the tree inventory export.\n- `exportFormat` (string, required): The format in which to export the tree inventory data. Possible values are:\n - `\"csv\"`: Export the data in CSV format.\n - `\"parquet\"`: Export the data in Parquet format.\n - `\"geojson\"`: Export the data in GeoJSON format.\n\n## Response\n\nIf the request is successful, the endpoint will return a `201 Created` status code and the export request details in the response body. The response body will be a JSON object with the following fields:\n\n- `status` (string): The status of the export request. Will be set to `\"pending\"` initially.\n- `createdOn` (string): The timestamp when the export request was created.\n- `modifiedOn` (string): The timestamp when the export request was last modified.\n- `expiresOn` (string): The timestamp when the export request will expire (7 days from creation).\n- `signedUrl` (string, optional): The signed URL to download the exported file. This field will be `null` initially.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `422 Unprocessable Entity`: The export format is invalid or the request cannot be processed.\n\n## Usage Notes\n\n- Ensure that the tree inventory for the specified domain is completed before initiating an export.\n- The export request will be processed in the background. Use the GET endpoint to check the status.","operationId":"create_tree_inventory_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"enum":["csv","parquet","geojson"],"type":"string","title":"Exportformat"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Tree Inventory"],"summary":"Get Tree Inventory Export","description":"# Get Tree Inventory Export\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/inventories/tree/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint retrieves the details of a tree inventory export request for a specific domain. Users can check the status, metadata, and download URL of the export request.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to retrieve the tree inventory export.\n- `exportFormat` (string, required): The format of the export request. Possible values are:\n - `\"csv\"`: Retrieve the CSV export request details.\n - `\"parquet\"`: Retrieve the Parquet export request details.\n - `\"geojson\"`: Retrieve the GeoJSON export request details.\n\n## Response\n\nIf the request is successful, the endpoint will return a `200 OK` status code and the export request details in the response body. The response body will be a JSON object with the following fields:\n\n- `status` (string): The status of the export request. Possible values are `\"pending\"`, `\"running\"`, `\"completed\"`, `\"failed\"`, and `\"expired\"`.\n- `createdOn` (string): The timestamp when the export request was created.\n- `modifiedOn` (string): The timestamp when the export request was last modified.\n- `expiresOn` (string): The timestamp when the export request will expire.\n- `signedUrl` (string, optional): The signed URL to download the exported file. This will be `null` if the status is not `\"completed\"`.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `404 Not Found`: The specified export request does not exist.\n\n## Usage Notes\n\n- Once the export is completed, the `status` will change to `\"completed\"`, and the `signedUrl` field will be populated with a URL to download the export file.\n- The signed URL will be valid for 7 days from the creation of the export request, as indicated by the `expiresOn` field.\n- To download the exported file, make a GET request to the provided `signedUrl` once it's available.\n- If the current time is past the `expiresOn` timestamp, the `status` will change to `\"expired\"`, and the `signedUrl` will be set to `null`.\n- There is no separate download endpoint. Use the `signedUrl` provided in the export details to download the file directly.\n\n## Example Workflow\n\n1. Create an export request using the POST endpoint.\n2. Periodically check the status of the export using the GET endpoint.\n3. Once the status is `\"completed\"`, retrieve the `signedUrl` from the export details.\n4. Use the `signedUrl` to download the exported file within 7 days of the export creation.","operationId":"get_tree_inventory_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"enum":["csv","geojson","parquet"],"type":"string","title":"Exportformat"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids":{"get":{"tags":["Grids"],"summary":"Get Grids","description":"# Get Grids Endpoint\n\nThis endpoint retrieves the grids resource associated with a domain\nbelonging to the user based on the provided domain ID.\n\nA grids resource is a container for the various types of gridded\ndata that can exist with the spatial context of the domain. Currently,\ntree, surface, topography, and feature grids are supported.\n\n## Endpoint: `GET /v1/domains/{domainId}/grids`\n\n### Path Parameters\n\nTo retrieve the grids of a domain, the following path parameter is required:\n\n- **domainId**: (string) The unique identifier of a domain belonging to the user.\n### Response\n\nThe response returns the members of the specified grids resource following\nthe Grids schema.\n\n- **tree**: (TreeGrid)\n- **surface**: (SurfaceGrid)\n- **topography**: (TopographyGrid)\n- **feature**: (FeatureGrid)\n\n### Example Request\n\n```http\nGET /v1/domains/1e7d8d3c9f8b4c3ba9e7c3b4f8d7a9c1/grids\n```\n\n### Error Responses\n\n- **404 Not Found**: The specified domain does not exist or the user does not have access to it.\n - **Detail**: \"Domain not found.\"\n- **500 Internal Server Error**: An error occurred while retrieving the grid resources.\n - **Detail**: \"An error occurred while getting the grid resources.\"","operationId":"get_grids","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Grids"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/exports/{exportFormat}":{"post":{"tags":["Grids"],"summary":"Create Grid Export","description":"# Create Grid Export\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/grids/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint initiates the creation of an export file for the grid data of a specific domain to the specified format.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format in which to export the grid data. Possible values are:\n - `\"zarr\"`: Export the data in the compressed zarr format.\n - `\"QUIC-Fire\"`: Exports the grid data to the set of input files required by the QUIC-Fire model.\n\n### QUIC-Fire Format\n\nFastFuels supports grid exports directly to input files for the QUIC-Fire\nmodel. The export format is a zip file containing the following files:\n- treesrhof.dat\n- treesmoist.dat\n- treesdepth.dat\n- topo.dat\n\nThe exporter attempts to build the required files from the available grid data.\n\nThe following examples demonstrate some of the possible behavior:\n- If a \"topography\" grid is not available, the exporter will not include topo.dat in the export.\n- If the \"surface\" grid is present, but the \"tree\" grid is not, the exporter will include treesrhof.dat, treesmoist.dat, and treesdepth.dat in the export as a 2D input.\n- If the \"tree\" grid is present, but the \"surface\" grid is not, the exporter will include treesrhof.dat, treesmoist.dat, and treesdepth.dat in the export as a 3D input.\n- If both the \"surface\" and \"tree\" grids are present, the exporter will include treesrhof.dat, treesmoist.dat, and treesdepth.dat in the export as a 3D input with the surface grid as the bottom layer with respect to the z-axis.\n\n## Response\n\nIf successful, returns a `201 Created` status code and a JSON object with:\n\n- `status` (string): Initially set to `\"pending\"`.\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of last modification.\n- `expiresOn` (string): Expiration timestamp (7 days from creation).\n- `signedUrl` (string, optional): Initially `null`, populated when export is completed.\n\n## Error Responses\n\n- `404 Not Found`: Domain not found or user lacks access.\n- `422 Unprocessable Entity`: Invalid export format or request.\n- `429 Too Many Requests`: Error submitting the export job due to resource exhaustion.\n\n## Usage Notes\n\n- Ensure the grid data for the domain are completed before initiating an export.\n- Check the export status using the GET endpoint.\n- Use the `signedUrl` to download the file once available.","operationId":"create_grid_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"enum":["zarr","QUIC-Fire"],"type":"string","title":"Exportformat"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Grids"],"summary":"Get Grid Export","description":"# Get Grid Export\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint retrieves the details of a grid export request for a specific domain.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format of the export. Possible values are:\n - `\"zarr\"`: Export the data in the compressed zarr format.\n - `\"QUIC-Fire\"`: Exports the grid data to the set of input files required by the QUIC-Fire model.\n\n## Response\n\nIf successful, returns a `200 OK` status code and a JSON object with:\n\n- `status` (string): Current status of the export (`\"pending\"`, `\"running\"`, `\"completed\"`, `\"failed\"`, or `\"expired\"`).\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of last modification.\n- `expiresOn` (string): Expiration timestamp.\n- `signedUrl` (string, optional): URL to download the exported file, if status is `\"completed\"`.\n\n## Error Responses\n\n- `404 Not Found`: Domain or export request not found.\n\n## Usage Notes\n\n- Use this endpoint to check the status of an export request.\n- When status is `\"completed\"`, use the `signedUrl` to download the file.\n- The signed URL expires 7 days after creation.","operationId":"get_grid_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"enum":["zarr","QUIC-Fire"],"type":"string","title":"Exportformat"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Grids"],"summary":"Delete Grid Export","description":"# Delete Grid Export\n\n## Endpoint\n\n```\nDELETE /v1/domains/{domainId}/grids/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint deletes a grid export request and its associated files for a specific domain.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format of the export to delete. Possible values are:\n - `\"zarr\"`: Delete the export in the compressed zarr format.\n - `\"QUIC-Fire\"`: Delete the grid data exported to the set of input files required by the QUIC-Fire model.\n\n## Response\n\nIf successful, returns a `204 No Content` status code.\n\n## Error Responses\n\n- `404 Not Found`: Domain or export request not found.\n\n## Usage Notes\n\n- Use this endpoint to delete an existing grid export request and its related data.\n- The export request is removed from Firestore, and the associated files are deleted from Google Cloud Storage asynchronously.","operationId":"delete_grid_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"enum":["zarr","QUIC-Fire"],"type":"string","title":"Exportformat"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/tree":{"post":{"tags":["Tree Grid"],"summary":"Create Tree Grid","description":"# Create Tree Grid\n\nThis endpoint creates a new tree grid resource for a specific domain.\nTree grid data represents various 3D gridded tree attribute (e.g.,\nbulk density, fuel moisture, SPCD) data that exists within the spatial\ncontext of a domain. Tree grid data is typically generated to create\ninputs to 3D fire behavior models such as QUIC-Fire or FDS.\n\nOn resource creation, the tree grid data is set to a status of \"pending\".\nThe tree grid data is generated in the background using the specified\nmethod and data sources. Once the tree grid data is generated and\navailable for user access, the status is updated to \"completed\".\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/grids/tree\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for\n which you want to create the tree grid.\n\n## Request Body\n\nThe request body should be a JSON object containing the following fields:\n\n- `attributes` (array of strings, required): List of attributes to include in the tree grid data. Attributes represent the an additional dimension in the 3D gridded data. Possible values are:\n - `\"bulkDensity\"`\n - `\"fuelMoisture\"`\n - `\"SPCD\"`\n\n### Attribute Descriptions and Sources\n\n- `bulkDensity` (kg/m³): The mass of the tree fuel per unit volume of the occupied cell.\n- `foliarMoisture` (%): Live foliar moisture content of the occupied cell.\n- `SPCD` (unitless): The FIA species code of the occupied cell.\n- `SAVR` (m²/m³): The surface area to volume ratio of fuel particles in the occupied cell.\n\nEach attribute can be sourced from different data sources. By default, the system will use pre-defined data sources to acquire data for the specified attributes. However, if you want to specify additional information for how to acquire an attribute, you can provide detailed instructions in the request body.\n\nTo specify additional information for an attribute, add a field with the attribute name to the request body. For example:\n\n```json\n{\n \"attributes\": [\"bulkDensity\", \"fuelMoisture\"],\n \"bulkDensity\": {\n \"source\": \"TreeInventory\",\n \"biomassModel\": \"NSVB\"\n },\n \"fuelMoisture\": {\"source\": \"uniform\", \"value\": 175}\n}\n```\n\nIn this example, the `bulkDensity` attribute is sourced from the Tree Inventory using the NSVB biomass model, and the `fuelMoisture` attribute is set to a uniform value of 175%.\n\nThe general form of this construction is as follows:\n\n- `bulkDensity`, `fuelMoisture`, `SPCD`, `SAVR` (object, optional): The data source for the respective attribute. The structure of these objects depends on the source specified.\n\n#### Uniform Source\n\nIf the source is `\"uniform\"`, the object should have the following fields:\n\n- `value` (float, required): The uniform value for the attribute.\n\n#### Tree Inventory Source\n\nIf the source is `\"TreeInventory\"`, data will be sourced from the Tree Inventory resource.\n\n## Response\n\nIf the request is successful, the endpoint will return a `201 Created` status code and the created tree grid resource in the response body. The response body will be a JSON object with the following fields:\n\n- `status` (string): The status of the tree grid. Will be set to `\"pending\"` initially.\n- `createdOn` (string): The timestamp when the tree grid was created.\n- `modifiedOn` (string): The timestamp when the tree grid was last modified.\n- `checksum` (string): A unique checksum for the tree grid resource.\n- `attributes` (array of strings): The list of attributes included in the tree grid.\n- `bulkDensity`, `fuelMoisture`, `SPCD` (object): The data source information for the respective attribute.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `404 Not Found`: The tree inventory for the specified domain does not exist.\n- `400 Bad Request`: The tree inventory status is not \"completed\".\n- `422 Unprocessable Entity`: The request body is invalid or required fields are missing.","operationId":"create_tree_grid","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTreeGridRequest"},"examples":{"default_attributes":{"summary":"Default attributes example","value":{"attributes":["bulkDensity","fuelMoisture"]},"description":"This example creates a tree grid with the default attributes. Default configurations and data sources are used for each provided attribute."},"defaults_with_attributes":{"summary":"Default attributes with explicit fields example","value":{"attributes":["bulkDensity","fuelMoisture"],"bulkDensity":{"source":"TreeInventory"},"fuelMoisture":{"source":"uniform","value":100}},"description":"This example creates a tree grid with the default attributes. Default configurations and data sources are provided for each attribute. These additional fields are equivalent to the default values. Providing them explicitly is optional."},"uniform_fuel_moisture":{"summary":"Uniform fuel moisture example","value":{"attributes":["fuelMoisture"],"fuelMoisture":{"source":"uniform","value":175}},"description":"This example creates a tree grid with a uniform fuel moisture value of 175%."}}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreeGrid"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Tree Grid"],"summary":"Get Tree Grid","description":"# Get Tree Grid\n\nThis endpoint retrieves the details of an existing tree grid resource\nfor a specific domain. Users can access the status and metadata of the\ntree grid that has been created.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/tree\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for\n which you want to retrieve the tree grid.\n\n## Response\n\nIf the request is successful, the endpoint will return a `200 OK` status code and the tree grid resource in the response body. The response body will be a JSON object with the following fields:\n\n- `status` (string): The status of the tree grid.\n- `createdOn` (string): The timestamp when the tree grid was created.\n- `modifiedOn` (string): The timestamp when the tree grid was last modified.\n- `checksum` (string): A unique checksum for the tree grid resource.\n- `attributes` (array of strings): The list of attributes included in the tree grid.\n- `bulkDensity`, `fuelMoisture`, `SPCD` (object): The data source information for the respective attribute.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `404 Not Found`: The tree grid for the specified domain does not exist.","operationId":"get_tree_grid","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreeGrid"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Tree Grid"],"summary":"Delete Tree Grid","description":"# Delete Tree Grid\n\nThis endpoint deletes an existing tree grid resource for a specific\ndomain. This action removes the tree grid data from the database and\ncancels any ongoing job execution related to the tree grid.\n\n## Endpoint\n\n```\nDELETE /v1/domains/{domainId}/grids/tree\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to delete the tree grid.\n\n## Response\n\nIf the request is successful, the endpoint will return a `204 No Content` status code. This indicates that the tree grid has been successfully deleted and no content is returned in the response body.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `404 Not Found`: The tree grid for the specified domain does not exist.\n\n## Usage Notes\n\n- Deleting a tree grid is a permanent action and cannot be undone. Ensure that you have the correct domain ID before making the delete request.\n- The endpoint will also cancel any ongoing job execution related to the tree grid and remove the associated data from the cache and cloud storage.","operationId":"delete_tree_grid","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/tree/attributes":{"get":{"tags":["Tree Grid"],"summary":"Get Tree Grid Attribute Metadata","description":"# Get Tree Grid Attribute Metadata\n\nRetrieves metadata about the structure of the tree grid and its attributes for a given domain.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/tree/attributes\n```\n\n## Path Parameters\n\n- `domainId` (string, required): Unique identifier of the domain.\n\n## Response\n\n### Success Response (200 OK)\n\nReturns a JSON response containing:\n\n- `shape`: Dimensions of the grid data.\n- `dimensions`: Names of each dimension.\n- `chunks`: Number of chunks in each dimension.\n- `chunkShape`: Shape of each chunk.\n- `attributes`: Detailed information about each available attribute.\n\n### Error Responses\n\n- 404 Not Found: Tree grid not found or not accessible.\n- 422 Unprocessable Entity: Tree grid not in 'completed' status.","operationId":"Get Tree Grid Attribute Metadata","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GridAttributeMetadataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/tree/exports/{exportFormat}":{"post":{"tags":["Tree Grid"],"summary":"Create Tree Grid Export","description":"# Create Tree Grid Export\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/grids/tree/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint initiates the creation of an export file for the tree grid data of a specific domain in the zarr compressed format. The export process runs in the background.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format for the export. Currently, only `\"zarr\"` is supported.\n\n## Response\n\nIf successful, returns a `201 Created` status code and a JSON object with:\n\n- `status` (string): Initially set to `\"pending\"`.\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of last modification.\n- `expiresOn` (string): Expiration timestamp (7 days from creation).\n\n## Error Responses\n\n- `404 Not Found`: Domain not found or user lacks access.\n- `422 Unprocessable Entity`: Invalid export format or request.\n- `429 Too Many Requests`: Error submitting the export job due to resource exhaustion.\n\n## Usage Notes\n\n- Ensure the tree grid for the domain is completed before initiating an export.\n- Check the export status using the GET endpoint.","operationId":"create_tree_grid_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"const":"zarr","type":"string","title":"Exportformat"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Tree Grid"],"summary":"Get Tree Grid Export","description":"# Get Tree Grid Export\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/tree/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint retrieves the details of a tree grid export request for a specific domain.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format of the export. Currently, only `\"zarr\"` is supported.\n\n## Response\n\nIf successful, returns a `200 OK` status code and a JSON object with:\n\n- `status` (string): Current status of the export (`\"pending\"`, `\"running\"`, `\"completed\"`, `\"failed\"`, or `\"expired\"`).\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of last modification.\n- `expiresOn` (string): Expiration timestamp.\n- `signedUrl` (string, optional): URL to download the exported file, if status is `\"completed\"`.\n\n## Error Responses\n\n- `404 Not Found`: Domain or export request not found.\n\n## Usage Notes\n\n- Use this endpoint to check the status of an export request.\n- When status is `\"completed\"`, use the `signedUrl` to download the file.\n- The signed URL expires 7 days after creation.","operationId":"get_tree_grid_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"const":"zarr","type":"string","title":"Exportformat"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/surface":{"post":{"tags":["Surface Grid"],"summary":"Create Surface Grid","description":"# Create Surface Grid\n\nCreates a new surface grid containing fuel attributes for a domain. Surface fuels are represented through five key attributes: fuel load, fuel depth, fuel moisture, surface area-to-volume ratio (SAVR), and fire behavior fuel models (FBFM).\n\n## Path Parameters\n- `domainId` (string, required): Domain identifier\n\n## Request Body Structure\n\n### Required Fields\n\n- `attributes` (array[string]): One or more surface fuel attributes to include:\n - `fuelLoad`: Fuel loading per unit area (kg/m²)\n - `fuelDepth`: Depth of fuel bed above surface (m)\n - `fuelMoisture`: Mass of water per unit mass of dry fuel (%)\n - `SAVR`: Surface area-to-volume ratio (m²/m³)\n - `FBFM`: Fire behavior fuel model classification\n\n### Data Sources\n\nEach attribute requires a data source. Available sources vary by attribute:\n\n#### 1. LANDFIRE Source (`source: \"LANDFIRE\"`)\nAvailable for: fuelLoad, fuelDepth, SAVR, FBFM\n\nBase configuration:\n- `product`: \"FBFM40\" (Scott & Burgan 40 Fuel Models), \"FBFM13\" (Anderson 13 Fuel Models), or \"FCCS\" (Fuel Characteristic Classification System)\n- `version`: \"2022\" (FBFM40/FBFM13) or \"2023\" (FCCS)\n- `interpolationMethod`: \"nearest\", \"linear\", \"cubic\", or \"zipper\"\n- `featureMasks`: Array of feature types to mask (optional)\n- `removeNonBurnable`: Array of non-burnable codes to replace (FBFM40 only)\n\nFuel Load:\n- Without groups: Computes total dead fuel load (1hr + 10hr + 100hr + dead herbaceous + dead woody)\n- With groups: Values for specific size classes:\n - `oneHour`: 1-hour dead fuels + dead herbaceous + dead woody\n - `tenHour`: 10-hour dead fuels\n - `hundredHour`: 100-hour dead fuels\n - `liveHerbaceous`: Live herbaceous fuels\n - `liveWoody`: Live woody fuels\n- Additional fields:\n - `curingLiveHerbaceous`: 0-1\n - `curingLiveWoody`: 0-1\n\nSAVR:\n- Without groups: Computes weighted average SAVR of dead fuels\n- With groups: Values for specific size classes:\n - `oneHour`: 1-hour dead fuels\n - `tenHour`: 10-hour dead fuels\n - `hundredHour`: 100-hour dead fuels\n - `liveHerbaceous`: Live herbaceous fuels\n - `liveWoody`: Live woody fuels\n\nFuel Depth:\n- Groups field is ignored - returns single fuel bed depth value\n\nFor FCCS product (Fuel Characteristic Classification System):\n\nFuel Load:\n- Supports `oneHour`, `tenHour`, and `hundredHour` groups only\n- No curing parameters needed (no curingLiveHerbaceous or curingLiveWoody fields)\n- No live fuel groups (liveHerbaceous, liveWoody)\n- Returns: Dead fuel loads (1hr, 10hr, 100hr) from FCCS lookup table\n\nFuel Depth:\n- Groups field is ignored - returns single fuel bed depth value from FCCS lookup table\n\nSAVR:\n- Not supported for FCCS product\n\n#### 2. Uniform Value Source (`source: \"uniform\"`)\nAvailable for: all attributes\n\nConfiguration:\n- `value`: Single numeric value applied across entire grid\n- `featureMasks`: Array of feature types to mask (optional)\n\n#### 3. Uniform By Size Class Source (`source: \"uniformBySizeClass\"`)\nAvailable for: fuelMoisture only\n\nConfiguration:\n- `groups` (required): Array of size classes to include. Values must be a subset of:\n - `oneHour`: 1-hour dead fuels\n - `tenHour`: 10-hour dead fuels\n - `hundredHour`: 100-hour dead fuels\n - `liveHerbaceous`: Live herbaceous fuels\n - `liveWoody`: Live woody fuels\n- Must provide corresponding value for each specified group:\n - `oneHour`: Value for 1-hour fuels (if in groups)\n - `tenHour`: Value for 10-hour fuels (if in groups)\n - `hundredHour`: Value for 100-hour fuels (if in groups)\n - `liveHerbaceous`: Value for live herbaceous fuels (if in groups)\n - `liveWoody`: Value for live woody fuels (if in groups)\n- `featureMasks`: Array of feature types to mask (optional)\n\n### Feature Enhancement Options\n\n#### Feature Masks (`featureMasks`)\n- Overlays high-resolution features from OpenStreetMap\n- Available features: \"road\", \"water\", \"building\"\n- Applies to any attribute source type\n\n#### Non-Burnable Replacement (`removeNonBurnable`)\n- Removes specified LANDFIRE non-burnable classes\n- Available codes:\n - \"NB1\": Urban/developed\n - \"NB2\": Snow/ice\n - \"NB3\": Agricultural\n - \"NB8\": Water\n - \"NB9\": Bare ground\n- Replaced using majority filter of surrounding burnable fuels\n- Only available for LANDFIRE sources\n\n### Modifications\nOptional list of modifications to apply to computed values:\n```python\nmodifications: [\n {\n \"conditions\": [\n {\n \"attribute\": string, # Must be in attributes array\n \"operator\": string, # Comparison operator\n \"value\": any # Target value\n }\n ],\n \"actions\": [\n {\n \"attribute\": string, # Must be in attributes array\n \"modifier\": string, # Modification type\n \"value\": any # New value\n }\n ]\n }\n]\n```\n\n## Response\nReturns SurfaceGrid object containing:\n- Request body fields\n- `status`: Job status\n- `createdOn`: Creation timestamp\n- `modifiedOn`: Last modified timestamp\n- `checksum`: Resource checksum\n\n## Errors\n- 404: Domain not found\n- 422: Invalid request or incompatible data sources\n- 429: Too many requests","operationId":"create_surface_grid","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSurfaceGridRequest"},"examples":{"basic":{"value":{"attributes":["fuelLoad","fuelDepth","fuelMoisture"]},"summary":"Basic surface grid request","description":"Creates a surface grid with three attributes using default configurations. The API will automatically use appropriate data sources and settings for each attribute."},"detailed_defaults":{"value":{"attributes":["fuelLoad","fuelDepth","fuelMoisture"],"fuelLoad":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"nearest","curingLiveHerbaceous":0.25,"curingLiveWoody":0.25,"groups":["oneHour","tenHour","hundredHour","liveHerbaceous","liveWoody"]},"fuelDepth":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"nearest"},"fuelMoisture":{"source":"uniform","value":15}},"summary":"Detailed configuration example","description":"Shows explicit configuration of each attribute, demonstrating the default values that would be used automatically in the basic example."},"zipper_interpolation":{"value":{"attributes":["fuelLoad","fuelDepth","FBFM"],"fuelLoad":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"zipper"},"fuelDepth":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"zipper"},"FBFM":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"zipper"}},"summary":"Zipper interpolation example","description":"Demonstrates using the zipper interpolation method for smoother transitions between different fuel types at boundaries."},"feature_masks":{"value":{"attributes":["fuelLoad","fuelDepth","fuelMoisture"],"fuelLoad":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"linear","featureMasks":["road","water"],"removeNonBurnable":["NB1","NB8"]},"fuelDepth":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"linear","featureMasks":["road","water"],"removeNonBurnable":["NB1","NB8"]},"fuelMoisture":{"source":"uniform","value":15,"featureMasks":["road","water"]}},"summary":"Feature masks example","description":"Shows how to replace non-burnable fuel models with burnable models and apply a high resolution feature mask to remove fuels from roads and water bodies"},"fuel_model_modification":{"value":{"attributes":["FBFM","fuelLoad","fuelDepth"],"FBFM":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"nearest"},"fuelLoad":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"nearest","curingLiveHerbaceous":0.25,"curingLiveWoody":0.25},"fuelDepth":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"nearest"},"modifications":[{"conditions":[{"attribute":"FBFM","operator":"eq","value":"GR1"}],"actions":[{"attribute":"FBFM","modifier":"replace","value":"GR2"}]}]},"summary":"Fuel model modification example","description":"Shows how to modify specific fuel models, in this case replacing GR1 with GR2 wherever it occurs."},"size_class_moisture":{"value":{"attributes":["fuelMoisture"],"fuelMoisture":{"source":"uniformBySizeClass","oneHour":0.15,"tenHour":0.2,"hundredHour":0.25,"groups":["oneHour","tenHour","hundredHour"]}},"summary":"Size class moisture example","description":"Demonstrates setting moisture values only for specific size classes."},"fuel_load_groups":{"value":{"attributes":["fuelLoad"],"fuelLoad":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"nearest","curingLiveHerbaceous":0.25,"curingLiveWoody":0.25,"groups":["oneHour","tenHour","hundredHour"]}},"summary":"Size class groups for fuel load","description":"Shows how to request fuel load data for specific size class groups. This example retrieves dead fuel loading for 1-hour, 10-hour, and 100-hour fuels."},"savr_groups":{"value":{"attributes":["SAVR"],"SAVR":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"nearest","groups":["oneHour","tenHour","hundredHour"]}},"summary":"Size class groups for surface area to volume ratio","description":"Shows how to request SAVR data for specific size class groups. This example retrieves SAVR values for live herbaceous and live woody fuels."},"combined_size_classes":{"value":{"attributes":["fuelLoad","fuelMoisture","SAVR"],"fuelLoad":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"nearest","curingLiveHerbaceous":0.25,"curingLiveWoody":0.25,"groups":["oneHour"]},"fuelMoisture":{"source":"uniformBySizeClass","oneHour":0.15,"tenHour":0.2,"hundredHour":0.25,"groups":["oneHour"]},"SAVR":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"nearest","groups":["oneHour"]}},"summary":"Combined size class configurations","description":"Demonstrates how to combine multiple attributes with consistent size class groups. This example focuses on 1-hour and live herbaceous fuels across fuel load, moisture, and SAVR attributes."},"fccs_basic":{"value":{"attributes":["fuelLoad","fuelDepth"],"fuelLoad":{"source":"LANDFIRE","product":"FCCS","version":"2023","interpolationMethod":"nearest","groups":["oneHour","tenHour","hundredHour"]},"fuelDepth":{"source":"LANDFIRE","product":"FCCS","version":"2023","interpolationMethod":"nearest"},"fuelMoisture":{"source":"uniformBySizeClass","oneHour":0.15,"tenHour":0.2,"hundredHour":0.25,"groups":["oneHour"]}},"summary":"Basic FCCS example","description":"FCCS (Fuel Characteristic Classification System) with LANDFIRE 2023 data. Supports 1-hour, 10-hour, and 100-hour timelag fuels (no live fuels)."}}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurfaceGrid"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Surface Grid"],"summary":"Get Surface Grid","description":"# Get Surface Grid\n\nThis endpoint retrieves the details of an existing surface grid resource\nfor a specific domain. Users can access the status and metadata of the\nsurface grid that has been created.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/surface\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for\n which you want to retrieve the surface grid.\n\n## Response\n\nIf the request is successful, the endpoint will return a `200 OK` status code and the surface grid resource in the response body. The response body will be a JSON object with the following fields:\n\n- `status` (string): The status of the surface grid.\n- `createdOn` (string): The timestamp when the surface grid was created.\n- `modifiedOn` (string): The timestamp when the surface grid was last modified.\n- `checksum` (string): A unique checksum for the surface grid resource.\n- `attributes` (array of strings): The list of attributes included in the surface grid.\n- `fuelLoad`, `fuelDepth`, `fuelMoisture`, `SAVR`, `FBFM` (object): The data source information for the respective attribute.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `404 Not Found`: The surface grid for the specified domain does not exist.","operationId":"get_surface_grid","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurfaceGrid"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Surface Grid"],"summary":"Delete Surface Grid","description":"# Delete Surface Grid\n\nThis endpoint deletes an existing surface grid resource for a specific\ndomain. This action removes the surface grid data from the database and\ncancels any ongoing job execution related to the surface grid.\n\n## Endpoint\n\n```\nDELETE /v1/domains/{domainId}/grids/surface\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to delete the surface grid.\n\n## Response\n\nIf the request is successful, the endpoint will return a `204 No Content` status code. This indicates that the surface grid has been successfully deleted and no content is returned in the response body.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `404 Not Found`: The surface grid for the specified domain does not exist.\n\n## Usage Notes\n\n- Deleting a surface grid is a permanent action and cannot be undone. Ensure that you have the correct domain ID before making the delete request.\n- The endpoint will also cancel any ongoing job execution related to the surface grid and remove the associated data from the cache and cloud storage.","operationId":"delete_surface_grid","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/surface/attributes":{"get":{"tags":["Surface Grid"],"summary":"Get Surface Grid Attribute Metadata","description":"# Get Surface Grid Attribute Metadata\n\nRetrieves metadata about the structure of the surface grid and its attributes for a given domain.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/surface/attributes\n```\n\n## Path Parameters\n\n- `domainId` (string, required): Unique identifier of the domain.\n\n## Response\n\n### Success Response (200 OK)\n\nReturns a JSON response containing:\n\n- `shape`: Dimensions of the grid data.\n- `dimensions`: Names of each dimension.\n- `chunks`: Number of chunks in each dimension.\n- `chunkShape`: Shape of each chunk.\n- `attributes`: Detailed information about each available attribute.\n\n### Error Responses\n\n- 404 Not Found: Surface grid not found or not accessible.\n- 422 Unprocessable Entity: Surface grid not in 'completed' status.","operationId":"Get Surface Grid Attribute Metadata","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GridAttributeMetadataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/surface/exports/{exportFormat}":{"post":{"tags":["Surface Grid"],"summary":"Create Surface Grid Export","description":"# Create Surface Grid Export\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/grids/surface/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint initiates the creation of an export file for the surface grid data of a specific domain in the zarr compressed format. The export process runs in the background.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format for the export. Currently, the supported formats are `\"zarr\"` and `\"geotiff\"`.\n\n## Response\n\nIf successful, returns a `201 Created` status code and a JSON object with:\n\n- `status` (string): Initially set to `\"pending\"`.\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of last modification.\n- `expiresOn` (string): Expiration timestamp (7 days from creation).\n\n## Error Responses\n\n- `404 Not Found`: Domain not found or user lacks access.\n- `422 Unprocessable Entity`: Invalid export format or request.\n- `429 Too Many Requests`: Error submitting the export job due to resource exhaustion.\n\n## Usage Notes\n\n- Ensure the surface grid for the domain is completed before initiating an export.\n- Check the export status using the GET endpoint.","operationId":"create_surface_grid_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"enum":["zarr","geotiff"],"type":"string","title":"Exportformat"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Surface Grid"],"summary":"Get Surface Grid Export","description":"# Get Surface Grid Export\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/surface/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint retrieves the details of a surface grid export request for a specific domain.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format of the export. Currently, supported formats are `\"zarr\"` and `\"geotiff\"`.\n\n## Response\n\nIf successful, returns a `200 OK` status code and a JSON object with:\n\n- `status` (string): Current status of the export (`\"pending\"`, `\"running\"`, `\"completed\"`, `\"failed\"`, or `\"expired\"`).\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of last modification.\n- `expiresOn` (string): Expiration timestamp.\n- `signedUrl` (string, optional): URL to download the exported file, if status is `\"completed\"`.\n\n## Error Responses\n\n- `404 Not Found`: Domain or export request not found.\n\n## Usage Notes\n\n- Use this endpoint to check the status of an export request.\n- When status is `\"completed\"`, use the `signedUrl` to download the file.\n- The signed URL expires 7 days after creation.","operationId":"get_surface_grid_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"enum":["zarr","geotiff"],"type":"string","title":"Exportformat"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/topography":{"post":{"tags":["Topography Grid"],"summary":"Create Topography Grid","description":"# Create Topography Grid\n\nThis endpoint creates a new topography grid resource for a specific domain.\nTopography grid data represents various topographic attributes (elevation,\nslope, and aspect) that exist within the spatial context of a domain.\nThe topography grid data can be generated using different data sources\n(3DEP, LANDFIRE, or uniform values) and interpolation methods.\n\nOn resource creation, the topography grid data is set to a status of \"pending\".\nThe topography grid data is generated in the background using the specified\nmethod and data sources. Once the topography grid data is generated and\navailable for user access, the status is updated to \"completed\".\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/grids/topography\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for\n which you want to create the topography grid.\n\n## Request Body\n\nThe request body should be a JSON object containing the following fields:\n\n- `attributes` (array of strings, required): List of attributes to include in the topography grid. Possible values are:\n - `\"elevation\"`\n - `\"slope\"`\n - `\"aspect\"`\n\n### Attribute Descriptions and Sources\n\n- `elevation` (m): The elevation of the terrain above sea level.\n- `slope` (degrees): The slope of the terrain surface.\n- `aspect` (degrees): The aspect of the terrain surface (direction the slope faces).\n\nEach attribute can be sourced from different data sources. By default, the system will use 3DEP (USGS 3D Elevation Program) data for all attributes. However, if you want to specify different sources or configurations for any attribute, you can provide detailed instructions in the request body.\n\nTo specify additional information for an attribute, add a field with the attribute name to the request body. For example:\n\n```json\n{\n \"attributes\": [\"elevation\"],\n \"elevation\": {\n \"source\": \"3DEP\",\n \"interpolationMethod\": \"cubic\"\n }\n}\n```\n\nThe structure of attribute configuration objects depends on the source specified:\n\n#### 3DEP Source (Default)\n\nIf the source is `\"3DEP\"`, the object should have the following fields:\n\n- `source` (string, required): Must be `\"3DEP\"`.\n- `interpolationMethod` (string, required): The interpolation method to use. Possible values are:\n - `\"nearest\"`: Preserves exact data points without interpolation\n - `\"linear\"`: Linear interpolation between points\n - `\"cubic\"`: Smooth interpolation using cubic splines (default for elevation and slope)\n\nNote: Aspect attribute automatically uses nearest neighbor interpolation regardless of what is specified.\n\n#### LANDFIRE Source\n\nIf the source is `\"LANDFIRE\"`, the object should have the following fields:\n\n- `source` (string, required): Must be `\"LANDFIRE\"`.\n- `version` (string, required): The version of the LANDFIRE product. Currently, only `\"2020\"` is supported.\n- `interpolationMethod` (string, required): The interpolation method to use. Possible values are:\n - `\"nearest\"`: Preserves exact data points\n - `\"linear\"`: Linear interpolation\n - `\"cubic\"`: Smooth cubic interpolation\n - `\"zipper\"`: Special method for LANDFIRE data\n\nNote: Aspect attribute automatically uses nearest neighbor interpolation regardless of what is specified.\n\n#### Uniform Source\n\nIf the source is `\"uniform\"`, the object should have the following fields:\n\n- `source` (string, required): Must be `\"uniform\"`.\n- `value` (float, required): The uniform value for the attribute.\n\nNote: Uniform source is only available for the elevation attribute.\n\n## Response\n\nIf the request is successful, the endpoint will return a `201 Created` status code and the created topography grid resource in the response body. The response body will be a JSON object with the following fields:\n\n- `attributes` (array of strings): The list of attributes included in the topography grid.\n- `elevation` (object, optional): The data source configuration for elevation.\n- `slope` (object, optional): The data source configuration for slope.\n- `aspect` (object, optional): The data source configuration for aspect.\n- `status` (string): The status of the topography grid. Will be set to `\"pending\"` initially.\n- `createdOn` (string): The timestamp when the topography grid was created.\n- `modifiedOn` (string): The timestamp when the topography grid was last modified.\n- `checksum` (string): A unique checksum for the topography grid resource.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `422 Unprocessable Entity`: The request body is invalid, the data sources are not compatible with the domain CRS, or required fields are missing.\n- `429 Too Many Requests`: The system is currently unable to process additional job requests.","operationId":"create_topography_grid","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTopographyGridRequest"},"examples":{"default_attributes":{"value":{"attributes":["elevation"]},"summary":"Simple elevation request (uses 3DEP)","description":"Creates a topography grid with elevation data using the default 3DEP source. This is the simplest way to get high-quality elevation data."},"default_attributes_with_fields":{"value":{"attributes":["elevation"],"elevation":{"source":"3DEP","interpolationMethod":"cubic"}},"summary":"Default configuration (3DEP) shown explicitly","description":"Creates a topography grid using 3DEP with default settings shown explicitly. While providing these fields is unnecessary when using defaults, this example shows the actual configuration being used."},"landfire_elevation":{"value":{"attributes":["elevation"],"elevation":{"source":"LANDFIRE","version":"2020","interpolationMethod":"cubic"}},"summary":"Using LANDFIRE for elevation data","description":"Creates a topography grid using LANDFIRE elevation data instead of the default 3DEP source. LANDFIRE might be preferred when working with other LANDFIRE-sourced data for consistency."},"landfire_all":{"value":{"attributes":["elevation","slope","aspect"],"elevation":{"source":"LANDFIRE","version":"2020","interpolationMethod":"cubic"},"slope":{"source":"LANDFIRE","version":"2020","interpolationMethod":"cubic"},"aspect":{"source":"LANDFIRE","version":"2020","interpolationMethod":"nearest"}},"summary":"Using LANDFIRE for all attributes","description":"Creates a complete topography grid using LANDFIRE data for all attributes. Note that aspect uses nearest neighbor interpolation to preserve directional accuracy."},"nearest_interpolation":{"value":{"attributes":["elevation"],"elevation":{"source":"3DEP","interpolationMethod":"nearest"}},"summary":"Using nearest neighbor interpolation","description":"Creates a topography grid using nearest neighbor interpolation instead of the default cubic interpolation. This might be preferred when you want to preserve exact data points without interpolation."},"all_attributes":{"value":{"attributes":["elevation","slope","aspect"]},"summary":"All topographic attributes","description":"Creates a complete topography grid with elevation, slope, and aspect using default 3DEP source and configurations for each attribute. Note that aspect automatically uses nearest neighbor interpolation while elevation and slope use cubic interpolation."},"mixed_sources":{"value":{"attributes":["elevation","slope","aspect"],"elevation":{"source":"LANDFIRE","version":"2020","interpolationMethod":"cubic"},"slope":{"source":"3DEP","interpolationMethod":"cubic"},"aspect":{"source":"LANDFIRE","version":"2020","interpolationMethod":"nearest"}},"summary":"Mixed data sources","description":"Creates a topography grid mixing LANDFIRE and 3DEP sources. Shows how different data sources can be used for different attributes, which might be useful when optimizing for specific attribute qualities or data consistency requirements."},"uniform_elevation":{"value":{"attributes":["elevation"],"elevation":{"source":"uniform","value":1000.0}},"summary":"Uniform elevation","description":"Creates a topography grid with a uniform elevation value. This can be useful for testing or theoretical scenarios where a flat surface is desired."}}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopographyGrid"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Topography Grid"],"summary":"Get Topography Grid","description":"# Get Topography Grid\n\nThis endpoint retrieves the details of an existing topography grid resource\nfor a specific domain.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/topography\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for\n which you want to retrieve the topography grid.\n\n## Response\n\nIf the request is successful, the endpoint will return a `200 OK` status code and the topography grid resource in the response body. The response body will be a JSON object with the following fields:\n\n- `attributes` (array of strings): The list of attributes included in the topography grid (elevation, slope, and/or aspect).\n- `elevation` (object, optional): The data source configuration for elevation.\n- `slope` (object, optional): The data source configuration for slope.\n- `aspect` (object, optional): The data source configuration for aspect.\n- `status` (string): The current status of the topography grid (e.g., \"pending\", \"completed\").\n- `createdOn` (string): The timestamp when the topography grid was created.\n- `modifiedOn` (string): The timestamp when the topography grid was last modified.\n- `checksum` (string): A unique checksum for the topography grid resource.\n\nThe structure of attribute configuration objects will match what was provided during creation, with 3DEP as the default source. See the create_topography_grid endpoint documentation for details on data source configurations.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist, the user does not have access to it, or the topography grid for the specified domain does not exist.\n\n## Usage Notes\n\n- Use this endpoint to check the status and details of a previously created topography grid.\n- The response will include all the information provided during the creation of the topography grid, along with its current status and timestamps.","operationId":"get_topography_grid","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopographyGrid"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Topography Grid"],"summary":"Delete Topography Grid","description":"# Delete Topography Grid\n\nThis endpoint deletes an existing topography grid resource for a specific\ndomain. This action removes the topography grid data from the database and\ncancels any ongoing job execution related to the topography grid.\n\n## Endpoint\n\n```\nDELETE /v1/domains/{domainId}/grids/topography\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to delete the topography grid.\n\n## Response\n\nIf the request is successful, the endpoint will return a `204 No Content` status code. This indicates that the topography grid has been successfully deleted and no content is returned in the response body.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `404 Not Found`: The topography grid for the specified domain does not exist.\n\n## Usage Notes\n\n- Deleting a topography grid is a permanent action and cannot be undone. Ensure that you have the correct domain ID before making the delete request.\n- The endpoint will also cancel any ongoing job execution related to the topography grid and remove the associated data from the cache and cloud storage.","operationId":"delete_topography_grid","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/topography/attributes":{"get":{"tags":["Topography Grid"],"summary":"Get Topography Grid Attribute Metadata","description":"# Get Topography Grid Attribute Metadata\n\nThis endpoint retrieves detailed metadata about the structure of the topography grid and its attributes for a given domain. This includes information about the grid's dimensions, chunking, and available attributes with their units and descriptions.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/topography/attributes\n```\n\n## Path Parameters\n\n- `domainId` (string, required): Unique identifier of the domain.\n\n## Response\n\n### Success Response (200 OK)\n\nReturns a JSON response containing:\n\n- `shape` (array): Dimensions of the grid data [height, width].\n- `dimensions` (array): Names of each dimension [\"y\", \"x\"].\n- `chunks` (array): Number of chunks in each dimension.\n- `chunkShape` (array): Shape of each chunk [chunk_height, chunk_width].\n- `attributes` (array): Detailed information about each available attribute:\n - `name` (string): Attribute name (e.g., \"elevation\", \"slope\", \"aspect\")\n - `description` (string): Description of what the attribute represents\n - `units` (string): Units of measurement (e.g., \"m\", \"degrees\")\n\n### Error Responses\n\n- `404 Not Found`: Topography grid not found or not accessible.\n- `422 Unprocessable Entity`: Topography grid not in 'completed' status.","operationId":"Get Topography Grid Attribute Metadata","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GridAttributeMetadataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/topography/exports/{exportFormat}":{"post":{"tags":["Topography Grid"],"summary":"Create Topography Grid Export","description":"# Create Topography Grid Export\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/grids/topography/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint initiates the creation of an export file for the topography grid data of a specific domain. The export process runs in the background and can generate files in either zarr or GeoTIFF format.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format for the export. Supported values:\n - `\"zarr\"`: Zarr array format, suitable for high-performance array storage\n - `\"geotiff\"`: GeoTIFF format, suitable for GIS applications\n\n## Response\n\nIf successful, returns a `201 Created` status code and a JSON object with:\n\n- `status` (string): Initially set to `\"pending\"`.\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of last modification.\n- `expiresOn` (string): Expiration timestamp (7 days from creation).\n\n## Error Responses\n\n- `404 Not Found`: Domain not found or user lacks access.\n- `422 Unprocessable Entity`: Invalid export format or topography grid not in completed status.\n- `429 Too Many Requests`: Error submitting the export job due to resource exhaustion.\n\n## Usage Notes\n\n- Ensure the topography grid for the domain is completed before initiating an export.\n- Check the export status using the GET endpoint.","operationId":"create_topography_grid_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"enum":["zarr","geotiff"],"type":"string","title":"Exportformat"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Topography Grid"],"summary":"Get Topography Grid Export","description":"# Get Topography Grid Export\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/topography/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint retrieves the details of a topography grid export request for a specific domain.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format of the export. Currently, only `\"zarr\"` is supported.\n\n## Response\n\nIf successful, returns a `200 OK` status code and a JSON object with:\n\n- `status` (string): Current status of the export (`\"pending\"`, `\"running\"`, `\"completed\"`, `\"failed\"`, or `\"expired\"`).\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of last modification.\n- `expiresOn` (string): Expiration timestamp.\n- `signedUrl` (string, optional): URL to download the exported file, if status is `\"completed\"`.\n\n## Error Responses\n\n- `404 Not Found`: Domain or export request not found.\n\n## Usage Notes\n\n- Use this endpoint to check the status of an export request.\n- When status is `\"completed\"`, use the `signedUrl` to download the file.\n- The signed URL expires 7 days after creation.","operationId":"get_topography_grid_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"enum":["zarr","geotiff"],"type":"string","title":"Exportformat"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/feature":{"post":{"tags":["Feature Grid"],"summary":"Create Feature Grid","description":"# Create Feature Grid\n\nThis endpoint creates a new feature grid resource for a specific domain. Feature grids\nare used to represent spatial data related to various features within the domain. This\noperation generates a feature grid based on the provided configuration and data sources.\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/grids/feature\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to create the feature grid.\n\n## Request Body\n\nThe request body should be a JSON object adhering to the `CreateFeatureGridRequest` model, containing\nthe necessary configuration and data source information for generating the feature grid.\n\n## Response\n\nIf the request is successful, the endpoint will return a `201 Created` status code and the created feature grid resource in the response body. The response body will include the following fields:\n\n- `createdOn` (string): The timestamp when the feature grid was created.\n- `modifiedOn` (string): The timestamp when the feature grid was last modified.\n- `status` (string): The status of the feature grid, initially set to `\"PENDING\"`.\n- `checksum` (string): A unique checksum for the feature grid resource.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `429 Too Many Requests`: The system is currently overloaded, and the job could not be submitted.\n\n## Usage Notes\n\n- If an existing feature grid already exists for the domain, its associated job execution will be canceled before creating the new grid.\n- The feature grid generation is handled as a background job. The status will initially be `\"PENDING\"` and will be updated once the job completes.\n- The system will attempt to remove any cached data related to the previous feature grid.","operationId":"create_feature_grid","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFeatureGridRequest"},"examples":{"default_attributes":{"value":{"attributes":["road","water"]},"summary":"Road and Water attributes example","description":"This example creates a feature grid using both road and water feature data."}}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureGrid"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Feature Grid"],"summary":"Get Feature Grid","description":"# Get Feature Grid\n\nThis endpoint retrieves the feature grid data for a specific domain. Feature grids\nrepresent spatial data related to various features within the domain. If the feature grid\ndata has been generated and stored, it will be returned in the response.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/feature\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to retrieve the feature grid.\n\n## Response\n\nIf the feature grid data exists, the endpoint will return a `200 OK` status code and the feature grid resource in the response body. The response will be a JSON object adhering to the `FeatureGrid` model, which includes:\n\n- `createdOn` (string): The timestamp when the feature grid was created.\n- `modifiedOn` (string): The timestamp when the feature grid was last modified.\n- `status` (string): The current status of the feature grid.\n- `checksum` (string): A unique checksum for the feature grid resource.\n\n## Error Responses\n\n- `404 Not Found`: The feature grid data has not been created for the specified domain, or it cannot be retrieved.\n\n## Usage Notes\n\n- Ensure that the `domainId` provided is correct and that the user has the appropriate permissions to access the domain's data.\n- The feature grid data is retrieved from the database, and if it does not exist, a `404 Not Found` error will be returned.","operationId":"get_feature_grid","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureGrid"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Feature Grid"],"summary":"Delete Feature Grid","description":"# Delete Feature Grid\n\nThis endpoint deletes the feature grid data for a specific domain. If the feature grid exists,\nit will be removed from the database, and any associated resources, such as files in the GCS bucket,\nwill be deleted asynchronously.\n\n## Endpoint\n\n```\nDELETE /v1/domains/{domainId}/grids/feature\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to delete the feature grid.\n\n## Response\n\n- `204 No Content`: The feature grid was successfully deleted. The response body will be empty.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain or feature grid does not exist or the user does not have access to it.\n\n## Usage Notes\n\n- Ensure that the `domainId` provided is correct and that the user has the appropriate permissions to delete the domain's data.\n- The feature grid data is removed from the database, and any running jobs related to the feature grid are canceled in the background.\n- The associated Zarr group in the GCS bucket is deleted asynchronously.","operationId":"delete_feature_grid","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/feature/attributes":{"get":{"tags":["Feature Grid"],"summary":"Get Feature Grid Attribute Metadata","description":"# Get Feature Grid Attribute Metadata\n\nRetrieves metadata about the structure of the feature grid and its attributes for a given domain.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/feature/attributes\n```\n\n## Path Parameters\n\n- `domainId` (string, required): Unique identifier of the domain.\n\n## Response\n\n### Success Response (200 OK)\n\nReturns a JSON response containing:\n\n- `shape`: Dimensions of the grid data.\n- `dimensions`: Names of each dimension.\n- `chunks`: Number of chunks in each dimension.\n- `chunkShape`: Shape of each chunk.\n- `attributes`: Detailed information about each available attribute.\n\n### Error Responses\n\n- 404 Not Found: Feature grid not found or not accessible.\n- 422 Unprocessable Entity: Feature grid not in 'completed' status.","operationId":"Get Feature Grid Attribute Metadata","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GridAttributeMetadataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/feature/exports/{exportFormat}":{"post":{"tags":["Feature Grid"],"summary":"Create Feature Grid Export","description":"# Create Feature Grid Export\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/grids/feature/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint initiates the creation of an export file for the feature grid data of a specific domain in the zarr compressed format. The export process runs in the background.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format for the export. Currently, the supported formats are `\"zarr\"` and `\"geotiff\"`.\n\n## Response\n\nIf successful, returns a `201 Created` status code and a JSON object with:\n\n- `status` (string): Initially set to `\"pending\"`.\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of last modification.\n- `expiresOn` (string): Expiration timestamp (7 days from creation).\n\n## Error Responses\n\n- `404 Not Found`: Domain not found or user lacks access.\n- `422 Unprocessable Entity`: Invalid export format or request.\n- `429 Too Many Requests`: Error submitting the export job due to resource exhaustion.\n\n## Usage Notes\n\n- Ensure the feature grid for the domain is completed before initiating an export.\n- Check the export status using the GET endpoint.","operationId":"create_feature_grid_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"enum":["zarr","geotiff"],"type":"string","title":"Exportformat"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Feature Grid"],"summary":"Get Feature Grid Export","description":"# Get Feature Grid Export\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/feature/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint retrieves the details of a feature grid export request for a specific domain.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format of the export. Currently, supported formats are `\"zarr\"` and `\"geotiff\"`.\n\n## Response\n\nIf successful, returns a `200 OK` status code and a JSON object with:\n\n- `status` (string): Current status of the export (`\"pending\"`, `\"running\"`, `\"completed\"`, `\"failed\"`, or `\"expired\"`).\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of last modification.\n- `expiresOn` (string): Expiration timestamp.\n- `signedUrl` (string, optional): URL to download the exported file, if status is `\"completed\"`.\n\n## Error Responses\n\n- `404 Not Found`: Domain or export request not found.\n\n## Usage Notes\n\n- Use this endpoint to check the status of an export request.\n- When status is `\"completed\"`, use the `signedUrl` to download the file.\n- The signed URL expires 7 days after creation.","operationId":"get_feature_grid_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"enum":["zarr","geotiff"],"type":"string","title":"Exportformat"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/pointclouds":{"get":{"tags":["Point Cloud"],"summary":"Get Pointclouds","description":"# Get Point Cloud\n\nThis endpoint retrieves the details of an existing point cloud resource for a specific domain. Users can access the status and metadata of the point cloud data associated with the domain, including information about Airborne Laser Scanning (ALS) data if available.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/pointclouds\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to retrieve the point cloud resource.\n\n## Response\n\nIf the request is successful, the endpoint will return a `200 OK` status code and the point cloud resource in the response body. The response body will be a JSON object containing:\n\n- `status` (string): The status of the point cloud resource. Possible values include \"pending\", \"running\", \"completed\", and \"failed\".\n- `createdOn` (string): The timestamp when the resource was created.\n- `modifiedOn` (string): The timestamp when the resource was last modified.\n- `checksum` (string): A unique checksum for the resource.\n- `als` (object, optional): Metadata regarding the Airborne Laser Scanning data, if uploaded.\n\n## Error Responses\n\n- `404 Not Found`: If the specified domain does not exist or the user does not have access to it.\n- `404 Not Found`: If the point cloud resource for the specified domain does not exist.","operationId":"get_pointclouds","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PointCloud"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/pointclouds/als":{"post":{"tags":["Als PointCloud"],"summary":"Create Als Point Cloud","description":"# Create ALS Point Cloud\n\nThis endpoint initiates the creation of an Airborne Laser Scanning (ALS) point cloud resource for a specified domain. ALS data provides high-resolution elevation data used for creating detailed canopy height models and tree inventories.\n\nOn creation, the resource status is set to \"pending\". The behavior of the endpoint depends on the `sources` specified in the request body: it either generates a signed URL for user upload or schedules a background job to retrieve public data (e.g., 3DEP).\n\nIf an existing ALS point cloud resource exists for this domain, any ongoing jobs associated with it are immediately canceled, and the data is overwritten.\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/pointclouds/als\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to create the ALS point cloud.\n\n## Request Body\n\nThe request body should be a JSON object conforming to the `AlsPointCloud` model.\n\n### Source Configuration\n\n- `sources` (array of strings, required): Determines the acquisition method.\n - **File Upload (`\"file\"`)**: If `\"file\"` is included in the list, the API prepares a signed URL for you to upload a custom `.laz` file.\n - ** PLEASE NOTE: ** There is no validation on the point cloud file at this time. If there are errors downstream, please take a second look at your source file.\n - **Automated Retrieval**: If `\"file\"` is **not** present, the system attempts to automatically retrieve or generate point cloud data via a background job (e.g., from public datasets like USGS 3DEP).\n\n### File Source Workflow\n\nIf the source is `\"file\"`, the response will include upload instructions.\n1. Call this endpoint with `\"sources\": [\"file\"]`.\n2. The response contains a `file` object with a signed URL.\n3. Perform a `PUT` request to that URL with your `.laz` file.\n\n## Response\n\nReturns a `201 Created` status code and the created resource metadata.\n\n- `status` (string): Set to `\"pending\"`.\n- `createdOn` (string): Timestamp of creation.\n- `checksum` (string): Unique identifier for the version.\n- `file` (object, optional): If source is \"file\", contains:\n - `url`: The Google Cloud Storage signed URL.\n - `headers`: Required headers for the upload (e.g., `x-goog-content-length-range`).\n - `message`: Instructions for the upload.\n- `executionName` (string, optional): If using automated retrieval, the ID of the background job.\n\n## Error Responses\n\n- `404 Not Found`: If the domain does not exist or the user lacks access.\n- `404 Not Found`: If the parent `pointclouds` resource does not exist for this domain.\n- `503 Service Unavailable`: If the background job service is temporarily unavailable or exhausted (only applicable for non-file sources).","operationId":"create_als_point_cloud","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAlsPointCloudRequest"},"examples":{"default_attributes":{"value":{"sources":["3DEP"]}}}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlsPointCloud"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Als PointCloud"],"summary":"Get Als Point Cloud","description":"# Get ALS Point Cloud\n\nThis endpoint retrieves the details of the Airborne Laser Scanning (ALS) point cloud resource for a specific domain. It provides access to the processing status, metadata, and configuration of the ALS data that has been uploaded or generated.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/pointclouds/als\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to retrieve the ALS point cloud data.\n\n## Response\n\nIf the request is successful, the endpoint will return a `200 OK` status code and the ALS point cloud resource in the response body. The response body will be a JSON object containing:\n\n- `status` (string): The status of the ALS resource (e.g., \"pending\", \"completed\").\n- `createdOn` (string): The timestamp when the resource was created.\n- `modifiedOn` (string): The timestamp when the resource was last modified.\n- `checksum` (string): A unique checksum for the resource.\n- `sources` (array): The list of sources used to generate the point cloud (e.g., `[\"file\"]` or `[\"3dep\"]`).\n- `file` (object, optional): Upload information if the source was a file.\n\n## Error Responses\n\n- `404 Not Found`: If the specified domain does not exist or the user does not have access to it.\n- `404 Not Found`: If the parent `pointclouds` resource does not exist for the domain.\n- `404 Not Found`: If the `als` point cloud data has not yet been created for this domain.\n- `404 Not Found`: If the stored ALS data is corrupted or cannot be parsed into the response model.","operationId":"get_als_point_cloud","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlsPointCloud"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Als PointCloud"],"summary":"Delete Als Point Cloud","description":"# Delete ALS Point Cloud\n\nThis endpoint deletes the Airborne Laser Scanning (ALS) point cloud resource for a specific domain. This is a permanent action that removes the ALS configuration and metadata from the database.\n\nIn addition to database updates, this endpoint triggers the following side effects:\n1. **Job Cancellation**: If there is an active background job (e.g., fetching 3DEP data) associated with this resource, it is immediately canceled.\n2. **Storage Cleanup**: A background task is scheduled to permanently delete all associated files (e.g., `.laz` files) from the cloud storage bucket.\n\n## Endpoint\n\n```\nDELETE /v1/domains/{domainId}/pointclouds/als\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to delete the ALS point cloud.\n\n## Response\n\nIf the request is successful, the endpoint will return a `204 No Content` status code, indicating that the resource was successfully deleted. No response body is returned.\n\n## Error Responses\n\n- `404 Not Found`: If the specified domain does not exist or the user does not have access to it.\n- `404 Not Found`: If the parent `pointclouds` resource does not exist for the domain.","operationId":"delete_als_point_cloud","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Access":{"type":"string","enum":["personal","application"],"title":"Access","description":"Enumerates the available access types for an API key."},"AlsPointCloud":{"properties":{"sources":{"items":{"$ref":"#/components/schemas/AlsPointCloudSource"},"type":"array","title":"Sources"},"ThreeDEP":{"anyOf":[{"$ref":"#/components/schemas/ThreeDEPSource"},{"type":"null"}]},"status":{"$ref":"#/components/schemas/JobStatus","default":"pending"},"createdOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Createdon"},"modifiedOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modifiedon"},"checksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum"},"file":{"anyOf":[{"$ref":"#/components/schemas/api__resources__pointclouds__als__schema__UploadResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/api__resources__inventories__tree__schema__ProcessingError"},{"type":"null"}],"description":"Detailed error information if processing failed, regardless of source type."}},"type":"object","required":["sources"],"title":"AlsPointCloud"},"AlsPointCloudSource":{"type":"string","enum":["3DEP","file"],"title":"AlsPointCloudSource"},"Application":{"properties":{"name":{"type":"string","title":"Name","description":"A name for the application."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"An optional description for the application."},"id":{"type":"string","title":"Id","description":"Unique identifier for the application."},"ownerId":{"type":"string","title":"Ownerid","description":"Unique identifier of the user that adimisters the application."},"createdOn":{"type":"string","format":"date-time","title":"Createdon","description":"The date and time the application was created."},"modifiedOn":{"type":"string","format":"date-time","title":"Modifiedon","description":"The date and time the application was modified."}},"type":"object","required":["name","id","ownerId"],"title":"Application","description":"Represents an application that can access the FastFuels API on behalf of non-FastFuels users."},"CreateAlsPointCloudRequest":{"properties":{"sources":{"items":{"$ref":"#/components/schemas/AlsPointCloudSource"},"type":"array","maxItems":1,"minItems":1,"title":"Sources","description":"List of sources of als point cloud. Currently '3DEP' or 'file'"},"ThreeDEP":{"anyOf":[{"$ref":"#/components/schemas/ThreeDEPSource"},{"type":"null"}]}},"type":"object","required":["sources"],"title":"CreateAlsPointCloudRequest"},"CreateApplicationRequest":{"properties":{"name":{"type":"string","title":"Name","description":"A name for the application."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"An optional description for the application."}},"type":"object","required":["name"],"title":"CreateApplicationRequest","description":"Request body for creating a new application."},"CreateDomainRequest":{"oneOf":[{"$ref":"#/components/schemas/CreateDomainRequestFeature"},{"$ref":"#/components/schemas/CreateDomainRequestFeatureCollection"}],"title":"CreateDomainRequest","discriminator":{"propertyName":"type","mapping":{"Feature":"#/components/schemas/CreateDomainRequestFeature","FeatureCollection":"#/components/schemas/CreateDomainRequestFeatureCollection"}}},"CreateDomainRequestFeature":{"properties":{"type":{"type":"string","const":"Feature","title":"Type","default":"Feature"},"geometry":{"oneOf":[{"$ref":"#/components/schemas/Point"},{"$ref":"#/components/schemas/MultiPoint"},{"$ref":"#/components/schemas/LineString"},{"$ref":"#/components/schemas/MultiLineString"},{"$ref":"#/components/schemas/Polygon"},{"$ref":"#/components/schemas/MultiPolygon"}],"title":"Geometry","discriminator":{"propertyName":"type","mapping":{"LineString":"#/components/schemas/LineString","MultiLineString":"#/components/schemas/MultiLineString","MultiPoint":"#/components/schemas/MultiPoint","MultiPolygon":"#/components/schemas/MultiPolygon","Point":"#/components/schemas/Point","Polygon":"#/components/schemas/Polygon"}}},"properties":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Properties"},"name":{"type":"string","title":"Name","description":"The name of the domain.","default":""},"description":{"type":"string","title":"Description","description":"A brief description of the domain.","default":""},"horizontalResolution":{"type":"number","title":"Horizontalresolution","description":"The horizontal resolution in meters of a regular grid representation of the domain.","default":2.0},"verticalResolution":{"type":"number","title":"Verticalresolution","description":"The vertical resolution in meters of a regular grid representation of the domain.","default":1.0},"crs":{"$ref":"#/components/schemas/GeoJsonCRS","description":"The GeoJSON specification formatted coordinate reference system (CRS) of the domain."},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"A list of tags associated with the domain.","default":[]}},"type":"object","required":["geometry"],"title":"CreateDomainRequestFeature"},"CreateDomainRequestFeatureCollection":{"properties":{"type":{"type":"string","const":"FeatureCollection","title":"Type","default":"FeatureCollection"},"features":{"items":{"$ref":"#/components/schemas/GeoJSONFeature"},"type":"array","minItems":1,"title":"Features"},"name":{"type":"string","title":"Name","description":"The name of the domain.","default":""},"description":{"type":"string","title":"Description","description":"A brief description of the domain.","default":""},"horizontalResolution":{"type":"number","title":"Horizontalresolution","description":"The horizontal resolution in meters of a regular grid representation of the domain.","default":2.0},"verticalResolution":{"type":"number","title":"Verticalresolution","description":"The vertical resolution in meters of a regular grid representation of the domain.","default":1.0},"crs":{"$ref":"#/components/schemas/GeoJsonCRS","description":"The GeoJSON specification formatted coordinate reference system (CRS) of the domain."},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"A list of tags associated with the domain.","default":[]}},"type":"object","required":["features"],"title":"CreateDomainRequestFeatureCollection"},"CreateFeatureGridRequest":{"properties":{"attributes":{"items":{"$ref":"#/components/schemas/FeatureGridAttribute"},"type":"array","title":"Attributes","description":"List of feature types to rasterize."}},"type":"object","required":["attributes"],"title":"CreateFeatureGridRequest"},"CreateKeyRequest":{"properties":{"name":{"type":"string","title":"Name","description":"A name to semantically identify the key."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"An optional description of the keys purpose."},"validDays":{"type":"integer","title":"Validdays","description":"Number of days for which this key will be valid.","default":30},"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"type":"array","title":"Scopes","description":"A list of scopes available to the key.","default":["read"]},"access":{"$ref":"#/components/schemas/Access","description":"Access type for the API key","default":"personal"},"applicationId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Applicationid","description":"Application ID accessed by the API key"}},"type":"object","required":["name"],"title":"CreateKeyRequest","description":"Request body for creating an API key resource"},"CreateRoadFeatureRequest":{"properties":{"sources":{"items":{"$ref":"#/components/schemas/RoadFeatureSource"},"type":"array","title":"Sources","description":"List of sources of road features"},"geojson":{"anyOf":[{"$ref":"#/components/schemas/GeoJSONFeature"},{"$ref":"#/components/schemas/GeoJSONFeatureCollection"},{"type":"null"}],"title":"Geojson","description":"GeoJSON input when source is geojson. Must contain Polygon or MultiPolygon geometries."}},"type":"object","required":["sources"],"title":"CreateRoadFeatureRequest","description":"Request model for creating road features with validation."},"CreateSurfaceGridRequest":{"properties":{"attributes":{"items":{"$ref":"#/components/schemas/SurfaceGridAttribute"},"type":"array","minItems":1,"title":"Attributes","description":"List of attributes to include in the surface grid"},"fuelLoad":{"anyOf":[{"$ref":"#/components/schemas/SurfaceGridLandfireFBFM40FuelLoadSource"},{"$ref":"#/components/schemas/SurfaceGridLandfireFCCSFuelLoadSource"},{"$ref":"#/components/schemas/SurfaceGridUniformValue"},{"type":"null"}],"title":"Fuelload"},"fuelDepth":{"anyOf":[{"$ref":"#/components/schemas/SurfaceGridLandfireFBFM40Source"},{"$ref":"#/components/schemas/SurfaceGridLandfireFCCSSource"},{"$ref":"#/components/schemas/SurfaceGridUniformValue"},{"type":"null"}],"title":"Fueldepth"},"fuelMoisture":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/SurfaceGridUniformValue"},{"$ref":"#/components/schemas/SurfaceGridUniformValueBySizeClass"}],"title":"SurfaceGridFuelMoistureSource","discriminator":{"propertyName":"source","mapping":{"uniform":"#/components/schemas/SurfaceGridUniformValue","uniformBySizeClass":"#/components/schemas/SurfaceGridUniformValueBySizeClass"}}},{"type":"null"}],"title":"Fuelmoisture"},"SAVR":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/SurfaceGridLandfireFBFM40SAVRSource"},{"$ref":"#/components/schemas/SurfaceGridUniformValue"}],"title":"SurfaceGridSAVRSource","discriminator":{"propertyName":"source","mapping":{"LANDFIRE":"#/components/schemas/SurfaceGridLandfireFBFM40SAVRSource","uniform":"#/components/schemas/SurfaceGridUniformValue"}}},{"type":"null"}],"title":"Savr"},"FBFM":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/SurfaceGridLandfireFBFM40Source"},{"$ref":"#/components/schemas/SurfaceGridUniformFBFM40Value"}],"title":"SurfaceGridFBFMSource","discriminator":{"propertyName":"source","mapping":{"LANDFIRE":"#/components/schemas/SurfaceGridLandfireFBFM40Source","uniform":"#/components/schemas/SurfaceGridUniformFBFM40Value"}}},{"type":"null"}],"title":"Fbfm"},"modifications":{"items":{"$ref":"#/components/schemas/SurfaceGridModification"},"type":"array","maxItems":1000,"title":"ListSurfaceGridModifications","description":"List of modifications to apply to the surface grid","default":[]}},"type":"object","required":["attributes"],"title":"CreateSurfaceGridRequest"},"CreateTopographyGridRequest":{"properties":{"attributes":{"items":{"$ref":"#/components/schemas/TopographyGridAttribute"},"type":"array","title":"Attributes","description":"List of attributes to include in the surface grid"},"elevation":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/TopographyGrid3DEPSource"},{"$ref":"#/components/schemas/TopographyGridLandfireSource"},{"$ref":"#/components/schemas/TopographyGridUniformValue"}],"title":"TopographyGridElevationSource","discriminator":{"propertyName":"source","mapping":{"3DEP":"#/components/schemas/TopographyGrid3DEPSource","LANDFIRE":"#/components/schemas/TopographyGridLandfireSource","uniform":"#/components/schemas/TopographyGridUniformValue"}}},{"type":"null"}],"title":"Elevation"},"aspect":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/TopographyGrid3DEPSourceAspect"},{"$ref":"#/components/schemas/TopographyGridLandfireSourceAspect"}],"title":"TopographyGridAspectSource","discriminator":{"propertyName":"source","mapping":{"3DEP":"#/components/schemas/TopographyGrid3DEPSourceAspect","LANDFIRE":"#/components/schemas/TopographyGridLandfireSourceAspect"}}},{"type":"null"}],"title":"Aspect"},"slope":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/TopographyGrid3DEPSource"},{"$ref":"#/components/schemas/TopographyGridLandfireSource"}],"title":"TopographyGridSlopeSource","discriminator":{"propertyName":"source","mapping":{"3DEP":"#/components/schemas/TopographyGrid3DEPSource","LANDFIRE":"#/components/schemas/TopographyGridLandfireSource"}}},{"type":"null"}],"title":"Slope"}},"type":"object","required":["attributes"],"title":"CreateTopographyGridRequest"},"CreateTreeGridRequest":{"properties":{"attributes":{"items":{"$ref":"#/components/schemas/TreeGridAttribute"},"type":"array","title":"Attributes","description":"List of attributes to include in the tree grid. Each attribute is a separate layer in the grid. Attributes present in the list will be assigned default values unless an additional field is provided.","default":["bulkDensity","fuelMoisture"]},"bulkDensity":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/TreeGridInventorySource"},{"$ref":"#/components/schemas/TreeGridUniformValue"}],"title":"TreeGridBulkDensitySource","discriminator":{"propertyName":"source","mapping":{"TreeInventory":"#/components/schemas/TreeGridInventorySource","uniform":"#/components/schemas/TreeGridUniformValue"}}},{"type":"null"}],"title":"Bulkdensity"},"fuelMoisture":{"anyOf":[{"$ref":"#/components/schemas/TreeGridUniformValue"},{"type":"null"}]},"SPCD":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/TreeGridInventorySource"},{"$ref":"#/components/schemas/TreeGridUniformValue"}],"title":"TreeGridSPCDSource","discriminator":{"propertyName":"source","mapping":{"TreeInventory":"#/components/schemas/TreeGridInventorySource","uniform":"#/components/schemas/TreeGridUniformValue"}}},{"type":"null"}],"title":"Spcd"},"SAVR":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/TreeGridInventorySource"},{"$ref":"#/components/schemas/TreeGridUniformValue"}],"title":"TreeGridSAVRSource","discriminator":{"propertyName":"source","mapping":{"TreeInventory":"#/components/schemas/TreeGridInventorySource","uniform":"#/components/schemas/TreeGridUniformValue"}}},{"type":"null"}],"title":"Savr"}},"type":"object","title":"CreateTreeGridRequest","description":"The request used to create a tree grid."},"CreateTreeInventoryRequest":{"properties":{"sources":{"items":{"$ref":"#/components/schemas/TreeInventorySource"},"type":"array","maxItems":1,"minItems":1,"title":"Sources","description":"The data sources used to build the tree inventory. Currently, only one data source at a time is supported."},"TreeMap":{"anyOf":[{"$ref":"#/components/schemas/TreeMapSource"},{"type":"null"}]},"modifications":{"items":{"$ref":"#/components/schemas/TreeInventoryModification"},"type":"array","maxItems":1000,"title":"ListTreeInventoryModifications","description":"List of modifications to apply to the tree inventory data","default":[]},"treatments":{"items":{"oneOf":[{"$ref":"#/components/schemas/TreeInventoryTreatmentDirectionalThinning"},{"$ref":"#/components/schemas/TreeInventoryTreatmentProportionalThinning"}],"title":"TreeInventoryTreatment","description":"A treatment to apply to the tree inventory data","discriminator":{"propertyName":"method","mapping":{"directionalThinning":"#/components/schemas/TreeInventoryTreatmentDirectionalThinning","proportionalThinning":"#/components/schemas/TreeInventoryTreatmentProportionalThinning"}}},"type":"array","maxItems":1000,"title":"ListTreeInventoryTreatments","description":"List of silvicultural treatments to apply.","default":[]},"featureMasks":{"items":{"$ref":"#/components/schemas/FeatureType"},"type":"array","title":"Featuremasks","description":"List of Features to mask tree inventory data. This has the effect of removing trees that intersect with the feature.","default":[]}},"type":"object","required":["sources"],"title":"CreateTreeInventoryRequest"},"CreateWaterFeatureRequest":{"properties":{"sources":{"items":{"$ref":"#/components/schemas/WaterFeatureSource"},"type":"array","title":"Sources","description":"List of sources of road features"}},"type":"object","required":["sources"],"title":"CreateWaterFeatureRequest"},"Domain":{"properties":{"type":{"type":"string","const":"FeatureCollection","title":"Type","default":"FeatureCollection"},"features":{"items":{"$ref":"#/components/schemas/GeoJSONFeature"},"type":"array","minItems":1,"title":"Features"},"name":{"type":"string","title":"Name","description":"The name of the domain.","default":""},"description":{"type":"string","title":"Description","description":"A brief description of the domain.","default":""},"horizontalResolution":{"type":"number","title":"Horizontalresolution","description":"The horizontal resolution in meters of a regular grid representation of the domain.","default":2.0},"verticalResolution":{"type":"number","title":"Verticalresolution","description":"The vertical resolution in meters of a regular grid representation of the domain.","default":1.0},"crs":{"$ref":"#/components/schemas/GeoJsonCRS","description":"The GeoJSON specification formatted coordinate reference system (CRS) of the domain."},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"A list of tags associated with the domain.","default":[]},"id":{"type":"string","title":"Id","description":"A unique identifier for the domain."},"createdOn":{"type":"string","format":"date-time","title":"Createdon","description":"The date and time the domain was created."},"modifiedOn":{"type":"string","format":"date-time","title":"Modifiedon","description":"The date and time the domain was last modified."}},"type":"object","required":["features","createdOn","modifiedOn"],"title":"Domain","description":"Represents a domain resource."},"DomainSortField":{"type":"string","enum":["createdOn","modifiedOn","name"],"title":"DomainSortField","description":"Enum for sorting domain resources by field."},"DomainSortOrder":{"type":"string","enum":["ascending","descending"],"title":"DomainSortOrder","description":"Enum for sorting domain resources by order."},"Export":{"properties":{"domainId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domainid","description":"The domain ID."},"resource":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource","description":"The resource to export."},"subResource":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subresource","description":"The sub-resource to export."},"attribute":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attribute","description":"The attribute to export."},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format","description":"The format to export the resource in."},"status":{"anyOf":[{"$ref":"#/components/schemas/ExportStatus"},{"type":"null"}],"description":"The status of the export job."},"createdOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Createdon","description":"The date and time the export job was created."},"modifiedOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modifiedon","description":"The date and time the export job was last modified."},"signedUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signedurl","description":"The signed URL to download the exported file."},"expiresOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expireson","description":"The date and time the export job will expire."}},"type":"object","title":"Export","description":"Request to export a resource"},"ExportStatus":{"type":"string","enum":["pending","running","failed","completed","expired"],"title":"ExportStatus"},"FBFM40":{"type":"string","enum":["NB1","NB2","NB3","NB8","NB9","GR1","GR2","GR3","GR4","GR5","GR6","GR7","GR8","GR9","GS1","GS2","GS3","GS4","SH1","SH2","SH3","SH4","SH5","SH6","SH7","SH8","SH9","TU1","TU2","TU3","TU4","TU5","TL1","TL2","TL3","TL4","TL5","TL6","TL7","TL8","TL9","SB1","SB2","SB3","SB4"],"title":"FBFM40"},"FeatureGrid":{"properties":{"attributes":{"items":{"$ref":"#/components/schemas/FeatureGridAttribute"},"type":"array","title":"Attributes","description":"List of feature types to rasterize."},"status":{"anyOf":[{"$ref":"#/components/schemas/JobStatus"},{"type":"null"}]},"createdOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Createdon"},"modifiedOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modifiedon"},"checksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum"}},"type":"object","required":["attributes"],"title":"FeatureGrid"},"FeatureGridAttribute":{"type":"string","enum":["road","water"],"title":"FeatureGridAttribute"},"FeatureType":{"type":"string","enum":["road","water"],"title":"FeatureType"},"Features":{"properties":{"road":{"anyOf":[{"$ref":"#/components/schemas/RoadFeature"},{"type":"null"}]},"water":{"anyOf":[{"$ref":"#/components/schemas/WaterFeature"},{"type":"null"}]}},"type":"object","title":"Features"},"GeoJSONFeature":{"properties":{"type":{"type":"string","const":"Feature","title":"Type","default":"Feature"},"geometry":{"oneOf":[{"$ref":"#/components/schemas/Point"},{"$ref":"#/components/schemas/MultiPoint"},{"$ref":"#/components/schemas/LineString"},{"$ref":"#/components/schemas/MultiLineString"},{"$ref":"#/components/schemas/Polygon"},{"$ref":"#/components/schemas/MultiPolygon"}],"title":"Geometry","discriminator":{"propertyName":"type","mapping":{"LineString":"#/components/schemas/LineString","MultiLineString":"#/components/schemas/MultiLineString","MultiPoint":"#/components/schemas/MultiPoint","MultiPolygon":"#/components/schemas/MultiPolygon","Point":"#/components/schemas/Point","Polygon":"#/components/schemas/Polygon"}}},"properties":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Properties"}},"type":"object","required":["geometry"],"title":"GeoJSONFeature","description":"A GeoJSON Feature object."},"GeoJSONFeatureCollection":{"properties":{"type":{"type":"string","const":"FeatureCollection","title":"Type","default":"FeatureCollection"},"features":{"items":{"$ref":"#/components/schemas/GeoJSONFeature"},"type":"array","minItems":1,"title":"Features"}},"type":"object","required":["features"],"title":"GeoJSONFeatureCollection","description":"A GeoJSON FeatureCollection object."},"GeoJSONStyleProperties":{"properties":{"strokeColor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strokecolor","description":"The color of a line as part of a polygon, polyline, or multigeometry","examples":["#555555"]},"strokeOpacity":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Strokeopacity","description":"The opacity of the line component of a polygon, polyline, or multigeometry","examples":[1.0]},"strokeWidth":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Strokewidth","description":"The width of the line component of a polygon, polyline, or multigeometry","examples":[2.0]},"fillColor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fillcolor","description":"The color of the interior of a polygon","examples":["#555555"]},"fillOpacity":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Fillopacity","description":"The opacity of the interior of a polygon","examples":[0.5]}},"type":"object","title":"GeoJSONStyleProperties"},"GeoJsonCRS":{"properties":{"type":{"type":"string","const":"name","title":"Type","default":"name"},"properties":{"$ref":"#/components/schemas/GeoJsonCRSProperties"}},"type":"object","required":["properties"],"title":"GeoJsonCRS"},"GeoJsonCRSProperties":{"properties":{"name":{"type":"string","title":"Name","default":"EPSG:4326"}},"type":"object","title":"GeoJsonCRSProperties"},"GridAttributeMetadataResponse":{"properties":{"shape":{"items":{"type":"integer"},"type":"array","maxItems":3,"minItems":2,"title":"Shape","description":"The total shape of the grid data."},"dimensions":{"items":{"type":"string"},"type":"array","maxItems":3,"minItems":2,"title":"Dimensions","description":"A text descriptor of each dimension in the grid data."},"chunks":{"items":{"type":"integer"},"type":"array","maxItems":3,"minItems":2,"title":"Chunks","description":"The number of chunks in each dimension."},"chunkShape":{"items":{"type":"integer"},"type":"array","maxItems":3,"minItems":2,"title":"Chunkshape","description":"The shape of each chunk."},"attributes":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Attributes","description":"Information about each attribute in the grid data."}},"type":"object","required":["shape","dimensions","chunks","chunkShape","attributes"],"title":"GridAttributeMetadataResponse"},"Grids":{"properties":{"tree":{"anyOf":[{"$ref":"#/components/schemas/TreeGrid"},{"type":"null"}]},"surface":{"anyOf":[{"$ref":"#/components/schemas/SurfaceGrid"},{"type":"null"}]},"topography":{"anyOf":[{"$ref":"#/components/schemas/TopographyGrid"},{"type":"null"}]},"feature":{"anyOf":[{"$ref":"#/components/schemas/FeatureGrid"},{"type":"null"}]}},"type":"object","title":"Grids"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"Inventories":{"properties":{"tree":{"anyOf":[{"$ref":"#/components/schemas/TreeInventory"},{"type":"null"}]}},"type":"object","title":"Inventories"},"JobStatus":{"type":"string","enum":["pending","running","failed","completed"],"title":"JobStatus"},"Key":{"properties":{"name":{"type":"string","title":"Name","description":"A name to semantically identify the key."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"An optional description of the keys purpose."},"validDays":{"type":"integer","title":"Validdays","description":"Number of days for which this key will be valid.","default":30},"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"type":"array","title":"Scopes","description":"A list of scopes available to the key.","default":["read"]},"access":{"$ref":"#/components/schemas/Access","description":"Access type for the API key","default":"personal"},"applicationId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Applicationid","description":"Application ID accessed by the API key"},"id":{"type":"string","title":"Id","description":"Unique identifier for the key that also serves as the access token."},"createdOn":{"type":"string","format":"date-time","title":"Createdon","description":"The date and time the key was created."},"expiresOn":{"type":"string","format":"date-time","title":"Expireson","description":"The date at which this key is no longer valid."},"ownerId":{"type":"string","title":"Ownerid","description":"The unique ID of the user who generated the key."}},"type":"object","required":["name","id","ownerId"],"title":"Key","description":"Represents an API key used to authenticate users accessing the API programmatically"},"LineString":{"properties":{"type":{"type":"string","const":"LineString","title":"Type","default":"LineString"},"coordinates":{"items":{"$ref":"#/components/schemas/Position"},"type":"array","title":"Coordinates"}},"type":"object","required":["coordinates"],"title":"LineString"},"ListApplicationsResponse":{"properties":{"currentPage":{"type":"integer","title":"Currentpage","description":"The current page number."},"pageSize":{"type":"integer","title":"Pagesize","description":"The number of resources per page."},"totalItems":{"type":"integer","title":"Totalitems","description":"The total number of resources."},"applications":{"items":{"$ref":"#/components/schemas/Application"},"type":"array","title":"Applications","description":"A list of applications."}},"type":"object","required":["currentPage","pageSize","totalItems","applications"],"title":"ListApplicationsResponse","description":"Paginated response for listing applications."},"ListDomainResponse":{"properties":{"currentPage":{"type":"integer","title":"Currentpage","description":"The current page number."},"pageSize":{"type":"integer","title":"Pagesize","description":"The number of resources per page."},"totalItems":{"type":"integer","title":"Totalitems","description":"The total number of resources."},"domains":{"items":{"$ref":"#/components/schemas/Domain"},"type":"array","title":"Domains","description":"A list of domain resources."}},"type":"object","required":["currentPage","pageSize","totalItems","domains"],"title":"ListDomainResponse","description":"Paginated response for listing domain resources."},"ListKeysResponse":{"properties":{"currentPage":{"type":"integer","title":"Currentpage","description":"The current page number."},"pageSize":{"type":"integer","title":"Pagesize","description":"The number of resources per page."},"totalItems":{"type":"integer","title":"Totalitems","description":"The total number of resources."},"keys":{"items":{"$ref":"#/components/schemas/Key"},"type":"array","title":"Keys","description":"A list of API keys."}},"type":"object","required":["currentPage","pageSize","totalItems","keys"],"title":"ListKeysResponse","description":"Paginated response for listing API keys."},"MetaCanopyHeightMapSource":{"properties":{"source":{"type":"string","const":"Meta2024","title":"Source"},"license":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License"},"citation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Citation"}},"type":"object","required":["source"],"title":"MetaCanopyHeightMapSource"},"Modifier":{"type":"string","enum":["multiply","divide","add","subtract","replace"],"title":"Modifier"},"MultiLineString":{"properties":{"type":{"type":"string","const":"MultiLineString","title":"Type","default":"MultiLineString"},"coordinates":{"items":{"items":{"$ref":"#/components/schemas/Position"},"type":"array"},"type":"array","title":"Coordinates"}},"type":"object","required":["coordinates"],"title":"MultiLineString"},"MultiPoint":{"properties":{"type":{"type":"string","const":"MultiPoint","title":"Type","default":"MultiPoint"},"coordinates":{"items":{"$ref":"#/components/schemas/Position"},"type":"array","title":"Coordinates"}},"type":"object","required":["coordinates"],"title":"MultiPoint"},"MultiPolygon":{"properties":{"type":{"type":"string","const":"MultiPolygon","title":"Type","default":"MultiPolygon"},"coordinates":{"items":{"items":{"items":{"$ref":"#/components/schemas/Position"},"type":"array"},"type":"array"},"type":"array","title":"Coordinates"}},"type":"object","required":["coordinates"],"title":"MultiPolygon"},"Operator":{"type":"string","enum":["eq","ne","gt","lt","ge","le"],"title":"Operator"},"Point":{"properties":{"type":{"type":"string","const":"Point","title":"Type","default":"Point"},"coordinates":{"$ref":"#/components/schemas/Position"}},"type":"object","required":["coordinates"],"title":"Point"},"PointCloud":{"properties":{"als":{"anyOf":[{"$ref":"#/components/schemas/AlsPointCloud"},{"type":"null"}]}},"type":"object","title":"PointCloud"},"Polygon":{"properties":{"type":{"type":"string","const":"Polygon","title":"Type","default":"Polygon"},"coordinates":{"items":{"items":{"$ref":"#/components/schemas/Position"},"type":"array"},"type":"array","title":"Coordinates"}},"type":"object","required":["coordinates"],"title":"Polygon"},"Position":{"items":{"type":"number"},"type":"array","maxItems":3,"minItems":2,"title":"Position"},"RoadFeature":{"properties":{"sources":{"items":{"$ref":"#/components/schemas/RoadFeatureSource"},"type":"array","title":"Sources","description":"List of sources of road features"},"geojson":{"anyOf":[{"$ref":"#/components/schemas/GeoJSONFeature"},{"$ref":"#/components/schemas/GeoJSONFeatureCollection"},{"type":"null"}],"title":"Geojson","description":"GeoJSON input when source is geojson. Must contain Polygon or MultiPolygon geometries."},"status":{"anyOf":[{"$ref":"#/components/schemas/JobStatus"},{"type":"null"}]},"createdOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Createdon"},"modifiedOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modifiedon"},"checksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum"}},"type":"object","required":["sources"],"title":"RoadFeature","description":"Response model for road features without strict validation."},"RoadFeatureSource":{"type":"string","enum":["OSM","geojson"],"title":"RoadFeatureSource"},"Scope":{"type":"string","enum":["read","write"],"title":"Scope","description":"Enumerates the available scopes or permissions attached to an API key."},"SurfaceGrid":{"properties":{"attributes":{"anyOf":[{"items":{"$ref":"#/components/schemas/SurfaceGridAttribute"},"type":"array"},{"type":"null"}],"title":"Attributes"},"fuelLoad":{"anyOf":[{"$ref":"#/components/schemas/SurfaceGridLandfireFBFM40FuelLoadSource"},{"$ref":"#/components/schemas/SurfaceGridLandfireFCCSFuelLoadSource"},{"$ref":"#/components/schemas/SurfaceGridUniformValue"},{"type":"null"}],"title":"Fuelload"},"fuelDepth":{"anyOf":[{"$ref":"#/components/schemas/SurfaceGridLandfireFBFM40Source"},{"$ref":"#/components/schemas/SurfaceGridLandfireFCCSSource"},{"$ref":"#/components/schemas/SurfaceGridUniformValue"},{"type":"null"}],"title":"Fueldepth"},"fuelMoisture":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/SurfaceGridUniformValue"},{"$ref":"#/components/schemas/SurfaceGridUniformValueBySizeClass"}],"title":"SurfaceGridFuelMoistureSource","discriminator":{"propertyName":"source","mapping":{"uniform":"#/components/schemas/SurfaceGridUniformValue","uniformBySizeClass":"#/components/schemas/SurfaceGridUniformValueBySizeClass"}}},{"type":"null"}],"title":"Fuelmoisture"},"SAVR":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/SurfaceGridLandfireFBFM40SAVRSource"},{"$ref":"#/components/schemas/SurfaceGridUniformValue"}],"title":"SurfaceGridSAVRSource","discriminator":{"propertyName":"source","mapping":{"LANDFIRE":"#/components/schemas/SurfaceGridLandfireFBFM40SAVRSource","uniform":"#/components/schemas/SurfaceGridUniformValue"}}},{"type":"null"}],"title":"Savr"},"FBFM":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/SurfaceGridLandfireFBFM40Source"},{"$ref":"#/components/schemas/SurfaceGridUniformFBFM40Value"}],"title":"SurfaceGridFBFMSource","discriminator":{"propertyName":"source","mapping":{"LANDFIRE":"#/components/schemas/SurfaceGridLandfireFBFM40Source","uniform":"#/components/schemas/SurfaceGridUniformFBFM40Value"}}},{"type":"null"}],"title":"Fbfm"},"modifications":{"items":{"$ref":"#/components/schemas/SurfaceGridModification"},"type":"array","maxItems":1000,"title":"ListSurfaceGridModifications","description":"List of modifications to apply to the surface grid","default":[]},"status":{"anyOf":[{"$ref":"#/components/schemas/JobStatus"},{"type":"null"}]},"createdOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Createdon"},"modifiedOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modifiedon"},"checksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum"}},"type":"object","title":"SurfaceGrid"},"SurfaceGridAttribute":{"type":"string","enum":["fuelLoad","fuelDepth","fuelMoisture","SAVR","FBFM"],"title":"SurfaceGridAttribute"},"SurfaceGridInterpolationMethod":{"type":"string","enum":["nearest","linear","cubic","zipper"],"title":"SurfaceGridInterpolationMethod"},"SurfaceGridLandfireFBFM40FuelLoadSource":{"properties":{"featureMasks":{"items":{"$ref":"#/components/schemas/FeatureType"},"type":"array","title":"Featuremasks","description":"List of feature masks to apply to the surface grid attribute","default":[]},"source":{"type":"string","const":"LANDFIRE","title":"Source","default":"LANDFIRE"},"product":{"type":"string","const":"FBFM40","title":"Product","default":"FBFM40"},"version":{"type":"string","const":"2022","title":"Version","description":"Version of the LANDFIRE data to use for the surface grid attribute.","default":"2022"},"interpolationMethod":{"$ref":"#/components/schemas/SurfaceGridInterpolationMethod","description":"Interpolation method to use when resampling the LANDFIRE data to the desired surface grid resolution.","default":"nearest"},"removeNonBurnable":{"anyOf":[{"items":{"type":"string","enum":["NB1","NB2","NB3","NB8","NB9"]},"type":"array"},{"type":"null"}],"title":"Removenonburnable","description":"List of non-burnable fuel model codes to remove from the surface grid attribute. Nonburnable blocks are replaced by burnable block by applying a majority filter to the grid. This feature is especially useful when used with the featureMasks field for replacing coarse resolution 30m data with high resolution road, water, and building polygons from other data sources such as OSM."},"curingLiveHerbaceous":{"type":"number","minimum":0.0,"title":"Curingliveherbaceous","description":"Proportion of live herbaceous fuel that is cured.","default":0.25},"curingLiveWoody":{"type":"number","minimum":0.0,"title":"Curinglivewoody","description":"Proportion of live woody fuel that is cured.","default":0.1},"groups":{"anyOf":[{"items":{"$ref":"#/components/schemas/SurfaceGridLandfireFBFM40Group"},"type":"array","minItems":1},{"type":"null"}],"title":"Groups","description":"List of FBFM40 size class groups to include in the surface grid attribute. Must include at least one group.","default":["oneHour","tenHour","hundredHour","liveHerbaceous","liveWoody"]}},"type":"object","title":"SurfaceGridLandfireFBFM40FuelLoadSource"},"SurfaceGridLandfireFBFM40Group":{"type":"string","enum":["oneHour","tenHour","hundredHour","liveHerbaceous","liveWoody"],"title":"SurfaceGridLandfireFBFM40Group","description":"The size class groups available for the FBFM40 fuel model."},"SurfaceGridLandfireFBFM40SAVRSource":{"properties":{"featureMasks":{"items":{"$ref":"#/components/schemas/FeatureType"},"type":"array","title":"Featuremasks","description":"List of feature masks to apply to the surface grid attribute","default":[]},"source":{"type":"string","const":"LANDFIRE","title":"Source","default":"LANDFIRE"},"product":{"type":"string","const":"FBFM40","title":"Product","default":"FBFM40"},"version":{"type":"string","const":"2022","title":"Version","description":"Version of the LANDFIRE data to use for the surface grid attribute.","default":"2022"},"interpolationMethod":{"$ref":"#/components/schemas/SurfaceGridInterpolationMethod","description":"Interpolation method to use when resampling the LANDFIRE data to the desired surface grid resolution.","default":"nearest"},"removeNonBurnable":{"anyOf":[{"items":{"type":"string","enum":["NB1","NB2","NB3","NB8","NB9"]},"type":"array"},{"type":"null"}],"title":"Removenonburnable","description":"List of non-burnable fuel model codes to remove from the surface grid attribute. Nonburnable blocks are replaced by burnable block by applying a majority filter to the grid. This feature is especially useful when used with the featureMasks field for replacing coarse resolution 30m data with high resolution road, water, and building polygons from other data sources such as OSM."},"groups":{"anyOf":[{"items":{"$ref":"#/components/schemas/SurfaceGridLandfireFBFM40Group"},"type":"array","minItems":1},{"type":"null"}],"title":"Groups","description":"List of FBFM40 size class groups to include in the surface grid attribute. Must include at least one group."}},"type":"object","title":"SurfaceGridLandfireFBFM40SAVRSource"},"SurfaceGridLandfireFBFM40Source":{"properties":{"featureMasks":{"items":{"$ref":"#/components/schemas/FeatureType"},"type":"array","title":"Featuremasks","description":"List of feature masks to apply to the surface grid attribute","default":[]},"source":{"type":"string","const":"LANDFIRE","title":"Source","default":"LANDFIRE"},"product":{"type":"string","const":"FBFM40","title":"Product","default":"FBFM40"},"version":{"type":"string","const":"2022","title":"Version","description":"Version of the LANDFIRE data to use for the surface grid attribute.","default":"2022"},"interpolationMethod":{"$ref":"#/components/schemas/SurfaceGridInterpolationMethod","description":"Interpolation method to use when resampling the LANDFIRE data to the desired surface grid resolution.","default":"nearest"},"removeNonBurnable":{"anyOf":[{"items":{"type":"string","enum":["NB1","NB2","NB3","NB8","NB9"]},"type":"array"},{"type":"null"}],"title":"Removenonburnable","description":"List of non-burnable fuel model codes to remove from the surface grid attribute. Nonburnable blocks are replaced by burnable block by applying a majority filter to the grid. This feature is especially useful when used with the featureMasks field for replacing coarse resolution 30m data with high resolution road, water, and building polygons from other data sources such as OSM."}},"type":"object","title":"SurfaceGridLandfireFBFM40Source"},"SurfaceGridLandfireFCCSFuelLoadSource":{"properties":{"featureMasks":{"items":{"$ref":"#/components/schemas/FeatureType"},"type":"array","title":"Featuremasks","description":"List of feature masks to apply to the surface grid attribute","default":[]},"source":{"type":"string","const":"LANDFIRE","title":"Source","default":"LANDFIRE"},"product":{"type":"string","const":"FCCS","title":"Product","default":"FCCS"},"version":{"type":"string","const":"2023","title":"Version","description":"Version of the LANDFIRE data to use for the surface grid attribute. FCCS uses version 2023.","default":"2023"},"interpolationMethod":{"$ref":"#/components/schemas/SurfaceGridInterpolationMethod","description":"Interpolation method to use when resampling the LANDFIRE data to the desired surface grid resolution.","default":"nearest"},"groups":{"anyOf":[{"items":{"$ref":"#/components/schemas/SurfaceGridLandfireFCCSGroup"},"type":"array","minItems":1},{"type":"null"}],"title":"Groups","description":"List of FCCS size class groups to include in the surface grid attribute. Must include at least one group.","default":["oneHour","tenHour","hundredHour"]}},"type":"object","title":"SurfaceGridLandfireFCCSFuelLoadSource","description":"Source configuration for FCCS fuel load data.\nFCCS supports 1-hour, 10-hour, and 100-hour timelag fuels (no live fuels or curing parameters)."},"SurfaceGridLandfireFCCSGroup":{"type":"string","enum":["oneHour","tenHour","hundredHour"],"title":"SurfaceGridLandfireFCCSGroup","description":"The size class groups available for the FCCS fuel model.\nFCCS supports 1-hour, 10-hour, and 100-hour timelag fuels only."},"SurfaceGridLandfireFCCSSource":{"properties":{"featureMasks":{"items":{"$ref":"#/components/schemas/FeatureType"},"type":"array","title":"Featuremasks","description":"List of feature masks to apply to the surface grid attribute","default":[]},"source":{"type":"string","const":"LANDFIRE","title":"Source","default":"LANDFIRE"},"product":{"type":"string","const":"FCCS","title":"Product","default":"FCCS"},"version":{"type":"string","const":"2023","title":"Version","description":"Version of the LANDFIRE data to use for the surface grid attribute. FCCS uses version 2023.","default":"2023"},"interpolationMethod":{"$ref":"#/components/schemas/SurfaceGridInterpolationMethod","description":"Interpolation method to use when resampling the LANDFIRE data to the desired surface grid resolution.","default":"nearest"}},"type":"object","title":"SurfaceGridLandfireFCCSSource","description":"Base source configuration for FCCS (Fuel Characteristic Classification System) data.\nFCCS provides detailed fuelbed classifications using LANDFIRE 2023 data."},"SurfaceGridModification":{"properties":{"conditions":{"items":{"oneOf":[{"$ref":"#/components/schemas/SurfaceGridModificationFBFMCondition"},{"$ref":"#/components/schemas/SurfaceGridModificationFuelLoadCondition"},{"$ref":"#/components/schemas/SurfaceGridModificationFuelHeightCondition"},{"$ref":"#/components/schemas/SurfaceGridModificationFuelMoistureCondition"}],"title":"SurfaceGridModificationCondition","description":"The conditions for the surface grid modification.","discriminator":{"propertyName":"attribute","mapping":{"FBFM":"#/components/schemas/SurfaceGridModificationFBFMCondition","fuelDepth":"#/components/schemas/SurfaceGridModificationFuelHeightCondition","fuelLoad":"#/components/schemas/SurfaceGridModificationFuelLoadCondition","fuelMoisture":"#/components/schemas/SurfaceGridModificationFuelMoistureCondition"}}},"type":"array","title":"ListSurfaceGridModificationConditions","description":"The conditions for the surface grid modification."},"actions":{"items":{"oneOf":[{"$ref":"#/components/schemas/SurfaceGridModificationFBFMAction"},{"$ref":"#/components/schemas/SurfaceGridModificationFuelLoadAction"},{"$ref":"#/components/schemas/SurfaceGridModificationFuelHeightAction"},{"$ref":"#/components/schemas/SurfaceGridModificationFuelMoistureAction"}],"title":"SurfaceGridModificationAction","description":"The actions for the surface grid modification.","discriminator":{"propertyName":"attribute","mapping":{"FBFM":"#/components/schemas/SurfaceGridModificationFBFMAction","fuelDepth":"#/components/schemas/SurfaceGridModificationFuelHeightAction","fuelLoad":"#/components/schemas/SurfaceGridModificationFuelLoadAction","fuelMoisture":"#/components/schemas/SurfaceGridModificationFuelMoistureAction"}}},"type":"array","minItems":1,"title":"ListSurfaceGridModificationActions","description":"The actions for the surface grid modification."}},"type":"object","required":["conditions","actions"],"title":"SurfaceGridModification"},"SurfaceGridModificationFBFMAction":{"properties":{"attribute":{"type":"string","const":"FBFM","title":"Attribute"},"modifier":{"type":"string","const":"replace","title":"Modifier"},"value":{"$ref":"#/components/schemas/FBFM40"}},"type":"object","required":["attribute","modifier","value"],"title":"SurfaceGridModificationFBFMAction"},"SurfaceGridModificationFBFMCondition":{"properties":{"attribute":{"type":"string","const":"FBFM","title":"Attribute"},"operator":{"type":"string","const":"eq","title":"Operator"},"value":{"$ref":"#/components/schemas/FBFM40"}},"type":"object","required":["attribute","operator","value"],"title":"SurfaceGridModificationFBFMCondition"},"SurfaceGridModificationFuelHeightAction":{"properties":{"attribute":{"type":"string","const":"fuelDepth","title":"Attribute"},"modifier":{"$ref":"#/components/schemas/Modifier"},"value":{"type":"number","minimum":0.0,"title":"Value"}},"type":"object","required":["attribute","modifier","value"],"title":"SurfaceGridModificationFuelHeightAction"},"SurfaceGridModificationFuelHeightCondition":{"properties":{"attribute":{"type":"string","const":"fuelDepth","title":"Attribute"},"operator":{"$ref":"#/components/schemas/Operator"},"value":{"type":"number","minimum":0.0,"title":"Value"}},"type":"object","required":["attribute","operator","value"],"title":"SurfaceGridModificationFuelHeightCondition"},"SurfaceGridModificationFuelLoadAction":{"properties":{"attribute":{"type":"string","const":"fuelLoad","title":"Attribute"},"modifier":{"$ref":"#/components/schemas/Modifier"},"value":{"type":"number","minimum":0.0,"title":"Value"}},"type":"object","required":["attribute","modifier","value"],"title":"SurfaceGridModificationFuelLoadAction"},"SurfaceGridModificationFuelLoadCondition":{"properties":{"attribute":{"type":"string","const":"fuelLoad","title":"Attribute"},"operator":{"$ref":"#/components/schemas/Operator"},"value":{"type":"number","minimum":0.0,"title":"Value"}},"type":"object","required":["attribute","operator","value"],"title":"SurfaceGridModificationFuelLoadCondition"},"SurfaceGridModificationFuelMoistureAction":{"properties":{"attribute":{"type":"string","const":"fuelMoisture","title":"Attribute"},"modifier":{"$ref":"#/components/schemas/Modifier"},"value":{"type":"number","minimum":0.0,"title":"Value"}},"type":"object","required":["attribute","modifier","value"],"title":"SurfaceGridModificationFuelMoistureAction"},"SurfaceGridModificationFuelMoistureCondition":{"properties":{"attribute":{"type":"string","const":"fuelMoisture","title":"Attribute"},"operator":{"$ref":"#/components/schemas/Operator"},"value":{"type":"number","minimum":0.0,"title":"Value"}},"type":"object","required":["attribute","operator","value"],"title":"SurfaceGridModificationFuelMoistureCondition"},"SurfaceGridUniformFBFM40Value":{"properties":{"featureMasks":{"items":{"$ref":"#/components/schemas/FeatureType"},"type":"array","title":"Featuremasks","description":"List of feature masks to apply to the surface grid attribute","default":[]},"source":{"type":"string","const":"uniform","title":"Source","default":"uniform"},"value":{"$ref":"#/components/schemas/FBFM40"}},"type":"object","required":["value"],"title":"SurfaceGridUniformFBFM40Value"},"SurfaceGridUniformValue":{"properties":{"featureMasks":{"items":{"$ref":"#/components/schemas/FeatureType"},"type":"array","title":"Featuremasks","description":"List of feature masks to apply to the surface grid attribute","default":[]},"source":{"type":"string","const":"uniform","title":"Source","default":"uniform"},"value":{"type":"number","minimum":0.0,"title":"Value"}},"type":"object","required":["value"],"title":"SurfaceGridUniformValue"},"SurfaceGridUniformValueBySizeClass":{"properties":{"featureMasks":{"items":{"$ref":"#/components/schemas/FeatureType"},"type":"array","title":"Featuremasks","description":"List of feature masks to apply to the surface grid attribute","default":[]},"source":{"type":"string","const":"uniformBySizeClass","title":"Source","default":"uniformBySizeClass"},"oneHour":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Onehour"},"tenHour":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Tenhour"},"hundredHour":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Hundredhour"},"liveHerbaceous":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Liveherbaceous"},"liveWoody":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Livewoody"},"groups":{"anyOf":[{"items":{"$ref":"#/components/schemas/SurfaceGridLandfireFBFM40Group"},"type":"array","minItems":1},{"type":"null"}],"title":"Groups","description":"List of size class groups to include in the surface grid attribute. Must include at least one group."}},"type":"object","title":"SurfaceGridUniformValueBySizeClass"},"ThreeDEPSource":{"properties":{"tiles":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tiles"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"ThreeDEPSource","description":"for recording metadata about the 3DEP source"},"TopographyGrid":{"properties":{"attributes":{"anyOf":[{"items":{"$ref":"#/components/schemas/TopographyGridAttribute"},"type":"array"},{"type":"null"}],"title":"Attributes"},"elevation":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/TopographyGrid3DEPSource"},{"$ref":"#/components/schemas/TopographyGridLandfireSource"},{"$ref":"#/components/schemas/TopographyGridUniformValue"}],"title":"TopographyGridElevationSource","discriminator":{"propertyName":"source","mapping":{"3DEP":"#/components/schemas/TopographyGrid3DEPSource","LANDFIRE":"#/components/schemas/TopographyGridLandfireSource","uniform":"#/components/schemas/TopographyGridUniformValue"}}},{"type":"null"}],"title":"Elevation"},"aspect":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/TopographyGrid3DEPSourceAspect"},{"$ref":"#/components/schemas/TopographyGridLandfireSourceAspect"}],"title":"TopographyGridAspectSource","discriminator":{"propertyName":"source","mapping":{"3DEP":"#/components/schemas/TopographyGrid3DEPSourceAspect","LANDFIRE":"#/components/schemas/TopographyGridLandfireSourceAspect"}}},{"type":"null"}],"title":"Aspect"},"slope":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/TopographyGrid3DEPSource"},{"$ref":"#/components/schemas/TopographyGridLandfireSource"}],"title":"TopographyGridSlopeSource","discriminator":{"propertyName":"source","mapping":{"3DEP":"#/components/schemas/TopographyGrid3DEPSource","LANDFIRE":"#/components/schemas/TopographyGridLandfireSource"}}},{"type":"null"}],"title":"Slope"},"status":{"anyOf":[{"$ref":"#/components/schemas/JobStatus"},{"type":"null"}]},"createdOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Createdon"},"modifiedOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modifiedon"},"checksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum"}},"type":"object","title":"TopographyGrid"},"TopographyGrid3DEPSource":{"properties":{"source":{"type":"string","const":"3DEP","title":"Source","default":"3DEP"},"interpolationMethod":{"type":"string","enum":["nearest","linear","cubic"],"title":"Interpolationmethod","default":"linear"}},"type":"object","title":"TopographyGrid3DEPSource"},"TopographyGrid3DEPSourceAspect":{"properties":{"source":{"type":"string","const":"3DEP","title":"Source","default":"3DEP"},"interpolationMethod":{"type":"string","const":"nearest","title":"Interpolationmethod","default":"nearest"}},"type":"object","title":"TopographyGrid3DEPSourceAspect"},"TopographyGridAttribute":{"type":"string","enum":["elevation","slope","aspect"],"title":"TopographyGridAttribute"},"TopographyGridInterpolationMethod":{"type":"string","enum":["nearest","linear","cubic","zipper"],"title":"TopographyGridInterpolationMethod"},"TopographyGridLandfireSource":{"properties":{"source":{"type":"string","const":"LANDFIRE","title":"Source","default":"LANDFIRE"},"version":{"type":"string","const":"2020","title":"Version","default":"2020"},"interpolationMethod":{"$ref":"#/components/schemas/TopographyGridInterpolationMethod","default":"linear"}},"type":"object","title":"TopographyGridLandfireSource"},"TopographyGridLandfireSourceAspect":{"properties":{"source":{"type":"string","const":"LANDFIRE","title":"Source","default":"LANDFIRE"},"version":{"type":"string","const":"2020","title":"Version","default":"2020"},"interpolationMethod":{"type":"string","const":"nearest","title":"Interpolationmethod","default":"nearest"}},"type":"object","title":"TopographyGridLandfireSourceAspect"},"TopographyGridUniformValue":{"properties":{"source":{"type":"string","const":"uniform","title":"Source","default":"uniform"},"value":{"type":"number","title":"Value"}},"type":"object","required":["value"],"title":"TopographyGridUniformValue"},"TreeGrid":{"properties":{"attributes":{"items":{"$ref":"#/components/schemas/TreeGridAttribute"},"type":"array","title":"Attributes","description":"List of attributes to include in the tree grid. Each attribute is a separate layer in the grid. Attributes present in the list will be assigned default values unless an additional field is provided.","default":["bulkDensity","fuelMoisture"]},"bulkDensity":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/TreeGridInventorySource"},{"$ref":"#/components/schemas/TreeGridUniformValue"}],"title":"TreeGridBulkDensitySource","discriminator":{"propertyName":"source","mapping":{"TreeInventory":"#/components/schemas/TreeGridInventorySource","uniform":"#/components/schemas/TreeGridUniformValue"}}},{"type":"null"}],"title":"Bulkdensity"},"fuelMoisture":{"anyOf":[{"$ref":"#/components/schemas/TreeGridUniformValue"},{"type":"null"}]},"SPCD":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/TreeGridInventorySource"},{"$ref":"#/components/schemas/TreeGridUniformValue"}],"title":"TreeGridSPCDSource","discriminator":{"propertyName":"source","mapping":{"TreeInventory":"#/components/schemas/TreeGridInventorySource","uniform":"#/components/schemas/TreeGridUniformValue"}}},{"type":"null"}],"title":"Spcd"},"SAVR":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/TreeGridInventorySource"},{"$ref":"#/components/schemas/TreeGridUniformValue"}],"title":"TreeGridSAVRSource","discriminator":{"propertyName":"source","mapping":{"TreeInventory":"#/components/schemas/TreeGridInventorySource","uniform":"#/components/schemas/TreeGridUniformValue"}}},{"type":"null"}],"title":"Savr"},"status":{"$ref":"#/components/schemas/JobStatus","default":"pending"},"createdOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Createdon"},"modifiedOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modifiedon"},"checksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum"},"treeInventoryChecksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Treeinventorychecksum"}},"type":"object","title":"TreeGrid"},"TreeGridAttribute":{"type":"string","enum":["bulkDensity","fuelMoisture","SPCD","SAVR"],"title":"TreeGridAttribute","description":"The attributes that can be used to generate a tree grid."},"TreeGridInventorySource":{"properties":{"source":{"type":"string","const":"TreeInventory","title":"Source","default":"TreeInventory"}},"type":"object","title":"TreeGridInventorySource"},"TreeGridUniformValue":{"properties":{"source":{"type":"string","const":"uniform","title":"Source","default":"uniform"},"value":{"type":"number","title":"Value"}},"type":"object","required":["value"],"title":"TreeGridUniformValue"},"TreeInventory":{"properties":{"sources":{"items":{"$ref":"#/components/schemas/TreeInventorySource"},"type":"array","title":"Sources"},"TreeMap":{"anyOf":[{"$ref":"#/components/schemas/TreeMapSource"},{"type":"null"}]},"modifications":{"items":{"$ref":"#/components/schemas/TreeInventoryModification"},"type":"array","maxItems":1000,"title":"ListTreeInventoryModifications","description":"List of modifications to apply to the tree inventory data","default":[]},"treatments":{"items":{"oneOf":[{"$ref":"#/components/schemas/TreeInventoryTreatmentDirectionalThinning"},{"$ref":"#/components/schemas/TreeInventoryTreatmentProportionalThinning"}],"title":"TreeInventoryTreatment","description":"A treatment to apply to the tree inventory data","discriminator":{"propertyName":"method","mapping":{"directionalThinning":"#/components/schemas/TreeInventoryTreatmentDirectionalThinning","proportionalThinning":"#/components/schemas/TreeInventoryTreatmentProportionalThinning"}}},"type":"array","maxItems":1000,"title":"ListTreeInventoryTreatments","description":"List of silvicultural treatments to apply.","default":[]},"featureMasks":{"items":{"$ref":"#/components/schemas/FeatureType"},"type":"array","title":"Featuremasks","description":"List of Features to mask tree inventory data. This has the effect of removing trees that intersect with the feature.","default":[]},"status":{"$ref":"#/components/schemas/JobStatus","default":"pending"},"createdOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Createdon"},"modifiedOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modifiedon"},"checksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum"},"file":{"anyOf":[{"$ref":"#/components/schemas/api__resources__inventories__tree__schema__UploadResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/api__resources__inventories__tree__schema__ProcessingError"},{"type":"null"}],"description":"Detailed error information if processing failed, regardless of source type."}},"type":"object","required":["sources"],"title":"TreeInventory"},"TreeInventoryModification":{"properties":{"conditions":{"items":{"oneOf":[{"$ref":"#/components/schemas/TreeInventoryModificationSPCDCondition"},{"$ref":"#/components/schemas/TreeInventoryModificationHTCondition"},{"$ref":"#/components/schemas/TreeInventoryModificationDIACondition"},{"$ref":"#/components/schemas/TreeInventoryModificationCRCondition"},{"$ref":"#/components/schemas/TreeInventoryModificationExpressionCondition"}],"title":"TreeInventoryModificationCondition","description":"Conditions for filtering trees. Supports single fields (HT, DIA, CR, SPCD) or arithmetic expressions.","discriminator":{"propertyName":"attribute","mapping":{"CR":"#/components/schemas/TreeInventoryModificationCRCondition","DIA":"#/components/schemas/TreeInventoryModificationDIACondition","HT":"#/components/schemas/TreeInventoryModificationHTCondition","SPCD":"#/components/schemas/TreeInventoryModificationSPCDCondition","expression":"#/components/schemas/TreeInventoryModificationExpressionCondition"}}},"type":"array","title":"ListTreeInventoryModificationConditions","description":"The conditions for the tree inventory modification."},"actions":{"items":{"anyOf":[{"$ref":"#/components/schemas/TreeInventoryModificationSPCDAction"},{"$ref":"#/components/schemas/TreeInventoryModificationHTAction"},{"$ref":"#/components/schemas/TreeInventoryModificationDIAAction"},{"$ref":"#/components/schemas/TreeInventoryModificationCRAction"},{"$ref":"#/components/schemas/TreeInventoryModificationRemoveAction"}],"title":"TreeInventoryModificationAction","description":"Actions to apply to trees. Use modifier='remove' to remove trees."},"type":"array","minItems":1,"title":"ListTreeInventoryModificationActions","description":"The actions for the tree inventory modification."}},"type":"object","required":["conditions","actions"],"title":"TreeInventoryModification"},"TreeInventoryModificationCRAction":{"properties":{"attribute":{"type":"string","const":"CR","title":"Attribute"},"modifier":{"$ref":"#/components/schemas/Modifier"},"value":{"type":"number","maximum":1.0,"exclusiveMinimum":0.0,"title":"Value"}},"type":"object","required":["attribute","modifier","value"],"title":"TreeInventoryModificationCRAction"},"TreeInventoryModificationCRCondition":{"properties":{"attribute":{"type":"string","const":"CR","title":"Attribute"},"operator":{"$ref":"#/components/schemas/Operator"},"value":{"type":"number","maximum":1.0,"exclusiveMinimum":0.0,"title":"Value"}},"type":"object","required":["attribute","operator","value"],"title":"TreeInventoryModificationCRCondition"},"TreeInventoryModificationDIAAction":{"properties":{"attribute":{"type":"string","const":"DIA","title":"Attribute"},"modifier":{"$ref":"#/components/schemas/Modifier"},"value":{"type":"number","minimum":0.0,"title":"Value"}},"type":"object","required":["attribute","modifier","value"],"title":"TreeInventoryModificationDIAAction"},"TreeInventoryModificationDIACondition":{"properties":{"attribute":{"type":"string","const":"DIA","title":"Attribute"},"operator":{"$ref":"#/components/schemas/Operator"},"value":{"type":"number","minimum":0.0,"title":"Value"}},"type":"object","required":["attribute","operator","value"],"title":"TreeInventoryModificationDIACondition"},"TreeInventoryModificationExpressionCondition":{"properties":{"attribute":{"type":"string","const":"expression","title":"Attribute"},"operator":{"$ref":"#/components/schemas/Operator"},"value":{"type":"number","title":"Value"},"expression":{"type":"string","maxLength":200,"minLength":1,"title":"Expression","description":"Arithmetic expression using tree fields (HT, DIA, CR)","examples":["HT * (1 - CR)","HT / DIA","(HT + DIA) / 2"]}},"type":"object","required":["attribute","operator","value","expression"],"title":"TreeInventoryModificationExpressionCondition","description":"Expression-based condition for filtering trees based on computed values.\n\nSupports arithmetic expressions combining tree fields:\n- Fields: HT, DIA, CR\n- Operators: +, -, *, /, ()\n- Examples: \"HT * (1 - CR)\", \"HT / DIA\", \"(HT + DIA) / 2\""},"TreeInventoryModificationHTAction":{"properties":{"attribute":{"type":"string","const":"HT","title":"Attribute"},"modifier":{"$ref":"#/components/schemas/Modifier"},"value":{"type":"number","minimum":0.0,"title":"Value"}},"type":"object","required":["attribute","modifier","value"],"title":"TreeInventoryModificationHTAction"},"TreeInventoryModificationHTCondition":{"properties":{"attribute":{"type":"string","const":"HT","title":"Attribute"},"operator":{"$ref":"#/components/schemas/Operator"},"value":{"type":"number","minimum":0.0,"title":"Value"}},"type":"object","required":["attribute","operator","value"],"title":"TreeInventoryModificationHTCondition"},"TreeInventoryModificationRemoveAction":{"properties":{"attribute":{"anyOf":[{"type":"string","const":"all"},{"type":"null"}],"title":"Attribute","description":"Optional field for backwards compatibility. Automatically normalized to None."},"modifier":{"type":"string","const":"remove","title":"Modifier","description":"Remove trees matching conditions","default":"remove"}},"type":"object","title":"TreeInventoryModificationRemoveAction","description":"Remove all trees matching the conditions.\n\nSupports two syntaxes:\n- New (simplified): {\"modifier\": \"remove\"}\n- Legacy (backwards compatible): {\"attribute\": \"all\", \"modifier\": \"remove\"}\n\nNote: The 'attribute' field is automatically normalized to None internally."},"TreeInventoryModificationSPCDAction":{"properties":{"attribute":{"type":"string","const":"SPCD","title":"Attribute"},"modifier":{"type":"string","const":"replace","title":"Modifier"},"value":{"type":"integer","title":"Value"}},"type":"object","required":["attribute","modifier","value"],"title":"TreeInventoryModificationSPCDAction"},"TreeInventoryModificationSPCDCondition":{"properties":{"attribute":{"type":"string","const":"SPCD","title":"Attribute"},"operator":{"type":"string","const":"eq","title":"Operator"},"value":{"type":"integer","title":"Value"}},"type":"object","required":["attribute","operator","value"],"title":"TreeInventoryModificationSPCDCondition"},"TreeInventorySource":{"type":"string","enum":["TreeMap","file","pointcloud"],"title":"TreeInventorySource"},"TreeInventoryTreatmentDirectionalThinning":{"properties":{"method":{"type":"string","const":"directionalThinning","title":"Method"},"direction":{"type":"string","enum":["above","below"],"title":"Direction"},"targetMetric":{"type":"string","enum":["diameter","basalArea"],"title":"Targetmetric"},"targetValue":{"type":"number","minimum":0.0,"title":"Targetvalue"}},"type":"object","required":["method","direction","targetMetric","targetValue"],"title":"TreeInventoryTreatmentDirectionalThinning"},"TreeInventoryTreatmentProportionalThinning":{"properties":{"method":{"type":"string","const":"proportionalThinning","title":"Method"},"targetMetric":{"type":"string","const":"basalArea","title":"Targetmetric"},"targetValue":{"type":"number","minimum":0.0,"title":"Targetvalue"}},"type":"object","required":["method","targetMetric","targetValue"],"title":"TreeInventoryTreatmentProportionalThinning"},"TreeMapSource":{"properties":{"version":{"$ref":"#/components/schemas/TreeMapVersion","default":"2022"},"seed":{"type":"integer","title":"Seed"},"canopyHeightMapConfiguration":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/MetaCanopyHeightMapSource"}],"discriminator":{"propertyName":"source","mapping":{"Meta2024":"#/components/schemas/MetaCanopyHeightMapSource"}}},{"type":"null"}],"title":"Canopyheightmapconfiguration","description":"Optional canopy height map configuration argument to use with the TreeMap data source."}},"type":"object","title":"TreeMapSource"},"TreeMapVersion":{"type":"string","enum":["2014","2016","2020","2022"],"title":"TreeMapVersion"},"UpdateDomainRequest":{"properties":{"name":{"type":"string","title":"Name","description":"The name of the domain."},"description":{"type":"string","title":"Description","description":"A brief description of the domain."},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"A list of tags associated with the domain."}},"type":"object","title":"UpdateDomainRequest","description":"Request body for updating a domain resource."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WaterFeature":{"properties":{"sources":{"items":{"$ref":"#/components/schemas/WaterFeatureSource"},"type":"array","title":"Sources","description":"List of sources of road features"},"status":{"anyOf":[{"$ref":"#/components/schemas/JobStatus"},{"type":"null"}]},"createdOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Createdon"},"modifiedOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modifiedon"},"checksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum"}},"type":"object","required":["sources"],"title":"WaterFeature"},"WaterFeatureSource":{"type":"string","enum":["OSM"],"title":"WaterFeatureSource"},"api__resources__inventories__tree__schema__ProcessingError":{"properties":{"code":{"type":"string","title":"Code","description":"A unique error code identifying the type of error that occurred."},"message":{"type":"string","title":"Message","description":"A user-friendly error message describing what went wrong."},"details":{"type":"string","title":"Details","description":"Technical details about the error for debugging purposes."},"suggestions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggestions","description":"Actionable suggestions for resolving the error."}},"type":"object","required":["code","message","details"],"title":"ProcessingError","description":"Structured error information for user feedback, matching the uploader service error format."},"api__resources__inventories__tree__schema__UploadResponse":{"properties":{"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Information about the current step in the upload process."},"method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Method","description":"The HTTP method used to make the upload request."},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"The signed URL used to make the request."},"headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Headers","description":"The HTTP headers that need to be included with the PUT request."},"curl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Curl","description":"A cURL command that can be used to perform the upload."}},"type":"object","required":["message"],"title":"UploadResponse","description":"Upload response model to provide all necessary information and updates for file upload process."},"api__resources__pointclouds__als__schema__UploadResponse":{"properties":{"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Information about the current step in the upload process."},"method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Method","description":"The HTTP method used to make the upload request."},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"The signed URL used to make the request."},"headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Headers","description":"The HTTP headers that need to be included with the PUT request."},"curl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Curl","description":"A cURL command that can be used to perform the upload."}},"type":"object","title":"UploadResponse","description":"Upload response model to provide all necessary information and updates for file upload process."}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","in":"header","name":"api-key"},"HTTPBearer":{"type":"http","scheme":"bearer"}}}} \ No newline at end of file +{"openapi":"3.1.0","info":{"title":"FastFuels API","description":"A JSON API for creating, editing, and retrieving 3D fuels data for next generation fire behavior models.","version":"0.1.0"},"servers":[{"url":"https://api.fastfuels.silvxlabs.com"}],"paths":{"/":{"get":{"tags":["Index"],"summary":"Index","operationId":"index","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/cookies":{"get":{"tags":["Cookies"],"summary":"Create session cookie","description":"Create a session cookie for authentication","operationId":"get_cookie","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"delete":{"tags":["Cookies"],"summary":"Delete session cookie","description":"Remove session cookie for logout","operationId":"delete_cookie","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/keys":{"post":{"tags":["API Keys"],"summary":"Create API key","description":"Create a new API key for authentication","operationId":"create_key","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["API Keys"],"summary":"List API keys","description":"Get paginated list of accessible API keys","operationId":"list_keys","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":100,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListKeysResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/keys/{keyId}":{"get":{"tags":["API Keys"],"summary":"Get API key","description":"Get API key details by ID","operationId":"get_key_by_id","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"keyId","in":"path","required":true,"schema":{"type":"string","title":"Keyid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["API Keys"],"summary":"Delete API key","description":"Permanently delete an API key by ID","operationId":"delete_key","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"keyId","in":"path","required":true,"schema":{"type":"string","title":"Keyid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications":{"post":{"tags":["Applications"],"summary":"Create application","description":"Create a new application for API access","operationId":"create_application","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApplicationRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Application"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Applications"],"summary":"List applications","description":"Get paginated list of user's applications","operationId":"list_applications","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":100,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListApplicationsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{applicationId}":{"get":{"tags":["Applications"],"summary":"Get application","description":"Get application details by ID","operationId":"get_application","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"applicationId","in":"path","required":true,"schema":{"type":"string","title":"Applicationid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Application"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Applications"],"summary":"Update application","description":"Update application details","operationId":"update_application","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"applicationId","in":"path","required":true,"schema":{"type":"string","title":"Applicationid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApplicationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Application"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Applications"],"summary":"Delete application","description":"Delete an application by ID","operationId":"delete_application","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"applicationId","in":"path","required":true,"schema":{"type":"string","title":"Applicationid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains":{"post":{"tags":["Domains"],"summary":"Create Domain","description":"# Create Domain Endpoint\n\nThis endpoint creates a new domain resource based on a spatial extent and additional details provided by the user. The domain resource acts as the spatial container for all other resources that create data within the system.\n\n## What is a Domain Resource?\n\nA domain resource is a spatial container that represents a specific geographical area. It includes metadata such as the name, description, creation date, and the spatial extent defined by geographic coordinates. Domains are used to organize and manage spatial data and operations within a defined area. The data can be vectorized, such as holding features or trees in an inventory, or rasterized, such as a 3D canopy fuel grid or a Digital Elevation Model (DEM).\n\n## Endpoint: `POST /domains`\n\n### Request Body\n\nThe request body should be a GeoJSON object defined by the [GeoJSON specification (RFC 7946)](https://datatracker.ietf.org/doc/html/rfc7946). It can be either a Feature or a FeatureCollection. The required fields differ slightly between these two types, but there are some shared fields as well.\n\n#### Shared Fields\n\nThese fields are required for both Feature and FeatureCollection inputs:\n\n- **type**: (string) Must be either \"Feature\" or \"FeatureCollection\".\n- **name**: (string, optional) The name of the domain.\n- **description**: (string, optional) A brief description of the domain.\n- **horizontalResolution**: (float) The horizontal resolution in meters of a regular grid representation of the domain.\n- **verticalResolution**: (float) The vertical resolution in meters of a regular grid representation of the domain.\n- **crs**: (GeoJsonCRS) The GeoJSON specification formatted coordinate reference system (CRS) of the domain.\n - **type**: (string) Must be \"name\".\n - **properties**: (object) The properties object containing the CRS details.\n - **name**: (string) The name of the CRS, e.g., \"EPSG:4326\". Must be either 'local' or a valid authority string.\n\n#### Feature-specific Fields\n\nWhen the input type is \"Feature\", the following additional field is required:\n\n- **geometry**: (GeoJSON Geometry object) A GeoJSON geometry object defining the spatial location of the domain.\n - **type**: (string) Must be a valid GeoJSON type, e.g., \"Polygon\".\n - **coordinates**: (array) An array of coordinates defining the geometry.\n\n#### FeatureCollection-specific Fields\n\nWhen the input type is \"FeatureCollection\", the following additional field is required:\n\n- **features**: (array of Feature objects) An array of Feature objects. Each Feature object should have:\n - **type**: (string) Must be \"Feature\".\n - **geometry**: (GeoJSON Geometry object) As described in the Feature-specific fields.\n\n### Response\n\nOn successful creation, the endpoint returns the newly created domain resource with the following fields:\n\n- **id**: (string) A unique identifier for the domain.\n- **name**: (string) The name of the domain.\n- **description**: (string) A brief description of the domain.\n- **createdOn**: (datetime) The date and time the domain was created.\n- **modifiedOn**: (datetime) The date and time the domain was last modified.\n- **type**: (string) Will be \"FeatureCollection\".\n- **features**: (array) An array of two Feature objects:\n 1. The domain feature (padded bounding box):\n - **type**: (string) Will be \"Feature\".\n - **geometry**: (GeoJSON) The GeoJSON geometry representing the padded spatial extent of the domain.\n - **properties**: (object) Additional properties of the domain feature.\n - **name**: (string) Will be \"domain\".\n - **area**: (float) The area of the domain in square meters.\n - **perimeter**: (float) The perimeter of the domain in meters.\n 2. The input feature:\n - **type**: (string) Will be \"Feature\".\n - **geometry**: (GeoJSON) The GeoJSON geometry representing the original input geometry.\n - **properties**: (object) Additional properties of the input feature.\n - **name**: (string) Will be \"input\".\n - **area**: (float) The area of the input geometry in square meters.\n - **perimeter**: (float) The perimeter of the input geometry in meters.\n- **horizontalResolution**: (float) The horizontal resolution of the domain.\n- **verticalResolution**: (float) The vertical resolution of the domain.\n- **crs**: (GeoJsonCRS) The coordinate reference system of the domain.\n- **utmAuthorityString**: (string, optional) The UTM authority string if the input was projected to UTM.\n\n### Processing from Request to Response\n\nThe system performs several processing steps to convert the Request Body into the Response Body:\n\n1. **CRS Handling and Projection**:\n - If the input CRS is geographic (e.g., EPSG:4326), the geometry is automatically projected to the appropriate UTM zone.\n - If the input CRS is already projected, the domain will keep that CRS.\n - If the input CRS is 'local', the spatial data is assumed to be NOT geo-referenced, and no projection is performed.\n\n2. **Bounding Box Calculation**:\n - The system calculates the bounding box of the input geometry (or the combined geometries for a FeatureCollection).\n\n3. **Resolution-based Padding**:\n - The bounding box is padded out to the nearest multiple of the user-provided horizontal resolution.\n\n4. **FeatureCollection Creation**:\n - The system creates a FeatureCollection with two features: the padded bounding box (domain) and the original input geometry.\n\nThese steps ensure that the domain's extent is regularized, aligned with the specified resolution, and in a suitable projected coordinate system (when applicable), which allows for subsequent grid-based operations.\n\n### Important Notes\n\n1. **Projection**: The domain will always be stored in a projected coordinate system if the input is geographic. This ensures consistency and accuracy for spatial operations within the domain.\n\n2. **UTM Zone Selection**: When projecting from a geographic CRS, the system automatically selects the appropriate UTM zone based on the centroid of the input geometry.\n\n3. **FeatureCollection Handling**: When a FeatureCollection is provided as input, the domain will be created based on the combined extent of all features in the collection.\n\n4. **Zero Area Handling**: If the spatial extent has zero area (e.g., a point or line), the endpoint will raise an error.\n\n5. **Resolution Alignment**: The spatial extent is padded out to the nearest multiple of horizontal and vertical resolution (in meters) to ensure grid alignment.\n\n6. **Maximum Area**: Currently, the maximum area for a domain is 16 square kilometers. We are planning to increase this limit in the future. If this limitation is an issue for your use case, please contact us for assistance.\n\n7. **CRS Preservation**: If you provide data in a specific projected CRS, that CRS will be preserved in the domain. This is useful for maintaining consistency with existing data sources or specific regional requirements.\n\n### Error Responses\n\n- **422 Unprocessable Entity**: The spatial extent is invalid.\n - **Detail**: \"Invalid spatial extent. The area of the spatial extent must be greater than zero meters.\"\n - **Detail**: \"Invalid spatial extent. The area of the spatial extent must be less than sixteen square kilometers.\"\n- **500 Internal Server Error**: An error occurred while creating the domain resource.","operationId":"create_domain","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDomainRequest"},"examples":{"feature collection WGS84":{"value":{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"coordinates":[[[-114.09545796676623,46.8324794598619],[-114.11217537297199,46.8324794598619],[-114.11217537297199,46.82496749915157],[-114.09545796676623,46.82496749915157],[-114.09545796676623,46.8324794598619]]],"type":"Polygon"}}],"name":"Example","description":"This is an example domain.","horizontalResolution":2,"verticalResolution":1},"summary":"Example WGS84 FeatureCollection","description":"This example creates a domain from a FeatureCollection GeoJSON object. The GeoJSON represents an approximately 1 square kilometer area in the Blue Mountain Recreation Area outside of Missoula, Montana. The CRS of the FeatureCollection is not provided so it is assumed to be 'EPSG:4326'."},"feature collection EPSG:5070":{"value":{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-1377797.8087433458,2780720.35945401],[-1379055.2389321132,2780962.840146559],[-1379212.7978295316,2780146.1745799617],[-1377955.2239776908,2779903.6661836714],[-1377797.8087433458,2780720.35945401]]]}}],"name":"Example","description":"This is an example domain.","horizontalResolution":2,"verticalResolution":1,"crs":{"properties":{"name":"EPSG:5070"},"type":"name"}},"summary":"Example EPSG:5070 FeatureCollection","description":"This example creates a domain from a FeatureCollection GeoJSON object with a CRS of 'EPSG:5070'. Note that the CRS is explicitly set in the GeoJSON object. Because the CRS is a projected coordinate system, FastFuels uses the provided CRS for the domain instead of reprojecting."},"feature UTM":{"value":{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[721502.7544906491,5190645.048516054],[720227.9398802927,5190598.00908098],[720258.6480286171,5189763.323999467],[721533.6406826023,5189810.364218195],[721502.7544906491,5190645.048516054]]]},"crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:EPSG::32611"}},"name":"Example","description":"This is an example domain.","horizontalResolution":2,"verticalResolution":1},"summary":"Example UTM Feature","description":"This example creates a domain from a polygon feature GeoJSON object with UTM coordinates."},"feature local":{"value":{"type":"Feature","geometry":{"coordinates":[[[0,0],[0,100],[100,100],[100,0],[0,0]]],"type":"Polygon"},"properties":{},"name":"Example","description":"This is an example domain.","horizontalResolution":2,"verticalResolution":1,"crs":{"properties":{"name":"local"},"type":"name"}},"summary":"Example Local Feature","description":"Example of a domain with spatial data in a local coordinate system (with meter units). The crs field is set to 'local' to indicate that the coordinates are in a local coordinate system."},"feature 3DEP":{"value":{"type":"Feature","geometry":{"coordinates":[[[-114.19991252294375,46.7747518267752],[-114.19991252294375,46.77023218168779],[-114.19133479742844,46.77023218168779],[-114.19133479742844,46.7747518267752],[-114.19991252294375,46.7747518267752]]],"type":"Polygon"},"properties":{},"name":"3DEP Example","description":"Small 3DEP example domain behind blue mountain","horizontalResolution":2,"verticalResolution":1,"crs":{"properties":{"name":"EPSG:4326"},"type":"name"}},"summary":"Example 3DEP Feature","description":"Example of a domain with spatial data from the 3DEP point cloud resource."},"feature Blackfoot":{"value":{"type":"Feature","geometry":{"coordinates":[[[-113.70402605601585,46.91933213469031],[-113.70402605601585,46.91262776084295],[-113.69531269250463,46.91262776084295],[-113.69531269250463,46.91933213469031],[-113.70402605601585,46.91933213469031]]],"type":"Polygon"},"properties":{},"name":"Blackfoot Example","description":"Example domain that contains 3dep, road and water features.","horizontalResolution":2,"verticalResolution":2,"crs":{"properties":{"name":"EPSG:4326"},"type":"name"}},"summary":"Example Blackfoot Domain. 3DEP, Road and Water Features","description":"Example domain that contains 3DEP, road and water features."}}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Domains"],"summary":"List Domains","description":"# List Domains Endpoint\n\nThis endpoint retrieves a paginated list of domain resources based on the\nquery parameters provided by the user.\n\n## Endpoint: `GET /domains`\n\n### Query Parameters\n\nTo retrieve a list of domains, the following query parameters can be used:\n\n- **page**: (integer, optional) The page number to retrieve. Page number is zero-indexed. Default is 0.\n- **size**: (integer, optional) The number of resources to retrieve per page. Minimum is 1 and maximum is 1000. Default is 100.\n- **sortBy**: (string, optional) The field by which to sort the domains. Valid values are:\n - \"createdOn\"\n - \"modifiedOn\"\n - \"name\"\n- **sortOrder**: (string, optional) The order in which to sort the results. Valid values are:\n - \"ascending\"\n - \"descending\"\n\n### Response\n\nThe response is a paginated list of domain resources, including metadata about the current page and the size of each page.\n\n- **domains**: (array) A list of Domain objects.\n- **currentPage**: (integer) The current page number.\n- **pageSize**: (integer) The number of domains per page.\n- **totalItems**: (integer) The total number of domain resources that belong to the user.\n\nEach Domain object in the list follows the Domain schema.\n\n### Example Request\n\n```http\nGET /domains?page=0&size=10&sortBy=createdOn&sortOrder=ascending\n```\n\n### Important Notes\n\n1. The `page` parameter is zero-indexed, meaning that the first page is `0`.\n2. The `size` parameter determines the number of domains returned per page, with a minimum of 1 and a maximum of 1000.\n3. The `sortBy` parameter allows sorting by specific fields, and the `sortOrder` parameter determines the order of sorting (ascending or descending).\n\n### Error Responses\n\n- **422 Unprocessable Entity**: Invalid query parameters.\n - **Detail**: \"Invalid value for query parameter 'page'. Must be a non-negative integer.\"\n - **Detail**: \"Invalid value for query parameter 'size'. Must be an integer between 1 and 1000.\"\n- **500 Internal Server Error**: An error occurred while listing the domain resources.","operationId":"list_domains","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"The page number to retrieve. Page number is zero-indexed.","default":0,"title":"Page"},"description":"The page number to retrieve. Page number is zero-indexed."},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"The number of resources to retrieve per page.","default":100,"title":"Size"},"description":"The number of resources to retrieve per page."},{"name":"sortBy","in":"query","required":false,"schema":{"$ref":"#/components/schemas/DomainSortField"}},{"name":"sortOrder","in":"query","required":false,"schema":{"$ref":"#/components/schemas/DomainSortOrder"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListDomainResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}":{"get":{"tags":["Domains"],"summary":"Get Domain","description":"# Get Domain Endpoint\n\nThis endpoint retrieves a specific domain resource based on the provided domain ID.\n\n## Endpoint: `GET /domains/{domainId}`\n\n### Path Parameters\n\nTo retrieve a specific domain, the following path parameter is required:\n\n- **domainId**: (string) The unique identifier of the domain to retrieve.\n\n### Response\n\nThe response returns the details of the requested domain resource, including its metadata and spatial information.\n\n- **id**: (string) A unique identifier for the domain.\n- **name**: (string) The name of the domain.\n- **description**: (string) A brief description of the domain.\n- **createdOn**: (datetime) The date and time the domain was created.\n- **modifiedOn**: (datetime) The date and time the domain was last modified.\n- **type**: (string) Always \"FeatureCollection\".\n- **features**: (array) An array of two Feature objects:\n 1. The domain feature (padded bounding box):\n - **type**: (string) Will be \"Feature\".\n - **geometry**: (GeoJSON) The GeoJSON geometry representing the padded spatial extent of the domain.\n - **properties**: (object) Additional properties of the domain feature.\n - **name**: (string) Will be \"domain\".\n - **area**: (float) The area of the domain in square meters.\n - **perimeter**: (float) The perimeter of the domain in meters.\n 2. The input feature:\n - **type**: (string) Will be \"Feature\".\n - **geometry**: (GeoJSON) The GeoJSON geometry representing the original input geometry.\n - **properties**: (object) Additional properties of the input feature.\n - **name**: (string) Will be \"input\".\n - **area**: (float) The area of the input geometry in square meters.\n - **perimeter**: (float) The perimeter of the input geometry in meters.\n- **horizontalResolution**: (float) The horizontal resolution of the domain in meters.\n- **verticalResolution**: (float) The vertical resolution of the domain in meters.\n- **crs**: (GeoJsonCRS) The coordinate reference system of the domain.\n- **utmAuthorityString**: (string, optional) The UTM authority string if the input was projected to UTM.\n\n### Error Responses\n\n- **404 Not Found**: The specified domain does not exist or the user does not have access to it.\n - **Detail**: \"Resource not found.\"\n- **500 Internal Server Error**: An error occurred while retrieving the domain resource.\n - **Detail**: \"An error occurred while getting the domain resource.\"","operationId":"get_domain","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Domains"],"summary":"Update Domain","description":"# Update Domain Endpoint\n\nThis endpoint updates an existing domain resource based on the provided domain ID and request body. Users can modify specific fields of the domain, while other fields remain unchanged.\n\n## Endpoint: `PATCH /domains/{domainId}`\n\n### Path Parameters\n\nTo update a specific domain, the following path parameter is required:\n\n- **domainId**: (string) The unique identifier of the domain to update.\n\n### Request Body\n\nTo update a domain, the request body should include one or more of the following fields:\n\n- **name**: (string, optional) The name of the domain.\n- **description**: (string, optional) A brief description of the domain.\n- **tags**: (array of strings, optional) A list of tags associated with the domain.\n\n### Fields that Can Be Updated\n\n- **name**: The name of the domain.\n- **description**: A brief description of the domain.\n- **tags**: The list of tags associated with the domain.\n\n### Fields that Cannot Be Updated\n\nThe following fields cannot be updated. If you wish to change these fields, you need to create a new domain resource with the desired values:\n\n- **id**: The unique identifier for the domain.\n- **createdOn**: The date and time the domain was created.\n- **type**: Always \"FeatureCollection\".\n- **features**: The FeatureCollection containing the domain and input geometries.\n- **horizontalResolution**: The horizontal resolution of the domain.\n- **verticalResolution**: The vertical resolution of the domain.\n- **crs**: The coordinate reference system of the domain.\n- **utmAuthorityString**: The UTM authority string of the domain.\n\n### Response\n\nThe response returns the updated domain resource with the following fields:\n\n- **id**: (string) A unique identifier for the domain.\n- **name**: (string) The name of the domain.\n- **description**: (string) A brief description of the domain.\n- **createdOn**: (datetime) The date and time the domain was created.\n- **modifiedOn**: (datetime) The date and time the domain was last modified.\n- **type**: (string) Always \"FeatureCollection\".\n- **features**: (array) An array of two Feature objects:\n 1. The domain feature (padded bounding box):\n - **type**: (string) Will be \"Feature\".\n - **geometry**: (GeoJSON) The GeoJSON geometry representing the padded spatial extent of the domain.\n - **properties**: (object) Additional properties of the domain feature.\n - **name**: (string) Will be \"domain\".\n - **area**: (float) The area of the domain in square meters.\n - **perimeter**: (float) The perimeter of the domain in meters.\n 2. The input feature:\n - **type**: (string) Will be \"Feature\".\n - **geometry**: (GeoJSON) The GeoJSON geometry representing the original input geometry.\n - **properties**: (object) Additional properties of the input feature.\n - **name**: (string) Will be \"input\".\n - **area**: (float) The area of the input geometry in square meters.\n - **perimeter**: (float) The perimeter of the input geometry in meters.\n- **horizontalResolution**: (float) The horizontal resolution of the domain.\n- **verticalResolution**: (float) The vertical resolution of the domain.\n- **crs**: (GeoJsonCRS) The coordinate reference system of the domain.\n- **utmAuthorityString**: (string, optional) The UTM authority string if the input was projected to UTM.\n- **tags**: (array of strings) A list of tags associated with the domain.\n\n### Important Notes\n\n1. Only the **name**, **description**, and **tags** fields can be updated. If you wish to change any other fields (such as features, horizontalResolution, verticalResolution, crs, etc.), you must create a new domain resource with the desired values.\n2. The **modifiedOn** field will be automatically updated to the current date and time whenever any updatable field is changed.\n\n### Error Responses\n\n- **404 Not Found**: The specified domain does not exist or the user does not have access to it.\n - **Detail**: \"Resource not found.\"\n- **500 Internal Server Error**: An error occurred while updating the domain resource.\n - **Detail**: \"An error occurred while updating the domain resource.\"","operationId":"update_domain","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDomainRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Domains"],"summary":"Delete Domain","description":"# Delete Domain Endpoint\n\nThis endpoint deletes an existing domain resource based on the provided domain ID.\n\n## Endpoint: `DELETE /domains/{domainId}`\n\n### Path Parameters\n\nTo delete a specific domain, the following path parameter is required:\n\n- **domainId**: (string) The unique identifier of the domain to delete.\n\n### Response\n\nThe response does not return any content on a successful deletion and will have a status code of 204 No Content.\n\n### Example Request\n\n```http\nDELETE /domains/1e7d8d3c9f8b4c3ba9e7c3b4f8d7a9c1\n```\n\n### Example Response\n\n```\nHTTP/1.1 204 No Content\n```\n\n### Important Notes\n\n1. Deleting a domain is a permanent action and cannot be undone. Once a domain is deleted, it is removed from the database and cannot be recovered.\n2. Ensure that you have the correct domain ID before making the delete request to avoid accidentally deleting the wrong domain.\n\n### Error Responses\n\n- **404 Not Found**: The specified domain does not exist or the user does not have access to it.\n - **Detail**: \"Resource not found.\"\n- **500 Internal Server Error**: An error occurred while deleting the domain resource.\n - **Detail**: \"An error occurred while deleting the domain resource.\"\n\n### Example Error Response\n\n```json\n{\n \"detail\": \"Resource not found.\"\n}\n```\n\n### Example Internal Server Error Response\n\n```json\n{\n \"detail\": \"An error occurred while deleting the domain resource.\"\n}\n```","operationId":"delete_domain","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/preview":{"post":{"tags":["Domains"],"summary":"Preview Domain","description":"# Preview Domain Endpoint\n\nThis endpoint processes a CreateDomainRequest and returns a Domain object without saving the data to the database. It allows users to preview what their domain will look like before actually creating it.\n\n## Endpoint: `POST /domains/preview`\n\n### Request Body\n\nThe request body should be a GeoJSON object defined by the [GeoJSON specification (RFC 7946)](https://datatracker.ietf.org/doc/html/rfc7946). It can be either a Feature or a FeatureCollection. The structure is identical to the Create Domain endpoint's request body.\n\n#### Shared Fields\n\n- **type**: (string) Must be either \"Feature\" or \"FeatureCollection\".\n- **name**: (string, optional) The name of the domain.\n- **description**: (string, optional) A brief description of the domain.\n- **horizontalResolution**: (float) The horizontal resolution in meters of a regular grid representation of the domain.\n- **verticalResolution**: (float) The vertical resolution in meters of a regular grid representation of the domain.\n- **crs**: (GeoJsonCRS) The GeoJSON specification formatted coordinate reference system (CRS) of the domain.\n - **type**: (string) Must be \"name\".\n - **properties**: (object) The properties object containing the CRS details.\n - **name**: (string) The name of the CRS, e.g., \"EPSG:4326\". Must be either 'local' or a valid authority string.\n- **tags**: (array of strings, optional) A list of tags associated with the domain.\n\n#### Feature-specific Fields\n\nWhen the input type is \"Feature\", the following additional field is required:\n\n- **geometry**: (GeoJSON Geometry object) A GeoJSON geometry object defining the spatial location of the domain.\n - **type**: (string) Must be a valid GeoJSON type, e.g., \"Polygon\".\n - **coordinates**: (array) An array of coordinates defining the geometry.\n\n#### FeatureCollection-specific Fields\n\nWhen the input type is \"FeatureCollection\", the following additional field is required:\n\n- **features**: (array of Feature objects) An array of Feature objects. Each Feature object should have:\n - **type**: (string) Must be \"Feature\".\n - **geometry**: (GeoJSON Geometry object) As described in the Feature-specific fields.\n\n### Response\n\nThe response returns a preview of the domain resource with the following fields:\n\n- **id**: (string) Will always be \"preview\" for this endpoint.\n- **name**: (string) The name of the domain.\n- **description**: (string) A brief description of the domain.\n- **createdOn**: (datetime) The current date and time.\n- **modifiedOn**: (datetime) The current date and time.\n- **type**: (string) Always \"FeatureCollection\".\n- **features**: (array) An array of two Feature objects:\n 1. The domain feature (padded bounding box):\n - **type**: (string) Will be \"Feature\".\n - **geometry**: (GeoJSON) The GeoJSON geometry representing the padded spatial extent of the domain.\n - **properties**: (object) Additional properties of the domain feature.\n - **name**: (string) Will be \"domain\".\n - **area**: (float) The area of the domain in square meters.\n - **perimeter**: (float) The perimeter of the domain in meters.\n 2. The input feature:\n - **type**: (string) Will be \"Feature\".\n - **geometry**: (GeoJSON) The GeoJSON geometry representing the original input geometry.\n - **properties**: (object) Additional properties of the input feature.\n - **name**: (string) Will be \"input\".\n - **area**: (float) The area of the input geometry in square meters.\n - **perimeter**: (float) The perimeter of the input geometry in meters.\n- **horizontalResolution**: (float) The horizontal resolution of the domain.\n- **verticalResolution**: (float) The vertical resolution of the domain.\n- **crs**: (GeoJsonCRS) The coordinate reference system of the domain.\n- **utmAuthorityString**: (string, optional) The UTM authority string if the input was projected to UTM.\n- **tags**: (array of strings) A list of tags associated with the domain.\n\n### Processing\n\nThe preview endpoint performs the same processing steps as the create endpoint:\n\n1. **CRS Handling and Projection**: Projects the geometry to UTM if necessary.\n2. **Bounding Box Calculation**: Calculates the bounding box of the input geometry.\n3. **Resolution-based Padding**: Pads the bounding box to align with the specified resolution.\n4. **FeatureCollection Creation**: Creates a FeatureCollection with the padded domain and original input geometries.\n\n### Important Notes\n\n1. This endpoint does not save any data to the database. It's purely for preview purposes.\n2. The `id` field will always be \"preview\" in the response.\n3. The `createdOn` and `modifiedOn` fields will be set to the current time but are not persisted.\n4. All the same validations and checks applied in the create endpoint are also applied here, including area limitations and CONUS checks.\n\n### Error Responses\n\n- **422 Unprocessable Entity**: The spatial extent is invalid.\n - **Detail**: \"Invalid spatial extent. The area of the spatial extent must be greater than zero meters.\"\n - **Detail**: \"Invalid spatial extent. The area of the spatial extent must be less than sixteen square kilometers.\"\n - **Detail**: \"Invalid spatial extent. The spatial extent must be entirely within CONUS.\"\n- **500 Internal Server Error**: An error occurred while previewing the domain resource.\n - **Detail**: \"An error occurred while previewing the domain resource.\"","operationId":"preview_domain","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDomainRequest"},"examples":{"feature collection WGS84":{"summary":"Example WGS84 FeatureCollection","description":"This example creates a domain from a FeatureCollection GeoJSON object. The GeoJSON represents an approximately 1 square kilometer area in the Blue Mountain Recreation Area outside of Missoula, Montana. The CRS of the FeatureCollection is not provided so it is assumed to be 'EPSG:4326'.","value":{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"coordinates":[[[-114.09545796676623,46.8324794598619],[-114.11217537297199,46.8324794598619],[-114.11217537297199,46.82496749915157],[-114.09545796676623,46.82496749915157],[-114.09545796676623,46.8324794598619]]],"type":"Polygon"}}],"name":"Example","description":"This is an example domain.","horizontalResolution":2,"verticalResolution":1}},"feature collection EPSG:5070":{"summary":"Example EPSG:5070 FeatureCollection","description":"This example creates a domain from a FeatureCollection GeoJSON object with a CRS of 'EPSG:5070'. Note that the CRS is explicitly set in the GeoJSON object. Because the CRS is a projected coordinate system, FastFuels uses the provided CRS for the domain instead of reprojecting.","value":{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-1377797.8087433458,2780720.35945401],[-1379055.2389321132,2780962.840146559],[-1379212.7978295316,2780146.1745799617],[-1377955.2239776908,2779903.6661836714],[-1377797.8087433458,2780720.35945401]]]}}],"name":"Example","description":"This is an example domain.","horizontalResolution":2,"verticalResolution":1,"crs":{"properties":{"name":"EPSG:5070"},"type":"name"}}},"feature UTM":{"summary":"Example UTM Feature","description":"This example creates a domain from a polygon feature GeoJSON object with UTM coordinates.","value":{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[721502.7544906491,5190645.048516054],[720227.9398802927,5190598.00908098],[720258.6480286171,5189763.323999467],[721533.6406826023,5189810.364218195],[721502.7544906491,5190645.048516054]]]},"crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:EPSG::32611"}},"name":"Example","description":"This is an example domain.","horizontalResolution":2,"verticalResolution":1}},"feature local":{"summary":"Example Local Feature","description":"Example of a domain with spatial data in a local coordinate system (with meter units). The crs field is set to 'local' to indicate that the coordinates are in a local coordinate system.","value":{"type":"Feature","geometry":{"coordinates":[[[0,0],[0,100],[100,100],[100,0],[0,0]]],"type":"Polygon"},"properties":{},"name":"Example","description":"This is an example domain.","horizontalResolution":2,"verticalResolution":1,"crs":{"properties":{"name":"local"},"type":"name"}}},"feature 3DEP":{"summary":"Example 3DEP Feature","description":"Example of a domain with spatial data from the 3DEP point cloud resource.","value":{"type":"Feature","geometry":{"coordinates":[[[-114.19991252294375,46.7747518267752],[-114.19991252294375,46.77023218168779],[-114.19133479742844,46.77023218168779],[-114.19133479742844,46.7747518267752],[-114.19991252294375,46.7747518267752]]],"type":"Polygon"},"properties":{},"name":"3DEP Example","description":"Small 3DEP example domain behind blue mountain","horizontalResolution":2,"verticalResolution":1,"crs":{"properties":{"name":"EPSG:4326"},"type":"name"}}},"feature Blackfoot":{"summary":"Example Blackfoot Domain. 3DEP, Road and Water Features","description":"Example domain that contains 3DEP, road and water features.","value":{"type":"Feature","geometry":{"coordinates":[[[-113.70402605601585,46.91933213469031],[-113.70402605601585,46.91262776084295],[-113.69531269250463,46.91262776084295],[-113.69531269250463,46.91933213469031],[-113.70402605601585,46.91933213469031]]],"type":"Polygon"},"properties":{},"name":"Blackfoot Example","description":"Example domain that contains 3dep, road and water features.","horizontalResolution":2,"verticalResolution":2,"crs":{"properties":{"name":"EPSG:4326"},"type":"name"}}}}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/v1/domains/reproject":{"post":{"tags":["Domains"],"summary":"Reproject Geojson","description":"# Reproject GeoJSON Endpoint\n\nThis endpoint reprojects a GeoJSON FeatureCollection to a different coordinate reference system (CRS) using the specified EPSG code.\n\n## Endpoint: `POST /domains/reproject`\n\n### Query Parameters\n\nTo reproject a GeoJSON, the following query parameter is required:\n\n- **targetEPSG**: (integer, optional) The EPSG code of the target coordinate reference system. Default is 4362.\n\n### Request Body\n\nThe request body should be a GeoJSON FeatureCollection object that includes:\n\n- **type**: (string) Must be \"FeatureCollection\".\n- **features**: (array) An array of Feature objects, each containing:\n - **type**: (string) Must be \"Feature\".\n - **geometry**: (object) A GeoJSON geometry object.\n - **properties**: (object, optional) Properties associated with the feature.\n\n### Response\n\nThe response returns the reprojected GeoJSON FeatureCollection with all geometries transformed to the target coordinate reference system while preserving the original properties of each feature.\n\n### Example Request\n\n```http\nPOST /domains/reproject?targetEPSG=32633\nContent-Type: application/json\n\n{\n \"type\": \"FeatureCollection\",\n \"features\": [\n {\n \"type\": \"Feature\",\n \"geometry\": {\n \"type\": \"Polygon\",\n \"coordinates\": [[[...coordinates in source CRS...]]]\n },\n \"properties\": {\n \"name\": \"Example Feature\"\n }\n }\n ]\n}\n```\n\n### Example Response\n\n```json\n{\n \"type\": \"FeatureCollection\",\n \"features\": [\n {\n \"type\": \"Feature\",\n \"geometry\": {\n \"type\": \"Polygon\",\n \"coordinates\": [[[...coordinates in target CRS...]]]\n },\n \"properties\": {\n \"name\": \"Example Feature\"\n }\n }\n ]\n}\n```","operationId":"reproject_geojson","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"targetEPSG","in":"query","required":false,"schema":{"type":"integer","description":"The target EPSG code to reproject the GeoJSON to.","default":4362,"title":"Targetepsg"},"description":"The target EPSG code to reproject the GeoJSON to."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeoJSONFeatureCollection"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeoJSONFeatureCollection"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/features/{featureName}/style":{"patch":{"tags":["Domains"],"summary":"Update Feature Style","description":"# Update Feature Style\n\nUpdates the style properties of a specific feature in a domain while preserving its geometry. This endpoint allows you to customize the visual appearance of either the domain boundary or input geometry features.\n\n## Endpoint\n\n```\nPATCH /domains/{domainId}/features/{featureName}/style\n```\n\n## Path Parameters\n\n- `domainId` (string, required)\n - The unique identifier of the domain containing the feature to update\n\n- `featureName` (string, required)\n - The name of the feature to update\n - Must be either \"domain\" or \"input\"\n - \"domain\" refers to the padded bounding box feature\n - \"input\" refers to the original input geometry feature\n\n## Request Body\n\nThe request body should contain style properties to update. All properties are optional:\n\n```json\n{\n \"strokeColor\": string, // The color of line/boundary (e.g., \"#555555\")\n \"strokeOpacity\": number, // The opacity of lines/boundaries (0-1)\n \"strokeWidth\": number, // The width of lines/boundaries\n \"fillColor\": string, // The fill color for polygons (e.g., \"#555555\")\n \"fillOpacity\": number // The opacity of polygon fills (0-1)\n}\n```\n\n## Response\n\nReturns the updated feature with the new style properties. The response includes:\n\n- `type`: Always \"Feature\"\n- `geometry`: The unchanged GeoJSON geometry of the feature\n- `properties`: Object containing:\n - `name`: The feature name (\"domain\" or \"input\")\n - `area`: The area of the feature in square meters\n - `perimeter`: The perimeter of the feature in meters\n - `style`: The updated style properties\n\n## Example Request\n\n```http\nPATCH /domains/abc123/features/domain/style\nContent-Type: application/json\n\n{\n \"strokeColor\": \"#FF0000\",\n \"strokeWidth\": 3,\n \"strokeOpacity\": 0.8,\n \"fillColor\": \"#FFA500\",\n \"fillOpacity\": 0.3\n}\n```\n\n## Example Response\n\n```json\n{\n \"type\": \"Feature\",\n \"geometry\": {\n \"type\": \"Polygon\",\n \"coordinates\": [/* ... */]\n },\n \"properties\": {\n \"name\": \"domain\",\n \"area\": 10000.0,\n \"perimeter\": 400.0,\n \"style\": {\n \"strokeColor\": \"#FF0000\",\n \"strokeWidth\": 3,\n \"strokeOpacity\": 0.8,\n \"fillColor\": \"#FFA500\",\n \"fillOpacity\": 0.3\n }\n }\n}\n```\n\n## Error Responses\n\n- **404 Not Found**\n - The specified domain or feature does not exist\n - The user does not have access to the specified domain\n\n- **500 Internal Server Error**\n - An error occurred while updating the feature style\n - Response includes an error message in the detail field\n\n## Notes\n\n- Style properties are merged with existing styles - only specified properties are updated\n- Unspecified style properties retain their existing values\n- The geometry and other feature properties remain unchanged\n- Style changes are persistent and will be saved to the database","operationId":"update_feature_style","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"featureName","in":"path","required":true,"schema":{"enum":["domain","input"],"type":"string","title":"Featurename"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeoJSONStyleProperties"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeoJSONFeature"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/export":{"get":{"tags":["Domains"],"summary":"Export Domain Data","description":"# Export Domain Data Endpoint\n\nThis endpoint exports all metadata for a domain including features, grids, and inventories.\nReturns domain configuration and metadata for all resources without including large data payloads.\n\n## Endpoint: `GET /domains/{domainId}/export`\n\n### Path Parameters\n\n- **domainId**: (string) The unique identifier of the domain to export.\n\n### Response\n\nThe response returns a JSON object containing metadata for the domain and all its resources:\n\n- **domain**: (object) Full domain metadata including:\n - **id**: Domain identifier\n - **name**: Domain name\n - **description**: Domain description\n - **horizontalResolution**: Grid horizontal resolution in meters\n - **verticalResolution**: Grid vertical resolution in meters\n - **crs**: Coordinate reference system\n - **features**: Domain boundary geometry\n - **createdOn**: Creation timestamp\n - **modifiedOn**: Last modification timestamp\n - **tags**: Associated tags\n\n- **features**: (object) Feature metadata (excluding GeoJSON data):\n - **road**: Road feature configuration, sources, status, timestamps\n - **water**: Water feature configuration, sources, status, timestamps\n\n- **grids**: (object) Grid metadata (excluding array data):\n - **tree**: Tree grid configuration, attributes, sources, status\n - **surface**: Surface grid configuration, attributes, sources, modifications\n - **topography**: Topography grid configuration, attributes, sources\n - **feature**: Feature grid configuration, attributes\n\n- **inventories**: (object) Inventory metadata (excluding tree records):\n - **tree**: Tree inventory configuration, sources, modifications, treatments\n\n### What is Excluded\n\nThe following large data payloads are excluded to keep the response size manageable.\nUse dedicated endpoints to access this data:\n\n- **Feature GeoJSON**: Use `/features/{type}/exports/geojson`\n- **Grid array data**: Use `/grids/exports/zarr` or `/grids/{type}/{attribute}/data`\n- **Tree inventory records**: Use `/inventories/tree/exports/{format}`\n\n### Use Cases\n\n- Backup domain configuration and settings\n- Audit domain state and resource creation\n- Compare domains and their configurations\n- Debug configuration issues\n- Export for documentation or sharing\n\n### Error Responses\n\n- **404 Not Found**: The specified domain does not exist or the user does not have access to it.\n - **Detail**: \"Resource not found: domains/{domainId}\"\n - **Detail**: \"Unauthorized access for: domains/{domainId}\"\n\n### Example Response\n\n```json\n{\n \"domain\": {\n \"id\": \"abc123\",\n \"name\": \"My Domain\",\n \"description\": \"Test domain\",\n \"horizontalResolution\": 10.0,\n \"verticalResolution\": 2.0,\n ...\n },\n \"features\": {\n \"road\": {\n \"status\": \"completed\",\n \"sources\": [\"OSM\"],\n ...\n }\n },\n \"grids\": {\n \"tree\": {\n \"status\": \"completed\",\n \"attributes\": [\"bulkDensity\", \"fuelMoisture\"],\n ...\n }\n },\n \"inventories\": {\n \"tree\": {\n \"status\": \"completed\",\n \"sources\": [\"TreeMap\"],\n ...\n }\n }\n}\n```","operationId":"export_domain_data","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Export Domain Data V1 Domains Domainid Export Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/features":{"get":{"tags":["Features"],"summary":"Get Features","description":"# Get Features Endpoint\n\nThis endpoint retrieves the features resource associated with a domain\nbelonging to the user based on the provided domain ID.\n\nA features resource is a container for the various types of feature\ndata that can exist with the spatial context of the domain. Currently,\nonly road and water features are supported, though other forms of feature\nwill be added soon.\n\n## Endpoint: `GET /v1/domains/{domainId}/features`\n\n### Path Parameters\n\nTo retrieve the features of a domain, the following path parameter is required:\n\n- **domainId**: (string) The unique identifier of the domain belonging to the user whose features are to be retrieved.\n\n### Response\n\nThe response returns the members of the specified features resource\nfollowing the Features schema.\n\n- **road**: (RoadFeature)\n- **water**: (WaterFeature)\n\n### Example Request\n\n```http\nGET /v1/domains/1e7d8d3c9f8b4c3ba9e7c3b4f8d7a9c1/features\n```\n\n### Error Responses\n\n- **404 Not Found**: The specified domain does not exist or the user does not have access to it.\n - **Detail**: \"Domain not found.\"\n- **500 Internal Server Error**: An error occurred while retrieving the feature resources.\n - **Detail**: \"An error occurred while getting the feature resources.\"","operationId":"get_features","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Features"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/features/exports/{exportFormat}":{"post":{"tags":["Features"],"summary":"Create Feature Export","description":"# Create Feature Export\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/features/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint initiates the creation of an export file for the feature data (road and water) of a specific domain, in the specified format.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format in which to export the feature data. Possible value:\n - `\"geojson\"`: Export the feature data in GeoJSON format.\n\n## Response\n\nIf successful, returns a `201 Created` status code and a JSON object with:\n\n- `status` (string): Initially set to `\"pending\"`.\n- `createdOn` (string): Timestamp of the export request creation.\n- `modifiedOn` (string): Timestamp of the last modification.\n- `expiresOn` (string): Expiration timestamp (7 days from creation).\n- `signedUrl` (string, optional): Initially `null`, populated when export is completed.\n\n## Error Responses\n\n- `404 Not Found`: If the domain is not found, or there are no water or road features created.\n- `429 Too Many Requests`: Error submitting the export job due to resource exhaustion.\n\n## Usage Notes\n\n- Ensure that the road and water feature data for the domain have been created before initiating an export. If neither feature exists, the request will result in a `404 Not Found` error.\n- The export will be processed as a background job, and the status will initially be set to `\"pending\"`.\n- Check the export status using a separate endpoint to monitor progress.\n- Once the export is complete, use the `signedUrl` to download the GeoJSON file.","operationId":"create_feature_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"const":"geojson","type":"string","title":"Exportformat"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Features"],"summary":"Get Feature Export","description":"# Get Feature Export\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/features/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint retrieves the details of a feature export request (for road and water features) for a specific domain.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format of the export. Possible value:\n - `\"geojson\"`: Export the feature data in GeoJSON format.\n\n## Response\n\nIf successful, returns a `200 OK` status code and a JSON object with:\n\n- `status` (string): Current status of the export (`\"pending\"`, `\"running\"`, `\"completed\"`, `\"failed\"`, or `\"expired\"`).\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of the last modification.\n- `expiresOn` (string): Expiration timestamp.\n- `signedUrl` (string, optional): URL to download the exported file, if status is `\"completed\"`.\n\n## Error Responses\n\n- `404 Not Found`: Export not found or no feature data exists for the specified export format.\n\n## Usage Notes\n\n- Use this endpoint to check the status of a feature export request.\n- Once the status is `\"completed\"`, you can use the `signedUrl` to download the exported GeoJSON file.\n- The signed URL expires 7 days after creation.","operationId":"get_feature_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"const":"geojson","type":"string","title":"Exportformat"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Features"],"summary":"Delete Feature Export","description":"# Delete Feature Export\n\n## Endpoint\n\n```\nDELETE /v1/domains/{domainId}/features/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint deletes a feature export request and its associated files for a specific domain.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format of the export to delete. Possible values are:\n - `\"geojson\"`: Delete the export in the geojson format.\n\n## Response\n\nIf successful, returns a `204 No Content` status code.\n\n## Error Responses\n\n- `404 Not Found`: Domain or export request not found.\n\n## Usage Notes\n\n- Use this endpoint to delete an existing feature export request and its related data.\n- The export request is removed from Firestore, and the associated files are deleted from Google Cloud Storage asynchronously.","operationId":"delete_feature_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"const":"geojson","type":"string","title":"Exportformat"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/features/road":{"post":{"tags":["Road Feature"],"summary":"Create Road Feature","description":"# Create Road Feature\n\nThis endpoint creates a new road feature resource for a specific domain.\nRoad features represent various road attributes (e.g., type, condition) within the spatial context of a domain.\nThe road feature data can be generated using various data sources (e.g., OSM, user-provided GeoJSON).\n\nOn resource creation, the road feature data is set to a status of \"pending\".\nThe road feature data is generated in the background using the specified methods and data sources.\nOnce the road feature data is generated and available for user access, the status is updated to \"completed\".\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/features/road\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to create the road feature.\n\n## Request Body\n\nThe request body should be a JSON object containing the following fields:\n\n- `sources` (array of strings, required): List of sources to include in the road feature. Possible values include:\n - `\"OSM\"`: OpenStreetMap data source. Not supported for domains with local coordinate systems.\n - `\"geojson\"`: User-provided GeoJSON data. Supported for all coordinate systems including local.\n- `geojson` (object, optional): GeoJSON Feature or FeatureCollection object. Required when source is `\"geojson\"`.\n Must contain only Polygon or MultiPolygon geometries (area-based features).\n\n## Response\n\nIf the request is successful, the endpoint will return a `201 Created` status code and the created road feature resource in the response body. The response body will be a JSON object with the following fields:\n\n- `status` (string): The status of the road feature. Will be set to `\"pending\"` initially.\n- `createdOn` (string): The timestamp when the road feature was created.\n- `modifiedOn` (string): The timestamp when the road feature was last modified.\n- `checksum` (string): A unique checksum for the road feature resource.\n- `sources` (array of strings): The list of sources used for the road feature.\n- `geojson` (object, optional): The GeoJSON data if provided.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `422 Unprocessable Entity`: Invalid request body (e.g., OSM source with local CRS, missing geojson field, invalid geometry types).\n- `503 Service Unavailable`: The service is temporarily unavailable (OSM source only).\n\n## Usage Notes\n\n- OSM source is not supported for domains with \"local\" coordinate systems.\n- geojson source is supported for all coordinate systems, including local.\n- When using geojson source, the provided GeoJSON will be clipped to the domain boundary.\n- For non-local CRS, the GeoJSON will be automatically transformed to match the domain's CRS.\n- The endpoint updates the road feature data in the database and logs relevant information for monitoring and debugging.","operationId":"create_road_feature","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRoadFeatureRequest"},"examples":{"OSM source":{"value":{"sources":["OSM"]},"summary":"OSM Source Example","description":"This example creates a road feature using OpenStreetMap data. The road data will be automatically fetched from OSM based on the domain boundary. Note: OSM source is not supported for domains with local coordinate systems."},"GeoJSON source":{"value":{"sources":["geojson"],"geojson":{"type":"FeatureCollection","name":"road","crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:OGC:1.3:CRS84"}},"features":[{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-114.10642793064184,46.83276641015527],[-114.10601673996699,46.83205398685405],[-114.10557181862677,46.83168108130049],[-114.10481856162541,46.83156628534552],[-114.10398620803223,46.83148139151754],[-114.10383371860418,46.83143498343838],[-114.1019381969797,46.832386812410306],[-114.10154897057593,46.83241949539097],[-114.1011173123978,46.832376644929134],[-114.09969047951152,46.832106463373236],[-114.09824592361048,46.832165550706954],[-114.09788135714261,46.832315850119066],[-114.09686270290597,46.83223681341092],[-114.09667926299389,46.83218961010543],[-114.09661334539341,46.83226239332075],[-114.09729838549353,46.832492515303045],[-114.09735857865687,46.83252595300362],[-114.0969412563536,46.83250472391239],[-114.09646946744755,46.83234383393762],[-114.09538030113876,46.832135353896334],[-114.0950569932669,46.83209523226897],[-114.09506329436755,46.83197838904346],[-114.09643105075425,46.83219394537029],[-114.09659097833102,46.83210227559111],[-114.09762453468636,46.83219232957655],[-114.09779993777798,46.83210105084325],[-114.0987658347815,46.83200855432987],[-114.0996652437212,46.83199945681341],[-114.1015225878364,46.83233373350426],[-114.10377523573847,46.83136968249515],[-114.10439547172474,46.83136411431307],[-114.10560905169886,46.831565020384055],[-114.10604248947286,46.83186317863551],[-114.10640546268593,46.83231910223805],[-114.10658327904652,46.83275970380685],[-114.10642793064184,46.83276641015527]]]]}}]}},"summary":"GeoJSON Source Example","description":"This example creates a road feature using user-provided GeoJSON data. The GeoJSON must contain Polygon or MultiPolygon geometries representing road areas. The provided GeoJSON will be clipped to the domain boundary and transformed to match the domain's CRS if necessary. This source is supported for all coordinate systems including local."}}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoadFeature"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Road Feature"],"summary":"Get Road Feature","description":"# Get Road Feature\n\nThis endpoint retrieves the details of an existing road feature resource\nfor a specific domain. Users can access the status and metadata of the\nroad feature that has been created.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/features/road\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to retrieve the road feature.\n\n## Response\n\nIf the request is successful, the endpoint will return a `200 OK` status code and the road feature resource in the response body. The response body will be a JSON object with the following fields:\n\n- `status` (string): The status of the road feature.\n- `createdOn` (string): The timestamp when the road feature was created.\n- `modifiedOn` (string): The timestamp when the road feature was last modified.\n- `checksum` (string): A unique checksum for the road feature resource.\n- `sources` (array of strings): The list of sources used for the road feature.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `404 Not Found`: The road feature for the specified domain does not exist or is empty.\n\n## Usage Notes\n\n- Ensure that the domain ID provided in the request path is valid and that the user has access to the specified domain.\n- If the road feature data is empty or invalid, the endpoint will raise a `404 Not Found` error with a detail message indicating the issue.","operationId":"get_road_feature","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoadFeature"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Road Feature"],"summary":"Delete Road Feature","description":"# Delete Road Feature\n\nThis endpoint deletes an existing road feature resource for a specific\ndomain. This action removes the road feature data from the database and\ncancels any ongoing job execution related to the road feature.\n\n## Endpoint\n\n```\nDELETE /v1/domains/{domainId}/features/road\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to delete the road feature.\n\n## Response\n\nIf the request is successful, the endpoint will return a `204 No Content` status code. This indicates that the road feature has been successfully deleted and no content is returned in the response body.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n - **Detail**: \"Domain not found\"\n\n## Usage Notes\n\n- Deleting a road feature is a permanent action and cannot be undone. Ensure that you have the correct domain ID before making the delete request.\n- The endpoint will also cancel any ongoing job execution related to the road feature and remove the associated data from the cache and cloud storage.","operationId":"delete_road_feature","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/features/road/data":{"get":{"tags":["Road Feature"],"summary":"Get Road Feature Data","description":"# Get Road Feature Data\n\nThis endpoint retrieves paginated road feature data for a specific domain.\nRoad feature data represents individual road segments and their attributes\n(e.g., road type, surface condition) in GeoJSON format.\n\nThe road feature resource must be created and fully processed (status \"completed\")\nbefore data can be retrieved through this endpoint.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/features/road/data\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to retrieve road feature data.\n\n## Query Parameters\n\n- `page` (integer, optional): Zero-indexed page number. Must be greater than or equal to 0. Defaults to `0`.\n- `size` (integer, optional): Number of features to return per page. Valid range: `1` to `1000`. Defaults to `50`.\n\n## Response\n\nIf the request is successful, the endpoint will return a `200 OK` status code and a GeoJSON FeatureCollection\nwith pagination metadata. The response body will contain:\n\n- `type` (string): Always \"FeatureCollection\".\n- `features` (array): Array of GeoJSON Feature objects representing individual road segments.\n- `currentPage` (integer): The current page number returned.\n- `pageSize` (integer): The number of features per page.\n- `totalItems` (integer): The total number of road features available in the domain.\n- `crs` (object, optional): Coordinate reference system information for the domain.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist, the user does not have access to it, or no road feature resource exists for this domain.\n- `422 Unprocessable Entity`: The road feature resource does not have status 'completed', or validation failed for query parameters.\n- `401 Unauthorized`: The request lacks valid authentication credentials.\n- `403 Forbidden`: The authenticated user does not have permission to access this domain.\n\n## Usage Notes\n\n- The road feature resource must be created and have status 'completed' before data can be retrieved.\n- Use the pagination parameters to retrieve large datasets efficiently.\n- The `totalItems` field can be used to calculate the total number of pages available.","operationId":"get_road_feature_data","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"The page number to retrieve. Page number is zero-indexed.","default":0,"title":"Page"},"description":"The page number to retrieve. Page number is zero-indexed."},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"The number of resources to retrieve per page.","default":50,"title":"Size"},"description":"The number of resources to retrieve per page."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureDataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/features/road/exports/{exportFormat}":{"post":{"tags":["Road Feature"],"summary":"Create Road Feature Export","description":"# Create Road Feature Export\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/features/road/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint initiates the creation of an export file for the road feature data of a specific domain, in the specified format.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format in which to export the road feature data. Possible value:\n - `\"geojson\"`: Export the feature data in GeoJSON format.\n\n## Response\n\nIf successful, returns a `201 Created` status code and a JSON object with:\n\n- `status` (string): Initially set to `\"pending\"`.\n- `createdOn` (string): Timestamp of the export request creation.\n- `modifiedOn` (string): Timestamp of the last modification.\n- `expiresOn` (string): Expiration timestamp (7 days from creation).\n- `signedUrl` (string, optional): Initially `null`, populated when export is completed.\n\n## Error Responses\n\n- `404 Not Found`: If the domain is not found, or there are no water or road features created.\n- `429 Too Many Requests`: Error submitting the export job due to resource exhaustion.\n\n## Usage Notes\n\n- The export will be processed as a background job, and the status will initially be set to `\"pending\"`.\n- Check the export status using a separate endpoint to monitor progress.\n- Once the export is complete, use the `signedUrl` to download the GeoJSON file.","operationId":"create_road_feature_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"const":"geojson","type":"string","title":"Exportformat"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Road Feature"],"summary":"Get Road Feature Export","description":"# Get Road Feature Export\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/features/road/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint retrieves the details of a feature export request (for road features) for a specific domain.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format of the export. Possible value:\n - `\"geojson\"`: Export the feature data in GeoJSON format.\n\n## Response\n\nIf successful, returns a `200 OK` status code and a JSON object with:\n\n- `status` (string): Current status of the export (`\"pending\"`, `\"running\"`, `\"completed\"`, `\"failed\"`, or `\"expired\"`).\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of the last modification.\n- `expiresOn` (string): Expiration timestamp.\n- `signedUrl` (string, optional): URL to download the exported file, if status is `\"completed\"`.\n\n## Error Responses\n\n- `404 Not Found`: Export not found or no feature data exists for the specified export format.\n\n## Usage Notes\n\n- Use this endpoint to check the status of a road feature export request.\n- Once the status is `\"completed\"`, you can use the `signedUrl` to download the exported GeoJSON file.\n- The signed URL expires 7 days after creation.","operationId":"get_road_feature_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"const":"geojson","type":"string","title":"Exportformat"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/features/water":{"post":{"tags":["Water Feature"],"summary":"Create Water Feature","description":"# Create Water Feature\n\nThis endpoint creates a new water feature resource for a specific domain.\nWater feature data represents various water-related attributes (e.g.,\nlakes, rivers) that exist within the spatial context of a domain. The\nwater feature data can be sourced from different data sources (e.g., OSM)\nand can include various details about water features in the domain.\n\nOn resource creation, the water feature data is set to a status of \"pending\".\nThe data is processed in the background, and once it is available for user\naccess, the status is updated to \"completed\".\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/features/water\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for\n which you want to create the water feature.\n\n## Request Body\n\nThe request body should be a JSON object containing the following fields:\n\n- `sources` (array of strings, required): List of sources from which the\n water feature data should be collected. Currently, `\"OSM\"` is a supported source.\n- Additional fields might be included based on the source. For example,\n if the source is `\"OSM\"`, the request can specify additional parameters\n related to how the data should be fetched.\n\n## Response\n\nIf the request is successful, the endpoint will return a `201 Created` status code\nand the created water feature resource in the response body. The response body will\nbe a JSON object with the following fields:\n\n- `status` (string): The status of the water feature. Initially set to `\"pending\"`.\n- `createdOn` (string): The timestamp when the water feature was created.\n- `modifiedOn` (string): The timestamp when the water feature was last modified.\n- `checksum` (string): A unique checksum for the water feature resource.\n- `sources` (array of strings): The list of sources used to gather the water feature data.\n\n## Error Responses\n\n- `422 Unprocessable Entity`: The domain is in a local coordinate system which\n does not support water features.\n - **Detail**: \"WaterFeature is not supported for local coordinate systems.\"\n- `429 Too Many Requests`: An error occurred while running the job for processing\n the water feature data.\n - **Detail**: An error message related to job submission.\n\n## Usage Notes\n\n- Ensure that the domain ID provided in the request path is valid and that the user\n has access to the specified domain.\n- If using `\"OSM\"` as a source, additional parameters can be specified as needed.\n- The process of creating and updating the water feature data involves background\n job execution, and the endpoint will return the initial resource with a pending status.","operationId":"create_water_feature","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWaterFeatureRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaterFeature"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Water Feature"],"summary":"Get Water Feature","description":"# Get Water Feature\n\nThis endpoint retrieves the details of an existing water feature resource\nfor a specific domain. The water feature data represents various water-related\nattributes (e.g., lakes, rivers) that have been created and stored for the\ngiven domain.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/features/water\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for\n which you want to retrieve the water feature.\n\n## Response\n\nIf the request is successful, the endpoint will return a `200 OK` status code\nand the water feature resource in the response body. The response body will\nbe a JSON object with the following fields:\n\n- `status` (string): The status of the water feature.\n- `createdOn` (string): The timestamp when the water feature was created.\n- `modifiedOn` (string): The timestamp when the water feature was last modified.\n- `checksum` (string): A unique checksum for the water feature resource.\n- `sources` (array of strings): The list of sources used to gather the water feature data.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `404 Not Found`: The water feature for the specified domain does not exist or is empty.\n - **Detail**: \"water feature empty.\"\n\n## Usage Notes\n\n- Ensure that the domain ID provided in the request path is valid and that the user\n has access to the specified domain.\n- If the water feature data does not exist or is empty, a `404 Not Found` error will be raised.","operationId":"get_water_feature","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaterFeature"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Water Feature"],"summary":"Delete Water Feature","description":"# Delete Water Feature\n\nThis endpoint deletes an existing water feature resource for a specific domain.\nThis action removes the water feature data from the database and cancels any ongoing\njob execution related to the water feature.\n\n## Endpoint\n\n```\nDELETE /v1/domains/{domainId}/features/water\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to delete the water feature.\n\n## Response\n\nIf the request is successful, the endpoint will return a `204 No Content` status code.\nThis indicates that the water feature has been successfully deleted and no content is returned\nin the response body.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n - **Detail**: \"Domain not found\"\n- `404 Not Found`: The water feature for the specified domain does not exist.\n - **Detail**: \"Water feature not found\"\n\n## Usage Notes\n\n- Deleting a water feature is a permanent action and cannot be undone. Ensure that you have\n the correct domain ID before making the delete request.\n- The endpoint will also cancel any ongoing job execution related to the water feature and\n remove the associated data from the cache and cloud storage.","operationId":"delete_water_feature","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/features/water/data":{"get":{"tags":["Water Feature"],"summary":"Get Water Feature Data","description":"# Get Water Feature Data\n\nThis endpoint retrieves paginated water feature data for a specific domain.\nWater feature data represents individual water bodies and their attributes\n(e.g., lakes, rivers, streams) in GeoJSON format.\n\nThe water feature resource must be created and fully processed (status \"completed\")\nbefore data can be retrieved through this endpoint.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/features/water/data\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to retrieve water feature data.\n\n## Query Parameters\n\n- `page` (integer, optional): Zero-indexed page number. Must be greater than or equal to 0. Defaults to `0`.\n- `size` (integer, optional): Number of features to return per page. Valid range: `1` to `1000`. Defaults to `50`.\n\n## Response\n\nIf the request is successful, the endpoint will return a `200 OK` status code and a GeoJSON FeatureCollection\nwith pagination metadata. The response body will contain:\n\n- `type` (string): Always \"FeatureCollection\".\n- `features` (array): Array of GeoJSON Feature objects representing individual water bodies.\n- `currentPage` (integer): The current page number returned.\n- `pageSize` (integer): The number of features per page.\n- `totalItems` (integer): The total number of water features available in the domain.\n- `crs` (object, optional): Coordinate reference system information for the domain.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist, the user does not have access to it, or no water feature resource exists for this domain.\n- `422 Unprocessable Entity`: The water feature resource does not have status 'completed', or validation failed for query parameters.\n- `401 Unauthorized`: The request lacks valid authentication credentials.\n- `403 Forbidden`: The authenticated user does not have permission to access this domain.\n\n## Usage Notes\n\n- The water feature resource must be created and have status 'completed' before data can be retrieved.\n- Use the pagination parameters to retrieve large datasets efficiently.\n- The `totalItems` field can be used to calculate the total number of pages available.","operationId":"get_water_feature_data","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"The page number to retrieve. Page number is zero-indexed.","default":0,"title":"Page"},"description":"The page number to retrieve. Page number is zero-indexed."},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"The number of resources to retrieve per page.","default":50,"title":"Size"},"description":"The number of resources to retrieve per page."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureDataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/features/water/exports/{exportFormat}":{"post":{"tags":["Water Feature"],"summary":"Create Water Feature Export","description":"# Create Water Feature Export\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/features/water/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint initiates the creation of an export file for the water feature data of a specific domain, in the specified format.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format in which to export the water feature data. Possible value:\n - `\"geojson\"`: Export the feature data in GeoJSON format.\n\n## Response\n\nIf successful, returns a `201 Created` status code and a JSON object with:\n\n- `status` (string): Initially set to `\"pending\"`.\n- `createdOn` (string): Timestamp of the export request creation.\n- `modifiedOn` (string): Timestamp of the last modification.\n- `expiresOn` (string): Expiration timestamp (7 days from creation).\n- `signedUrl` (string, optional): Initially `null`, populated when export is completed.\n\n## Error Responses\n\n- `404 Not Found`: If the domain is not found, or there are no water or water features created.\n- `429 Too Many Requests`: Error submitting the export job due to resource exhaustion.\n\n## Usage Notes\n\n- The export will be processed as a background job, and the status will initially be set to `\"pending\"`.\n- Check the export status using a separate endpoint to monitor progress.\n- Once the export is complete, use the `signedUrl` to download the GeoJSON file.","operationId":"create_water_feature_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"const":"geojson","type":"string","title":"Exportformat"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Water Feature"],"summary":"Get Water Feature Export","description":"# Get Water Feature Export\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/features/water/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint retrieves the details of a feature export request (for water features) for a specific domain.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format of the export. Possible value:\n - `\"geojson\"`: Export the feature data in GeoJSON format.\n\n## Response\n\nIf successful, returns a `200 OK` status code and a JSON object with:\n\n- `status` (string): Current status of the export (`\"pending\"`, `\"running\"`, `\"completed\"`, `\"failed\"`, or `\"expired\"`).\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of the last modification.\n- `expiresOn` (string): Expiration timestamp.\n- `signedUrl` (string, optional): URL to download the exported file, if status is `\"completed\"`.\n\n## Error Responses\n\n- `404 Not Found`: Export not found or no feature data exists for the specified export format.\n\n## Usage Notes\n\n- Use this endpoint to check the status of a water feature export request.\n- Once the status is `\"completed\"`, you can use the `signedUrl` to download the exported GeoJSON file.\n- The signed URL expires 7 days after creation.","operationId":"get_water_feature_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"const":"geojson","type":"string","title":"Exportformat"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/inventories":{"get":{"tags":["Inventories"],"summary":"Get Inventories","description":"# Get Inventories Endpoint\n\nThis endpoint retrieves the inventories resource associated with a domain\nbelonging to the user based on the provided domain ID.\n\nAn inventories resource is a container for the various types of inventory\ndata that can exist with the spatial context of the domain. Currently,\nonly tree inventories are supported, though other forms of inventory will\nbe added soon.\n\n## Endpoint: `GET /v1/domains/{domainId}/inventories`\n\n### Path Parameters\n\nTo retrieve the inventories of a domain, the following path parameter is required:\n\n- **domainId**: (string) The unique identifier of the domain belonging to the user whose inventories are to be retrieved.\n\n### Response\n\nThe response returns the members of the specified inventories resource\nfollowing the Inventories schema.\n\n- **tree**: (TreeInventory)\n\n\n### Example Request\n\n```http\nGET /v1/domains/1e7d8d3c9f8b4c3ba9e7c3b4f8d7a9c1/inventories\n```\n\n### Error Responses\n\n- **404 Not Found**: The specified domain does not exist or the user does not have access to it.\n - **Detail**: \"Domain not found.\"\n- **500 Internal Server Error**: An error occurred while retrieving the inventory resources.\n - **Detail**: \"An error occurred while getting the inventory resources.\"","operationId":"get_inventories","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Inventories"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/inventories/tree":{"post":{"tags":["Tree Inventory"],"summary":"Create Tree Inventory","description":"# Create Tree Inventory\n\nThis endpoint creates a new tree inventory resource for a specific domain. Tree Inventory data represents a complete forest inventory that exists within the spatial context of a domain. The tree inventory data can be generated using various data products and models that provide either national coverage (e.g., TreeMap) or local coverage.\n\nOn resource creation, the tree inventory data is set to a status of \"pending\". The tree inventory data is generated in the background using the specified method (e.g., TreeMap). Once the tree inventory data is generated and available for user access, the status is updated to \"completed\".\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/inventories/tree\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for\n which you want to create the tree inventory.\n\n## Request Body\n\nThe request body should be a JSON object containing the following fields:\n\n- `sources` (array of strings, required): List of data sources to be used for building the tree inventory. Currently, only one data source at a time is supported. Possible values are:\n - `\"TreeMap\"`: Indicates that the tree inventory should be created using the TreeMap raster product. This approach generates a tree inventory with national coverage.\n - `\"file\"`: Indicates that you will upload a file via a signed url. Please see File Source Configuration for more info.\n - `\"pointcloud\"`: Indicates that the tree inventory should be created from the domain's ALS point cloud resource. This resource must exist and be in a \"completed\" state.\n\n- `modifications` (array of objects, optional): List of modifications to apply to the tree inventory data. Maximum 1000 modifications allowed. See the Modifications section below for details.\n\n- `treatments` (array of objects, optional): List of silvicultural treatments to apply to the tree inventory. Maximum 1000 treatments allowed. See the Treatments section below for details.\n\n- `featureMasks` (array of strings, optional): List of Features to mask tree inventory data. Referenced features must exist and be completed before creating the tree inventory.\n\n### TreeMap Source Configuration\n\nIf `\"TreeMap\"` is included in the `sources`, the request body can include additional configurations for `TreeMap`:\n\n- `TreeMap` (object, optional): Advanced configurations for the TreeMap data source.\n - `version` (string, optional): The version of TreeMap to use. Default is `\"2022\"`. Possible values are:\n - `\"2014\"`: Use the 2014 version of TreeMap.\n - `\"2016\"`: Use the 2016 version of TreeMap.\n - `\"2020\"`: Use the 2020 version of TreeMap.\n - `\"2022\"`: Use the 2022 version of TreeMap.\n - `seed` (integer, optional): The random seed to use for generating the tree inventory. If not provided, a random seed will be generated.\n - `canopyHeightMapConfiguration` (object, optional): Canopy height map configuration for TreeMap data source. If provided, the canopy height map will be used to segment and impute the coarse 30m TreeMap data with high-resolution canopy height data. Details of this approach will be provided in an upcoming publication. Please contact support.fastfuels@silvxlabs.com for more information.\n - `source` (string, required): The source of the canopy height map data. Possible values are:\n - `\"Meta2024\"`: Use the Meta2024 canopy height map data. More information about this data source can be found here: https://www.sciencedirect.com/science/article/pii/S003442572300439X\n\n### File Source Configuration\nGenerate Signed URL for Tree Inventory Upload\n\nIf the source is `\"file\"`, this endpoint generates a signed URL that allows users to upload a CSV file representing the tree inventory data.\nThe signed URL is valid for 1 hour and has a maximum upload size of 500 MB.\n\nThe full work flow consists of the following steps:\n1. Call this endpoint to get a signed URL\n2. Perform a put request to send your file to the signed url. Here is a python example:\n\n```[python]\nwith open(\"your_file_goes_here.csv\", \"rb\") as file:\n upload_response = requests.put(\n signed_url_response[\"file\"][\"url\"],\n data=file,\n headers=signed_url_response[\"file\"][\"headers\"],\n )\n```\n**Note**: the signed_url_response has a field named \"file\" with the relevant info for the put request.\n\n3. Your file will be validated and processed in the background\n4. The status of your upload can be retrieved via and inventory get() request\n\n#### Required Columns\n\nThe CSV file must include the following columns with their specified data types and constraints:\n\n1. **SPCD** (Integer)\n - FIA species code\n - Must be an integer\n - Represents standard FIA species classifications\n\n2. **STATUSCD** (Integer)\n - Tree status code\n - Must be one of these values:\n - 0: No status\n - 1: Live\n - 2: Dead\n - 3: Missing\n\n3. **DIA** (Float)\n - Diameter at breast height (DBH)\n - Unit: centimeters (cm)\n - Range: 0 to 1200 cm\n - Measured at 1.37 meters above ground\n\n4. **HT** (Float)\n - Tree height\n - Unit: meters (m)\n - Range: 0 to 116 meters\n - Measured from ground to tree top\n\n5. **CR** (Float)\n - Crown ratio\n - Unit: ratio (dimensionless)\n - Range: 0 to 1\n - Represents the ratio of crown length to total tree height\n\n6. **X** (Float)\n - X coordinate in projected coordinate system\n - Unit: meters (m)\n - Range: Must fall within domain bounds (west to east)\n - Required: Yes\n - Used for spatial positioning\n\n7. **Y** (Float)\n - Y coordinate in projected coordinate system\n - Unit: meters (m)\n - Range: Must fall within domain bounds (south to north)\n - Required: Yes\n - Used for spatial positioning\n\n### Point Cloud Source Configuration\n\nIf `\"pointcloud\"` is included in the `sources`, the endpoint will:\n1. Verify that a completed ALS point cloud resource exists for the domain.\n2. Perform a spatial check to ensure the domain's bounding box intersects with the operational area of the tree generation model.\n3. If validation passes, it will schedule a background job (`treecondenser`) to generate the tree inventory from the point cloud data.\n### Modifications\n\nThe `modifications` field allows you to filter and adjust tree inventory data before it's finalized. Modifications are applied sequentially in the order they appear in the array, and each modification consists of:\n\n1. **Conditions**: Criteria for selecting which trees to modify (AND logic)\n2. **Actions**: Operations to perform on selected trees\n\n#### Modification Structure\n\n```json\n{\n \"conditions\": [\n {/* condition 1 */},\n {/* condition 2 */}\n ],\n \"actions\": [\n {/* action 1 */},\n {/* action 2 */}\n ]\n}\n```\n\nAll conditions must be true (AND logic) for a tree to be selected. Actions are then applied to all selected trees.\n\n#### Condition Types\n\n**1. Simple Field Conditions**\n\nFilter trees based on individual field values:\n\n- **Available Fields**: `HT` (height), `DIA` (diameter), `CR` (crown ratio), `SPCD` (species code)\n- **Operators**: `eq` (equals), `ne` (not equals), `gt` (greater than), `lt` (less than), `ge` (greater than or equal), `le` (less than or equal)\n\n**Example**: Select trees taller than 20 meters\n```json\n{\n \"attribute\": \"HT\",\n \"operator\": \"gt\",\n \"value\": 20\n}\n```\n\n**2. Expression-Based Conditions**\n\nFilter trees based on arithmetic expressions combining multiple fields. This enables complex filtering logic in a single API call, replacing download-modify-upload workflows.\n\n- **Available Fields**: `HT`, `DIA`, `CR`\n- **Operators**: `+`, `-`, `*`, `/`, `()`\n- **Comparison Operators**: Same as simple conditions (`eq`, `ne`, `gt`, `lt`, `ge`, `le`)\n\n**Example**: Select trees where crown length (HT × CR) is less than 1 meter\n```json\n{\n \"attribute\": \"expression\",\n \"expression\": \"HT * CR\",\n \"operator\": \"lt\",\n \"value\": 1.0\n}\n```\n\n**Common Expression Use Cases:**\n\n- **Crown length**: `HT * CR` (vertical extent of crown)\n- **Crown base height**: `HT * (1 - CR)` (height where crown begins)\n- **Height-to-diameter ratio**: `HT / DIA` (slenderness ratio)\n- **Average metrics**: `(HT + DIA) / 2`\n\n**Security Notes:**\n- Only arithmetic operations permitted\n- No function calls, imports, or code execution\n- Validated at API level for safety\n\n**Multiple Conditions:**\n\nCombine multiple conditions with AND logic:\n```json\n{\n \"conditions\": [\n {\n \"attribute\": \"expression\",\n \"expression\": \"HT * CR\",\n \"operator\": \"gt\",\n \"value\": 5.0\n },\n {\n \"attribute\": \"SPCD\",\n \"operator\": \"eq\",\n \"value\": 202\n }\n ],\n \"actions\": [...]\n}\n```\nThis selects Douglas-fir trees (SPCD=202) with crown length > 5m.\n\n#### Action Types\n\n**1. Modify Field Values**\n\nAdjust tree attributes for selected trees:\n\n- **Available Fields**: `HT`, `DIA`, `CR`, `SPCD`\n- **Modifiers**:\n - `multiply`: Multiply by value\n - `divide`: Divide by value\n - `add`: Add value\n - `subtract`: Subtract value\n - `replace`: Replace with value\n\n**Example**: Reduce height of tall trees by 10%\n```json\n{\n \"attribute\": \"HT\",\n \"modifier\": \"multiply\",\n \"value\": 0.9\n}\n```\n\n**Value Constraints**: Modifications automatically enforce valid ranges:\n- `HT` ≥ 0 (height cannot be negative)\n- `DIA` ≥ 0 (diameter cannot be negative)\n- `CR`: 0 ≤ CR ≤ 1 (crown ratio must be between 0 and 1)\n\n**2. Remove Trees**\n\nRemove selected trees from the inventory.\n\n**New simplified syntax** (recommended):\n```json\n{\n \"modifier\": \"remove\"\n}\n```\n\n**Legacy syntax** (still supported):\n```json\n{\n \"attribute\": \"all\",\n \"modifier\": \"remove\"\n}\n```\n\nBoth syntaxes produce identical results and are fully backwards compatible.\n\n**Important**: Remove action must be the only action in the actions array. Multiple actions cannot be combined with remove.\n\n#### Complete Modification Examples\n\n**Example 1: Remove trees with short crowns**\n\nReplace pandas workflow:\n```python\n# Old workflow: download CSV, filter in pandas\ndf = df[df['HT'] * df['CR'] >= 1]\n# ...then re-upload\n```\n\nWith single API call:\n```json\n{\n \"modifications\": [\n {\n \"conditions\": [\n {\n \"attribute\": \"expression\",\n \"expression\": \"HT * CR\",\n \"operator\": \"lt\",\n \"value\": 1.0\n }\n ],\n \"actions\": [\n {\"modifier\": \"remove\"}\n ]\n }\n ]\n}\n```\n\n**Example 2: Remove unrealistic trees**\n\nRemove trees with abnormal height-to-diameter ratio:\n```json\n{\n \"modifications\": [\n {\n \"conditions\": [\n {\n \"attribute\": \"expression\",\n \"expression\": \"HT / DIA\",\n \"operator\": \"gt\",\n \"value\": 100.0\n }\n ],\n \"actions\": [\n {\"modifier\": \"remove\"}\n ]\n }\n ]\n}\n```\n\n**Example 3: Modify and filter**\n\nReduce height of tall trees, then remove small diameter trees:\n```json\n{\n \"modifications\": [\n {\n \"conditions\": [\n {\"attribute\": \"HT\", \"operator\": \"gt\", \"value\": 30}\n ],\n \"actions\": [\n {\"attribute\": \"HT\", \"modifier\": \"multiply\", \"value\": 0.9}\n ]\n },\n {\n \"conditions\": [\n {\"attribute\": \"DIA\", \"operator\": \"lt\", \"value\": 10}\n ],\n \"actions\": [\n {\"modifier\": \"remove\"}\n ]\n }\n ]\n}\n```\n\n**Processing Order:**\n1. Modifications are applied before treatments\n2. Modifications within the array are applied sequentially\n3. All conditions must be true (AND logic) for trees to be selected\n4. Actions are applied to all selected trees\n\n### Treatments\n\nThe `treatments` field is an array of treatment objects. Each treatment object represents a silvicultural treatment to be applied to the tree inventory. Currently, there are two types of treatment types available:\n\n1. Proportional Thinning\n2. Directional Thinning\n\n#### Proportional Thinning\n\n- `method`: \"proportionalThinning\" (string, required)\n- `targetMetric`: \"basalArea\" (string, required)\n- `targetValue`: float (required)\n - Unit: square meters per hectare (m²/ha)\n - Represents the target basal area after thinning\n\n#### Directional Thinning\n\n- `method`: \"directionalThinning\" (string, required)\n- `direction`: (string, required)\n - Possible values: \"below\" or \"above\"\n - Indicates whether to thin from below (smallest to largest) or above (largest to smallest)\n- `targetMetric`: (string, required)\n - Possible values: \"diameter\" or \"basalArea\"\n- `targetValue`: float (required)\n - Units of the targetValue quantity depends on the targetMetric:\n - For \"diameter\": centimeters (cm)\n - For \"basalArea\": square meters per hectare (m²/ha)\n - Represents the threshold for thinning (diameter) or the target basal area after thinning\n\nNote: The order of treatments in the array determines the sequence in which they will be applied to the tree inventory.\n\n## Response\n\nIf the request is successful, the endpoint will return a `201 Created` status code and the created tree inventory resource in the response body. The response body will be a JSON object with the following fields:\n\n- `status` (string): The status of the tree inventory. Will be set to `\"pending\"` initially.\n- `createdOn` (string): The timestamp when the tree inventory was created.\n- `modifiedOn` (string): The timestamp when the tree inventory was last modified.\n- `checksum` (string): A unique checksum for the tree inventory resource.\n\n## Error Responses\n\n- `404 Not Found`: If the specified domain does not exist or the user does not have access to it.\n- `422 Unprocessable Entity`: If `TreeMap` is specified as a source for a domain with a \"local\" coordinate system.\n- `422 Unprocessable Entity`: If `featureMasks` are provided but the required features resource is not in a \"completed\" state.\n- `422 Unprocessable Entity`: If `pointcloud` is specified as a source but the domain's 'als' pointcloud resource is not in a \"completed\" state.\n- `422 Unprocessable Entity`: If `pointcloud` is specified and the domain is outside the model's operational area.\n- `422 Unprocessable Entity`: If an unexpected error occurs during the point cloud spatial bound check.\n- `500 Internal Server Error`: If the point cloud model configuration is missing required data (e.g., spatial bounds).\n- `503 Service Unavailable`: If the background job service (e.g., StandGen or TreeCondenser) is temporarily unavailable or exhausted.","operationId":"create_tree_inventory","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTreeInventoryRequest"},"examples":{"treemap_defaults":{"value":{"sources":["TreeMap"]},"summary":"TreeMap example with defaults","description":"This example creates a tree inventory using data from the TreeMap raster product. In this example, the user only provides 'TreeMap' as an element in the 'sources' list. The 'TreeMap' source is then populated with default values for the 'version' and 'seed' fields."},"treemap_advanced":{"value":{"sources":["TreeMap"],"TreeMap":{"version":"2022","seed":123456789}},"summary":"TreeMap example with advanced options","description":"This example creates a tree inventory using data from the TreeMap raster product. In this example, the user provides 'TreeMap' as an element in the 'sources' list. The 'TreeMap' source is then populated with the specified 'version' and 'seed' values."},"treemap_with_meta_canopy_height_model_configuration":{"value":{"sources":["TreeMap"],"TreeMap":{"version":"2022","seed":123456789,"canopyHeightMapConfiguration":{"source":"Meta2024"}}},"summary":"TreeMap example with canopy height map configuration","description":"Shows how to use TreeMap data product with a imputation and segmentation from a high resolution canopy height map."},"treemap_with_feature_masks":{"value":{"sources":["TreeMap"],"featureMasks":["road","water"]},"summary":"TreeMap example with feature masks","description":"This example creates a tree inventory using data from the TreeMap raster product. In this example, the user provides 'TreeMap' as an element in the 'sources' list. The 'TreeMap' source is then populated with default values for the 'version' and 'seed' fields. The 'featureMasks' list is also provided with 'road' and 'water' elements to mask out these features from the inventory."},"file_upload":{"value":{"sources":["file"]},"summary":"File upload","description":"Upload custom tree inventory data via CSV file.\n\nThis initiates a two-step upload process:\n1. The API returns a signed URL with required headers\n2. Upload your CSV file using a PUT request to the signed URL\n\nRequired CSV columns:\n- SPCD (Integer): FIA species code\n- STATUSCD (Integer): Tree status code (0=alive, 1=dead, 2=cut, 3=removed)\n- DIA (Float): Diameter at breast height in centimeters (0-1200)\n- HT (Float): Tree height in meters (0-116)\n- CR (Float): Crown ratio as a decimal (0-1)\n- X (Float): X coordinate in meters (within domain bounds)\n- Y (Float): Y coordinate in meters (within domain bounds)\n\nMaximum file size: 500 MB"},"treemap_ht_modification":{"value":{"sources":["TreeMap"],"modifications":[{"conditions":{"attribute":"HT","operator":"gt","value":20},"actions":{"attribute":"HT","modifier":"multiply","value":0.9}}]},"summary":"TreeMap height modification example","description":"This example creates a tree inventory using data from the TreeMap raster product. It applies a modification to reduce the height of all trees taller than 20 meters by 10%."},"treemap_dia_modification":{"value":{"sources":["TreeMap"],"modifications":[{"conditions":{"attribute":"DIA","operator":"lt","value":20.32},"actions":{"attribute":"all","modifier":"remove"}}]},"summary":"TreeMap remove trees modification example","description":"This example creates a tree inventory using data from the TreeMap raster product. It applies a modification to remove all trees with a diameter at breast height less than 20.32cm (8 inches)."},"treemap_remove_short_crown":{"value":{"sources":["TreeMap"],"modifications":[{"conditions":[{"attribute":"expression","expression":"HT * CR","operator":"lt","value":1.0}],"actions":[{"modifier":"remove"}]}]},"summary":"Remove trees with crown length < 1m using expression","description":"Remove trees where crown length (CL = HT * CR) is less than 1 meter.\n\nThis example demonstrates:\n- Expression-based conditions that combine multiple fields\n- Simplified remove action syntax (no 'attribute' field required)\n- Single API call replaces download-modify-upload workflow\n\nCrown Length (CL) represents the vertical extent of the tree crown, computed as height times crown ratio.\n\nEquivalent pandas operation: df = df[df['HT'] * df['CR'] >= 1]"},"treemap_remove_high_slenderness":{"value":{"sources":["TreeMap"],"modifications":[{"conditions":[{"attribute":"expression","expression":"HT / DIA","operator":"gt","value":100.0}],"actions":[{"modifier":"remove"}]}]},"summary":"Remove trees with height/diameter ratio > 100","description":"Remove trees where the height-to-diameter ratio exceeds 100.\n\nThis filters out unrealistically thin trees that may be data artifacts. The expression 'HT / DIA' computes the slenderness ratio for each tree.\n\nExample: A tree with HT=20m and DIA=0.15cm would have a ratio of 133, and would be removed."},"treemap_complex_expression_filtering":{"value":{"sources":["TreeMap"],"modifications":[{"conditions":[{"attribute":"expression","expression":"HT * CR","operator":"gt","value":2.0},{"attribute":"expression","expression":"HT / DIA","operator":"lt","value":80.0}],"actions":[{"modifier":"remove"}]}]},"summary":"Complex filtering with multiple expressions","description":"Remove trees matching multiple expression-based criteria (AND logic).\n\nRemoves trees where:\n- Crown length (HT * CR) > 2 meters AND\n- Height/diameter ratio (HT / DIA) < 80\n\nAll conditions must be true for a tree to be removed. This demonstrates combining multiple computed metrics for sophisticated filtering."},"treemap_mixed_conditions":{"value":{"sources":["TreeMap"],"modifications":[{"conditions":[{"attribute":"expression","expression":"HT * (1 - CR)","operator":"lt","value":5.0},{"attribute":"SPCD","operator":"eq","value":202}],"actions":[{"modifier":"remove"}]}]},"summary":"Mixed expression and field conditions","description":"Remove Douglas-fir trees with low crown base height.\n\nConditions (all must be true):\n- Crown base height (HT * (1 - CR)) < 5 meters\n- Species code (SPCD) equals 202 (Douglas-fir)\n\nCrown base height represents the height at which the tree crown begins. This example demonstrates combining expression-based filtering with traditional field filtering."},"treemap_remove_simplified_syntax":{"value":{"sources":["TreeMap"],"modifications":[{"conditions":[{"attribute":"DIA","operator":"lt","value":20.32}],"actions":[{"modifier":"remove"}]}]},"summary":"Remove trees with simplified syntax","description":"Remove trees with diameter less than 20.32cm using simplified remove syntax.\n\nNew simplified syntax: {\"modifier\": \"remove\"}\nLegacy syntax (still works): {\"attribute\": \"all\", \"modifier\": \"remove\"}\n\nBoth syntaxes produce identical results and are fully backwards compatible."},"treemap_proportional_thinning":{"value":{"sources":["TreeMap"],"treatments":[{"method":"proportionalThinning","targetMetric":"basalArea","targetValue":25}]},"summary":"TreeMap proportional thinning example","description":"This example creates a tree inventory using data from the TreeMap raster product. It applies a silvicultural treatment to thin the forest to 25 square meters of basal area per hectare."},"treemap_directional_thinning":{"value":{"sources":["TreeMap"],"treatments":[{"method":"directionalThinning","direction":"below","targetMetric":"diameter","targetValue":30.48}]},"summary":"TreeMap directional thinning example","description":"This example creates a tree inventory using data from the TreeMap raster product. It applies a silvicultural treatment to remove from below all trees with a diameter at breast height less than 30.48cm (12 inches)."},"pointcloud_default":{"value":{"sources":["pointcloud"]},"summary":"Point cloud example","description":"Create a tree inventory from a point cloud source utilizing GDAM."}}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreeInventory"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Tree Inventory"],"summary":"Get Tree Inventory","description":"# Get Tree Inventory\n\nThis endpoint retrieves the details of an existing tree inventory\nresource for a specific domain. Users can access the status and metadata\nof the tree inventory that has been created.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/inventories/tree\n```\n\n### Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to retrieve the tree inventory.\n\n### Response\n\nIf the request is successful, the endpoint will return a `200 OK` status code and the tree inventory resource in the response body. The response body will be a JSON object with the following fields:\n\n- `status` (string): The status of the tree inventory. Possible values are \"pending\", \"running\", \"completed\", and \"failed\".\n- `createdOn` (string): The timestamp when the tree inventory was created.\n- `modifiedOn` (string): The timestamp when the tree inventory was last modified.\n- `checksum` (string): A unique checksum for the tree inventory resource.\n- `treeInventory` (object): The tree inventory data, as provided in the request body when the tree inventory was created.\n\n### Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n - **Detail**: \"Domain not found\"\n- `404 Not Found`: The tree inventory for the specified domain does not exist.\n - **Detail**: \"Tree inventory not created\"","operationId":"get_tree_inventory","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreeInventory"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Tree Inventory"],"summary":"Delete Tree Inventory","description":"# Delete Tree Inventory\n\nThis endpoint deletes an existing tree inventory resource for a specific\ndomain. This action removes the tree inventory data from the database and\ncancels any ongoing job execution related to the tree inventory.\n\n## Endpoint\n\n```\nDELETE /v1/domains/{domainId}/inventories/tree\n```\n\n### Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to delete the tree inventory.\n\n### Response\n\nIf the request is successful, the endpoint will return a `204 No Content` status code. This indicates that the tree inventory has been successfully deleted and no content is returned in the response body.\n\n### Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n - **Detail**: \"Domain not found\"\n\n### Usage Notes\n\n- Deleting a tree inventory is a permanent action and cannot be undone. Ensure that you have the correct domain ID before making the delete request.\n- The endpoint will also cancel any ongoing job execution related to the tree inventory and remove the associated data from the cache and cloud storage.","operationId":"delete_tree_inventory","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/inventories/tree/exports/{exportFormat}":{"post":{"tags":["Tree Inventory"],"summary":"Create Tree Inventory Export","description":"# Create Tree Inventory Export\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/inventories/tree/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint initiates the creation of an export file for the tree inventory data of a specific domain. The data can be exported in various formats including CSV, Parquet, and GeoJSON. The export process runs in the background.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to create the tree inventory export.\n- `exportFormat` (string, required): The format in which to export the tree inventory data. Possible values are:\n - `\"csv\"`: Export the data in CSV format.\n - `\"parquet\"`: Export the data in Parquet format.\n - `\"geojson\"`: Export the data in GeoJSON format.\n\n## Response\n\nIf the request is successful, the endpoint will return a `201 Created` status code and the export request details in the response body. The response body will be a JSON object with the following fields:\n\n- `status` (string): The status of the export request. Will be set to `\"pending\"` initially.\n- `createdOn` (string): The timestamp when the export request was created.\n- `modifiedOn` (string): The timestamp when the export request was last modified.\n- `expiresOn` (string): The timestamp when the export request will expire (7 days from creation).\n- `signedUrl` (string, optional): The signed URL to download the exported file. This field will be `null` initially.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `422 Unprocessable Entity`: The export format is invalid or the request cannot be processed.\n\n## Usage Notes\n\n- Ensure that the tree inventory for the specified domain is completed before initiating an export.\n- The export request will be processed in the background. Use the GET endpoint to check the status.","operationId":"create_tree_inventory_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"enum":["csv","parquet","geojson"],"type":"string","title":"Exportformat"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Tree Inventory"],"summary":"Get Tree Inventory Export","description":"# Get Tree Inventory Export\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/inventories/tree/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint retrieves the details of a tree inventory export request for a specific domain. Users can check the status, metadata, and download URL of the export request.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to retrieve the tree inventory export.\n- `exportFormat` (string, required): The format of the export request. Possible values are:\n - `\"csv\"`: Retrieve the CSV export request details.\n - `\"parquet\"`: Retrieve the Parquet export request details.\n - `\"geojson\"`: Retrieve the GeoJSON export request details.\n\n## Response\n\nIf the request is successful, the endpoint will return a `200 OK` status code and the export request details in the response body. The response body will be a JSON object with the following fields:\n\n- `status` (string): The status of the export request. Possible values are `\"pending\"`, `\"running\"`, `\"completed\"`, `\"failed\"`, and `\"expired\"`.\n- `createdOn` (string): The timestamp when the export request was created.\n- `modifiedOn` (string): The timestamp when the export request was last modified.\n- `expiresOn` (string): The timestamp when the export request will expire.\n- `signedUrl` (string, optional): The signed URL to download the exported file. This will be `null` if the status is not `\"completed\"`.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `404 Not Found`: The specified export request does not exist.\n\n## Usage Notes\n\n- Once the export is completed, the `status` will change to `\"completed\"`, and the `signedUrl` field will be populated with a URL to download the export file.\n- The signed URL will be valid for 7 days from the creation of the export request, as indicated by the `expiresOn` field.\n- To download the exported file, make a GET request to the provided `signedUrl` once it's available.\n- If the current time is past the `expiresOn` timestamp, the `status` will change to `\"expired\"`, and the `signedUrl` will be set to `null`.\n- There is no separate download endpoint. Use the `signedUrl` provided in the export details to download the file directly.\n\n## Example Workflow\n\n1. Create an export request using the POST endpoint.\n2. Periodically check the status of the export using the GET endpoint.\n3. Once the status is `\"completed\"`, retrieve the `signedUrl` from the export details.\n4. Use the `signedUrl` to download the exported file within 7 days of the export creation.","operationId":"get_tree_inventory_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"enum":["csv","geojson","parquet"],"type":"string","title":"Exportformat"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids":{"get":{"tags":["Grids"],"summary":"Get Grids","description":"# Get Grids Endpoint\n\nThis endpoint retrieves the grids resource associated with a domain\nbelonging to the user based on the provided domain ID.\n\nA grids resource is a container for the various types of gridded\ndata that can exist with the spatial context of the domain. Currently,\ntree, surface, topography, and feature grids are supported.\n\n## Endpoint: `GET /v1/domains/{domainId}/grids`\n\n### Path Parameters\n\nTo retrieve the grids of a domain, the following path parameter is required:\n\n- **domainId**: (string) The unique identifier of a domain belonging to the user.\n### Response\n\nThe response returns the members of the specified grids resource following\nthe Grids schema.\n\n- **tree**: (TreeGrid)\n- **surface**: (SurfaceGrid)\n- **topography**: (TopographyGrid)\n- **feature**: (FeatureGrid)\n\n### Example Request\n\n```http\nGET /v1/domains/1e7d8d3c9f8b4c3ba9e7c3b4f8d7a9c1/grids\n```\n\n### Error Responses\n\n- **404 Not Found**: The specified domain does not exist or the user does not have access to it.\n - **Detail**: \"Domain not found.\"\n- **500 Internal Server Error**: An error occurred while retrieving the grid resources.\n - **Detail**: \"An error occurred while getting the grid resources.\"","operationId":"get_grids","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Grids"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/exports/{exportFormat}":{"post":{"tags":["Grids"],"summary":"Create Grid Export","description":"# Create Grid Export\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/grids/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint initiates the creation of an export file for the grid data of a specific domain to the specified format.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format in which to export the grid data. Possible values are:\n - `\"zarr\"`: Export the data in the compressed zarr format.\n - `\"QUIC-Fire\"`: Exports the grid data to the set of input files required by the QUIC-Fire model.\n\n### QUIC-Fire Format\n\nFastFuels supports grid exports directly to input files for the QUIC-Fire\nmodel. The export format is a zip file containing the following files:\n- treesrhof.dat\n- treesmoist.dat\n- treesdepth.dat\n- topo.dat\n\nThe exporter attempts to build the required files from the available grid data.\n\nThe following examples demonstrate some of the possible behavior:\n- If a \"topography\" grid is not available, the exporter will not include topo.dat in the export.\n- If the \"surface\" grid is present, but the \"tree\" grid is not, the exporter will include treesrhof.dat, treesmoist.dat, and treesdepth.dat in the export as a 2D input.\n- If the \"tree\" grid is present, but the \"surface\" grid is not, the exporter will include treesrhof.dat, treesmoist.dat, and treesdepth.dat in the export as a 3D input.\n- If both the \"surface\" and \"tree\" grids are present, the exporter will include treesrhof.dat, treesmoist.dat, and treesdepth.dat in the export as a 3D input with the surface grid as the bottom layer with respect to the z-axis.\n\n## Response\n\nIf successful, returns a `201 Created` status code and a JSON object with:\n\n- `status` (string): Initially set to `\"pending\"`.\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of last modification.\n- `expiresOn` (string): Expiration timestamp (7 days from creation).\n- `signedUrl` (string, optional): Initially `null`, populated when export is completed.\n\n## Error Responses\n\n- `404 Not Found`: Domain not found or user lacks access.\n- `422 Unprocessable Entity`: Invalid export format or request.\n- `429 Too Many Requests`: Error submitting the export job due to resource exhaustion.\n\n## Usage Notes\n\n- Ensure the grid data for the domain are completed before initiating an export.\n- Check the export status using the GET endpoint.\n- Use the `signedUrl` to download the file once available.","operationId":"create_grid_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"enum":["zarr","QUIC-Fire"],"type":"string","title":"Exportformat"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Grids"],"summary":"Get Grid Export","description":"# Get Grid Export\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint retrieves the details of a grid export request for a specific domain.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format of the export. Possible values are:\n - `\"zarr\"`: Export the data in the compressed zarr format.\n - `\"QUIC-Fire\"`: Exports the grid data to the set of input files required by the QUIC-Fire model.\n\n## Response\n\nIf successful, returns a `200 OK` status code and a JSON object with:\n\n- `status` (string): Current status of the export (`\"pending\"`, `\"running\"`, `\"completed\"`, `\"failed\"`, or `\"expired\"`).\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of last modification.\n- `expiresOn` (string): Expiration timestamp.\n- `signedUrl` (string, optional): URL to download the exported file, if status is `\"completed\"`.\n\n## Error Responses\n\n- `404 Not Found`: Domain or export request not found.\n\n## Usage Notes\n\n- Use this endpoint to check the status of an export request.\n- When status is `\"completed\"`, use the `signedUrl` to download the file.\n- The signed URL expires 7 days after creation.","operationId":"get_grid_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"enum":["zarr","QUIC-Fire"],"type":"string","title":"Exportformat"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Grids"],"summary":"Delete Grid Export","description":"# Delete Grid Export\n\n## Endpoint\n\n```\nDELETE /v1/domains/{domainId}/grids/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint deletes a grid export request and its associated files for a specific domain.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format of the export to delete. Possible values are:\n - `\"zarr\"`: Delete the export in the compressed zarr format.\n - `\"QUIC-Fire\"`: Delete the grid data exported to the set of input files required by the QUIC-Fire model.\n\n## Response\n\nIf successful, returns a `204 No Content` status code.\n\n## Error Responses\n\n- `404 Not Found`: Domain or export request not found.\n\n## Usage Notes\n\n- Use this endpoint to delete an existing grid export request and its related data.\n- The export request is removed from Firestore, and the associated files are deleted from Google Cloud Storage asynchronously.","operationId":"delete_grid_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"enum":["zarr","QUIC-Fire"],"type":"string","title":"Exportformat"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/tree":{"post":{"tags":["Tree Grid"],"summary":"Create Tree Grid","description":"# Create Tree Grid\n\nThis endpoint creates a new tree grid resource for a specific domain.\nTree grid data represents various 3D gridded tree attribute (e.g.,\nbulk density, fuel moisture, SPCD) data that exists within the spatial\ncontext of a domain. Tree grid data is typically generated to create\ninputs to 3D fire behavior models such as QUIC-Fire or FDS.\n\nOn resource creation, the tree grid data is set to a status of \"pending\".\nThe tree grid data is generated in the background using the specified\nmethod and data sources. Once the tree grid data is generated and\navailable for user access, the status is updated to \"completed\".\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/grids/tree\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for\n which you want to create the tree grid.\n\n## Request Body\n\nThe request body should be a JSON object containing the following fields:\n\n- `attributes` (array of strings, required): List of attributes to include in the tree grid data. Attributes represent the an additional dimension in the 3D gridded data. Possible values are:\n - `\"bulkDensity\"`\n - `\"fuelMoisture\"`\n - `\"SPCD\"`\n\n### Attribute Descriptions and Sources\n\n- `bulkDensity` (kg/m³): The mass of the tree fuel per unit volume of the occupied cell.\n- `foliarMoisture` (%): Live foliar moisture content of the occupied cell.\n- `SPCD` (unitless): The FIA species code of the occupied cell.\n- `SAVR` (m²/m³): The surface area to volume ratio of fuel particles in the occupied cell.\n\nEach attribute can be sourced from different data sources. By default, the system will use pre-defined data sources to acquire data for the specified attributes. However, if you want to specify additional information for how to acquire an attribute, you can provide detailed instructions in the request body.\n\nTo specify additional information for an attribute, add a field with the attribute name to the request body. For example:\n\n```json\n{\n \"attributes\": [\"bulkDensity\", \"fuelMoisture\"],\n \"bulkDensity\": {\n \"source\": \"TreeInventory\",\n \"biomassModel\": \"NSVB\"\n },\n \"fuelMoisture\": {\"source\": \"uniform\", \"value\": 175}\n}\n```\n\nIn this example, the `bulkDensity` attribute is sourced from the Tree Inventory using the NSVB biomass model, and the `fuelMoisture` attribute is set to a uniform value of 175%.\n\nThe general form of this construction is as follows:\n\n- `bulkDensity`, `fuelMoisture`, `SPCD`, `SAVR` (object, optional): The data source for the respective attribute. The structure of these objects depends on the source specified.\n\n#### Uniform Source\n\nIf the source is `\"uniform\"`, the object should have the following fields:\n\n- `value` (float, required): The uniform value for the attribute.\n\n#### Tree Inventory Source\n\nIf the source is `\"TreeInventory\"`, data will be sourced from the Tree Inventory resource.\n\n## Response\n\nIf the request is successful, the endpoint will return a `201 Created` status code and the created tree grid resource in the response body. The response body will be a JSON object with the following fields:\n\n- `status` (string): The status of the tree grid. Will be set to `\"pending\"` initially.\n- `createdOn` (string): The timestamp when the tree grid was created.\n- `modifiedOn` (string): The timestamp when the tree grid was last modified.\n- `checksum` (string): A unique checksum for the tree grid resource.\n- `attributes` (array of strings): The list of attributes included in the tree grid.\n- `bulkDensity`, `fuelMoisture`, `SPCD` (object): The data source information for the respective attribute.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `404 Not Found`: The tree inventory for the specified domain does not exist.\n- `400 Bad Request`: The tree inventory status is not \"completed\".\n- `422 Unprocessable Entity`: The request body is invalid or required fields are missing.","operationId":"create_tree_grid","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTreeGridRequest"},"examples":{"default_attributes":{"summary":"Default attributes example","value":{"attributes":["bulkDensity","fuelMoisture"]},"description":"This example creates a tree grid with the default attributes. Default configurations and data sources are used for each provided attribute."},"defaults_with_attributes":{"summary":"Default attributes with explicit fields example","value":{"attributes":["bulkDensity","fuelMoisture"],"bulkDensity":{"source":"TreeInventory"},"fuelMoisture":{"source":"uniform","value":100}},"description":"This example creates a tree grid with the default attributes. Default configurations and data sources are provided for each attribute. These additional fields are equivalent to the default values. Providing them explicitly is optional."},"uniform_fuel_moisture":{"summary":"Uniform fuel moisture example","value":{"attributes":["fuelMoisture"],"fuelMoisture":{"source":"uniform","value":175}},"description":"This example creates a tree grid with a uniform fuel moisture value of 175%."}}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreeGrid"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Tree Grid"],"summary":"Get Tree Grid","description":"# Get Tree Grid\n\nThis endpoint retrieves the details of an existing tree grid resource\nfor a specific domain. Users can access the status and metadata of the\ntree grid that has been created.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/tree\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for\n which you want to retrieve the tree grid.\n\n## Response\n\nIf the request is successful, the endpoint will return a `200 OK` status code and the tree grid resource in the response body. The response body will be a JSON object with the following fields:\n\n- `status` (string): The status of the tree grid.\n- `createdOn` (string): The timestamp when the tree grid was created.\n- `modifiedOn` (string): The timestamp when the tree grid was last modified.\n- `checksum` (string): A unique checksum for the tree grid resource.\n- `attributes` (array of strings): The list of attributes included in the tree grid.\n- `bulkDensity`, `fuelMoisture`, `SPCD` (object): The data source information for the respective attribute.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `404 Not Found`: The tree grid for the specified domain does not exist.","operationId":"get_tree_grid","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreeGrid"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Tree Grid"],"summary":"Delete Tree Grid","description":"# Delete Tree Grid\n\nThis endpoint deletes an existing tree grid resource for a specific\ndomain. This action removes the tree grid data from the database and\ncancels any ongoing job execution related to the tree grid.\n\n## Endpoint\n\n```\nDELETE /v1/domains/{domainId}/grids/tree\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to delete the tree grid.\n\n## Response\n\nIf the request is successful, the endpoint will return a `204 No Content` status code. This indicates that the tree grid has been successfully deleted and no content is returned in the response body.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `404 Not Found`: The tree grid for the specified domain does not exist.\n\n## Usage Notes\n\n- Deleting a tree grid is a permanent action and cannot be undone. Ensure that you have the correct domain ID before making the delete request.\n- The endpoint will also cancel any ongoing job execution related to the tree grid and remove the associated data from the cache and cloud storage.","operationId":"delete_tree_grid","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/tree/attributes":{"get":{"tags":["Tree Grid"],"summary":"Get Tree Grid Attribute Metadata","description":"# Get Tree Grid Attribute Metadata\n\nRetrieves metadata about the structure of the tree grid and its attributes for a given domain.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/tree/attributes\n```\n\n## Path Parameters\n\n- `domainId` (string, required): Unique identifier of the domain.\n\n## Response\n\n### Success Response (200 OK)\n\nReturns a JSON response containing:\n\n- `shape`: Dimensions of the grid data.\n- `dimensions`: Names of each dimension.\n- `chunks`: Number of chunks in each dimension.\n- `chunkShape`: Shape of each chunk.\n- `attributes`: Detailed information about each available attribute.\n\n### Error Responses\n\n- 404 Not Found: Tree grid not found or not accessible.\n- 422 Unprocessable Entity: Tree grid not in 'completed' status.","operationId":"Get Tree Grid Attribute Metadata","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GridAttributeMetadataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/tree/exports/{exportFormat}":{"post":{"tags":["Tree Grid"],"summary":"Create Tree Grid Export","description":"# Create Tree Grid Export\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/grids/tree/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint initiates the creation of an export file for the tree grid data of a specific domain in the zarr compressed format. The export process runs in the background.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format for the export. Currently, only `\"zarr\"` is supported.\n\n## Response\n\nIf successful, returns a `201 Created` status code and a JSON object with:\n\n- `status` (string): Initially set to `\"pending\"`.\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of last modification.\n- `expiresOn` (string): Expiration timestamp (7 days from creation).\n\n## Error Responses\n\n- `404 Not Found`: Domain not found or user lacks access.\n- `422 Unprocessable Entity`: Invalid export format or request.\n- `429 Too Many Requests`: Error submitting the export job due to resource exhaustion.\n\n## Usage Notes\n\n- Ensure the tree grid for the domain is completed before initiating an export.\n- Check the export status using the GET endpoint.","operationId":"create_tree_grid_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"const":"zarr","type":"string","title":"Exportformat"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Tree Grid"],"summary":"Get Tree Grid Export","description":"# Get Tree Grid Export\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/tree/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint retrieves the details of a tree grid export request for a specific domain.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format of the export. Currently, only `\"zarr\"` is supported.\n\n## Response\n\nIf successful, returns a `200 OK` status code and a JSON object with:\n\n- `status` (string): Current status of the export (`\"pending\"`, `\"running\"`, `\"completed\"`, `\"failed\"`, or `\"expired\"`).\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of last modification.\n- `expiresOn` (string): Expiration timestamp.\n- `signedUrl` (string, optional): URL to download the exported file, if status is `\"completed\"`.\n\n## Error Responses\n\n- `404 Not Found`: Domain or export request not found.\n\n## Usage Notes\n\n- Use this endpoint to check the status of an export request.\n- When status is `\"completed\"`, use the `signedUrl` to download the file.\n- The signed URL expires 7 days after creation.","operationId":"get_tree_grid_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"const":"zarr","type":"string","title":"Exportformat"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/surface":{"post":{"tags":["Surface Grid"],"summary":"Create Surface Grid","description":"# Create Surface Grid\n\nCreates a new surface grid containing fuel attributes for a domain. Surface fuels are represented through five key attributes: fuel load, fuel depth, fuel moisture, surface area-to-volume ratio (SAVR), and fire behavior fuel models (FBFM).\n\n## Path Parameters\n- `domainId` (string, required): Domain identifier\n\n## Request Body Structure\n\n### Required Fields\n\n- `attributes` (array[string]): One or more surface fuel attributes to include:\n - `fuelLoad`: Fuel loading per unit area (kg/m²)\n - `fuelDepth`: Depth of fuel bed above surface (m)\n - `fuelMoisture`: Mass of water per unit mass of dry fuel (%)\n - `SAVR`: Surface area-to-volume ratio (m²/m³)\n - `FBFM`: Fire behavior fuel model classification\n\n### Data Sources\n\nEach attribute requires a data source. Available sources vary by attribute:\n\n#### 1. LANDFIRE Source (`source: \"LANDFIRE\"`)\nAvailable for: fuelLoad, fuelDepth, SAVR, FBFM\n\nBase configuration:\n- `product`: \"FBFM40\" (Scott & Burgan 40 Fuel Models), \"FBFM13\" (Anderson 13 Fuel Models), or \"FCCS\" (Fuel Characteristic Classification System)\n- `version`: \"2022\" (FBFM40/FBFM13) or \"2023\" (FCCS)\n- `interpolationMethod`: \"nearest\", \"linear\", \"cubic\", or \"zipper\"\n- `featureMasks`: Array of feature types to mask (optional)\n- `removeNonBurnable`: Array of non-burnable codes to replace (FBFM40 only)\n\nFuel Load:\n- Without groups: Computes total dead fuel load (1hr + 10hr + 100hr + dead herbaceous + dead woody)\n- With groups: Values for specific size classes:\n - `oneHour`: 1-hour dead fuels + dead herbaceous + dead woody\n - `tenHour`: 10-hour dead fuels\n - `hundredHour`: 100-hour dead fuels\n - `liveHerbaceous`: Live herbaceous fuels\n - `liveWoody`: Live woody fuels\n- Additional fields:\n - `curingLiveHerbaceous`: 0-1\n - `curingLiveWoody`: 0-1\n\nSAVR:\n- Without groups: Computes weighted average SAVR of dead fuels\n- With groups: Values for specific size classes:\n - `oneHour`: 1-hour dead fuels\n - `tenHour`: 10-hour dead fuels\n - `hundredHour`: 100-hour dead fuels\n - `liveHerbaceous`: Live herbaceous fuels\n - `liveWoody`: Live woody fuels\n\nFuel Depth:\n- Groups field is ignored - returns single fuel bed depth value\n\nFor FCCS product (Fuel Characteristic Classification System):\n\nFuel Load:\n- Supports `oneHour`, `tenHour`, and `hundredHour` groups only\n- No curing parameters needed (no curingLiveHerbaceous or curingLiveWoody fields)\n- No live fuel groups (liveHerbaceous, liveWoody)\n- Returns: Dead fuel loads (1hr, 10hr, 100hr) from FCCS lookup table\n\nFuel Depth:\n- Groups field is ignored - returns single fuel bed depth value from FCCS lookup table\n\nSAVR:\n- Not supported for FCCS product\n\n#### 2. Uniform Value Source (`source: \"uniform\"`)\nAvailable for: all attributes\n\nConfiguration:\n- `value`: Single numeric value applied across entire grid\n- `featureMasks`: Array of feature types to mask (optional)\n\n#### 3. Uniform By Size Class Source (`source: \"uniformBySizeClass\"`)\nAvailable for: fuelMoisture only\n\nConfiguration:\n- `groups` (required): Array of size classes to include. Values must be a subset of:\n - `oneHour`: 1-hour dead fuels\n - `tenHour`: 10-hour dead fuels\n - `hundredHour`: 100-hour dead fuels\n - `liveHerbaceous`: Live herbaceous fuels\n - `liveWoody`: Live woody fuels\n- Must provide corresponding value for each specified group:\n - `oneHour`: Value for 1-hour fuels (if in groups)\n - `tenHour`: Value for 10-hour fuels (if in groups)\n - `hundredHour`: Value for 100-hour fuels (if in groups)\n - `liveHerbaceous`: Value for live herbaceous fuels (if in groups)\n - `liveWoody`: Value for live woody fuels (if in groups)\n- `featureMasks`: Array of feature types to mask (optional)\n\n### Feature Enhancement Options\n\n#### Feature Masks (`featureMasks`)\n- Overlays high-resolution features from OpenStreetMap\n- Available features: \"road\", \"water\", \"building\"\n- Applies to any attribute source type\n\n#### Non-Burnable Replacement (`removeNonBurnable`)\n- Removes specified LANDFIRE non-burnable classes\n- Available codes:\n - \"NB1\": Urban/developed\n - \"NB2\": Snow/ice\n - \"NB3\": Agricultural\n - \"NB8\": Water\n - \"NB9\": Bare ground\n- Replaced using majority filter of surrounding burnable fuels\n- Only available for LANDFIRE sources\n\n### Modifications\nOptional list of modifications to apply to computed values. Each modification consists of conditions and actions.\n\n#### Attribute Conditions\nCheck attribute values before applying modifications:\n```python\n{\n \"attribute\": string, # Must be in attributes array\n \"operator\": string, # \"eq\", \"ne\", \"gt\", \"lt\", \"ge\", \"le\"\n \"value\": any # Target value\n}\n```\n\n#### Spatial Conditions\nTarget cells based on geographic location:\n```python\n{\n \"operator\": string, # \"within\", \"outside\", or \"intersects\"\n \"target\": string, # \"centroid\" (default) or \"cell\"\n \"geometry\": { # GeoJSON Polygon or MultiPolygon\n \"type\": \"Polygon\",\n \"coordinates\": [[[lon, lat], ...]]\n },\n \"crs\": { # Optional, defaults to domain CRS\n \"type\": \"name\",\n \"properties\": {\"name\": \"EPSG:4326\"}\n }\n}\n```\n\nSpatial operators:\n- `within`: Select cells inside the geometry\n- `outside`: Select cells outside the geometry\n- `intersects`: Select cells that overlap with the geometry\n\nTarget options:\n- `centroid`: Test cell center point (default)\n- `cell`: Test entire cell bounds\n\n#### Actions\nModify attribute values when conditions are met:\n```python\n{\n \"attribute\": string, # Must be in attributes array\n \"modifier\": string, # \"multiply\", \"divide\", \"add\", \"subtract\", \"replace\"\n \"value\": any # Modification value\n}\n```\n\n#### Example: Spatial Modification\n```python\nmodifications: [\n {\n \"conditions\": [\n {\n \"operator\": \"within\",\n \"geometry\": {\n \"type\": \"Polygon\",\n \"coordinates\": [[[-120.5, 39.0], [-120.5, 39.5], [-120.0, 39.5], [-120.0, 39.0], [-120.5, 39.0]]]\n }\n }\n ],\n \"actions\": [\n {\"attribute\": \"fuelLoad\", \"modifier\": \"multiply\", \"value\": 2.0}\n ]\n }\n]\n```\n\n#### Example: Combined Spatial and Attribute Conditions\n```python\nmodifications: [\n {\n \"conditions\": [\n {\n \"operator\": \"within\",\n \"geometry\": {\"type\": \"Polygon\", \"coordinates\": [...]}\n },\n {\n \"attribute\": \"FBFM\",\n \"operator\": \"eq\",\n \"value\": \"GR1\"\n }\n ],\n \"actions\": [\n {\"attribute\": \"fuelLoad\", \"modifier\": \"multiply\", \"value\": 1.5}\n ]\n }\n]\n```\n\n## Response\nReturns SurfaceGrid object containing:\n- Request body fields\n- `status`: Job status\n- `createdOn`: Creation timestamp\n- `modifiedOn`: Last modified timestamp\n- `checksum`: Resource checksum\n\n## Errors\n- 404: Domain not found\n- 422: Invalid request or incompatible data sources\n- 429: Too many requests","operationId":"create_surface_grid","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSurfaceGridRequest"},"examples":{"basic":{"value":{"attributes":["fuelLoad","fuelDepth","fuelMoisture"]},"summary":"Basic surface grid request","description":"Creates a surface grid with three attributes using default configurations. The API will automatically use appropriate data sources and settings for each attribute."},"detailed_defaults":{"value":{"attributes":["fuelLoad","fuelDepth","fuelMoisture"],"fuelLoad":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"nearest","curingLiveHerbaceous":0.25,"curingLiveWoody":0.25,"groups":["oneHour","tenHour","hundredHour","liveHerbaceous","liveWoody"]},"fuelDepth":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"nearest"},"fuelMoisture":{"source":"uniform","value":15}},"summary":"Detailed configuration example","description":"Shows explicit configuration of each attribute, demonstrating the default values that would be used automatically in the basic example."},"zipper_interpolation":{"value":{"attributes":["fuelLoad","fuelDepth","FBFM"],"fuelLoad":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"zipper"},"fuelDepth":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"zipper"},"FBFM":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"zipper"}},"summary":"Zipper interpolation example","description":"Demonstrates using the zipper interpolation method for smoother transitions between different fuel types at boundaries."},"feature_masks":{"value":{"attributes":["fuelLoad","fuelDepth","fuelMoisture"],"fuelLoad":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"linear","featureMasks":["road","water"],"removeNonBurnable":["NB1","NB8"]},"fuelDepth":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"linear","featureMasks":["road","water"],"removeNonBurnable":["NB1","NB8"]},"fuelMoisture":{"source":"uniform","value":15,"featureMasks":["road","water"]}},"summary":"Feature masks example","description":"Shows how to replace non-burnable fuel models with burnable models and apply a high resolution feature mask to remove fuels from roads and water bodies"},"fuel_model_modification":{"value":{"attributes":["FBFM","fuelLoad","fuelDepth"],"FBFM":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"nearest"},"fuelLoad":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"nearest","curingLiveHerbaceous":0.25,"curingLiveWoody":0.25},"fuelDepth":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"nearest"},"modifications":[{"conditions":[{"attribute":"FBFM","operator":"eq","value":"GR1"}],"actions":[{"attribute":"FBFM","modifier":"replace","value":"GR2"}]}]},"summary":"Fuel model modification example","description":"Shows how to modify specific fuel models, in this case replacing GR1 with GR2 wherever it occurs."},"size_class_moisture":{"value":{"attributes":["fuelMoisture"],"fuelMoisture":{"source":"uniformBySizeClass","oneHour":0.15,"tenHour":0.2,"hundredHour":0.25,"groups":["oneHour","tenHour","hundredHour"]}},"summary":"Size class moisture example","description":"Demonstrates setting moisture values only for specific size classes."},"fuel_load_groups":{"value":{"attributes":["fuelLoad"],"fuelLoad":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"nearest","curingLiveHerbaceous":0.25,"curingLiveWoody":0.25,"groups":["oneHour","tenHour","hundredHour"]}},"summary":"Size class groups for fuel load","description":"Shows how to request fuel load data for specific size class groups. This example retrieves dead fuel loading for 1-hour, 10-hour, and 100-hour fuels."},"savr_groups":{"value":{"attributes":["SAVR"],"SAVR":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"nearest","groups":["oneHour","tenHour","hundredHour"]}},"summary":"Size class groups for surface area to volume ratio","description":"Shows how to request SAVR data for specific size class groups. This example retrieves SAVR values for live herbaceous and live woody fuels."},"combined_size_classes":{"value":{"attributes":["fuelLoad","fuelMoisture","SAVR"],"fuelLoad":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"nearest","curingLiveHerbaceous":0.25,"curingLiveWoody":0.25,"groups":["oneHour"]},"fuelMoisture":{"source":"uniformBySizeClass","oneHour":0.15,"tenHour":0.2,"hundredHour":0.25,"groups":["oneHour"]},"SAVR":{"source":"LANDFIRE","product":"FBFM40","version":"2022","interpolationMethod":"nearest","groups":["oneHour"]}},"summary":"Combined size class configurations","description":"Demonstrates how to combine multiple attributes with consistent size class groups. This example focuses on 1-hour and live herbaceous fuels across fuel load, moisture, and SAVR attributes."},"fccs_basic":{"value":{"attributes":["fuelLoad","fuelDepth"],"fuelLoad":{"source":"LANDFIRE","product":"FCCS","version":"2023","interpolationMethod":"nearest","groups":["oneHour","tenHour","hundredHour"]},"fuelDepth":{"source":"LANDFIRE","product":"FCCS","version":"2023","interpolationMethod":"nearest"},"fuelMoisture":{"source":"uniformBySizeClass","oneHour":0.15,"tenHour":0.2,"hundredHour":0.25,"groups":["oneHour"]}},"summary":"Basic FCCS example","description":"FCCS (Fuel Characteristic Classification System) with LANDFIRE 2023 data. Supports 1-hour, 10-hour, and 100-hour timelag fuels (no live fuels)."},"spatial_modification_basic":{"value":{"attributes":["fuelLoad"],"modifications":[{"conditions":[{"operator":"within","geometry":{"type":"Polygon","coordinates":[[[-120.5,39.0],[-120.5,39.5],[-120.0,39.5],[-120.0,39.0],[-120.5,39.0]]]}}],"actions":[{"attribute":"fuelLoad","modifier":"multiply","value":2.0}]}]},"summary":"Spatial modification - within polygon","description":"Doubles fuel load for all cells within the specified polygon. Uses the default 'centroid' target, meaning cells are selected if their center point falls within the geometry."},"spatial_modification_outside":{"value":{"attributes":["fuelLoad"],"modifications":[{"conditions":[{"operator":"outside","target":"centroid","geometry":{"type":"Polygon","coordinates":[[[-120.5,39.0],[-120.5,39.5],[-120.0,39.5],[-120.0,39.0],[-120.5,39.0]]]}}],"actions":[{"attribute":"fuelLoad","modifier":"multiply","value":0.5}]}]},"summary":"Spatial modification - outside polygon","description":"Reduces fuel load by 50% for all cells outside the specified polygon. Useful for protecting specific areas while modifying the surrounding region."},"spatial_modification_combined":{"value":{"attributes":["fuelLoad","FBFM"],"modifications":[{"conditions":[{"operator":"within","geometry":{"type":"Polygon","coordinates":[[[-120.5,39.0],[-120.5,39.5],[-120.0,39.5],[-120.0,39.0],[-120.5,39.0]]]}},{"attribute":"FBFM","operator":"eq","value":"GR1"}],"actions":[{"attribute":"fuelLoad","modifier":"multiply","value":1.5}]}]},"summary":"Combined spatial and attribute conditions","description":"Increases fuel load by 50% for cells that are both within the polygon AND have FBFM fuel model GR1. Demonstrates combining spatial and attribute-based conditions."},"spatial_modification_with_crs":{"value":{"attributes":["fuelLoad"],"modifications":[{"conditions":[{"operator":"intersects","target":"cell","geometry":{"type":"Polygon","coordinates":[[[500000,4300000],[500000,4310000],[510000,4310000],[510000,4300000],[500000,4300000]]]},"crs":{"type":"name","properties":{"name":"EPSG:32610"}}}],"actions":[{"attribute":"fuelLoad","modifier":"replace","value":0.5}]}]},"summary":"Spatial modification with projected CRS","description":"Sets fuel load to 0.5 kg/m^2 for cells that intersect the polygon defined in UTM Zone 10N (EPSG:32610). Uses 'cell' target for intersection testing and demonstrates explicit CRS specification."}}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurfaceGrid"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Surface Grid"],"summary":"Get Surface Grid","description":"# Get Surface Grid\n\nThis endpoint retrieves the details of an existing surface grid resource\nfor a specific domain. Users can access the status and metadata of the\nsurface grid that has been created.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/surface\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for\n which you want to retrieve the surface grid.\n\n## Response\n\nIf the request is successful, the endpoint will return a `200 OK` status code and the surface grid resource in the response body. The response body will be a JSON object with the following fields:\n\n- `status` (string): The status of the surface grid.\n- `createdOn` (string): The timestamp when the surface grid was created.\n- `modifiedOn` (string): The timestamp when the surface grid was last modified.\n- `checksum` (string): A unique checksum for the surface grid resource.\n- `attributes` (array of strings): The list of attributes included in the surface grid.\n- `fuelLoad`, `fuelDepth`, `fuelMoisture`, `SAVR`, `FBFM` (object): The data source information for the respective attribute.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `404 Not Found`: The surface grid for the specified domain does not exist.","operationId":"get_surface_grid","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurfaceGrid"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Surface Grid"],"summary":"Delete Surface Grid","description":"# Delete Surface Grid\n\nThis endpoint deletes an existing surface grid resource for a specific\ndomain. This action removes the surface grid data from the database and\ncancels any ongoing job execution related to the surface grid.\n\n## Endpoint\n\n```\nDELETE /v1/domains/{domainId}/grids/surface\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to delete the surface grid.\n\n## Response\n\nIf the request is successful, the endpoint will return a `204 No Content` status code. This indicates that the surface grid has been successfully deleted and no content is returned in the response body.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `404 Not Found`: The surface grid for the specified domain does not exist.\n\n## Usage Notes\n\n- Deleting a surface grid is a permanent action and cannot be undone. Ensure that you have the correct domain ID before making the delete request.\n- The endpoint will also cancel any ongoing job execution related to the surface grid and remove the associated data from the cache and cloud storage.","operationId":"delete_surface_grid","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/surface/attributes":{"get":{"tags":["Surface Grid"],"summary":"Get Surface Grid Attribute Metadata","description":"# Get Surface Grid Attribute Metadata\n\nRetrieves metadata about the structure of the surface grid and its attributes for a given domain.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/surface/attributes\n```\n\n## Path Parameters\n\n- `domainId` (string, required): Unique identifier of the domain.\n\n## Response\n\n### Success Response (200 OK)\n\nReturns a JSON response containing:\n\n- `shape`: Dimensions of the grid data.\n- `dimensions`: Names of each dimension.\n- `chunks`: Number of chunks in each dimension.\n- `chunkShape`: Shape of each chunk.\n- `attributes`: Detailed information about each available attribute.\n\n### Error Responses\n\n- 404 Not Found: Surface grid not found or not accessible.\n- 422 Unprocessable Entity: Surface grid not in 'completed' status.","operationId":"Get Surface Grid Attribute Metadata","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GridAttributeMetadataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/surface/exports/{exportFormat}":{"post":{"tags":["Surface Grid"],"summary":"Create Surface Grid Export","description":"# Create Surface Grid Export\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/grids/surface/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint initiates the creation of an export file for the surface grid data of a specific domain in the zarr compressed format. The export process runs in the background.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format for the export. Currently, the supported formats are `\"zarr\"` and `\"geotiff\"`.\n\n## Response\n\nIf successful, returns a `201 Created` status code and a JSON object with:\n\n- `status` (string): Initially set to `\"pending\"`.\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of last modification.\n- `expiresOn` (string): Expiration timestamp (7 days from creation).\n\n## Error Responses\n\n- `404 Not Found`: Domain not found or user lacks access.\n- `422 Unprocessable Entity`: Invalid export format or request.\n- `429 Too Many Requests`: Error submitting the export job due to resource exhaustion.\n\n## Usage Notes\n\n- Ensure the surface grid for the domain is completed before initiating an export.\n- Check the export status using the GET endpoint.","operationId":"create_surface_grid_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"enum":["zarr","geotiff"],"type":"string","title":"Exportformat"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Surface Grid"],"summary":"Get Surface Grid Export","description":"# Get Surface Grid Export\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/surface/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint retrieves the details of a surface grid export request for a specific domain.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format of the export. Currently, supported formats are `\"zarr\"` and `\"geotiff\"`.\n\n## Response\n\nIf successful, returns a `200 OK` status code and a JSON object with:\n\n- `status` (string): Current status of the export (`\"pending\"`, `\"running\"`, `\"completed\"`, `\"failed\"`, or `\"expired\"`).\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of last modification.\n- `expiresOn` (string): Expiration timestamp.\n- `signedUrl` (string, optional): URL to download the exported file, if status is `\"completed\"`.\n\n## Error Responses\n\n- `404 Not Found`: Domain or export request not found.\n\n## Usage Notes\n\n- Use this endpoint to check the status of an export request.\n- When status is `\"completed\"`, use the `signedUrl` to download the file.\n- The signed URL expires 7 days after creation.","operationId":"get_surface_grid_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"enum":["zarr","geotiff"],"type":"string","title":"Exportformat"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/topography":{"post":{"tags":["Topography Grid"],"summary":"Create Topography Grid","description":"# Create Topography Grid\n\nThis endpoint creates a new topography grid resource for a specific domain.\nTopography grid data represents various topographic attributes (elevation,\nslope, and aspect) that exist within the spatial context of a domain.\nThe topography grid data can be generated using different data sources\n(3DEP, LANDFIRE, or uniform values) and interpolation methods.\n\nOn resource creation, the topography grid data is set to a status of \"pending\".\nThe topography grid data is generated in the background using the specified\nmethod and data sources. Once the topography grid data is generated and\navailable for user access, the status is updated to \"completed\".\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/grids/topography\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for\n which you want to create the topography grid.\n\n## Request Body\n\nThe request body should be a JSON object containing the following fields:\n\n- `attributes` (array of strings, required): List of attributes to include in the topography grid. Possible values are:\n - `\"elevation\"`\n - `\"slope\"`\n - `\"aspect\"`\n\n### Attribute Descriptions and Sources\n\n- `elevation` (m): The elevation of the terrain above sea level.\n- `slope` (degrees): The slope of the terrain surface.\n- `aspect` (degrees): The aspect of the terrain surface (direction the slope faces).\n\nEach attribute can be sourced from different data sources. By default, the system will use 3DEP (USGS 3D Elevation Program) data for all attributes. However, if you want to specify different sources or configurations for any attribute, you can provide detailed instructions in the request body.\n\nTo specify additional information for an attribute, add a field with the attribute name to the request body. For example:\n\n```json\n{\n \"attributes\": [\"elevation\"],\n \"elevation\": {\n \"source\": \"3DEP\",\n \"interpolationMethod\": \"cubic\"\n }\n}\n```\n\nThe structure of attribute configuration objects depends on the source specified:\n\n#### 3DEP Source (Default)\n\nIf the source is `\"3DEP\"`, the object should have the following fields:\n\n- `source` (string, required): Must be `\"3DEP\"`.\n- `interpolationMethod` (string, required): The interpolation method to use. Possible values are:\n - `\"nearest\"`: Preserves exact data points without interpolation\n - `\"linear\"`: Linear interpolation between points\n - `\"cubic\"`: Smooth interpolation using cubic splines (default for elevation and slope)\n\nNote: Aspect attribute automatically uses nearest neighbor interpolation regardless of what is specified.\n\n#### LANDFIRE Source\n\nIf the source is `\"LANDFIRE\"`, the object should have the following fields:\n\n- `source` (string, required): Must be `\"LANDFIRE\"`.\n- `version` (string, required): The version of the LANDFIRE product. Currently, only `\"2020\"` is supported.\n- `interpolationMethod` (string, required): The interpolation method to use. Possible values are:\n - `\"nearest\"`: Preserves exact data points\n - `\"linear\"`: Linear interpolation\n - `\"cubic\"`: Smooth cubic interpolation\n - `\"zipper\"`: Special method for LANDFIRE data\n\nNote: Aspect attribute automatically uses nearest neighbor interpolation regardless of what is specified.\n\n#### Uniform Source\n\nIf the source is `\"uniform\"`, the object should have the following fields:\n\n- `source` (string, required): Must be `\"uniform\"`.\n- `value` (float, required): The uniform value for the attribute.\n\nNote: Uniform source is only available for the elevation attribute.\n\n## Response\n\nIf the request is successful, the endpoint will return a `201 Created` status code and the created topography grid resource in the response body. The response body will be a JSON object with the following fields:\n\n- `attributes` (array of strings): The list of attributes included in the topography grid.\n- `elevation` (object, optional): The data source configuration for elevation.\n- `slope` (object, optional): The data source configuration for slope.\n- `aspect` (object, optional): The data source configuration for aspect.\n- `status` (string): The status of the topography grid. Will be set to `\"pending\"` initially.\n- `createdOn` (string): The timestamp when the topography grid was created.\n- `modifiedOn` (string): The timestamp when the topography grid was last modified.\n- `checksum` (string): A unique checksum for the topography grid resource.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `422 Unprocessable Entity`: The request body is invalid, the data sources are not compatible with the domain CRS, or required fields are missing.\n- `429 Too Many Requests`: The system is currently unable to process additional job requests.","operationId":"create_topography_grid","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTopographyGridRequest"},"examples":{"default_attributes":{"value":{"attributes":["elevation"]},"summary":"Simple elevation request (uses 3DEP)","description":"Creates a topography grid with elevation data using the default 3DEP source. This is the simplest way to get high-quality elevation data."},"default_attributes_with_fields":{"value":{"attributes":["elevation"],"elevation":{"source":"3DEP","interpolationMethod":"cubic"}},"summary":"Default configuration (3DEP) shown explicitly","description":"Creates a topography grid using 3DEP with default settings shown explicitly. While providing these fields is unnecessary when using defaults, this example shows the actual configuration being used."},"landfire_elevation":{"value":{"attributes":["elevation"],"elevation":{"source":"LANDFIRE","version":"2020","interpolationMethod":"cubic"}},"summary":"Using LANDFIRE for elevation data","description":"Creates a topography grid using LANDFIRE elevation data instead of the default 3DEP source. LANDFIRE might be preferred when working with other LANDFIRE-sourced data for consistency."},"landfire_all":{"value":{"attributes":["elevation","slope","aspect"],"elevation":{"source":"LANDFIRE","version":"2020","interpolationMethod":"cubic"},"slope":{"source":"LANDFIRE","version":"2020","interpolationMethod":"cubic"},"aspect":{"source":"LANDFIRE","version":"2020","interpolationMethod":"nearest"}},"summary":"Using LANDFIRE for all attributes","description":"Creates a complete topography grid using LANDFIRE data for all attributes. Note that aspect uses nearest neighbor interpolation to preserve directional accuracy."},"nearest_interpolation":{"value":{"attributes":["elevation"],"elevation":{"source":"3DEP","interpolationMethod":"nearest"}},"summary":"Using nearest neighbor interpolation","description":"Creates a topography grid using nearest neighbor interpolation instead of the default cubic interpolation. This might be preferred when you want to preserve exact data points without interpolation."},"all_attributes":{"value":{"attributes":["elevation","slope","aspect"]},"summary":"All topographic attributes","description":"Creates a complete topography grid with elevation, slope, and aspect using default 3DEP source and configurations for each attribute. Note that aspect automatically uses nearest neighbor interpolation while elevation and slope use cubic interpolation."},"mixed_sources":{"value":{"attributes":["elevation","slope","aspect"],"elevation":{"source":"LANDFIRE","version":"2020","interpolationMethod":"cubic"},"slope":{"source":"3DEP","interpolationMethod":"cubic"},"aspect":{"source":"LANDFIRE","version":"2020","interpolationMethod":"nearest"}},"summary":"Mixed data sources","description":"Creates a topography grid mixing LANDFIRE and 3DEP sources. Shows how different data sources can be used for different attributes, which might be useful when optimizing for specific attribute qualities or data consistency requirements."},"uniform_elevation":{"value":{"attributes":["elevation"],"elevation":{"source":"uniform","value":1000.0}},"summary":"Uniform elevation","description":"Creates a topography grid with a uniform elevation value. This can be useful for testing or theoretical scenarios where a flat surface is desired."}}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopographyGrid"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Topography Grid"],"summary":"Get Topography Grid","description":"# Get Topography Grid\n\nThis endpoint retrieves the details of an existing topography grid resource\nfor a specific domain.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/topography\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for\n which you want to retrieve the topography grid.\n\n## Response\n\nIf the request is successful, the endpoint will return a `200 OK` status code and the topography grid resource in the response body. The response body will be a JSON object with the following fields:\n\n- `attributes` (array of strings): The list of attributes included in the topography grid (elevation, slope, and/or aspect).\n- `elevation` (object, optional): The data source configuration for elevation.\n- `slope` (object, optional): The data source configuration for slope.\n- `aspect` (object, optional): The data source configuration for aspect.\n- `status` (string): The current status of the topography grid (e.g., \"pending\", \"completed\").\n- `createdOn` (string): The timestamp when the topography grid was created.\n- `modifiedOn` (string): The timestamp when the topography grid was last modified.\n- `checksum` (string): A unique checksum for the topography grid resource.\n\nThe structure of attribute configuration objects will match what was provided during creation, with 3DEP as the default source. See the create_topography_grid endpoint documentation for details on data source configurations.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist, the user does not have access to it, or the topography grid for the specified domain does not exist.\n\n## Usage Notes\n\n- Use this endpoint to check the status and details of a previously created topography grid.\n- The response will include all the information provided during the creation of the topography grid, along with its current status and timestamps.","operationId":"get_topography_grid","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopographyGrid"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Topography Grid"],"summary":"Delete Topography Grid","description":"# Delete Topography Grid\n\nThis endpoint deletes an existing topography grid resource for a specific\ndomain. This action removes the topography grid data from the database and\ncancels any ongoing job execution related to the topography grid.\n\n## Endpoint\n\n```\nDELETE /v1/domains/{domainId}/grids/topography\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to delete the topography grid.\n\n## Response\n\nIf the request is successful, the endpoint will return a `204 No Content` status code. This indicates that the topography grid has been successfully deleted and no content is returned in the response body.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `404 Not Found`: The topography grid for the specified domain does not exist.\n\n## Usage Notes\n\n- Deleting a topography grid is a permanent action and cannot be undone. Ensure that you have the correct domain ID before making the delete request.\n- The endpoint will also cancel any ongoing job execution related to the topography grid and remove the associated data from the cache and cloud storage.","operationId":"delete_topography_grid","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/topography/attributes":{"get":{"tags":["Topography Grid"],"summary":"Get Topography Grid Attribute Metadata","description":"# Get Topography Grid Attribute Metadata\n\nThis endpoint retrieves detailed metadata about the structure of the topography grid and its attributes for a given domain. This includes information about the grid's dimensions, chunking, and available attributes with their units and descriptions.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/topography/attributes\n```\n\n## Path Parameters\n\n- `domainId` (string, required): Unique identifier of the domain.\n\n## Response\n\n### Success Response (200 OK)\n\nReturns a JSON response containing:\n\n- `shape` (array): Dimensions of the grid data [height, width].\n- `dimensions` (array): Names of each dimension [\"y\", \"x\"].\n- `chunks` (array): Number of chunks in each dimension.\n- `chunkShape` (array): Shape of each chunk [chunk_height, chunk_width].\n- `attributes` (array): Detailed information about each available attribute:\n - `name` (string): Attribute name (e.g., \"elevation\", \"slope\", \"aspect\")\n - `description` (string): Description of what the attribute represents\n - `units` (string): Units of measurement (e.g., \"m\", \"degrees\")\n\n### Error Responses\n\n- `404 Not Found`: Topography grid not found or not accessible.\n- `422 Unprocessable Entity`: Topography grid not in 'completed' status.","operationId":"Get Topography Grid Attribute Metadata","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GridAttributeMetadataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/topography/exports/{exportFormat}":{"post":{"tags":["Topography Grid"],"summary":"Create Topography Grid Export","description":"# Create Topography Grid Export\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/grids/topography/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint initiates the creation of an export file for the topography grid data of a specific domain. The export process runs in the background and can generate files in either zarr or GeoTIFF format.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format for the export. Supported values:\n - `\"zarr\"`: Zarr array format, suitable for high-performance array storage\n - `\"geotiff\"`: GeoTIFF format, suitable for GIS applications\n\n## Response\n\nIf successful, returns a `201 Created` status code and a JSON object with:\n\n- `status` (string): Initially set to `\"pending\"`.\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of last modification.\n- `expiresOn` (string): Expiration timestamp (7 days from creation).\n\n## Error Responses\n\n- `404 Not Found`: Domain not found or user lacks access.\n- `422 Unprocessable Entity`: Invalid export format or topography grid not in completed status.\n- `429 Too Many Requests`: Error submitting the export job due to resource exhaustion.\n\n## Usage Notes\n\n- Ensure the topography grid for the domain is completed before initiating an export.\n- Check the export status using the GET endpoint.","operationId":"create_topography_grid_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"enum":["zarr","geotiff"],"type":"string","title":"Exportformat"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Topography Grid"],"summary":"Get Topography Grid Export","description":"# Get Topography Grid Export\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/topography/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint retrieves the details of a topography grid export request for a specific domain.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format of the export. Currently, only `\"zarr\"` is supported.\n\n## Response\n\nIf successful, returns a `200 OK` status code and a JSON object with:\n\n- `status` (string): Current status of the export (`\"pending\"`, `\"running\"`, `\"completed\"`, `\"failed\"`, or `\"expired\"`).\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of last modification.\n- `expiresOn` (string): Expiration timestamp.\n- `signedUrl` (string, optional): URL to download the exported file, if status is `\"completed\"`.\n\n## Error Responses\n\n- `404 Not Found`: Domain or export request not found.\n\n## Usage Notes\n\n- Use this endpoint to check the status of an export request.\n- When status is `\"completed\"`, use the `signedUrl` to download the file.\n- The signed URL expires 7 days after creation.","operationId":"get_topography_grid_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"enum":["zarr","geotiff"],"type":"string","title":"Exportformat"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/feature":{"post":{"tags":["Feature Grid"],"summary":"Create Feature Grid","description":"# Create Feature Grid\n\nThis endpoint creates a new feature grid resource for a specific domain. Feature grids\nare used to represent spatial data related to various features within the domain. This\noperation generates a feature grid based on the provided configuration and data sources.\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/grids/feature\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to create the feature grid.\n\n## Request Body\n\nThe request body should be a JSON object adhering to the `CreateFeatureGridRequest` model, containing\nthe necessary configuration and data source information for generating the feature grid.\n\n## Response\n\nIf the request is successful, the endpoint will return a `201 Created` status code and the created feature grid resource in the response body. The response body will include the following fields:\n\n- `createdOn` (string): The timestamp when the feature grid was created.\n- `modifiedOn` (string): The timestamp when the feature grid was last modified.\n- `status` (string): The status of the feature grid, initially set to `\"PENDING\"`.\n- `checksum` (string): A unique checksum for the feature grid resource.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain does not exist or the user does not have access to it.\n- `429 Too Many Requests`: The system is currently overloaded, and the job could not be submitted.\n\n## Usage Notes\n\n- If an existing feature grid already exists for the domain, its associated job execution will be canceled before creating the new grid.\n- The feature grid generation is handled as a background job. The status will initially be `\"PENDING\"` and will be updated once the job completes.\n- The system will attempt to remove any cached data related to the previous feature grid.","operationId":"create_feature_grid","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFeatureGridRequest"},"examples":{"default_attributes":{"value":{"attributes":["road","water"]},"summary":"Road and Water attributes example","description":"This example creates a feature grid using both road and water feature data."}}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureGrid"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Feature Grid"],"summary":"Get Feature Grid","description":"# Get Feature Grid\n\nThis endpoint retrieves the feature grid data for a specific domain. Feature grids\nrepresent spatial data related to various features within the domain. If the feature grid\ndata has been generated and stored, it will be returned in the response.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/feature\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to retrieve the feature grid.\n\n## Response\n\nIf the feature grid data exists, the endpoint will return a `200 OK` status code and the feature grid resource in the response body. The response will be a JSON object adhering to the `FeatureGrid` model, which includes:\n\n- `createdOn` (string): The timestamp when the feature grid was created.\n- `modifiedOn` (string): The timestamp when the feature grid was last modified.\n- `status` (string): The current status of the feature grid.\n- `checksum` (string): A unique checksum for the feature grid resource.\n\n## Error Responses\n\n- `404 Not Found`: The feature grid data has not been created for the specified domain, or it cannot be retrieved.\n\n## Usage Notes\n\n- Ensure that the `domainId` provided is correct and that the user has the appropriate permissions to access the domain's data.\n- The feature grid data is retrieved from the database, and if it does not exist, a `404 Not Found` error will be returned.","operationId":"get_feature_grid","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureGrid"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Feature Grid"],"summary":"Delete Feature Grid","description":"# Delete Feature Grid\n\nThis endpoint deletes the feature grid data for a specific domain. If the feature grid exists,\nit will be removed from the database, and any associated resources, such as files in the GCS bucket,\nwill be deleted asynchronously.\n\n## Endpoint\n\n```\nDELETE /v1/domains/{domainId}/grids/feature\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to delete the feature grid.\n\n## Response\n\n- `204 No Content`: The feature grid was successfully deleted. The response body will be empty.\n\n## Error Responses\n\n- `404 Not Found`: The specified domain or feature grid does not exist or the user does not have access to it.\n\n## Usage Notes\n\n- Ensure that the `domainId` provided is correct and that the user has the appropriate permissions to delete the domain's data.\n- The feature grid data is removed from the database, and any running jobs related to the feature grid are canceled in the background.\n- The associated Zarr group in the GCS bucket is deleted asynchronously.","operationId":"delete_feature_grid","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/feature/attributes":{"get":{"tags":["Feature Grid"],"summary":"Get Feature Grid Attribute Metadata","description":"# Get Feature Grid Attribute Metadata\n\nRetrieves metadata about the structure of the feature grid and its attributes for a given domain.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/feature/attributes\n```\n\n## Path Parameters\n\n- `domainId` (string, required): Unique identifier of the domain.\n\n## Response\n\n### Success Response (200 OK)\n\nReturns a JSON response containing:\n\n- `shape`: Dimensions of the grid data.\n- `dimensions`: Names of each dimension.\n- `chunks`: Number of chunks in each dimension.\n- `chunkShape`: Shape of each chunk.\n- `attributes`: Detailed information about each available attribute.\n\n### Error Responses\n\n- 404 Not Found: Feature grid not found or not accessible.\n- 422 Unprocessable Entity: Feature grid not in 'completed' status.","operationId":"Get Feature Grid Attribute Metadata","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GridAttributeMetadataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/grids/feature/exports/{exportFormat}":{"post":{"tags":["Feature Grid"],"summary":"Create Feature Grid Export","description":"# Create Feature Grid Export\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/grids/feature/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint initiates the creation of an export file for the feature grid data of a specific domain in the zarr compressed format. The export process runs in the background.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format for the export. Currently, the supported formats are `\"zarr\"` and `\"geotiff\"`.\n\n## Response\n\nIf successful, returns a `201 Created` status code and a JSON object with:\n\n- `status` (string): Initially set to `\"pending\"`.\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of last modification.\n- `expiresOn` (string): Expiration timestamp (7 days from creation).\n\n## Error Responses\n\n- `404 Not Found`: Domain not found or user lacks access.\n- `422 Unprocessable Entity`: Invalid export format or request.\n- `429 Too Many Requests`: Error submitting the export job due to resource exhaustion.\n\n## Usage Notes\n\n- Ensure the feature grid for the domain is completed before initiating an export.\n- Check the export status using the GET endpoint.","operationId":"create_feature_grid_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"enum":["zarr","geotiff"],"type":"string","title":"Exportformat"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Feature Grid"],"summary":"Get Feature Grid Export","description":"# Get Feature Grid Export\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/grids/feature/exports/{exportFormat}\n```\n\n## Description\n\nThis endpoint retrieves the details of a feature grid export request for a specific domain.\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain.\n- `exportFormat` (string, required): The format of the export. Currently, supported formats are `\"zarr\"` and `\"geotiff\"`.\n\n## Response\n\nIf successful, returns a `200 OK` status code and a JSON object with:\n\n- `status` (string): Current status of the export (`\"pending\"`, `\"running\"`, `\"completed\"`, `\"failed\"`, or `\"expired\"`).\n- `createdOn` (string): Timestamp of export request creation.\n- `modifiedOn` (string): Timestamp of last modification.\n- `expiresOn` (string): Expiration timestamp.\n- `signedUrl` (string, optional): URL to download the exported file, if status is `\"completed\"`.\n\n## Error Responses\n\n- `404 Not Found`: Domain or export request not found.\n\n## Usage Notes\n\n- Use this endpoint to check the status of an export request.\n- When status is `\"completed\"`, use the `signedUrl` to download the file.\n- The signed URL expires 7 days after creation.","operationId":"get_feature_grid_export","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}},{"name":"exportFormat","in":"path","required":true,"schema":{"enum":["zarr","geotiff"],"type":"string","title":"Exportformat"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/pointclouds":{"get":{"tags":["Point Cloud"],"summary":"Get Pointclouds","description":"# Get Point Cloud\n\nThis endpoint retrieves the details of an existing point cloud resource for a specific domain. Users can access the status and metadata of the point cloud data associated with the domain, including information about Airborne Laser Scanning (ALS) data if available.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/pointclouds\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to retrieve the point cloud resource.\n\n## Response\n\nIf the request is successful, the endpoint will return a `200 OK` status code and the point cloud resource in the response body. The response body will be a JSON object containing:\n\n- `status` (string): The status of the point cloud resource. Possible values include \"pending\", \"running\", \"completed\", and \"failed\".\n- `createdOn` (string): The timestamp when the resource was created.\n- `modifiedOn` (string): The timestamp when the resource was last modified.\n- `checksum` (string): A unique checksum for the resource.\n- `als` (object, optional): Metadata regarding the Airborne Laser Scanning data, if uploaded.\n\n## Error Responses\n\n- `404 Not Found`: If the specified domain does not exist or the user does not have access to it.\n- `404 Not Found`: If the point cloud resource for the specified domain does not exist.","operationId":"get_pointclouds","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PointCloud"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domainId}/pointclouds/als":{"post":{"tags":["Als PointCloud"],"summary":"Create Als Point Cloud","description":"# Create ALS Point Cloud\n\nThis endpoint initiates the creation of an Airborne Laser Scanning (ALS) point cloud resource for a specified domain. ALS data provides high-resolution elevation data used for creating detailed canopy height models and tree inventories.\n\nOn creation, the resource status is set to \"pending\". The behavior of the endpoint depends on the `sources` specified in the request body: it either generates a signed URL for user upload or schedules a background job to retrieve public data (e.g., 3DEP).\n\nIf an existing ALS point cloud resource exists for this domain, any ongoing jobs associated with it are immediately canceled, and the data is overwritten.\n\n## Endpoint\n\n```\nPOST /v1/domains/{domainId}/pointclouds/als\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to create the ALS point cloud.\n\n## Request Body\n\nThe request body should be a JSON object conforming to the `AlsPointCloud` model.\n\n### Source Configuration\n\n- `sources` (array of strings, required): Determines the acquisition method.\n - **File Upload (`\"file\"`)**: If `\"file\"` is included in the list, the API prepares a signed URL for you to upload a custom `.laz` file.\n - ** PLEASE NOTE: ** There is no validation on the point cloud file at this time. If there are errors downstream, please take a second look at your source file.\n - **Automated Retrieval**: If `\"file\"` is **not** present, the system attempts to automatically retrieve or generate point cloud data via a background job (e.g., from public datasets like USGS 3DEP).\n\n### File Source Workflow\n\nIf the source is `\"file\"`, the response will include upload instructions.\n1. Call this endpoint with `\"sources\": [\"file\"]`.\n2. The response contains a `file` object with a signed URL.\n3. Perform a `PUT` request to that URL with your `.laz` file.\n\n## Response\n\nReturns a `201 Created` status code and the created resource metadata.\n\n- `status` (string): Set to `\"pending\"`.\n- `createdOn` (string): Timestamp of creation.\n- `checksum` (string): Unique identifier for the version.\n- `file` (object, optional): If source is \"file\", contains:\n - `url`: The Google Cloud Storage signed URL.\n - `headers`: Required headers for the upload (e.g., `x-goog-content-length-range`).\n - `message`: Instructions for the upload.\n- `executionName` (string, optional): If using automated retrieval, the ID of the background job.\n\n## Error Responses\n\n- `404 Not Found`: If the domain does not exist or the user lacks access.\n- `404 Not Found`: If the parent `pointclouds` resource does not exist for this domain.\n- `503 Service Unavailable`: If the background job service is temporarily unavailable or exhausted (only applicable for non-file sources).","operationId":"create_als_point_cloud","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAlsPointCloudRequest"},"examples":{"default_attributes":{"value":{"sources":["3DEP"]}}}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlsPointCloud"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Als PointCloud"],"summary":"Get Als Point Cloud","description":"# Get ALS Point Cloud\n\nThis endpoint retrieves the details of the Airborne Laser Scanning (ALS) point cloud resource for a specific domain. It provides access to the processing status, metadata, and configuration of the ALS data that has been uploaded or generated.\n\n## Endpoint\n\n```\nGET /v1/domains/{domainId}/pointclouds/als\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to retrieve the ALS point cloud data.\n\n## Response\n\nIf the request is successful, the endpoint will return a `200 OK` status code and the ALS point cloud resource in the response body. The response body will be a JSON object containing:\n\n- `status` (string): The status of the ALS resource (e.g., \"pending\", \"completed\").\n- `createdOn` (string): The timestamp when the resource was created.\n- `modifiedOn` (string): The timestamp when the resource was last modified.\n- `checksum` (string): A unique checksum for the resource.\n- `sources` (array): The list of sources used to generate the point cloud (e.g., `[\"file\"]` or `[\"3dep\"]`).\n- `file` (object, optional): Upload information if the source was a file.\n\n## Error Responses\n\n- `404 Not Found`: If the specified domain does not exist or the user does not have access to it.\n- `404 Not Found`: If the parent `pointclouds` resource does not exist for the domain.\n- `404 Not Found`: If the `als` point cloud data has not yet been created for this domain.\n- `404 Not Found`: If the stored ALS data is corrupted or cannot be parsed into the response model.","operationId":"get_als_point_cloud","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlsPointCloud"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Als PointCloud"],"summary":"Delete Als Point Cloud","description":"# Delete ALS Point Cloud\n\nThis endpoint deletes the Airborne Laser Scanning (ALS) point cloud resource for a specific domain. This is a permanent action that removes the ALS configuration and metadata from the database.\n\nIn addition to database updates, this endpoint triggers the following side effects:\n1. **Job Cancellation**: If there is an active background job (e.g., fetching 3DEP data) associated with this resource, it is immediately canceled.\n2. **Storage Cleanup**: A background task is scheduled to permanently delete all associated files (e.g., `.laz` files) from the cloud storage bucket.\n\n## Endpoint\n\n```\nDELETE /v1/domains/{domainId}/pointclouds/als\n```\n\n## Path Parameters\n\n- `domainId` (string, required): The unique identifier of the domain for which you want to delete the ALS point cloud.\n\n## Response\n\nIf the request is successful, the endpoint will return a `204 No Content` status code, indicating that the resource was successfully deleted. No response body is returned.\n\n## Error Responses\n\n- `404 Not Found`: If the specified domain does not exist or the user does not have access to it.\n- `404 Not Found`: If the parent `pointclouds` resource does not exist for the domain.","operationId":"delete_als_point_cloud","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","title":"Domainid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Access":{"type":"string","enum":["personal","application"],"title":"Access","description":"Enumerates the available access types for an API key."},"AlsPointCloud":{"properties":{"sources":{"items":{"$ref":"#/components/schemas/AlsPointCloudSource"},"type":"array","title":"Sources"},"ThreeDEP":{"anyOf":[{"$ref":"#/components/schemas/ThreeDEPSource"},{"type":"null"}]},"status":{"$ref":"#/components/schemas/JobStatus","default":"pending"},"createdOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Createdon"},"modifiedOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modifiedon"},"checksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum"},"file":{"anyOf":[{"$ref":"#/components/schemas/api__resources__pointclouds__als__schema__UploadResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/api__resources__inventories__tree__schema__ProcessingError"},{"type":"null"}],"description":"Detailed error information if processing failed, regardless of source type."}},"type":"object","required":["sources"],"title":"AlsPointCloud"},"AlsPointCloudSource":{"type":"string","enum":["3DEP","file"],"title":"AlsPointCloudSource"},"Application":{"properties":{"name":{"type":"string","title":"Name","description":"A name for the application."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"An optional description for the application."},"id":{"type":"string","title":"Id","description":"Unique identifier for the application."},"ownerId":{"type":"string","title":"Ownerid","description":"Unique identifier of the user that adimisters the application."},"createdOn":{"type":"string","format":"date-time","title":"Createdon","description":"The date and time the application was created."},"modifiedOn":{"type":"string","format":"date-time","title":"Modifiedon","description":"The date and time the application was modified."}},"type":"object","required":["name","id","ownerId"],"title":"Application","description":"Represents an application that can access the FastFuels API on behalf of non-FastFuels users."},"CreateAlsPointCloudRequest":{"properties":{"sources":{"items":{"$ref":"#/components/schemas/AlsPointCloudSource"},"type":"array","maxItems":1,"minItems":1,"title":"Sources","description":"List of sources of als point cloud. Currently '3DEP' or 'file'"},"ThreeDEP":{"anyOf":[{"$ref":"#/components/schemas/ThreeDEPSource"},{"type":"null"}]}},"type":"object","required":["sources"],"title":"CreateAlsPointCloudRequest"},"CreateApplicationRequest":{"properties":{"name":{"type":"string","title":"Name","description":"A name for the application."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"An optional description for the application."}},"type":"object","required":["name"],"title":"CreateApplicationRequest","description":"Request body for creating a new application."},"CreateDomainRequest":{"oneOf":[{"$ref":"#/components/schemas/CreateDomainRequestFeature"},{"$ref":"#/components/schemas/CreateDomainRequestFeatureCollection"}],"title":"CreateDomainRequest","discriminator":{"propertyName":"type","mapping":{"Feature":"#/components/schemas/CreateDomainRequestFeature","FeatureCollection":"#/components/schemas/CreateDomainRequestFeatureCollection"}}},"CreateDomainRequestFeature":{"properties":{"type":{"type":"string","const":"Feature","title":"Type","default":"Feature"},"geometry":{"oneOf":[{"$ref":"#/components/schemas/Point"},{"$ref":"#/components/schemas/MultiPoint"},{"$ref":"#/components/schemas/LineString"},{"$ref":"#/components/schemas/MultiLineString"},{"$ref":"#/components/schemas/Polygon"},{"$ref":"#/components/schemas/MultiPolygon"}],"title":"Geometry","discriminator":{"propertyName":"type","mapping":{"LineString":"#/components/schemas/LineString","MultiLineString":"#/components/schemas/MultiLineString","MultiPoint":"#/components/schemas/MultiPoint","MultiPolygon":"#/components/schemas/MultiPolygon","Point":"#/components/schemas/Point","Polygon":"#/components/schemas/Polygon"}}},"properties":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Properties"},"name":{"type":"string","title":"Name","description":"The name of the domain.","default":""},"description":{"type":"string","title":"Description","description":"A brief description of the domain.","default":""},"horizontalResolution":{"type":"number","title":"Horizontalresolution","description":"The horizontal resolution in meters of a regular grid representation of the domain.","default":2.0},"verticalResolution":{"type":"number","title":"Verticalresolution","description":"The vertical resolution in meters of a regular grid representation of the domain.","default":1.0},"crs":{"$ref":"#/components/schemas/GeoJsonCRS","description":"The GeoJSON specification formatted coordinate reference system (CRS) of the domain."},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"A list of tags associated with the domain.","default":[]}},"type":"object","required":["geometry"],"title":"CreateDomainRequestFeature"},"CreateDomainRequestFeatureCollection":{"properties":{"type":{"type":"string","const":"FeatureCollection","title":"Type","default":"FeatureCollection"},"features":{"items":{"$ref":"#/components/schemas/GeoJSONFeature"},"type":"array","minItems":1,"title":"Features"},"name":{"type":"string","title":"Name","description":"The name of the domain.","default":""},"description":{"type":"string","title":"Description","description":"A brief description of the domain.","default":""},"horizontalResolution":{"type":"number","title":"Horizontalresolution","description":"The horizontal resolution in meters of a regular grid representation of the domain.","default":2.0},"verticalResolution":{"type":"number","title":"Verticalresolution","description":"The vertical resolution in meters of a regular grid representation of the domain.","default":1.0},"crs":{"$ref":"#/components/schemas/GeoJsonCRS","description":"The GeoJSON specification formatted coordinate reference system (CRS) of the domain."},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"A list of tags associated with the domain.","default":[]}},"type":"object","required":["features"],"title":"CreateDomainRequestFeatureCollection"},"CreateFeatureGridRequest":{"properties":{"attributes":{"items":{"$ref":"#/components/schemas/FeatureGridAttribute"},"type":"array","title":"Attributes","description":"List of feature types to rasterize."}},"type":"object","required":["attributes"],"title":"CreateFeatureGridRequest"},"CreateKeyRequest":{"properties":{"name":{"type":"string","title":"Name","description":"A name to semantically identify the key."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"An optional description of the keys purpose."},"validDays":{"type":"integer","title":"Validdays","description":"Number of days for which this key will be valid.","default":30},"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"type":"array","title":"Scopes","description":"A list of scopes available to the key.","default":["read"]},"access":{"$ref":"#/components/schemas/Access","description":"Access type for the API key","default":"personal"},"applicationId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Applicationid","description":"Application ID accessed by the API key"}},"type":"object","required":["name"],"title":"CreateKeyRequest","description":"Request body for creating an API key resource"},"CreateRoadFeatureRequest":{"properties":{"sources":{"items":{"$ref":"#/components/schemas/RoadFeatureSource"},"type":"array","title":"Sources","description":"List of sources of road features"},"geojson":{"anyOf":[{"$ref":"#/components/schemas/GeoJSONFeature"},{"$ref":"#/components/schemas/GeoJSONFeatureCollection"},{"type":"null"}],"title":"Geojson","description":"GeoJSON input when source is geojson. Must contain Polygon or MultiPolygon geometries."}},"type":"object","required":["sources"],"title":"CreateRoadFeatureRequest","description":"Request model for creating road features with validation."},"CreateSurfaceGridRequest":{"properties":{"attributes":{"items":{"$ref":"#/components/schemas/SurfaceGridAttribute"},"type":"array","minItems":1,"title":"Attributes","description":"List of attributes to include in the surface grid"},"fuelLoad":{"anyOf":[{"$ref":"#/components/schemas/SurfaceGridLandfireFBFM40FuelLoadSource"},{"$ref":"#/components/schemas/SurfaceGridLandfireFCCSFuelLoadSource"},{"$ref":"#/components/schemas/SurfaceGridUniformValue"},{"type":"null"}],"title":"Fuelload"},"fuelDepth":{"anyOf":[{"$ref":"#/components/schemas/SurfaceGridLandfireFBFM40Source"},{"$ref":"#/components/schemas/SurfaceGridLandfireFCCSSource"},{"$ref":"#/components/schemas/SurfaceGridUniformValue"},{"type":"null"}],"title":"Fueldepth"},"fuelMoisture":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/SurfaceGridUniformValue"},{"$ref":"#/components/schemas/SurfaceGridUniformValueBySizeClass"}],"title":"SurfaceGridFuelMoistureSource","discriminator":{"propertyName":"source","mapping":{"uniform":"#/components/schemas/SurfaceGridUniformValue","uniformBySizeClass":"#/components/schemas/SurfaceGridUniformValueBySizeClass"}}},{"type":"null"}],"title":"Fuelmoisture"},"SAVR":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/SurfaceGridLandfireFBFM40SAVRSource"},{"$ref":"#/components/schemas/SurfaceGridUniformValue"}],"title":"SurfaceGridSAVRSource","discriminator":{"propertyName":"source","mapping":{"LANDFIRE":"#/components/schemas/SurfaceGridLandfireFBFM40SAVRSource","uniform":"#/components/schemas/SurfaceGridUniformValue"}}},{"type":"null"}],"title":"Savr"},"FBFM":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/SurfaceGridLandfireFBFM40Source"},{"$ref":"#/components/schemas/SurfaceGridUniformFBFM40Value"}],"title":"SurfaceGridFBFMSource","discriminator":{"propertyName":"source","mapping":{"LANDFIRE":"#/components/schemas/SurfaceGridLandfireFBFM40Source","uniform":"#/components/schemas/SurfaceGridUniformFBFM40Value"}}},{"type":"null"}],"title":"Fbfm"},"modifications":{"items":{"$ref":"#/components/schemas/SurfaceGridModification"},"type":"array","maxItems":1000,"title":"ListSurfaceGridModifications","description":"List of modifications to apply to the surface grid","default":[]}},"type":"object","required":["attributes"],"title":"CreateSurfaceGridRequest"},"CreateTopographyGridRequest":{"properties":{"attributes":{"items":{"$ref":"#/components/schemas/TopographyGridAttribute"},"type":"array","title":"Attributes","description":"List of attributes to include in the surface grid"},"elevation":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/TopographyGrid3DEPSource"},{"$ref":"#/components/schemas/TopographyGridLandfireSource"},{"$ref":"#/components/schemas/TopographyGridUniformValue"}],"title":"TopographyGridElevationSource","discriminator":{"propertyName":"source","mapping":{"3DEP":"#/components/schemas/TopographyGrid3DEPSource","LANDFIRE":"#/components/schemas/TopographyGridLandfireSource","uniform":"#/components/schemas/TopographyGridUniformValue"}}},{"type":"null"}],"title":"Elevation"},"aspect":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/TopographyGrid3DEPSourceAspect"},{"$ref":"#/components/schemas/TopographyGridLandfireSourceAspect"}],"title":"TopographyGridAspectSource","discriminator":{"propertyName":"source","mapping":{"3DEP":"#/components/schemas/TopographyGrid3DEPSourceAspect","LANDFIRE":"#/components/schemas/TopographyGridLandfireSourceAspect"}}},{"type":"null"}],"title":"Aspect"},"slope":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/TopographyGrid3DEPSource"},{"$ref":"#/components/schemas/TopographyGridLandfireSource"}],"title":"TopographyGridSlopeSource","discriminator":{"propertyName":"source","mapping":{"3DEP":"#/components/schemas/TopographyGrid3DEPSource","LANDFIRE":"#/components/schemas/TopographyGridLandfireSource"}}},{"type":"null"}],"title":"Slope"}},"type":"object","required":["attributes"],"title":"CreateTopographyGridRequest"},"CreateTreeGridRequest":{"properties":{"attributes":{"items":{"$ref":"#/components/schemas/TreeGridAttribute"},"type":"array","title":"Attributes","description":"List of attributes to include in the tree grid. Each attribute is a separate layer in the grid. Attributes present in the list will be assigned default values unless an additional field is provided.","default":["bulkDensity","fuelMoisture"]},"bulkDensity":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/TreeGridInventorySource"},{"$ref":"#/components/schemas/TreeGridUniformValue"}],"title":"TreeGridBulkDensitySource","discriminator":{"propertyName":"source","mapping":{"TreeInventory":"#/components/schemas/TreeGridInventorySource","uniform":"#/components/schemas/TreeGridUniformValue"}}},{"type":"null"}],"title":"Bulkdensity"},"fuelMoisture":{"anyOf":[{"$ref":"#/components/schemas/TreeGridUniformValue"},{"type":"null"}]},"SPCD":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/TreeGridInventorySource"},{"$ref":"#/components/schemas/TreeGridUniformValue"}],"title":"TreeGridSPCDSource","discriminator":{"propertyName":"source","mapping":{"TreeInventory":"#/components/schemas/TreeGridInventorySource","uniform":"#/components/schemas/TreeGridUniformValue"}}},{"type":"null"}],"title":"Spcd"},"SAVR":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/TreeGridInventorySource"},{"$ref":"#/components/schemas/TreeGridUniformValue"}],"title":"TreeGridSAVRSource","discriminator":{"propertyName":"source","mapping":{"TreeInventory":"#/components/schemas/TreeGridInventorySource","uniform":"#/components/schemas/TreeGridUniformValue"}}},{"type":"null"}],"title":"Savr"}},"type":"object","title":"CreateTreeGridRequest","description":"The request used to create a tree grid."},"CreateTreeInventoryRequest":{"properties":{"sources":{"items":{"$ref":"#/components/schemas/TreeInventorySource"},"type":"array","maxItems":1,"minItems":1,"title":"Sources","description":"The data sources used to build the tree inventory. Currently, only one data source at a time is supported."},"TreeMap":{"anyOf":[{"$ref":"#/components/schemas/TreeMapSource"},{"type":"null"}]},"modifications":{"items":{"$ref":"#/components/schemas/TreeInventoryModification"},"type":"array","maxItems":1000,"title":"ListTreeInventoryModifications","description":"List of modifications to apply to the tree inventory data","default":[]},"treatments":{"items":{"oneOf":[{"$ref":"#/components/schemas/TreeInventoryTreatmentDirectionalThinning"},{"$ref":"#/components/schemas/TreeInventoryTreatmentProportionalThinning"}],"title":"TreeInventoryTreatment","description":"A treatment to apply to the tree inventory data","discriminator":{"propertyName":"method","mapping":{"directionalThinning":"#/components/schemas/TreeInventoryTreatmentDirectionalThinning","proportionalThinning":"#/components/schemas/TreeInventoryTreatmentProportionalThinning"}}},"type":"array","maxItems":1000,"title":"ListTreeInventoryTreatments","description":"List of silvicultural treatments to apply.","default":[]},"featureMasks":{"items":{"$ref":"#/components/schemas/FeatureType"},"type":"array","title":"Featuremasks","description":"List of Features to mask tree inventory data. This has the effect of removing trees that intersect with the feature.","default":[]}},"type":"object","required":["sources"],"title":"CreateTreeInventoryRequest"},"CreateWaterFeatureRequest":{"properties":{"sources":{"items":{"$ref":"#/components/schemas/WaterFeatureSource"},"type":"array","title":"Sources","description":"List of sources of road features"}},"type":"object","required":["sources"],"title":"CreateWaterFeatureRequest"},"Domain":{"properties":{"type":{"type":"string","const":"FeatureCollection","title":"Type","default":"FeatureCollection"},"features":{"items":{"$ref":"#/components/schemas/GeoJSONFeature"},"type":"array","minItems":1,"title":"Features"},"name":{"type":"string","title":"Name","description":"The name of the domain.","default":""},"description":{"type":"string","title":"Description","description":"A brief description of the domain.","default":""},"horizontalResolution":{"type":"number","title":"Horizontalresolution","description":"The horizontal resolution in meters of a regular grid representation of the domain.","default":2.0},"verticalResolution":{"type":"number","title":"Verticalresolution","description":"The vertical resolution in meters of a regular grid representation of the domain.","default":1.0},"crs":{"$ref":"#/components/schemas/GeoJsonCRS","description":"The GeoJSON specification formatted coordinate reference system (CRS) of the domain."},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"A list of tags associated with the domain.","default":[]},"id":{"type":"string","title":"Id","description":"A unique identifier for the domain."},"createdOn":{"type":"string","format":"date-time","title":"Createdon","description":"The date and time the domain was created."},"modifiedOn":{"type":"string","format":"date-time","title":"Modifiedon","description":"The date and time the domain was last modified."}},"type":"object","required":["features","createdOn","modifiedOn"],"title":"Domain","description":"Represents a domain resource."},"DomainSortField":{"type":"string","enum":["createdOn","modifiedOn","name"],"title":"DomainSortField","description":"Enum for sorting domain resources by field."},"DomainSortOrder":{"type":"string","enum":["ascending","descending"],"title":"DomainSortOrder","description":"Enum for sorting domain resources by order."},"Export":{"properties":{"domainId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domainid","description":"The domain ID."},"resource":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource","description":"The resource to export."},"subResource":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subresource","description":"The sub-resource to export."},"attribute":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attribute","description":"The attribute to export."},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format","description":"The format to export the resource in."},"status":{"anyOf":[{"$ref":"#/components/schemas/ExportStatus"},{"type":"null"}],"description":"The status of the export job."},"createdOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Createdon","description":"The date and time the export job was created."},"modifiedOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modifiedon","description":"The date and time the export job was last modified."},"signedUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signedurl","description":"The signed URL to download the exported file."},"expiresOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expireson","description":"The date and time the export job will expire."}},"type":"object","title":"Export","description":"Request to export a resource"},"ExportStatus":{"type":"string","enum":["pending","running","failed","completed","expired"],"title":"ExportStatus"},"FBFM40":{"type":"string","enum":["NB1","NB2","NB3","NB8","NB9","GR1","GR2","GR3","GR4","GR5","GR6","GR7","GR8","GR9","GS1","GS2","GS3","GS4","SH1","SH2","SH3","SH4","SH5","SH6","SH7","SH8","SH9","TU1","TU2","TU3","TU4","TU5","TL1","TL2","TL3","TL4","TL5","TL6","TL7","TL8","TL9","SB1","SB2","SB3","SB4"],"title":"FBFM40"},"FeatureDataResponse":{"properties":{"currentPage":{"type":"integer","title":"Currentpage","description":"The current page number."},"pageSize":{"type":"integer","title":"Pagesize","description":"The number of resources per page."},"totalItems":{"type":"integer","title":"Totalitems","description":"The total number of resources."},"crs":{"$ref":"#/components/schemas/GeoJsonCRS","description":"The GeoJSON specification formatted coordinate reference system (CRS) of the domain."},"type":{"type":"string","const":"FeatureCollection","title":"Type","default":"FeatureCollection"},"features":{"items":{"$ref":"#/components/schemas/GeoJSONFeature"},"type":"array","title":"Features","description":"A list of standard GeoJSON features."}},"type":"object","required":["currentPage","pageSize","totalItems","features"],"title":"FeatureDataResponse","description":"Paginated response structured as a GeoJSON FeatureCollection.\nIncludes standard FeatureCollection fields plus pagination metadata."},"FeatureGrid":{"properties":{"attributes":{"items":{"$ref":"#/components/schemas/FeatureGridAttribute"},"type":"array","title":"Attributes","description":"List of feature types to rasterize."},"status":{"anyOf":[{"$ref":"#/components/schemas/JobStatus"},{"type":"null"}]},"createdOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Createdon"},"modifiedOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modifiedon"},"checksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum"}},"type":"object","required":["attributes"],"title":"FeatureGrid"},"FeatureGridAttribute":{"type":"string","enum":["road","water"],"title":"FeatureGridAttribute"},"FeatureType":{"type":"string","enum":["road","water"],"title":"FeatureType"},"Features":{"properties":{"road":{"anyOf":[{"$ref":"#/components/schemas/RoadFeature"},{"type":"null"}]},"water":{"anyOf":[{"$ref":"#/components/schemas/WaterFeature"},{"type":"null"}]}},"type":"object","title":"Features"},"GeoJSONFeature":{"properties":{"type":{"type":"string","const":"Feature","title":"Type","default":"Feature"},"geometry":{"oneOf":[{"$ref":"#/components/schemas/Point"},{"$ref":"#/components/schemas/MultiPoint"},{"$ref":"#/components/schemas/LineString"},{"$ref":"#/components/schemas/MultiLineString"},{"$ref":"#/components/schemas/Polygon"},{"$ref":"#/components/schemas/MultiPolygon"}],"title":"Geometry","discriminator":{"propertyName":"type","mapping":{"LineString":"#/components/schemas/LineString","MultiLineString":"#/components/schemas/MultiLineString","MultiPoint":"#/components/schemas/MultiPoint","MultiPolygon":"#/components/schemas/MultiPolygon","Point":"#/components/schemas/Point","Polygon":"#/components/schemas/Polygon"}}},"properties":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Properties"}},"type":"object","required":["geometry"],"title":"GeoJSONFeature","description":"A GeoJSON Feature object."},"GeoJSONFeatureCollection":{"properties":{"type":{"type":"string","const":"FeatureCollection","title":"Type","default":"FeatureCollection"},"features":{"items":{"$ref":"#/components/schemas/GeoJSONFeature"},"type":"array","minItems":1,"title":"Features"}},"type":"object","required":["features"],"title":"GeoJSONFeatureCollection","description":"A GeoJSON FeatureCollection object."},"GeoJSONStyleProperties":{"properties":{"strokeColor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strokecolor","description":"The color of a line as part of a polygon, polyline, or multigeometry","examples":["#555555"]},"strokeOpacity":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Strokeopacity","description":"The opacity of the line component of a polygon, polyline, or multigeometry","examples":[1.0]},"strokeWidth":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Strokewidth","description":"The width of the line component of a polygon, polyline, or multigeometry","examples":[2.0]},"fillColor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fillcolor","description":"The color of the interior of a polygon","examples":["#555555"]},"fillOpacity":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Fillopacity","description":"The opacity of the interior of a polygon","examples":[0.5]}},"type":"object","title":"GeoJSONStyleProperties"},"GeoJsonCRS":{"properties":{"type":{"type":"string","const":"name","title":"Type","default":"name"},"properties":{"$ref":"#/components/schemas/GeoJsonCRSProperties"}},"type":"object","required":["properties"],"title":"GeoJsonCRS"},"GeoJsonCRSProperties":{"properties":{"name":{"type":"string","title":"Name","default":"EPSG:4326"}},"type":"object","title":"GeoJsonCRSProperties"},"GridAttributeMetadataResponse":{"properties":{"shape":{"items":{"type":"integer"},"type":"array","maxItems":3,"minItems":2,"title":"Shape","description":"The total shape of the grid data."},"dimensions":{"items":{"type":"string"},"type":"array","maxItems":3,"minItems":2,"title":"Dimensions","description":"A text descriptor of each dimension in the grid data."},"chunks":{"items":{"type":"integer"},"type":"array","maxItems":3,"minItems":2,"title":"Chunks","description":"The number of chunks in each dimension."},"chunkShape":{"items":{"type":"integer"},"type":"array","maxItems":3,"minItems":2,"title":"Chunkshape","description":"The shape of each chunk."},"attributes":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Attributes","description":"Information about each attribute in the grid data."}},"type":"object","required":["shape","dimensions","chunks","chunkShape","attributes"],"title":"GridAttributeMetadataResponse"},"Grids":{"properties":{"tree":{"anyOf":[{"$ref":"#/components/schemas/TreeGrid"},{"type":"null"}]},"surface":{"anyOf":[{"$ref":"#/components/schemas/SurfaceGrid"},{"type":"null"}]},"topography":{"anyOf":[{"$ref":"#/components/schemas/TopographyGrid"},{"type":"null"}]},"feature":{"anyOf":[{"$ref":"#/components/schemas/FeatureGrid"},{"type":"null"}]}},"type":"object","title":"Grids"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"Inventories":{"properties":{"tree":{"anyOf":[{"$ref":"#/components/schemas/TreeInventory"},{"type":"null"}]}},"type":"object","title":"Inventories"},"JobStatus":{"type":"string","enum":["pending","running","failed","completed"],"title":"JobStatus"},"Key":{"properties":{"name":{"type":"string","title":"Name","description":"A name to semantically identify the key."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"An optional description of the keys purpose."},"validDays":{"type":"integer","title":"Validdays","description":"Number of days for which this key will be valid.","default":30},"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"type":"array","title":"Scopes","description":"A list of scopes available to the key.","default":["read"]},"access":{"$ref":"#/components/schemas/Access","description":"Access type for the API key","default":"personal"},"applicationId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Applicationid","description":"Application ID accessed by the API key"},"id":{"type":"string","title":"Id","description":"Unique identifier for the key that also serves as the access token."},"createdOn":{"type":"string","format":"date-time","title":"Createdon","description":"The date and time the key was created."},"expiresOn":{"type":"string","format":"date-time","title":"Expireson","description":"The date at which this key is no longer valid."},"ownerId":{"type":"string","title":"Ownerid","description":"The unique ID of the user who generated the key."}},"type":"object","required":["name","id","ownerId"],"title":"Key","description":"Represents an API key used to authenticate users accessing the API programmatically"},"LineString":{"properties":{"type":{"type":"string","const":"LineString","title":"Type","default":"LineString"},"coordinates":{"items":{"$ref":"#/components/schemas/Position"},"type":"array","title":"Coordinates"}},"type":"object","required":["coordinates"],"title":"LineString"},"ListApplicationsResponse":{"properties":{"currentPage":{"type":"integer","title":"Currentpage","description":"The current page number."},"pageSize":{"type":"integer","title":"Pagesize","description":"The number of resources per page."},"totalItems":{"type":"integer","title":"Totalitems","description":"The total number of resources."},"applications":{"items":{"$ref":"#/components/schemas/Application"},"type":"array","title":"Applications","description":"A list of applications."}},"type":"object","required":["currentPage","pageSize","totalItems","applications"],"title":"ListApplicationsResponse","description":"Paginated response for listing applications."},"ListDomainResponse":{"properties":{"currentPage":{"type":"integer","title":"Currentpage","description":"The current page number."},"pageSize":{"type":"integer","title":"Pagesize","description":"The number of resources per page."},"totalItems":{"type":"integer","title":"Totalitems","description":"The total number of resources."},"domains":{"items":{"$ref":"#/components/schemas/Domain"},"type":"array","title":"Domains","description":"A list of domain resources."}},"type":"object","required":["currentPage","pageSize","totalItems","domains"],"title":"ListDomainResponse","description":"Paginated response for listing domain resources."},"ListKeysResponse":{"properties":{"currentPage":{"type":"integer","title":"Currentpage","description":"The current page number."},"pageSize":{"type":"integer","title":"Pagesize","description":"The number of resources per page."},"totalItems":{"type":"integer","title":"Totalitems","description":"The total number of resources."},"keys":{"items":{"$ref":"#/components/schemas/Key"},"type":"array","title":"Keys","description":"A list of API keys."}},"type":"object","required":["currentPage","pageSize","totalItems","keys"],"title":"ListKeysResponse","description":"Paginated response for listing API keys."},"MetaCanopyHeightMapSource":{"properties":{"source":{"type":"string","const":"Meta2024","title":"Source"},"license":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License"},"citation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Citation"}},"type":"object","required":["source"],"title":"MetaCanopyHeightMapSource"},"Modifier":{"type":"string","enum":["multiply","divide","add","subtract","replace"],"title":"Modifier","description":"Modifiers for modification actions."},"MultiLineString":{"properties":{"type":{"type":"string","const":"MultiLineString","title":"Type","default":"MultiLineString"},"coordinates":{"items":{"items":{"$ref":"#/components/schemas/Position"},"type":"array"},"type":"array","title":"Coordinates"}},"type":"object","required":["coordinates"],"title":"MultiLineString"},"MultiPoint":{"properties":{"type":{"type":"string","const":"MultiPoint","title":"Type","default":"MultiPoint"},"coordinates":{"items":{"$ref":"#/components/schemas/Position"},"type":"array","title":"Coordinates"}},"type":"object","required":["coordinates"],"title":"MultiPoint"},"MultiPolygon":{"properties":{"type":{"type":"string","const":"MultiPolygon","title":"Type","default":"MultiPolygon"},"coordinates":{"items":{"items":{"items":{"$ref":"#/components/schemas/Position"},"type":"array"},"type":"array"},"type":"array","title":"Coordinates"}},"type":"object","required":["coordinates"],"title":"MultiPolygon"},"Operator":{"type":"string","enum":["eq","ne","gt","lt","ge","le"],"title":"Operator","description":"Comparison operators for attribute-based conditions."},"Point":{"properties":{"type":{"type":"string","const":"Point","title":"Type","default":"Point"},"coordinates":{"$ref":"#/components/schemas/Position"}},"type":"object","required":["coordinates"],"title":"Point"},"PointCloud":{"properties":{"als":{"anyOf":[{"$ref":"#/components/schemas/AlsPointCloud"},{"type":"null"}]}},"type":"object","title":"PointCloud"},"Polygon":{"properties":{"type":{"type":"string","const":"Polygon","title":"Type","default":"Polygon"},"coordinates":{"items":{"items":{"$ref":"#/components/schemas/Position"},"type":"array"},"type":"array","title":"Coordinates"}},"type":"object","required":["coordinates"],"title":"Polygon"},"Position":{"items":{"type":"number"},"type":"array","maxItems":3,"minItems":2,"title":"Position"},"RoadFeature":{"properties":{"sources":{"items":{"$ref":"#/components/schemas/RoadFeatureSource"},"type":"array","title":"Sources","description":"List of sources of road features"},"geojson":{"anyOf":[{"$ref":"#/components/schemas/GeoJSONFeature"},{"$ref":"#/components/schemas/GeoJSONFeatureCollection"},{"type":"null"}],"title":"Geojson","description":"GeoJSON input when source is geojson. Must contain Polygon or MultiPolygon geometries."},"status":{"anyOf":[{"$ref":"#/components/schemas/JobStatus"},{"type":"null"}]},"createdOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Createdon"},"modifiedOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modifiedon"},"checksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum"}},"type":"object","required":["sources"],"title":"RoadFeature","description":"Response model for road features without strict validation."},"RoadFeatureSource":{"type":"string","enum":["OSM","geojson"],"title":"RoadFeatureSource"},"Scope":{"type":"string","enum":["read","write"],"title":"Scope","description":"Enumerates the available scopes or permissions attached to an API key."},"SpatialOperator":{"type":"string","enum":["within","outside","intersects"],"title":"SpatialOperator","description":"Spatial relationship operators for geometry-based conditions.\n\n- within: Select items whose target (centroid or cell) is inside the geometry\n- outside: Select items whose target is outside the geometry (inverse of within)\n- intersects: Select items whose target overlaps with the geometry"},"SpatialTarget":{"type":"string","enum":["centroid","cell"],"title":"SpatialTarget","description":"Specifies which part of the cell/item is tested against the geometry.\n\n- centroid: Test only the cell's centroid point against the geometry\n- cell: Test the entire cell bounds against the geometry"},"SurfaceGrid":{"properties":{"attributes":{"anyOf":[{"items":{"$ref":"#/components/schemas/SurfaceGridAttribute"},"type":"array"},{"type":"null"}],"title":"Attributes"},"fuelLoad":{"anyOf":[{"$ref":"#/components/schemas/SurfaceGridLandfireFBFM40FuelLoadSource"},{"$ref":"#/components/schemas/SurfaceGridLandfireFCCSFuelLoadSource"},{"$ref":"#/components/schemas/SurfaceGridUniformValue"},{"type":"null"}],"title":"Fuelload"},"fuelDepth":{"anyOf":[{"$ref":"#/components/schemas/SurfaceGridLandfireFBFM40Source"},{"$ref":"#/components/schemas/SurfaceGridLandfireFCCSSource"},{"$ref":"#/components/schemas/SurfaceGridUniformValue"},{"type":"null"}],"title":"Fueldepth"},"fuelMoisture":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/SurfaceGridUniformValue"},{"$ref":"#/components/schemas/SurfaceGridUniformValueBySizeClass"}],"title":"SurfaceGridFuelMoistureSource","discriminator":{"propertyName":"source","mapping":{"uniform":"#/components/schemas/SurfaceGridUniformValue","uniformBySizeClass":"#/components/schemas/SurfaceGridUniformValueBySizeClass"}}},{"type":"null"}],"title":"Fuelmoisture"},"SAVR":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/SurfaceGridLandfireFBFM40SAVRSource"},{"$ref":"#/components/schemas/SurfaceGridUniformValue"}],"title":"SurfaceGridSAVRSource","discriminator":{"propertyName":"source","mapping":{"LANDFIRE":"#/components/schemas/SurfaceGridLandfireFBFM40SAVRSource","uniform":"#/components/schemas/SurfaceGridUniformValue"}}},{"type":"null"}],"title":"Savr"},"FBFM":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/SurfaceGridLandfireFBFM40Source"},{"$ref":"#/components/schemas/SurfaceGridUniformFBFM40Value"}],"title":"SurfaceGridFBFMSource","discriminator":{"propertyName":"source","mapping":{"LANDFIRE":"#/components/schemas/SurfaceGridLandfireFBFM40Source","uniform":"#/components/schemas/SurfaceGridUniformFBFM40Value"}}},{"type":"null"}],"title":"Fbfm"},"modifications":{"items":{"$ref":"#/components/schemas/SurfaceGridModification"},"type":"array","maxItems":1000,"title":"ListSurfaceGridModifications","description":"List of modifications to apply to the surface grid","default":[]},"status":{"anyOf":[{"$ref":"#/components/schemas/JobStatus"},{"type":"null"}]},"createdOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Createdon"},"modifiedOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modifiedon"},"checksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum"}},"type":"object","title":"SurfaceGrid"},"SurfaceGridAttribute":{"type":"string","enum":["fuelLoad","fuelDepth","fuelMoisture","SAVR","FBFM"],"title":"SurfaceGridAttribute"},"SurfaceGridInterpolationMethod":{"type":"string","enum":["nearest","linear","cubic","zipper"],"title":"SurfaceGridInterpolationMethod"},"SurfaceGridLandfireFBFM40FuelLoadSource":{"properties":{"featureMasks":{"items":{"$ref":"#/components/schemas/FeatureType"},"type":"array","title":"Featuremasks","description":"List of feature masks to apply to the surface grid attribute","default":[]},"source":{"type":"string","const":"LANDFIRE","title":"Source","default":"LANDFIRE"},"product":{"type":"string","const":"FBFM40","title":"Product","default":"FBFM40"},"version":{"type":"string","const":"2022","title":"Version","description":"Version of the LANDFIRE data to use for the surface grid attribute.","default":"2022"},"interpolationMethod":{"$ref":"#/components/schemas/SurfaceGridInterpolationMethod","description":"Interpolation method to use when resampling the LANDFIRE data to the desired surface grid resolution.","default":"nearest"},"removeNonBurnable":{"anyOf":[{"items":{"type":"string","enum":["NB1","NB2","NB3","NB8","NB9"]},"type":"array"},{"type":"null"}],"title":"Removenonburnable","description":"List of non-burnable fuel model codes to remove from the surface grid attribute. Nonburnable blocks are replaced by burnable block by applying a majority filter to the grid. This feature is especially useful when used with the featureMasks field for replacing coarse resolution 30m data with high resolution road, water, and building polygons from other data sources such as OSM."},"curingLiveHerbaceous":{"type":"number","minimum":0.0,"title":"Curingliveherbaceous","description":"Proportion of live herbaceous fuel that is cured.","default":0.25},"curingLiveWoody":{"type":"number","minimum":0.0,"title":"Curinglivewoody","description":"Proportion of live woody fuel that is cured.","default":0.1},"groups":{"anyOf":[{"items":{"$ref":"#/components/schemas/SurfaceGridLandfireFBFM40Group"},"type":"array","minItems":1},{"type":"null"}],"title":"Groups","description":"List of FBFM40 size class groups to include in the surface grid attribute. Must include at least one group.","default":["oneHour","tenHour","hundredHour","liveHerbaceous","liveWoody"]}},"type":"object","title":"SurfaceGridLandfireFBFM40FuelLoadSource"},"SurfaceGridLandfireFBFM40Group":{"type":"string","enum":["oneHour","tenHour","hundredHour","liveHerbaceous","liveWoody"],"title":"SurfaceGridLandfireFBFM40Group","description":"The size class groups available for the FBFM40 fuel model."},"SurfaceGridLandfireFBFM40SAVRSource":{"properties":{"featureMasks":{"items":{"$ref":"#/components/schemas/FeatureType"},"type":"array","title":"Featuremasks","description":"List of feature masks to apply to the surface grid attribute","default":[]},"source":{"type":"string","const":"LANDFIRE","title":"Source","default":"LANDFIRE"},"product":{"type":"string","const":"FBFM40","title":"Product","default":"FBFM40"},"version":{"type":"string","const":"2022","title":"Version","description":"Version of the LANDFIRE data to use for the surface grid attribute.","default":"2022"},"interpolationMethod":{"$ref":"#/components/schemas/SurfaceGridInterpolationMethod","description":"Interpolation method to use when resampling the LANDFIRE data to the desired surface grid resolution.","default":"nearest"},"removeNonBurnable":{"anyOf":[{"items":{"type":"string","enum":["NB1","NB2","NB3","NB8","NB9"]},"type":"array"},{"type":"null"}],"title":"Removenonburnable","description":"List of non-burnable fuel model codes to remove from the surface grid attribute. Nonburnable blocks are replaced by burnable block by applying a majority filter to the grid. This feature is especially useful when used with the featureMasks field for replacing coarse resolution 30m data with high resolution road, water, and building polygons from other data sources such as OSM."},"groups":{"anyOf":[{"items":{"$ref":"#/components/schemas/SurfaceGridLandfireFBFM40Group"},"type":"array","minItems":1},{"type":"null"}],"title":"Groups","description":"List of FBFM40 size class groups to include in the surface grid attribute. Must include at least one group."}},"type":"object","title":"SurfaceGridLandfireFBFM40SAVRSource"},"SurfaceGridLandfireFBFM40Source":{"properties":{"featureMasks":{"items":{"$ref":"#/components/schemas/FeatureType"},"type":"array","title":"Featuremasks","description":"List of feature masks to apply to the surface grid attribute","default":[]},"source":{"type":"string","const":"LANDFIRE","title":"Source","default":"LANDFIRE"},"product":{"type":"string","const":"FBFM40","title":"Product","default":"FBFM40"},"version":{"type":"string","const":"2022","title":"Version","description":"Version of the LANDFIRE data to use for the surface grid attribute.","default":"2022"},"interpolationMethod":{"$ref":"#/components/schemas/SurfaceGridInterpolationMethod","description":"Interpolation method to use when resampling the LANDFIRE data to the desired surface grid resolution.","default":"nearest"},"removeNonBurnable":{"anyOf":[{"items":{"type":"string","enum":["NB1","NB2","NB3","NB8","NB9"]},"type":"array"},{"type":"null"}],"title":"Removenonburnable","description":"List of non-burnable fuel model codes to remove from the surface grid attribute. Nonburnable blocks are replaced by burnable block by applying a majority filter to the grid. This feature is especially useful when used with the featureMasks field for replacing coarse resolution 30m data with high resolution road, water, and building polygons from other data sources such as OSM."}},"type":"object","title":"SurfaceGridLandfireFBFM40Source"},"SurfaceGridLandfireFCCSFuelLoadSource":{"properties":{"featureMasks":{"items":{"$ref":"#/components/schemas/FeatureType"},"type":"array","title":"Featuremasks","description":"List of feature masks to apply to the surface grid attribute","default":[]},"source":{"type":"string","const":"LANDFIRE","title":"Source","default":"LANDFIRE"},"product":{"type":"string","const":"FCCS","title":"Product","default":"FCCS"},"version":{"type":"string","const":"2023","title":"Version","description":"Version of the LANDFIRE data to use for the surface grid attribute. FCCS uses version 2023.","default":"2023"},"interpolationMethod":{"$ref":"#/components/schemas/SurfaceGridInterpolationMethod","description":"Interpolation method to use when resampling the LANDFIRE data to the desired surface grid resolution.","default":"nearest"},"groups":{"anyOf":[{"items":{"$ref":"#/components/schemas/SurfaceGridLandfireFCCSGroup"},"type":"array","minItems":1},{"type":"null"}],"title":"Groups","description":"List of FCCS size class groups to include in the surface grid attribute. Must include at least one group.","default":["oneHour","tenHour","hundredHour"]}},"type":"object","title":"SurfaceGridLandfireFCCSFuelLoadSource","description":"Source configuration for FCCS fuel load data.\nFCCS supports 1-hour, 10-hour, and 100-hour timelag fuels (no live fuels or curing parameters)."},"SurfaceGridLandfireFCCSGroup":{"type":"string","enum":["oneHour","tenHour","hundredHour"],"title":"SurfaceGridLandfireFCCSGroup","description":"The size class groups available for the FCCS fuel model.\nFCCS supports 1-hour, 10-hour, and 100-hour timelag fuels only."},"SurfaceGridLandfireFCCSSource":{"properties":{"featureMasks":{"items":{"$ref":"#/components/schemas/FeatureType"},"type":"array","title":"Featuremasks","description":"List of feature masks to apply to the surface grid attribute","default":[]},"source":{"type":"string","const":"LANDFIRE","title":"Source","default":"LANDFIRE"},"product":{"type":"string","const":"FCCS","title":"Product","default":"FCCS"},"version":{"type":"string","const":"2023","title":"Version","description":"Version of the LANDFIRE data to use for the surface grid attribute. FCCS uses version 2023.","default":"2023"},"interpolationMethod":{"$ref":"#/components/schemas/SurfaceGridInterpolationMethod","description":"Interpolation method to use when resampling the LANDFIRE data to the desired surface grid resolution.","default":"nearest"}},"type":"object","title":"SurfaceGridLandfireFCCSSource","description":"Base source configuration for FCCS (Fuel Characteristic Classification System) data.\nFCCS provides detailed fuelbed classifications using LANDFIRE 2023 data."},"SurfaceGridModification":{"properties":{"conditions":{"items":{"anyOf":[{"$ref":"#/components/schemas/SurfaceGridModificationSpatialCondition"},{"$ref":"#/components/schemas/SurfaceGridModificationFBFMCondition"},{"$ref":"#/components/schemas/SurfaceGridModificationFuelLoadCondition"},{"$ref":"#/components/schemas/SurfaceGridModificationFuelHeightCondition"},{"$ref":"#/components/schemas/SurfaceGridModificationFuelMoistureCondition"}],"title":"SurfaceGridModificationCondition","description":"A condition for the surface grid modification. Can be either an attribute-based condition (checking attribute values) or a spatial condition (checking geographic location)."},"type":"array","title":"ListSurfaceGridModificationConditions","description":"The conditions for the surface grid modification."},"actions":{"items":{"oneOf":[{"$ref":"#/components/schemas/SurfaceGridModificationFBFMAction"},{"$ref":"#/components/schemas/SurfaceGridModificationFuelLoadAction"},{"$ref":"#/components/schemas/SurfaceGridModificationFuelHeightAction"},{"$ref":"#/components/schemas/SurfaceGridModificationFuelMoistureAction"}],"title":"SurfaceGridModificationAction","description":"The actions for the surface grid modification.","discriminator":{"propertyName":"attribute","mapping":{"FBFM":"#/components/schemas/SurfaceGridModificationFBFMAction","fuelDepth":"#/components/schemas/SurfaceGridModificationFuelHeightAction","fuelLoad":"#/components/schemas/SurfaceGridModificationFuelLoadAction","fuelMoisture":"#/components/schemas/SurfaceGridModificationFuelMoistureAction"}}},"type":"array","minItems":1,"title":"ListSurfaceGridModificationActions","description":"The actions for the surface grid modification."}},"type":"object","required":["conditions","actions"],"title":"SurfaceGridModification"},"SurfaceGridModificationFBFMAction":{"properties":{"attribute":{"type":"string","const":"FBFM","title":"Attribute"},"modifier":{"type":"string","const":"replace","title":"Modifier"},"value":{"$ref":"#/components/schemas/FBFM40"}},"type":"object","required":["attribute","modifier","value"],"title":"SurfaceGridModificationFBFMAction"},"SurfaceGridModificationFBFMCondition":{"properties":{"attribute":{"type":"string","const":"FBFM","title":"Attribute"},"operator":{"type":"string","const":"eq","title":"Operator"},"value":{"$ref":"#/components/schemas/FBFM40"}},"type":"object","required":["attribute","operator","value"],"title":"SurfaceGridModificationFBFMCondition"},"SurfaceGridModificationFuelHeightAction":{"properties":{"attribute":{"type":"string","const":"fuelDepth","title":"Attribute"},"modifier":{"$ref":"#/components/schemas/Modifier"},"value":{"type":"number","minimum":0.0,"title":"Value"}},"type":"object","required":["attribute","modifier","value"],"title":"SurfaceGridModificationFuelHeightAction"},"SurfaceGridModificationFuelHeightCondition":{"properties":{"attribute":{"type":"string","const":"fuelDepth","title":"Attribute"},"operator":{"$ref":"#/components/schemas/Operator"},"value":{"type":"number","minimum":0.0,"title":"Value"}},"type":"object","required":["attribute","operator","value"],"title":"SurfaceGridModificationFuelHeightCondition"},"SurfaceGridModificationFuelLoadAction":{"properties":{"attribute":{"type":"string","const":"fuelLoad","title":"Attribute"},"modifier":{"$ref":"#/components/schemas/Modifier"},"value":{"type":"number","minimum":0.0,"title":"Value"}},"type":"object","required":["attribute","modifier","value"],"title":"SurfaceGridModificationFuelLoadAction"},"SurfaceGridModificationFuelLoadCondition":{"properties":{"attribute":{"type":"string","const":"fuelLoad","title":"Attribute"},"operator":{"$ref":"#/components/schemas/Operator"},"value":{"type":"number","minimum":0.0,"title":"Value"}},"type":"object","required":["attribute","operator","value"],"title":"SurfaceGridModificationFuelLoadCondition"},"SurfaceGridModificationFuelMoistureAction":{"properties":{"attribute":{"type":"string","const":"fuelMoisture","title":"Attribute"},"modifier":{"$ref":"#/components/schemas/Modifier"},"value":{"type":"number","minimum":0.0,"title":"Value"}},"type":"object","required":["attribute","modifier","value"],"title":"SurfaceGridModificationFuelMoistureAction"},"SurfaceGridModificationFuelMoistureCondition":{"properties":{"attribute":{"type":"string","const":"fuelMoisture","title":"Attribute"},"operator":{"$ref":"#/components/schemas/Operator"},"value":{"type":"number","minimum":0.0,"title":"Value"}},"type":"object","required":["attribute","operator","value"],"title":"SurfaceGridModificationFuelMoistureCondition"},"SurfaceGridModificationSpatialCondition":{"properties":{"operator":{"$ref":"#/components/schemas/SpatialOperator","description":"The spatial relationship to test: 'within' (inside geometry), 'outside' (not inside geometry), or 'intersects' (overlaps geometry)."},"target":{"$ref":"#/components/schemas/SpatialTarget","description":"Which part of the cell to test against the geometry: 'centroid' (cell center point) or 'cell' (entire cell bounds).","default":"centroid"},"geometry":{"oneOf":[{"$ref":"#/components/schemas/Polygon"},{"$ref":"#/components/schemas/MultiPolygon"}],"title":"Geometry","description":"A GeoJSON Polygon or MultiPolygon geometry defining the spatial area for the condition.","discriminator":{"propertyName":"type","mapping":{"MultiPolygon":"#/components/schemas/MultiPolygon","Polygon":"#/components/schemas/Polygon"}}},"crs":{"anyOf":[{"$ref":"#/components/schemas/GeoJsonCRS"},{"type":"null"}],"description":"Coordinate reference system of the geometry. If not specified, assumes the same CRS as the domain (typically EPSG:4326)."}},"type":"object","required":["operator","geometry"],"title":"SurfaceGridModificationSpatialCondition","description":"Spatial condition for surface grid modifications.\n\nSelects cells based on their spatial relationship to a GeoJSON geometry.\nThis enables modifications to be applied to specific geographic areas,\nsuch as multiplying fuel load within a polygon or reducing fuel depth\noutside a protected area.\n\nExamples:\n Select cells within a polygon:\n {\n \"operator\": \"within\",\n \"geometry\": {\n \"type\": \"Polygon\",\n \"coordinates\": [[[-120.5, 39.0], [-120.5, 39.5], ...]]\n }\n }\n\n Select cells outside an area using cell bounds:\n {\n \"operator\": \"outside\",\n \"target\": \"cell\",\n \"geometry\": {...}\n }\n\n With explicit CRS (UTM Zone 10N):\n {\n \"operator\": \"intersects\",\n \"geometry\": {...},\n \"crs\": {\"type\": \"name\", \"properties\": {\"name\": \"EPSG:32610\"}}\n }"},"SurfaceGridUniformFBFM40Value":{"properties":{"featureMasks":{"items":{"$ref":"#/components/schemas/FeatureType"},"type":"array","title":"Featuremasks","description":"List of feature masks to apply to the surface grid attribute","default":[]},"source":{"type":"string","const":"uniform","title":"Source","default":"uniform"},"value":{"$ref":"#/components/schemas/FBFM40"}},"type":"object","required":["value"],"title":"SurfaceGridUniformFBFM40Value"},"SurfaceGridUniformValue":{"properties":{"featureMasks":{"items":{"$ref":"#/components/schemas/FeatureType"},"type":"array","title":"Featuremasks","description":"List of feature masks to apply to the surface grid attribute","default":[]},"source":{"type":"string","const":"uniform","title":"Source","default":"uniform"},"value":{"type":"number","minimum":0.0,"title":"Value"}},"type":"object","required":["value"],"title":"SurfaceGridUniformValue"},"SurfaceGridUniformValueBySizeClass":{"properties":{"featureMasks":{"items":{"$ref":"#/components/schemas/FeatureType"},"type":"array","title":"Featuremasks","description":"List of feature masks to apply to the surface grid attribute","default":[]},"source":{"type":"string","const":"uniformBySizeClass","title":"Source","default":"uniformBySizeClass"},"oneHour":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Onehour"},"tenHour":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Tenhour"},"hundredHour":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Hundredhour"},"liveHerbaceous":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Liveherbaceous"},"liveWoody":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Livewoody"},"groups":{"anyOf":[{"items":{"$ref":"#/components/schemas/SurfaceGridLandfireFBFM40Group"},"type":"array","minItems":1},{"type":"null"}],"title":"Groups","description":"List of size class groups to include in the surface grid attribute. Must include at least one group."}},"type":"object","title":"SurfaceGridUniformValueBySizeClass"},"ThreeDEPSource":{"properties":{"tiles":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tiles"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"ThreeDEPSource","description":"for recording metadata about the 3DEP source"},"TopographyGrid":{"properties":{"attributes":{"anyOf":[{"items":{"$ref":"#/components/schemas/TopographyGridAttribute"},"type":"array"},{"type":"null"}],"title":"Attributes"},"elevation":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/TopographyGrid3DEPSource"},{"$ref":"#/components/schemas/TopographyGridLandfireSource"},{"$ref":"#/components/schemas/TopographyGridUniformValue"}],"title":"TopographyGridElevationSource","discriminator":{"propertyName":"source","mapping":{"3DEP":"#/components/schemas/TopographyGrid3DEPSource","LANDFIRE":"#/components/schemas/TopographyGridLandfireSource","uniform":"#/components/schemas/TopographyGridUniformValue"}}},{"type":"null"}],"title":"Elevation"},"aspect":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/TopographyGrid3DEPSourceAspect"},{"$ref":"#/components/schemas/TopographyGridLandfireSourceAspect"}],"title":"TopographyGridAspectSource","discriminator":{"propertyName":"source","mapping":{"3DEP":"#/components/schemas/TopographyGrid3DEPSourceAspect","LANDFIRE":"#/components/schemas/TopographyGridLandfireSourceAspect"}}},{"type":"null"}],"title":"Aspect"},"slope":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/TopographyGrid3DEPSource"},{"$ref":"#/components/schemas/TopographyGridLandfireSource"}],"title":"TopographyGridSlopeSource","discriminator":{"propertyName":"source","mapping":{"3DEP":"#/components/schemas/TopographyGrid3DEPSource","LANDFIRE":"#/components/schemas/TopographyGridLandfireSource"}}},{"type":"null"}],"title":"Slope"},"status":{"anyOf":[{"$ref":"#/components/schemas/JobStatus"},{"type":"null"}]},"createdOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Createdon"},"modifiedOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modifiedon"},"checksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum"}},"type":"object","title":"TopographyGrid"},"TopographyGrid3DEPSource":{"properties":{"source":{"type":"string","const":"3DEP","title":"Source","default":"3DEP"},"interpolationMethod":{"type":"string","enum":["nearest","linear","cubic"],"title":"Interpolationmethod","default":"linear"}},"type":"object","title":"TopographyGrid3DEPSource"},"TopographyGrid3DEPSourceAspect":{"properties":{"source":{"type":"string","const":"3DEP","title":"Source","default":"3DEP"},"interpolationMethod":{"type":"string","const":"nearest","title":"Interpolationmethod","default":"nearest"}},"type":"object","title":"TopographyGrid3DEPSourceAspect"},"TopographyGridAttribute":{"type":"string","enum":["elevation","slope","aspect"],"title":"TopographyGridAttribute"},"TopographyGridInterpolationMethod":{"type":"string","enum":["nearest","linear","cubic","zipper"],"title":"TopographyGridInterpolationMethod"},"TopographyGridLandfireSource":{"properties":{"source":{"type":"string","const":"LANDFIRE","title":"Source","default":"LANDFIRE"},"version":{"type":"string","const":"2020","title":"Version","default":"2020"},"interpolationMethod":{"$ref":"#/components/schemas/TopographyGridInterpolationMethod","default":"linear"}},"type":"object","title":"TopographyGridLandfireSource"},"TopographyGridLandfireSourceAspect":{"properties":{"source":{"type":"string","const":"LANDFIRE","title":"Source","default":"LANDFIRE"},"version":{"type":"string","const":"2020","title":"Version","default":"2020"},"interpolationMethod":{"type":"string","const":"nearest","title":"Interpolationmethod","default":"nearest"}},"type":"object","title":"TopographyGridLandfireSourceAspect"},"TopographyGridUniformValue":{"properties":{"source":{"type":"string","const":"uniform","title":"Source","default":"uniform"},"value":{"type":"number","title":"Value"}},"type":"object","required":["value"],"title":"TopographyGridUniformValue"},"TreeGrid":{"properties":{"attributes":{"items":{"$ref":"#/components/schemas/TreeGridAttribute"},"type":"array","title":"Attributes","description":"List of attributes to include in the tree grid. Each attribute is a separate layer in the grid. Attributes present in the list will be assigned default values unless an additional field is provided.","default":["bulkDensity","fuelMoisture"]},"bulkDensity":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/TreeGridInventorySource"},{"$ref":"#/components/schemas/TreeGridUniformValue"}],"title":"TreeGridBulkDensitySource","discriminator":{"propertyName":"source","mapping":{"TreeInventory":"#/components/schemas/TreeGridInventorySource","uniform":"#/components/schemas/TreeGridUniformValue"}}},{"type":"null"}],"title":"Bulkdensity"},"fuelMoisture":{"anyOf":[{"$ref":"#/components/schemas/TreeGridUniformValue"},{"type":"null"}]},"SPCD":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/TreeGridInventorySource"},{"$ref":"#/components/schemas/TreeGridUniformValue"}],"title":"TreeGridSPCDSource","discriminator":{"propertyName":"source","mapping":{"TreeInventory":"#/components/schemas/TreeGridInventorySource","uniform":"#/components/schemas/TreeGridUniformValue"}}},{"type":"null"}],"title":"Spcd"},"SAVR":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/TreeGridInventorySource"},{"$ref":"#/components/schemas/TreeGridUniformValue"}],"title":"TreeGridSAVRSource","discriminator":{"propertyName":"source","mapping":{"TreeInventory":"#/components/schemas/TreeGridInventorySource","uniform":"#/components/schemas/TreeGridUniformValue"}}},{"type":"null"}],"title":"Savr"},"status":{"$ref":"#/components/schemas/JobStatus","default":"pending"},"createdOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Createdon"},"modifiedOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modifiedon"},"checksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum"},"treeInventoryChecksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Treeinventorychecksum"}},"type":"object","title":"TreeGrid"},"TreeGridAttribute":{"type":"string","enum":["bulkDensity","fuelMoisture","SPCD","SAVR"],"title":"TreeGridAttribute","description":"The attributes that can be used to generate a tree grid."},"TreeGridInventorySource":{"properties":{"source":{"type":"string","const":"TreeInventory","title":"Source","default":"TreeInventory"}},"type":"object","title":"TreeGridInventorySource"},"TreeGridUniformValue":{"properties":{"source":{"type":"string","const":"uniform","title":"Source","default":"uniform"},"value":{"type":"number","title":"Value"}},"type":"object","required":["value"],"title":"TreeGridUniformValue"},"TreeInventory":{"properties":{"sources":{"items":{"$ref":"#/components/schemas/TreeInventorySource"},"type":"array","title":"Sources"},"TreeMap":{"anyOf":[{"$ref":"#/components/schemas/TreeMapSource"},{"type":"null"}]},"modifications":{"items":{"$ref":"#/components/schemas/TreeInventoryModification"},"type":"array","maxItems":1000,"title":"ListTreeInventoryModifications","description":"List of modifications to apply to the tree inventory data","default":[]},"treatments":{"items":{"oneOf":[{"$ref":"#/components/schemas/TreeInventoryTreatmentDirectionalThinning"},{"$ref":"#/components/schemas/TreeInventoryTreatmentProportionalThinning"}],"title":"TreeInventoryTreatment","description":"A treatment to apply to the tree inventory data","discriminator":{"propertyName":"method","mapping":{"directionalThinning":"#/components/schemas/TreeInventoryTreatmentDirectionalThinning","proportionalThinning":"#/components/schemas/TreeInventoryTreatmentProportionalThinning"}}},"type":"array","maxItems":1000,"title":"ListTreeInventoryTreatments","description":"List of silvicultural treatments to apply.","default":[]},"featureMasks":{"items":{"$ref":"#/components/schemas/FeatureType"},"type":"array","title":"Featuremasks","description":"List of Features to mask tree inventory data. This has the effect of removing trees that intersect with the feature.","default":[]},"status":{"$ref":"#/components/schemas/JobStatus","default":"pending"},"createdOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Createdon"},"modifiedOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modifiedon"},"checksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum"},"file":{"anyOf":[{"$ref":"#/components/schemas/api__resources__inventories__tree__schema__UploadResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/api__resources__inventories__tree__schema__ProcessingError"},{"type":"null"}],"description":"Detailed error information if processing failed, regardless of source type."}},"type":"object","required":["sources"],"title":"TreeInventory"},"TreeInventoryModification":{"properties":{"conditions":{"items":{"oneOf":[{"$ref":"#/components/schemas/TreeInventoryModificationSPCDCondition"},{"$ref":"#/components/schemas/TreeInventoryModificationHTCondition"},{"$ref":"#/components/schemas/TreeInventoryModificationDIACondition"},{"$ref":"#/components/schemas/TreeInventoryModificationCRCondition"},{"$ref":"#/components/schemas/TreeInventoryModificationExpressionCondition"}],"title":"TreeInventoryModificationCondition","description":"Conditions for filtering trees. Supports single fields (HT, DIA, CR, SPCD) or arithmetic expressions.","discriminator":{"propertyName":"attribute","mapping":{"CR":"#/components/schemas/TreeInventoryModificationCRCondition","DIA":"#/components/schemas/TreeInventoryModificationDIACondition","HT":"#/components/schemas/TreeInventoryModificationHTCondition","SPCD":"#/components/schemas/TreeInventoryModificationSPCDCondition","expression":"#/components/schemas/TreeInventoryModificationExpressionCondition"}}},"type":"array","title":"ListTreeInventoryModificationConditions","description":"The conditions for the tree inventory modification."},"actions":{"items":{"anyOf":[{"$ref":"#/components/schemas/TreeInventoryModificationSPCDAction"},{"$ref":"#/components/schemas/TreeInventoryModificationHTAction"},{"$ref":"#/components/schemas/TreeInventoryModificationDIAAction"},{"$ref":"#/components/schemas/TreeInventoryModificationCRAction"},{"$ref":"#/components/schemas/TreeInventoryModificationRemoveAction"}],"title":"TreeInventoryModificationAction","description":"Actions to apply to trees. Use modifier='remove' to remove trees."},"type":"array","minItems":1,"title":"ListTreeInventoryModificationActions","description":"The actions for the tree inventory modification."}},"type":"object","required":["conditions","actions"],"title":"TreeInventoryModification"},"TreeInventoryModificationCRAction":{"properties":{"attribute":{"type":"string","const":"CR","title":"Attribute"},"modifier":{"$ref":"#/components/schemas/Modifier"},"value":{"type":"number","maximum":1.0,"exclusiveMinimum":0.0,"title":"Value"}},"type":"object","required":["attribute","modifier","value"],"title":"TreeInventoryModificationCRAction"},"TreeInventoryModificationCRCondition":{"properties":{"attribute":{"type":"string","const":"CR","title":"Attribute"},"operator":{"$ref":"#/components/schemas/Operator"},"value":{"type":"number","maximum":1.0,"exclusiveMinimum":0.0,"title":"Value"}},"type":"object","required":["attribute","operator","value"],"title":"TreeInventoryModificationCRCondition"},"TreeInventoryModificationDIAAction":{"properties":{"attribute":{"type":"string","const":"DIA","title":"Attribute"},"modifier":{"$ref":"#/components/schemas/Modifier"},"value":{"type":"number","minimum":0.0,"title":"Value"}},"type":"object","required":["attribute","modifier","value"],"title":"TreeInventoryModificationDIAAction"},"TreeInventoryModificationDIACondition":{"properties":{"attribute":{"type":"string","const":"DIA","title":"Attribute"},"operator":{"$ref":"#/components/schemas/Operator"},"value":{"type":"number","minimum":0.0,"title":"Value"}},"type":"object","required":["attribute","operator","value"],"title":"TreeInventoryModificationDIACondition"},"TreeInventoryModificationExpressionCondition":{"properties":{"attribute":{"type":"string","const":"expression","title":"Attribute"},"operator":{"$ref":"#/components/schemas/Operator"},"value":{"type":"number","title":"Value"},"expression":{"type":"string","maxLength":200,"minLength":1,"title":"Expression","description":"Arithmetic expression using tree fields (HT, DIA, CR)","examples":["HT * (1 - CR)","HT / DIA","(HT + DIA) / 2"]}},"type":"object","required":["attribute","operator","value","expression"],"title":"TreeInventoryModificationExpressionCondition","description":"Expression-based condition for filtering trees based on computed values.\n\nSupports arithmetic expressions combining tree fields:\n- Fields: HT, DIA, CR\n- Operators: +, -, *, /, ()\n- Examples: \"HT * (1 - CR)\", \"HT / DIA\", \"(HT + DIA) / 2\""},"TreeInventoryModificationHTAction":{"properties":{"attribute":{"type":"string","const":"HT","title":"Attribute"},"modifier":{"$ref":"#/components/schemas/Modifier"},"value":{"type":"number","minimum":0.0,"title":"Value"}},"type":"object","required":["attribute","modifier","value"],"title":"TreeInventoryModificationHTAction"},"TreeInventoryModificationHTCondition":{"properties":{"attribute":{"type":"string","const":"HT","title":"Attribute"},"operator":{"$ref":"#/components/schemas/Operator"},"value":{"type":"number","minimum":0.0,"title":"Value"}},"type":"object","required":["attribute","operator","value"],"title":"TreeInventoryModificationHTCondition"},"TreeInventoryModificationRemoveAction":{"properties":{"attribute":{"anyOf":[{"type":"string","const":"all"},{"type":"null"}],"title":"Attribute","description":"Optional field for backwards compatibility. Automatically normalized to None."},"modifier":{"type":"string","const":"remove","title":"Modifier","description":"Remove trees matching conditions","default":"remove"}},"type":"object","title":"TreeInventoryModificationRemoveAction","description":"Remove all trees matching the conditions.\n\nSupports two syntaxes:\n- New (simplified): {\"modifier\": \"remove\"}\n- Legacy (backwards compatible): {\"attribute\": \"all\", \"modifier\": \"remove\"}\n\nNote: The 'attribute' field is automatically normalized to None internally."},"TreeInventoryModificationSPCDAction":{"properties":{"attribute":{"type":"string","const":"SPCD","title":"Attribute"},"modifier":{"type":"string","const":"replace","title":"Modifier"},"value":{"type":"integer","title":"Value"}},"type":"object","required":["attribute","modifier","value"],"title":"TreeInventoryModificationSPCDAction"},"TreeInventoryModificationSPCDCondition":{"properties":{"attribute":{"type":"string","const":"SPCD","title":"Attribute"},"operator":{"type":"string","const":"eq","title":"Operator"},"value":{"type":"integer","title":"Value"}},"type":"object","required":["attribute","operator","value"],"title":"TreeInventoryModificationSPCDCondition"},"TreeInventorySource":{"type":"string","enum":["TreeMap","file","pointcloud"],"title":"TreeInventorySource"},"TreeInventoryTreatmentDirectionalThinning":{"properties":{"method":{"type":"string","const":"directionalThinning","title":"Method"},"direction":{"type":"string","enum":["above","below"],"title":"Direction"},"targetMetric":{"type":"string","enum":["diameter","basalArea"],"title":"Targetmetric"},"targetValue":{"type":"number","minimum":0.0,"title":"Targetvalue"}},"type":"object","required":["method","direction","targetMetric","targetValue"],"title":"TreeInventoryTreatmentDirectionalThinning"},"TreeInventoryTreatmentProportionalThinning":{"properties":{"method":{"type":"string","const":"proportionalThinning","title":"Method"},"targetMetric":{"type":"string","const":"basalArea","title":"Targetmetric"},"targetValue":{"type":"number","minimum":0.0,"title":"Targetvalue"}},"type":"object","required":["method","targetMetric","targetValue"],"title":"TreeInventoryTreatmentProportionalThinning"},"TreeMapSource":{"properties":{"version":{"$ref":"#/components/schemas/TreeMapVersion","default":"2022"},"seed":{"type":"integer","title":"Seed"},"canopyHeightMapConfiguration":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/MetaCanopyHeightMapSource"}],"discriminator":{"propertyName":"source","mapping":{"Meta2024":"#/components/schemas/MetaCanopyHeightMapSource"}}},{"type":"null"}],"title":"Canopyheightmapconfiguration","description":"Optional canopy height map configuration argument to use with the TreeMap data source."}},"type":"object","title":"TreeMapSource"},"TreeMapVersion":{"type":"string","enum":["2014","2016","2020","2022"],"title":"TreeMapVersion"},"UpdateDomainRequest":{"properties":{"name":{"type":"string","title":"Name","description":"The name of the domain."},"description":{"type":"string","title":"Description","description":"A brief description of the domain."},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"A list of tags associated with the domain."}},"type":"object","title":"UpdateDomainRequest","description":"Request body for updating a domain resource."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WaterFeature":{"properties":{"sources":{"items":{"$ref":"#/components/schemas/WaterFeatureSource"},"type":"array","title":"Sources","description":"List of sources of road features"},"status":{"anyOf":[{"$ref":"#/components/schemas/JobStatus"},{"type":"null"}]},"createdOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Createdon"},"modifiedOn":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modifiedon"},"checksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum"}},"type":"object","required":["sources"],"title":"WaterFeature"},"WaterFeatureSource":{"type":"string","enum":["OSM"],"title":"WaterFeatureSource"},"api__resources__inventories__tree__schema__ProcessingError":{"properties":{"code":{"type":"string","title":"Code","description":"A unique error code identifying the type of error that occurred."},"message":{"type":"string","title":"Message","description":"A user-friendly error message describing what went wrong."},"details":{"type":"string","title":"Details","description":"Technical details about the error for debugging purposes."},"suggestions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggestions","description":"Actionable suggestions for resolving the error."}},"type":"object","required":["code","message","details"],"title":"ProcessingError","description":"Structured error information for user feedback, matching the uploader service error format."},"api__resources__inventories__tree__schema__UploadResponse":{"properties":{"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Information about the current step in the upload process."},"method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Method","description":"The HTTP method used to make the upload request."},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"The signed URL used to make the request."},"headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Headers","description":"The HTTP headers that need to be included with the PUT request."},"curl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Curl","description":"A cURL command that can be used to perform the upload."}},"type":"object","required":["message"],"title":"UploadResponse","description":"Upload response model to provide all necessary information and updates for file upload process."},"api__resources__pointclouds__als__schema__UploadResponse":{"properties":{"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Information about the current step in the upload process."},"method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Method","description":"The HTTP method used to make the upload request."},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"The signed URL used to make the request."},"headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Headers","description":"The HTTP headers that need to be included with the PUT request."},"curl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Curl","description":"A cURL command that can be used to perform the upload."}},"type":"object","title":"UploadResponse","description":"Upload response model to provide all necessary information and updates for file upload process."}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","in":"header","name":"api-key"},"HTTPBearer":{"type":"http","scheme":"bearer"}}}} \ No newline at end of file diff --git a/fastfuels_sdk/client_library/models/__init__.py b/fastfuels_sdk/client_library/models/__init__.py index f4ace30..9e020d3 100644 --- a/fastfuels_sdk/client_library/models/__init__.py +++ b/fastfuels_sdk/client_library/models/__init__.py @@ -39,6 +39,7 @@ from fastfuels_sdk.client_library.models.export import Export from fastfuels_sdk.client_library.models.export_status import ExportStatus from fastfuels_sdk.client_library.models.fbfm40 import FBFM40 +from fastfuels_sdk.client_library.models.feature_data_response import FeatureDataResponse from fastfuels_sdk.client_library.models.feature_grid import FeatureGrid from fastfuels_sdk.client_library.models.feature_grid_attribute import FeatureGridAttribute from fastfuels_sdk.client_library.models.feature_type import FeatureType @@ -52,6 +53,7 @@ from fastfuels_sdk.client_library.models.geo_json_crs_properties import GeoJsonCRSProperties from fastfuels_sdk.client_library.models.geojson import Geojson from fastfuels_sdk.client_library.models.geometry import Geometry +from fastfuels_sdk.client_library.models.geometry1 import Geometry1 from fastfuels_sdk.client_library.models.grid_attribute_metadata_response import GridAttributeMetadataResponse from fastfuels_sdk.client_library.models.grids import Grids from fastfuels_sdk.client_library.models.http_validation_error import HTTPValidationError @@ -74,6 +76,8 @@ from fastfuels_sdk.client_library.models.road_feature import RoadFeature from fastfuels_sdk.client_library.models.road_feature_source import RoadFeatureSource from fastfuels_sdk.client_library.models.scope import Scope +from fastfuels_sdk.client_library.models.spatial_operator import SpatialOperator +from fastfuels_sdk.client_library.models.spatial_target import SpatialTarget from fastfuels_sdk.client_library.models.surface_grid import SurfaceGrid from fastfuels_sdk.client_library.models.surface_grid_attribute import SurfaceGridAttribute from fastfuels_sdk.client_library.models.surface_grid_fbfm_source import SurfaceGridFBFMSource @@ -97,6 +101,7 @@ from fastfuels_sdk.client_library.models.surface_grid_modification_fuel_load_condition import SurfaceGridModificationFuelLoadCondition from fastfuels_sdk.client_library.models.surface_grid_modification_fuel_moisture_action import SurfaceGridModificationFuelMoistureAction from fastfuels_sdk.client_library.models.surface_grid_modification_fuel_moisture_condition import SurfaceGridModificationFuelMoistureCondition +from fastfuels_sdk.client_library.models.surface_grid_modification_spatial_condition import SurfaceGridModificationSpatialCondition from fastfuels_sdk.client_library.models.surface_grid_savr_source import SurfaceGridSAVRSource from fastfuels_sdk.client_library.models.surface_grid_uniform_fbfm40_value import SurfaceGridUniformFBFM40Value from fastfuels_sdk.client_library.models.surface_grid_uniform_value import SurfaceGridUniformValue diff --git a/fastfuels_sdk/client_library/models/feature_data_response.py b/fastfuels_sdk/client_library/models/feature_data_response.py new file mode 100644 index 0000000..c7b14a7 --- /dev/null +++ b/fastfuels_sdk/client_library/models/feature_data_response.py @@ -0,0 +1,119 @@ +# coding: utf-8 + +""" + FastFuels API + + A JSON API for creating, editing, and retrieving 3D fuels data for next generation fire behavior models. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr, field_validator +from typing import Any, ClassVar, Dict, List, Optional +from fastfuels_sdk.client_library.models.geo_json_crs import GeoJsonCRS +from fastfuels_sdk.client_library.models.geo_json_feature import GeoJSONFeature +from typing import Optional, Set +from typing_extensions import Self + +class FeatureDataResponse(BaseModel): + """ + Paginated response structured as a GeoJSON FeatureCollection. Includes standard FeatureCollection fields plus pagination metadata. + """ # noqa: E501 + current_page: StrictInt = Field(description="The current page number.", alias="currentPage") + page_size: StrictInt = Field(description="The number of resources per page.", alias="pageSize") + total_items: StrictInt = Field(description="The total number of resources.", alias="totalItems") + crs: Optional[GeoJsonCRS] = Field(default=None, description="The GeoJSON specification formatted coordinate reference system (CRS) of the domain.") + type: Optional[StrictStr] = 'FeatureCollection' + features: List[GeoJSONFeature] = Field(description="A list of standard GeoJSON features.") + __properties: ClassVar[List[str]] = ["currentPage", "pageSize", "totalItems", "crs", "type", "features"] + + @field_validator('type') + def type_validate_enum(cls, value): + """Validates the enum""" + if value is None: + return value + + if value not in set(['FeatureCollection']): + raise ValueError("must be one of enum values ('FeatureCollection')") + return value + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of FeatureDataResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of crs + if self.crs: + _dict['crs'] = self.crs.to_dict() + # override the default output from pydantic by calling `to_dict()` of each item in features (list) + _items = [] + if self.features: + for _item_features in self.features: + if _item_features: + _items.append(_item_features.to_dict()) + _dict['features'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of FeatureDataResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "currentPage": obj.get("currentPage"), + "pageSize": obj.get("pageSize"), + "totalItems": obj.get("totalItems"), + "crs": GeoJsonCRS.from_dict(obj["crs"]) if obj.get("crs") is not None else None, + "type": obj.get("type") if obj.get("type") is not None else 'FeatureCollection', + "features": [GeoJSONFeature.from_dict(_item) for _item in obj["features"]] if obj.get("features") is not None else None + }) + return _obj + + diff --git a/fastfuels_sdk/client_library/models/geometry1.py b/fastfuels_sdk/client_library/models/geometry1.py new file mode 100644 index 0000000..79303f6 --- /dev/null +++ b/fastfuels_sdk/client_library/models/geometry1.py @@ -0,0 +1,140 @@ +# coding: utf-8 + +""" + FastFuels API + + A JSON API for creating, editing, and retrieving 3D fuels data for next generation fire behavior models. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import json +import pprint +from pydantic import BaseModel, ConfigDict, Field, StrictStr, ValidationError, field_validator +from typing import Any, List, Optional +from fastfuels_sdk.client_library.models.multi_polygon import MultiPolygon +from fastfuels_sdk.client_library.models.polygon import Polygon +from pydantic import StrictStr, Field +from typing import Union, List, Set, Optional, Dict +from typing_extensions import Literal, Self + +GEOMETRY1_ONE_OF_SCHEMAS = ["MultiPolygon", "Polygon"] + +class Geometry1(BaseModel): + """ + A GeoJSON Polygon or MultiPolygon geometry defining the spatial area for the condition. + """ + # data type: Polygon + oneof_schema_1_validator: Optional[Polygon] = None + # data type: MultiPolygon + oneof_schema_2_validator: Optional[MultiPolygon] = None + actual_instance: Optional[Union[MultiPolygon, Polygon]] = None + one_of_schemas: Set[str] = { "MultiPolygon", "Polygon" } + + model_config = ConfigDict( + validate_assignment=True, + protected_namespaces=(), + ) + + + discriminator_value_class_map: Dict[str, str] = { + } + + def __init__(self, *args, **kwargs) -> None: + if args: + if len(args) > 1: + raise ValueError("If a position argument is used, only 1 is allowed to set `actual_instance`") + if kwargs: + raise ValueError("If a position argument is used, keyword arguments cannot be used.") + super().__init__(actual_instance=args[0]) + else: + super().__init__(**kwargs) + + @field_validator('actual_instance') + def actual_instance_must_validate_oneof(cls, v): + instance = Geometry1.model_construct() + error_messages = [] + match = 0 + # validate data type: Polygon + if not isinstance(v, Polygon): + error_messages.append(f"Error! Input type `{type(v)}` is not `Polygon`") + else: + match += 1 + # validate data type: MultiPolygon + if not isinstance(v, MultiPolygon): + error_messages.append(f"Error! Input type `{type(v)}` is not `MultiPolygon`") + else: + match += 1 + if match > 1: + # more than 1 match + raise ValueError("Multiple matches found when setting `actual_instance` in Geometry1 with oneOf schemas: MultiPolygon, Polygon. Details: " + ", ".join(error_messages)) + elif match == 0: + # no match + raise ValueError("No match found when setting `actual_instance` in Geometry1 with oneOf schemas: MultiPolygon, Polygon. Details: " + ", ".join(error_messages)) + else: + return v + + @classmethod + def from_dict(cls, obj: Union[str, Dict[str, Any]]) -> Self: + return cls.from_json(json.dumps(obj)) + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Returns the object represented by the json string""" + instance = cls.model_construct() + error_messages = [] + match = 0 + + # deserialize data into Polygon + try: + instance.actual_instance = Polygon.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into MultiPolygon + try: + instance.actual_instance = MultiPolygon.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + + if match > 1: + # more than 1 match + raise ValueError("Multiple matches found when deserializing the JSON string into Geometry1 with oneOf schemas: MultiPolygon, Polygon. Details: " + ", ".join(error_messages)) + elif match == 0: + # no match + raise ValueError("No match found when deserializing the JSON string into Geometry1 with oneOf schemas: MultiPolygon, Polygon. Details: " + ", ".join(error_messages)) + else: + return instance + + def to_json(self) -> str: + """Returns the JSON representation of the actual instance""" + if self.actual_instance is None: + return "null" + + if hasattr(self.actual_instance, "to_json") and callable(self.actual_instance.to_json): + return self.actual_instance.to_json() + else: + return json.dumps(self.actual_instance) + + def to_dict(self) -> Optional[Union[Dict[str, Any], MultiPolygon, Polygon]]: + """Returns the dict representation of the actual instance""" + if self.actual_instance is None: + return None + + if hasattr(self.actual_instance, "to_dict") and callable(self.actual_instance.to_dict): + return self.actual_instance.to_dict() + else: + # primitive type + return self.actual_instance + + def to_str(self) -> str: + """Returns the string representation of the actual instance""" + return pprint.pformat(self.model_dump()) + + diff --git a/fastfuels_sdk/client_library/models/modifier.py b/fastfuels_sdk/client_library/models/modifier.py index 9555cdc..d60a017 100644 --- a/fastfuels_sdk/client_library/models/modifier.py +++ b/fastfuels_sdk/client_library/models/modifier.py @@ -20,7 +20,7 @@ class Modifier(str, Enum): """ - Modifier + Modifiers for modification actions. """ """ diff --git a/fastfuels_sdk/client_library/models/operator.py b/fastfuels_sdk/client_library/models/operator.py index 531e8f1..9071782 100644 --- a/fastfuels_sdk/client_library/models/operator.py +++ b/fastfuels_sdk/client_library/models/operator.py @@ -20,7 +20,7 @@ class Operator(str, Enum): """ - Operator + Comparison operators for attribute-based conditions. """ """ diff --git a/fastfuels_sdk/client_library/models/spatial_operator.py b/fastfuels_sdk/client_library/models/spatial_operator.py new file mode 100644 index 0000000..24c6f97 --- /dev/null +++ b/fastfuels_sdk/client_library/models/spatial_operator.py @@ -0,0 +1,38 @@ +# coding: utf-8 + +""" + FastFuels API + + A JSON API for creating, editing, and retrieving 3D fuels data for next generation fire behavior models. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class SpatialOperator(str, Enum): + """ + Spatial relationship operators for geometry-based conditions. - within: Select items whose target (centroid or cell) is inside the geometry - outside: Select items whose target is outside the geometry (inverse of within) - intersects: Select items whose target overlaps with the geometry + """ + + """ + allowed enum values + """ + WITHIN = 'within' + OUTSIDE = 'outside' + INTERSECTS = 'intersects' + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of SpatialOperator from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/fastfuels_sdk/client_library/models/spatial_target.py b/fastfuels_sdk/client_library/models/spatial_target.py new file mode 100644 index 0000000..c0cc539 --- /dev/null +++ b/fastfuels_sdk/client_library/models/spatial_target.py @@ -0,0 +1,37 @@ +# coding: utf-8 + +""" + FastFuels API + + A JSON API for creating, editing, and retrieving 3D fuels data for next generation fire behavior models. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class SpatialTarget(str, Enum): + """ + Specifies which part of the cell/item is tested against the geometry. - centroid: Test only the cell's centroid point against the geometry - cell: Test the entire cell bounds against the geometry + """ + + """ + allowed enum values + """ + CENTROID = 'centroid' + CELL = 'cell' + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of SpatialTarget from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/fastfuels_sdk/client_library/models/surface_grid_modification_condition.py b/fastfuels_sdk/client_library/models/surface_grid_modification_condition.py index 7c539b1..8f416d8 100644 --- a/fastfuels_sdk/client_library/models/surface_grid_modification_condition.py +++ b/fastfuels_sdk/client_library/models/surface_grid_modification_condition.py @@ -13,42 +13,47 @@ from __future__ import annotations +from inspect import getfullargspec import json import pprint +import re # noqa: F401 from pydantic import BaseModel, ConfigDict, Field, StrictStr, ValidationError, field_validator -from typing import Any, List, Optional +from typing import Optional from fastfuels_sdk.client_library.models.surface_grid_modification_fbfm_condition import SurfaceGridModificationFBFMCondition from fastfuels_sdk.client_library.models.surface_grid_modification_fuel_height_condition import SurfaceGridModificationFuelHeightCondition from fastfuels_sdk.client_library.models.surface_grid_modification_fuel_load_condition import SurfaceGridModificationFuelLoadCondition from fastfuels_sdk.client_library.models.surface_grid_modification_fuel_moisture_condition import SurfaceGridModificationFuelMoistureCondition -from pydantic import StrictStr, Field -from typing import Union, List, Set, Optional, Dict +from fastfuels_sdk.client_library.models.surface_grid_modification_spatial_condition import SurfaceGridModificationSpatialCondition +from typing import Union, Any, List, Set, TYPE_CHECKING, Optional, Dict from typing_extensions import Literal, Self +from pydantic import Field -SURFACEGRIDMODIFICATIONCONDITION_ONE_OF_SCHEMAS = ["SurfaceGridModificationFBFMCondition", "SurfaceGridModificationFuelHeightCondition", "SurfaceGridModificationFuelLoadCondition", "SurfaceGridModificationFuelMoistureCondition"] +SURFACEGRIDMODIFICATIONCONDITION_ANY_OF_SCHEMAS = ["SurfaceGridModificationFBFMCondition", "SurfaceGridModificationFuelHeightCondition", "SurfaceGridModificationFuelLoadCondition", "SurfaceGridModificationFuelMoistureCondition", "SurfaceGridModificationSpatialCondition"] class SurfaceGridModificationCondition(BaseModel): """ - The conditions for the surface grid modification. + A condition for the surface grid modification. Can be either an attribute-based condition (checking attribute values) or a spatial condition (checking geographic location). """ + + # data type: SurfaceGridModificationSpatialCondition + anyof_schema_1_validator: Optional[SurfaceGridModificationSpatialCondition] = None # data type: SurfaceGridModificationFBFMCondition - oneof_schema_1_validator: Optional[SurfaceGridModificationFBFMCondition] = None + anyof_schema_2_validator: Optional[SurfaceGridModificationFBFMCondition] = None # data type: SurfaceGridModificationFuelLoadCondition - oneof_schema_2_validator: Optional[SurfaceGridModificationFuelLoadCondition] = None + anyof_schema_3_validator: Optional[SurfaceGridModificationFuelLoadCondition] = None # data type: SurfaceGridModificationFuelHeightCondition - oneof_schema_3_validator: Optional[SurfaceGridModificationFuelHeightCondition] = None + anyof_schema_4_validator: Optional[SurfaceGridModificationFuelHeightCondition] = None # data type: SurfaceGridModificationFuelMoistureCondition - oneof_schema_4_validator: Optional[SurfaceGridModificationFuelMoistureCondition] = None - actual_instance: Optional[Union[SurfaceGridModificationFBFMCondition, SurfaceGridModificationFuelHeightCondition, SurfaceGridModificationFuelLoadCondition, SurfaceGridModificationFuelMoistureCondition]] = None - one_of_schemas: Set[str] = { "SurfaceGridModificationFBFMCondition", "SurfaceGridModificationFuelHeightCondition", "SurfaceGridModificationFuelLoadCondition", "SurfaceGridModificationFuelMoistureCondition" } - - model_config = ConfigDict( - validate_assignment=True, - protected_namespaces=(), - ) - - - discriminator_value_class_map: Dict[str, str] = { + anyof_schema_5_validator: Optional[SurfaceGridModificationFuelMoistureCondition] = None + if TYPE_CHECKING: + actual_instance: Optional[Union[SurfaceGridModificationFBFMCondition, SurfaceGridModificationFuelHeightCondition, SurfaceGridModificationFuelLoadCondition, SurfaceGridModificationFuelMoistureCondition, SurfaceGridModificationSpatialCondition]] = None + else: + actual_instance: Any = None + any_of_schemas: Set[str] = { "SurfaceGridModificationFBFMCondition", "SurfaceGridModificationFuelHeightCondition", "SurfaceGridModificationFuelLoadCondition", "SurfaceGridModificationFuelMoistureCondition", "SurfaceGridModificationSpatialCondition" } + + model_config = { + "validate_assignment": True, + "protected_namespaces": (), } def __init__(self, *args, **kwargs) -> None: @@ -62,41 +67,47 @@ def __init__(self, *args, **kwargs) -> None: super().__init__(**kwargs) @field_validator('actual_instance') - def actual_instance_must_validate_oneof(cls, v): + def actual_instance_must_validate_anyof(cls, v): instance = SurfaceGridModificationCondition.model_construct() error_messages = [] - match = 0 + # validate data type: SurfaceGridModificationSpatialCondition + if not isinstance(v, SurfaceGridModificationSpatialCondition): + error_messages.append(f"Error! Input type `{type(v)}` is not `SurfaceGridModificationSpatialCondition`") + else: + return v + # validate data type: SurfaceGridModificationFBFMCondition if not isinstance(v, SurfaceGridModificationFBFMCondition): error_messages.append(f"Error! Input type `{type(v)}` is not `SurfaceGridModificationFBFMCondition`") else: - match += 1 + return v + # validate data type: SurfaceGridModificationFuelLoadCondition if not isinstance(v, SurfaceGridModificationFuelLoadCondition): error_messages.append(f"Error! Input type `{type(v)}` is not `SurfaceGridModificationFuelLoadCondition`") else: - match += 1 + return v + # validate data type: SurfaceGridModificationFuelHeightCondition if not isinstance(v, SurfaceGridModificationFuelHeightCondition): error_messages.append(f"Error! Input type `{type(v)}` is not `SurfaceGridModificationFuelHeightCondition`") else: - match += 1 + return v + # validate data type: SurfaceGridModificationFuelMoistureCondition if not isinstance(v, SurfaceGridModificationFuelMoistureCondition): error_messages.append(f"Error! Input type `{type(v)}` is not `SurfaceGridModificationFuelMoistureCondition`") else: - match += 1 - if match > 1: - # more than 1 match - raise ValueError("Multiple matches found when setting `actual_instance` in SurfaceGridModificationCondition with oneOf schemas: SurfaceGridModificationFBFMCondition, SurfaceGridModificationFuelHeightCondition, SurfaceGridModificationFuelLoadCondition, SurfaceGridModificationFuelMoistureCondition. Details: " + ", ".join(error_messages)) - elif match == 0: + return v + + if error_messages: # no match - raise ValueError("No match found when setting `actual_instance` in SurfaceGridModificationCondition with oneOf schemas: SurfaceGridModificationFBFMCondition, SurfaceGridModificationFuelHeightCondition, SurfaceGridModificationFuelLoadCondition, SurfaceGridModificationFuelMoistureCondition. Details: " + ", ".join(error_messages)) + raise ValueError("No match found when setting the actual_instance in SurfaceGridModificationCondition with anyOf schemas: SurfaceGridModificationFBFMCondition, SurfaceGridModificationFuelHeightCondition, SurfaceGridModificationFuelLoadCondition, SurfaceGridModificationFuelMoistureCondition, SurfaceGridModificationSpatialCondition. Details: " + ", ".join(error_messages)) else: return v @classmethod - def from_dict(cls, obj: Union[str, Dict[str, Any]]) -> Self: + def from_dict(cls, obj: Dict[str, Any]) -> Self: return cls.from_json(json.dumps(obj)) @classmethod @@ -104,39 +115,40 @@ def from_json(cls, json_str: str) -> Self: """Returns the object represented by the json string""" instance = cls.model_construct() error_messages = [] - match = 0 - - # deserialize data into SurfaceGridModificationFBFMCondition + # anyof_schema_1_validator: Optional[SurfaceGridModificationSpatialCondition] = None + try: + instance.actual_instance = SurfaceGridModificationSpatialCondition.from_json(json_str) + return instance + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # anyof_schema_2_validator: Optional[SurfaceGridModificationFBFMCondition] = None try: instance.actual_instance = SurfaceGridModificationFBFMCondition.from_json(json_str) - match += 1 + return instance except (ValidationError, ValueError) as e: - error_messages.append(str(e)) - # deserialize data into SurfaceGridModificationFuelLoadCondition + error_messages.append(str(e)) + # anyof_schema_3_validator: Optional[SurfaceGridModificationFuelLoadCondition] = None try: instance.actual_instance = SurfaceGridModificationFuelLoadCondition.from_json(json_str) - match += 1 + return instance except (ValidationError, ValueError) as e: - error_messages.append(str(e)) - # deserialize data into SurfaceGridModificationFuelHeightCondition + error_messages.append(str(e)) + # anyof_schema_4_validator: Optional[SurfaceGridModificationFuelHeightCondition] = None try: instance.actual_instance = SurfaceGridModificationFuelHeightCondition.from_json(json_str) - match += 1 + return instance except (ValidationError, ValueError) as e: - error_messages.append(str(e)) - # deserialize data into SurfaceGridModificationFuelMoistureCondition + error_messages.append(str(e)) + # anyof_schema_5_validator: Optional[SurfaceGridModificationFuelMoistureCondition] = None try: instance.actual_instance = SurfaceGridModificationFuelMoistureCondition.from_json(json_str) - match += 1 + return instance except (ValidationError, ValueError) as e: - error_messages.append(str(e)) + error_messages.append(str(e)) - if match > 1: - # more than 1 match - raise ValueError("Multiple matches found when deserializing the JSON string into SurfaceGridModificationCondition with oneOf schemas: SurfaceGridModificationFBFMCondition, SurfaceGridModificationFuelHeightCondition, SurfaceGridModificationFuelLoadCondition, SurfaceGridModificationFuelMoistureCondition. Details: " + ", ".join(error_messages)) - elif match == 0: + if error_messages: # no match - raise ValueError("No match found when deserializing the JSON string into SurfaceGridModificationCondition with oneOf schemas: SurfaceGridModificationFBFMCondition, SurfaceGridModificationFuelHeightCondition, SurfaceGridModificationFuelLoadCondition, SurfaceGridModificationFuelMoistureCondition. Details: " + ", ".join(error_messages)) + raise ValueError("No match found when deserializing the JSON string into SurfaceGridModificationCondition with anyOf schemas: SurfaceGridModificationFBFMCondition, SurfaceGridModificationFuelHeightCondition, SurfaceGridModificationFuelLoadCondition, SurfaceGridModificationFuelMoistureCondition, SurfaceGridModificationSpatialCondition. Details: " + ", ".join(error_messages)) else: return instance @@ -150,7 +162,7 @@ def to_json(self) -> str: else: return json.dumps(self.actual_instance) - def to_dict(self) -> Optional[Union[Dict[str, Any], SurfaceGridModificationFBFMCondition, SurfaceGridModificationFuelHeightCondition, SurfaceGridModificationFuelLoadCondition, SurfaceGridModificationFuelMoistureCondition]]: + def to_dict(self) -> Optional[Union[Dict[str, Any], SurfaceGridModificationFBFMCondition, SurfaceGridModificationFuelHeightCondition, SurfaceGridModificationFuelLoadCondition, SurfaceGridModificationFuelMoistureCondition, SurfaceGridModificationSpatialCondition]]: """Returns the dict representation of the actual instance""" if self.actual_instance is None: return None @@ -158,7 +170,6 @@ def to_dict(self) -> Optional[Union[Dict[str, Any], SurfaceGridModificationFBFMC if hasattr(self.actual_instance, "to_dict") and callable(self.actual_instance.to_dict): return self.actual_instance.to_dict() else: - # primitive type return self.actual_instance def to_str(self) -> str: diff --git a/fastfuels_sdk/client_library/models/surface_grid_modification_spatial_condition.py b/fastfuels_sdk/client_library/models/surface_grid_modification_spatial_condition.py new file mode 100644 index 0000000..ddb4bad --- /dev/null +++ b/fastfuels_sdk/client_library/models/surface_grid_modification_spatial_condition.py @@ -0,0 +1,108 @@ +# coding: utf-8 + +""" + FastFuels API + + A JSON API for creating, editing, and retrieving 3D fuels data for next generation fire behavior models. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional +from fastfuels_sdk.client_library.models.geo_json_crs import GeoJsonCRS +from fastfuels_sdk.client_library.models.geometry1 import Geometry1 +from fastfuels_sdk.client_library.models.spatial_operator import SpatialOperator +from fastfuels_sdk.client_library.models.spatial_target import SpatialTarget +from typing import Optional, Set +from typing_extensions import Self + +class SurfaceGridModificationSpatialCondition(BaseModel): + """ + Spatial condition for surface grid modifications. Selects cells based on their spatial relationship to a GeoJSON geometry. This enables modifications to be applied to specific geographic areas, such as multiplying fuel load within a polygon or reducing fuel depth outside a protected area. Examples: Select cells within a polygon: { \"operator\": \"within\", \"geometry\": { \"type\": \"Polygon\", \"coordinates\": [[[-120.5, 39.0], [-120.5, 39.5], ...]] } } Select cells outside an area using cell bounds: { \"operator\": \"outside\", \"target\": \"cell\", \"geometry\": {...} } With explicit CRS (UTM Zone 10N): { \"operator\": \"intersects\", \"geometry\": {...}, \"crs\": {\"type\": \"name\", \"properties\": {\"name\": \"EPSG:32610\"}} } + """ # noqa: E501 + operator: SpatialOperator = Field(description="The spatial relationship to test: 'within' (inside geometry), 'outside' (not inside geometry), or 'intersects' (overlaps geometry).") + target: Optional[SpatialTarget] = Field(default=None, description="Which part of the cell to test against the geometry: 'centroid' (cell center point) or 'cell' (entire cell bounds).") + geometry: Geometry1 + crs: Optional[GeoJsonCRS] = None + __properties: ClassVar[List[str]] = ["operator", "target", "geometry", "crs"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of SurfaceGridModificationSpatialCondition from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of geometry + if self.geometry: + _dict['geometry'] = self.geometry.to_dict() + # override the default output from pydantic by calling `to_dict()` of crs + if self.crs: + _dict['crs'] = self.crs.to_dict() + # set to None if crs (nullable) is None + # and model_fields_set contains the field + if self.crs is None and "crs" in self.model_fields_set: + _dict['crs'] = None + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of SurfaceGridModificationSpatialCondition from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "operator": obj.get("operator"), + "target": obj.get("target"), + "geometry": Geometry1.from_dict(obj["geometry"]) if obj.get("geometry") is not None else None, + "crs": GeoJsonCRS.from_dict(obj["crs"]) if obj.get("crs") is not None else None + }) + return _obj + +