{"openapi":"3.1.0","info":{"title":"GeoInsight OGC API - DGGS","description":"DGGS data retrieval per OGC 21-038r1. Admin endpoints (/admin/*) are localhost-only and intentionally undocumented here.","license":{"name":""},"version":"0.1.2"},"paths":{"/":{"get":{"tags":["root"],"operationId":"root_handler","responses":{"200":{"description":"Get root"}}}},"/collections":{"get":{"tags":["Collections"],"operationId":"utoipa_doc","responses":{"200":{"description":"Get Collections","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionsResponse"}},"text/html":{"schema":{"type":"string"}}}}}}},"/collections/{collection_id}":{"get":{"tags":["Collection ID"],"operationId":"collection_id_utoipa_doc","parameters":[{"name":"collection_id","in":"path","description":"Collection identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Get Collection ID","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionIdResponse"}},"text/html":{"schema":{"type":"string"}}}}}}},"/collections/{collection_id}/dggs":{"get":{"tags":["DGGS"],"operationId":"collection_id_utoipa_doc","parameters":[{"name":"collection_id","in":"path","description":"Collection identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Get collection_id DGGS's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DggsResponse"}},"text/html":{"schema":{"type":"string"}}}}}}},"/collections/{collection_id}/dggs/{dggrs_id}":{"get":{"tags":["DGGRS ID"],"operationId":"collection_id_dggrs_id_utoipa_doc","parameters":[{"name":"collection_id","in":"path","description":"Collection identifier","required":true,"schema":{"type":"string"}},{"name":"dggrs_id","in":"path","description":"DGGRS_ID identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Get collection_id DGGRS","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DggrsIdResponse"}},"text/html":{"schema":{"type":"string"}}}}}}},"/collections/{collection_id}/dggs/{dggrs_id}/zones":{"get":{"tags":["Zones"],"operationId":"collection_id_dggrs_id_utoipa_doc","parameters":[{"name":"collection_id","in":"path","description":"Collection identifier","required":true,"schema":{"type":"string"}},{"name":"dggrs_id","in":"path","description":"DGGRS identifier","required":true,"schema":{"type":"string"}},{"name":"refined-geometry","in":"query","description":"Densify zone geometry by interpolating additional points along edges. Default: true.","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Get ZONES","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZonesResponse"}},"text/html":{"schema":{"type":"string"}},"application/geo+json":{"schema":{"type":"string"}},"application/vnd.apache.parquet":{"schema":{"type":"string"}},"application/vnd.geo+parquet":{"schema":{"type":"string"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/collections/{collection_id}/dggs/{dggrs_id}/zones/{zone_id}":{"get":{"tags":["Zone ID"],"operationId":"collection_id_dggrs_id_zone_id_utoipa_doc","parameters":[{"name":"collection_id","in":"path","description":"Collection identifier","required":true,"schema":{"type":"string"}},{"name":"dggrs_id","in":"path","description":"DGGRS identifier","required":true,"schema":{"type":"string"}},{"name":"zone_id","in":"path","description":"Zone identifier","required":true,"schema":{"type":"string"}},{"name":"refined-geometry","in":"query","description":"Densify zone geometry by interpolating additional points along edges. Default: true.","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Get ZONES","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZoneIdResponse"}},"text/html":{"schema":{"type":"string"}},"application/geo+json":{"schema":{"type":"string"}}}}}}},"/collections/{collection_id}/dggs/{dggrs_id}/zones/{zone_id}/data":{"get":{"tags":["Data"],"operationId":"collection_id_dggrs_id_zone_id_data_utoipa_doc","parameters":[{"name":"collection_id","in":"path","description":"Collection identifier","required":true,"schema":{"type":"string"}},{"name":"dggrs_id","in":"path","description":"DGGRS identifier","required":true,"schema":{"type":"string"}},{"name":"zone_id","in":"path","description":"Zone identifier","required":true,"schema":{"type":"string"}},{"name":"f","in":"query","description":"Response format. Accepted values: `json`, `dggs+json`, `geo+json`, `html`, `parquet`, `geoparquet`. Defaults to content negotiation via the `Accept` header.","required":false,"schema":{"type":"string"}},{"name":"zone-depth","in":"query","description":"Relative depth of child zones to aggregate. Accepts a single integer (e.g. `1`) or a comma-separated list (e.g. `1,2`). Defaults to the DGGRS-defined default depth.","required":false,"schema":{"type":"string"}},{"name":"datetime","in":"query","description":"Temporal filter in RFC 3339 format. Accepts an instant (`2024-01-01T00:00:00Z`) or an interval (`2024-01-01/2025-01-01`). Open-ended intervals use `..` (e.g. `2024-01-01/..`).","required":false,"schema":{"type":"string"}},{"name":"properties","in":"query","description":"Comma-separated list of queryable names to include in the response (e.g. `ndvi,evi`). Returns all queryables when omitted.","required":false,"schema":{"type":"string"}},{"name":"exclude-properties","in":"query","description":"Comma-separated list of queryable names to exclude from the response. Applied after `properties`.","required":false,"schema":{"type":"string"}},{"name":"refined-geometry","in":"query","description":"Densify zone geometry by interpolating additional points along edges. Relevant for geo+json and geoparquet formats. Default: false.","required":false,"schema":{"type":"boolean"}},{"name":"cog-url","in":"query","description":"URL of an arbitrary COG to query directly. Used on the /dggs/{dggrs_id}/zones/{zone_id}/data route (no collection). Bypasses collection lookup and caching.","required":false,"schema":{"type":"string"}},{"name":"cog-stat","in":"query","description":"Comma-separated statistics for a cog-url query (e.g. mean,min,max). Accepted values: count, valid, min, max, mean, median. Defaults to mean.","required":false,"schema":{"type":"string"}},{"name":"cog-band","in":"query","description":"Comma-separated 1-based band indices to read (e.g. 1,2,3). Defaults to 1.","required":false,"schema":{"type":"string"}},{"name":"cog-no-data-value","in":"query","description":"Override the COG no-data value. Pixels equal to this value are excluded from statistics. Applies to all raster sources (STAC, URL, direct COG). Overrides the collection-level default.","required":false,"schema":{"type":"number","format":"double"}},{"name":"cog-sampling-factor","in":"query","description":"Sampling density multiplier relative to zone count. Higher values increase accuracy. Defaults to 8.0.","required":false,"schema":{"type":"number","format":"double"}},{"name":"cog-all-touched","in":"query","description":"When true, include pixels whose boundaries are only touched by zone polygons. Defaults to false.","required":false,"schema":{"type":"boolean"}},{"name":"stac-search-strategy","in":"query","description":"STAC search strategy: `single` (default), `latest`, or `mosaic`. `latest` takes the newest item with no intersection check; `single` takes the newest item individually meeting the intersection threshold; `mosaic` accumulates items newest-first until their combined footprint reaches the coverage target (requires a `datetime` range). Overrides the collection-level default.","required":false,"schema":{"type":"string"}},{"name":"intersection_percent","in":"query","description":"Intersection percentage (0–100) of the parent zone. For `single`: minimum that the chosen item alone must cover (`0` disables the check, default). For `mosaic`: total combined coverage target (unset = 100%). Ignored for `latest`. Overrides the collection-level default.","required":false,"schema":{"type":"number","format":"double"}},{"name":"cloud_cover_percent","in":"query","description":"Maximum `eo:cloud_cover` percentage (0–100) allowed for STAC items. Omit to disable the filter (default). Overrides the collection-level default.","required":false,"schema":{"type":"number","format":"double"}}],"responses":{"200":{"description":"Get DATA","content":{"application/vnd.ogc.dggs+json":{"schema":{"$ref":"#/components/schemas/DataResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DataResponse"}},"application/geo+json":{"schema":{"type":"string"}},"text/html":{"schema":{"type":"string"}},"application/vnd.apache.parquet":{"schema":{"type":"string"}},"application/vnd.geo+parquet":{"schema":{"type":"string"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/collections/{collection_id}/items":{"get":{"tags":["Items"],"operationId":"items_utoipa_doc","parameters":[{"name":"collection_id","in":"path","description":"Collection identifier","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Page size (default 10, max 1000)","required":false,"schema":{"type":"integer","minimum":0}},{"name":"offset","in":"query","description":"0-based row offset into the lake parquet; numberMatched - limit pages the tail of the data","required":false,"schema":{"type":"integer","minimum":0}},{"name":"bbox","in":"query","description":"Spatial filter min_x,min_y,max_x,max_y (CRS84 lon/lat); rows whose geometry intersects the box. Uses bbox_* zonemap columns and/or ST_Intersects on the geometry column","required":false,"schema":{"type":"string"}},{"name":"datetime","in":"query","description":"Temporal filter on the datetime column: RFC 3339 instant or interval (start/end, start/.., ../end)","required":false,"schema":{"type":"string"}},{"name":"properties","in":"query","description":"Comma-separated columns to keep (geometry is retained for geojson/geoparquet unless excluded explicitly)","required":false,"schema":{"type":"string"}},{"name":"exclude-properties","in":"query","description":"Comma-separated columns to drop","required":false,"schema":{"type":"string"}},{"name":"filter","in":"query","description":"CQL2 filter expression over the parquet columns, e.g. population > 10000 AND name LIKE 'A%'","required":false,"schema":{"type":"string"}},{"name":"filter-lang","in":"query","description":"Language of filter: cql2-text (default) or cql2-json","required":false,"schema":{"type":"string"}},{"name":"f","in":"query","description":"Format: geojson (default, FeatureCollection), json (raw inspection view with files, columns and WKB previews), html (table view), parquet (page as a parquet file), geoparquet (page as GeoParquet)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"One page of the collection's raw lake parquet rows","content":{"application/geo+json":{"schema":{"$ref":"#/components/schemas/FeatureCollectionResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/RawItemsResponse"}},"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Invalid collection id or parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No parquet data in the lake for this collection","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"406":{"description":"Unsupported format (png, tiff)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/collections/{collection_id}/items/{feature_id}":{"get":{"tags":["Items"],"operationId":"item_id_utoipa_doc","parameters":[{"name":"collection_id","in":"path","description":"Collection identifier","required":true,"schema":{"type":"string"}},{"name":"feature_id","in":"path","description":"0-based row index in lake parquet glob scan order (within the filtered set when bbox/datetime are given); only stable while the lake prefix does not change","required":true,"schema":{"type":"integer","minimum":0}},{"name":"bbox","in":"query","description":"Spatial filter min_x,min_y,max_x,max_y (CRS84 lon/lat)","required":false,"schema":{"type":"string"}},{"name":"datetime","in":"query","description":"Temporal filter on the datetime column: RFC 3339 instant or interval","required":false,"schema":{"type":"string"}},{"name":"properties","in":"query","description":"Comma-separated columns to keep","required":false,"schema":{"type":"string"}},{"name":"exclude-properties","in":"query","description":"Comma-separated columns to drop","required":false,"schema":{"type":"string"}},{"name":"filter","in":"query","description":"CQL2 filter expression over the parquet columns","required":false,"schema":{"type":"string"}},{"name":"filter-lang","in":"query","description":"Language of filter: cql2-text (default) or cql2-json","required":false,"schema":{"type":"string"}},{"name":"f","in":"query","description":"Format: geojson (default, Feature), json (raw row), html (property table), parquet / geoparquet (single-row file)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"A single raw lake parquet row","content":{"application/geo+json":{"schema":{"$ref":"#/components/schemas/FeatureResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/RawItemResponse"}},"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Invalid collection id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Collection has no lake data or feature_id is out of range","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"406":{"description":"Unsupported format (png, tiff)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/collections/{collection_id}/queryables":{"get":{"tags":["Collections"],"operationId":"queryables_utoipa_doc","parameters":[{"name":"collection_id","in":"path","description":"Collection identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Queryables of the collection","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchemaResponse"}}}},"404":{"description":"Collection not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/collections/{collection_id}/schema":{"get":{"tags":["Collections"],"operationId":"schema_utoipa_doc","parameters":[{"name":"collection_id","in":"path","description":"Collection identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Logical schema of the collection","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchemaResponse"}}}},"404":{"description":"Collection not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/concepts":{"get":{"tags":["Concepts"],"operationId":"concepts_utoipa_doc","responses":{"200":{"description":"List of concepts (taxonomy)"},"503":{"description":"Datastore not initialized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/concepts/{concept_id}":{"get":{"tags":["Concept ID"],"operationId":"concept_id_utoipa_doc","parameters":[{"name":"concept_id","in":"path","description":"Concept identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Get Concept ID","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConceptIdResponse"}},"text/html":{"schema":{"type":"string"}}}}}}},"/conformance":{"get":{"tags":["Conformance"],"operationId":"conformance_utoipa_doc","responses":{"200":{"description":"Conformance declaration"},"503":{"description":"Datastore not initialized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/dggs":{"get":{"tags":["DGGS"],"operationId":"utoipa_doc","responses":{"200":{"description":"Get DGGS's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DggsResponse"}},"text/html":{"schema":{"type":"string"}}}}}}},"/dggs/{dggrs_id}":{"get":{"tags":["DGGRS ID"],"operationId":"dggrs_id_utoipa_doc","parameters":[{"name":"dggrs_id","in":"path","description":"DGGRS_ID identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Get DGGRS_ID","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DggrsIdResponse"}},"text/html":{"schema":{"type":"string"}}}}}}},"/dggs/{dggrs_id}/zones":{"get":{"tags":["Zones"],"operationId":"dggrs_id_utoipa_doc","parameters":[{"name":"dggrs_id","in":"path","description":"DGGRS identifier","required":true,"schema":{"type":"string"}},{"name":"refined-geometry","in":"query","description":"Densify zone geometry by interpolating additional points along edges. Default: true.","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Get ZONES","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZonesResponse"}},"text/html":{"schema":{"type":"string"}},"application/geo+json":{"schema":{"type":"string"}},"application/vnd.apache.parquet":{"schema":{"type":"string"}},"application/vnd.geo+parquet":{"schema":{"type":"string"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/dggs/{dggrs_id}/zones/{zone_id}":{"get":{"tags":["Zone ID"],"operationId":"dggrs_id_zone_id_utoipa_doc","parameters":[{"name":"dggrs_id","in":"path","description":"DGGRS identifier","required":true,"schema":{"type":"string"}},{"name":"zone_id","in":"path","description":"Zone identifier","required":true,"schema":{"type":"string"}},{"name":"refined-geometry","in":"query","description":"Densify zone geometry by interpolating additional points along edges. Default: true.","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Get ZONES","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZoneIdResponse"}},"text/html":{"schema":{"type":"string"}},"application/geo+json":{"schema":{"type":"string"}}}}}}},"/dggs/{dggrs_id}/zones/{zone_id}/data":{"get":{"tags":["Data"],"operationId":"dggs_id_zone_id_data_utoipa_doc","parameters":[{"name":"dggrs_id","in":"path","description":"DGGRS identifier","required":true,"schema":{"type":"string"}},{"name":"zone_id","in":"path","description":"Zone identifier","required":true,"schema":{"type":"string"}},{"name":"cog-url","in":"query","description":"URL of an arbitrary COG to query directly (required on this collection-less route).","required":false,"schema":{"type":"string"}},{"name":"f","in":"query","description":"Response format; see the collection-scoped variant for the full parameter list.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Zone data computed from the given COG"},"400":{"description":"Missing cog-url","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"tags":["Data"],"operationId":"dggs_id_zone_id_data_post_utoipa_doc","parameters":[{"name":"dggrs_id","in":"path","description":"DGGRS identifier","required":true,"schema":{"type":"string"}},{"name":"zone_id","in":"path","description":"Zone identifier","required":true,"schema":{"type":"string"}},{"name":"f","in":"query","description":"Response format. Accepted values: `json`, `dggs+json`, `geo+json`, `html`, `parquet`, `geoparquet`. Defaults to content negotiation via the `Accept` header.","required":false,"schema":{"type":"string"}},{"name":"zone-depth","in":"query","description":"Relative depth of child zones to aggregate. Accepts a single integer (e.g. `1`) or a comma-separated list (e.g. `1,2`). Defaults to the DGGRS-defined default depth.","required":false,"schema":{"type":"string"}},{"name":"datetime","in":"query","description":"Temporal filter in RFC 3339 format. Accepts an instant (`2024-01-01T00:00:00Z`) or an interval (`2024-01-01/2025-01-01`). Open-ended intervals use `..` (e.g. `2024-01-01/..`).","required":false,"schema":{"type":"string"}},{"name":"refined-geometry","in":"query","description":"Densify zone geometry by interpolating additional points along edges. Relevant for geo+json and geoparquet formats. Default: false.","required":false,"schema":{"type":"boolean"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrossCollectionRequest"}}},"required":true},"responses":{"200":{"description":"Data from several collections, joined on zone id","content":{"application/vnd.ogc.dggs+json":{"schema":{"$ref":"#/components/schemas/DataResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DataResponse"}},"application/geo+json":{"schema":{"type":"string"}},"text/html":{"schema":{"type":"string"}},"application/vnd.apache.parquet":{"schema":{"type":"string"}},"application/vnd.geo+parquet":{"schema":{"type":"string"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/orders":{"get":{"tags":["Orders"],"operationId":"orders_utoipa_doc","responses":{"200":{"description":"List all orders"},"401":{"description":"Missing or invalid bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Datastore not initialized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"tags":["Orders"],"operationId":"create_order_utoipa_doc","responses":{"200":{"description":"Order created; processing jobs are spawned"},"401":{"description":"Missing or invalid bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/orders/{order_id}":{"get":{"tags":["Orders"],"operationId":"order_id_utoipa_doc","parameters":[{"name":"order_id","in":"path","description":"Order identifier","required":true,"schema":{"type":"integer","format":"int32","minimum":0}}],"responses":{"200":{"description":"Order with its jobs"},"401":{"description":"Missing or invalid bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Order not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/orders/{order_id}/jobs":{"get":{"tags":["Orders"],"operationId":"jobs_utoipa_doc","parameters":[{"name":"order_id","in":"path","description":"Order identifier","required":true,"schema":{"type":"integer","format":"int32","minimum":0}}],"responses":{"200":{"description":"Jobs of the order"},"401":{"description":"Missing or invalid bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/orders/{order_id}/jobs/{job_id}":{"get":{"tags":["Orders"],"operationId":"job_id_utoipa_doc","parameters":[{"name":"order_id","in":"path","description":"Order identifier","required":true,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"job_id","in":"path","description":"Job identifier","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"Job status"},"401":{"description":"Missing or invalid bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}}},"components":{"schemas":{"ApiError":{"type":"object","description":"API error response body for JSON error messages.","required":["code","message"],"properties":{"code":{"type":"integer","format":"int32","description":"HTTP status code","example":422,"minimum":0},"hint":{"type":["string","null"],"description":"Optional hint to help client fix the request","example":"Parameter `parent-zone-level` is required when `parent-zone` is provided"},"message":{"type":"string","description":"Fixed message describing the error","example":"Validation Failed"}}},"CollectionId":{"type":"object","required":["id","links"],"properties":{"attribution":{"type":["string","null"]},"crs":{"type":["array","null"],"items":{"type":"string"}},"description":{"type":["string","null"]},"extent":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Extent"}]},"id":{"type":"string"},"item_type":{"type":["string","null"]},"links":{"type":"array","items":{"$ref":"#/components/schemas/Link"}},"title":{"type":["string","null"]}}},"CollectionIdResponse":{"type":"object","required":["id","links"],"properties":{"attribution":{"type":["string","null"]},"crs":{"type":["array","null"],"items":{"type":"string"}},"description":{"type":["string","null"]},"extent":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Extent"}]},"id":{"type":"string"},"item_type":{"type":["string","null"]},"links":{"type":"array","items":{"$ref":"#/components/schemas/Link"}},"title":{"type":["string","null"]}}},"CollectionSelectionBody":{"type":"object","description":"One collection's selection: which fields, optionally filtered and renamed.","required":["id","fields"],"properties":{"alias":{"type":["string","null"],"description":"Overrides the `id` as the output column prefix. Needed to list the same\ncollection twice (e.g. under two different filters), which would\notherwise collide on `id__field`."},"fields":{"type":"array","items":{"type":"string"},"description":"Fields to return from this collection's schema. Required and non-empty:\nthere is deliberately no wildcard, so the response column set does not\nsilently change when a collection's schema gains a field."},"filter":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/FilterSpec","description":"A CQL2 predicate restricting which of this collection's source rows\ncontribute to each zone's value. Only supported for DuckDB-backed\ncollections."}]},"id":{"type":"string","description":"The collection to read from."}}},"CollectionsResponse":{"type":"object","required":["links","collections"],"properties":{"collections":{"type":"array","items":{"$ref":"#/components/schemas/CollectionId"}},"links":{"type":"array","items":{"$ref":"#/components/schemas/Link"}}}},"ConceptCollectionResponse":{"type":"object","required":["id","properties"],"properties":{"id":{"type":"string"},"properties":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/SchemaProperty"},"propertyNames":{"type":"string"}}}},"ConceptIdResponse":{"type":"object","required":["id","name","ui_label","ui_description","category","processing","collections"],"properties":{"category":{"type":"string"},"collections":{"type":"array","items":{"$ref":"#/components/schemas/ConceptCollectionResponse"}},"id":{"type":"integer","format":"int32","minimum":0},"name":{"type":"string"},"processing":{"type":"array","items":{"$ref":"#/components/schemas/ConceptProcessingResponse"}},"ui_description":{"type":"string"},"ui_label":{"type":"string"}}},"ConceptProcessingResponse":{"type":"object","required":["derived_indice","dggs_refinement_level"],"properties":{"color_ramp":{"type":["string","null"]},"derived_indice":{"type":"string"},"dggs_refinement_level":{"type":"integer","format":"int32"},"notes":{"type":["string","null"]}}},"CrossCollectionRequest":{"type":"object","description":"A cross-collection data request.","required":["collections"],"properties":{"collections":{"type":"array","items":{"$ref":"#/components/schemas/CollectionSelectionBody"},"description":"One entry per collection to read from. Must not be empty."}}},"DataResponse":{"type":"object","required":["dggrs","zoneId","depths","links"],"properties":{"defaultDepth":{"type":["integer","null"],"format":"int32"},"depths":{"type":"array","items":{"type":"integer","format":"int32"}},"dggrs":{"type":"string"},"dimensions":{"type":["array","null"],"items":{"$ref":"#/components/schemas/Dimension"}},"links":{"type":"array","items":{"$ref":"#/components/schemas/Link"}},"schema":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Schema"}]},"zoneId":{"type":"string"}}},"DggrsId":{"type":"object","required":["id","title","uri","links"],"properties":{"id":{"type":"string"},"links":{"type":"array","items":{"$ref":"#/components/schemas/Link"}},"title":{"type":"string"},"uri":{"type":"string"}}},"DggrsIdResponse":{"type":"object","required":["id","title","uri"],"properties":{"crs":{"type":["array","null"],"items":{"type":"string"}},"default_depth":{"type":["integer","null"],"format":"int32"},"description":{"type":["string","null"]},"id":{"type":"string"},"linkTemplates":{"type":"array","items":{"$ref":"#/components/schemas/LinkTemplate"}},"links":{"type":"array","items":{"$ref":"#/components/schemas/Link"}},"max_refinement_level":{"type":["integer","null"],"format":"int32"},"max_relative_depth":{"type":["integer","null"],"format":"int32"},"title":{"type":"string"},"uri":{"type":"string"}}},"DggsResponse":{"type":"object","required":["links","dggrs"],"properties":{"dggrs":{"type":"array","items":{"$ref":"#/components/schemas/DggrsId"}},"links":{"type":"array","items":{"$ref":"#/components/schemas/Link"}}}},"Dimension":{"type":"object","required":["name","grid","interval"],"properties":{"definition":{"type":["string","null"]},"grid":{"$ref":"#/components/schemas/Grid"},"interval":{"type":"array","items":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/NumStr"}]}},"name":{"type":"string"},"unit":{"type":["string","null"]},"unitLang":{"type":["string","null"]}}},"Extent":{"type":"object","properties":{"spatial":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Spatial"}]},"temporal":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Temporal"}]}}},"FeatureCollectionResponse":{"type":"object","description":"OGC API Features `getFeatures` response over the collection's lake parquet.","required":["type","timeStamp","numberMatched","numberReturned","features","links"],"properties":{"features":{"type":"array","items":{"$ref":"#/components/schemas/FeatureResponse"}},"links":{"type":"array","items":{"$ref":"#/components/schemas/Link"}},"numberMatched":{"type":"integer","format":"int64"},"numberReturned":{"type":"integer","minimum":0},"timeStamp":{"type":"string"},"type":{"type":"string"}}},"FeatureResponse":{"type":"object","description":"A single GeoJSON Feature read from the lake parquet. `id` is the 0-based\nrow index in glob scan order (the raw parquet carries no guaranteed id\ncolumn) — only stable while the lake prefix doesn't change.","required":["type","id","geometry","properties"],"properties":{"geometry":{"type":"object"},"id":{"type":"integer","minimum":0},"links":{"type":"array","items":{"$ref":"#/components/schemas/Link"}},"properties":{"type":"object"},"type":{"type":"string"}}},"FileInfo":{"type":"object","description":"One parquet file under the collection's lake data prefix with its row count.","required":["file","rows"],"properties":{"file":{"type":"string"},"rows":{"type":"integer","format":"int64"}}},"FilterSpec":{"oneOf":[{"type":"string","description":"CQL2-Text, e.g. `\"length > 500\"`."},{"type":"object","description":"CQL2-JSON, e.g. `{\"op\": \">\", \"args\": [{\"property\": \"length\"}, 500]}`."}],"description":"A CQL2 filter in either encoding. A JSON object is CQL2-JSON, a string is\nCQL2-Text; the JSON type discriminates, so no `filter-lang` is needed."},"Grid":{"type":"object","required":["cellsCount"],"properties":{"boundCoordinates":{"type":["array","null"],"items":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/NumStr"}]}},"cellsCount":{"type":"integer","format":"int32","minimum":0},"coordinates":{"type":["array","null"],"items":{"$ref":"#/components/schemas/NumStr"}},"firstCoordinate":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/NumStr"}]},"relativeBounds":{"type":["array","null"],"items":{"$ref":"#/components/schemas/NumStr"}},"resolution":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/NumStr"}]}}},"Link":{"type":"object","required":["href","rel"],"properties":{"href":{"type":"string"},"hreflang":{"type":["string","null"]},"length":{"type":["integer","null"],"format":"int64"},"rel":{"type":"string"},"title":{"type":["string","null"]},"type":{"type":["string","null"]}}},"LinkTemplate":{"type":"object","required":["rel","title","uriTemplate"],"properties":{"rel":{"type":"string"},"title":{"type":"string"},"uriTemplate":{"type":"string"}}},"NumStr":{"oneOf":[{"type":"object","required":["U8"],"properties":{"U8":{"type":"integer","format":"int32","minimum":0}}},{"type":"object","required":["String"],"properties":{"String":{"type":"string"}}}]},"PropertyType":{"type":"string","enum":["array","boolean","integer","null","number","object","string"]},"RawItemResponse":{"type":"object","description":"Raw inspection view of a single row (`/items/{feature_id}?f=json`).","required":["collection","source","numberMatched","feature_id","item","links"],"properties":{"collection":{"type":"string"},"feature_id":{"type":"integer","minimum":0},"item":{"type":"object"},"links":{"type":"array","items":{"$ref":"#/components/schemas/Link"}},"numberMatched":{"type":"integer","format":"int64"},"source":{"type":"string","description":"The `read_parquet` glob the row was read from."}}},"RawItemsResponse":{"type":"object","description":"Raw inspection view (`f=json`): rows exactly as they sit in the lake\nparquet (geometry as a truncated WKB hex preview), plus the file list and\nrow counts a local `SELECT * FROM read_parquet('s3://…')` would show.","required":["collection","source","numberMatched","numberReturned","limit","offset","files","columns","items","links"],"properties":{"collection":{"type":"string"},"columns":{"type":"array","items":{"type":"string"}},"files":{"type":"array","items":{"$ref":"#/components/schemas/FileInfo"}},"items":{"type":"array","items":{"type":"object"}},"limit":{"type":"integer","minimum":0},"links":{"type":"array","items":{"$ref":"#/components/schemas/Link"}},"numberMatched":{"type":"integer","format":"int64"},"numberReturned":{"type":"integer","minimum":0},"offset":{"type":"integer","minimum":0},"source":{"type":"string","description":"The `read_parquet` glob the rows were read from."}}},"RootResponse":{"type":"object","required":["links"],"properties":{"attribution":{"type":["string","null"]},"description":{"type":["string","null"]},"links":{"type":"array","items":{"$ref":"#/components/schemas/Link"}},"title":{"type":["string","null"]}}},"Schema":{"type":"object","required":["type","properties"],"properties":{"properties":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/SchemaProperty"},"propertyNames":{"type":"string"}},"required":{"type":["array","null"],"items":{"type":"string"}},"type":{"$ref":"#/components/schemas/SchemaType"}}},"SchemaProperty":{"type":"object","description":"A single property in JSON Schema format, per OGC API - Features Part 3 §7.3.","required":["title","type"],"properties":{"description":{"type":["string","null"]},"enum":{"type":["array","null"],"items":{"type":"string"}},"format":{"type":["string","null"]},"gi_band_index":{"type":["integer","null"],"format":"int32"},"gi_data_type":{"type":["string","null"]},"gi_dggs_stat":{"type":["string","null"]},"gi_gsd":{"type":["number","null"],"format":"double"},"gi_unit":{"type":["string","null"]},"maxLength":{"type":["integer","null"],"format":"int32"},"maximum":{"type":["number","null"],"format":"double"},"minLength":{"type":["integer","null"],"format":"int32"},"minimum":{"type":["number","null"],"format":"double"},"pattern":{"type":["string","null"]},"title":{"type":"string"},"type":{"type":"string"}}},"SchemaResponse":{"type":"object","description":"OGC JSON Schema response used by both `/schema` and `/queryables`.","required":["$schema","$id","type","title","properties","additionalProperties"],"properties":{"$id":{"type":"string"},"$schema":{"type":"string"},"additionalProperties":{"type":"boolean"},"description":{"type":["string","null"]},"properties":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/SchemaProperty"},"propertyNames":{"type":"string"}},"title":{"type":"string"},"type":{"type":"string"}}},"SchemaType":{"type":"string","enum":["object"]},"Spatial":{"type":"object","properties":{"bbox":{"type":["array","null"],"items":{"type":"array","items":{"type":"number","format":"double"}}},"crs":{"type":["string","null"]}}},"Temporal":{"type":"object","properties":{"interval":{"type":["array","null"],"items":{"type":"array","items":{"type":"string"}}},"trs":{"type":["string","null"]}}},"ValueItem":{"type":"object","properties":{"average":{"type":["number","null"],"format":"double"},"maximum":{"type":["number","null"],"format":"double"},"minimum":{"type":["number","null"],"format":"double"},"stdDev":{"type":["number","null"],"format":"double"}}},"ZoneIdResponse":{"type":"object","required":["id","links"],"properties":{"areaMetersSquare":{"type":["number","null"],"format":"double"},"bbox":{"type":["array","null"],"items":{"type":"number","format":"double"},"description":"[min_lon, min_lat, max_lon, max_lat] per OGC DGGS API spec"},"centroid":{"type":["array","null"],"items":{"type":"number","format":"double"},"description":"[lon, lat] per OGC DGGS API spec"},"crs":{"type":["string","null"]},"geometry":{"type":"object"},"id":{"type":"string"},"level":{"type":["integer","null"],"format":"int32","minimum":0},"links":{"type":"array","items":{"$ref":"#/components/schemas/Link"}},"shapeType":{"type":["string","null"]},"statistics":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/ValueItem"},"propertyNames":{"type":"string"}},"temporalDurationSeconds":{"type":["number","null"],"format":"double"},"temporalInterval":{"type":["array","null"],"items":{"type":"string"}},"volumeMetersCube":{"type":["number","null"],"format":"double"}}},"ZonesResponse":{"type":"object","required":["zones","links"],"properties":{"linkTemplates":{"type":"array","items":{"$ref":"#/components/schemas/LinkTemplate"}},"links":{"type":"array","items":{"$ref":"#/components/schemas/Link"}},"returnedAreaMetersSquare":{"type":["number","null"],"format":"double"},"zones":{"type":"array","items":{"type":"string"}}}}}}}