{ "components": { "schemas": { "AIAvailabilityResponse": { "description": "Public-safe AI readiness signal.\n\nThe response exposes no provider, model, or key details. Editors with\n``use_ai_chat`` can use it without access to the admin-only AI status.", "properties": { "available": { "title": "Available", "type": "boolean" } }, "required": [ "available" ], "title": "AIAvailabilityResponse", "type": "object" }, "AIProbeCheck": { "description": "Result of one live provider check (chat or embeddings).", "properties": { "configured": { "description": "Whether this purpose has a provider key configured. False means no probe call was made.", "title": "Configured", "type": "boolean" }, "ok": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "description": "Whether the live provider call succeeded. None when not configured (no call was made).", "title": "Ok" }, "status": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "HTTP status returned by the provider on failure, when available.", "title": "Status" }, "error": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Short sanitized failure reason. Never contains the key or raw provider error bodies.", "title": "Error" } }, "required": [ "configured" ], "title": "AIProbeCheck", "type": "object" }, "AIProbeReport": { "description": "Per-purpose live provider probe results (admin ai-status ?probe=true).", "properties": { "chat": { "$ref": "#/components/schemas/AIProbeCheck" }, "embeddings": { "$ref": "#/components/schemas/AIProbeCheck" } }, "required": [ "chat", "embeddings" ], "title": "AIProbeReport", "type": "object" }, "AIStatusResponse": { "properties": { "provider": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Active AI provider name (e.g. 'anthropic', 'openai').", "title": "Provider" }, "model": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Active model name (e.g. 'claude-sonnet-4-20250514').", "title": "Model" }, "enabled": { "description": "Whether AI features are enabled for this instance.", "title": "Enabled", "type": "boolean" }, "configured": { "description": "Whether an API key is configured. AI features require both 'enabled' and 'configured'.", "title": "Configured", "type": "boolean" }, "semantic_search_enabled": { "default": false, "description": "Whether pgvector-backed semantic search is enabled.", "title": "Semantic Search Enabled", "type": "boolean" }, "has_embeddings": { "default": false, "description": "Whether at least one record has embeddings stored.", "title": "Has Embeddings", "type": "boolean" }, "probe": { "anyOf": [ { "$ref": "#/components/schemas/AIProbeReport" }, { "type": "null" } ], "description": "Live provider probe results. Only present when the request opted in via ?probe=true." } }, "required": [ "provider", "model", "enabled", "configured" ], "title": "AIStatusResponse", "type": "object" }, "AIStatusUpdate": { "properties": { "enabled": { "description": "Set to true to enable AI features (chat, generation, semantic search), false to disable.", "title": "Enabled", "type": "boolean" } }, "required": [ "enabled" ], "title": "AIStatusUpdate", "type": "object" }, "AddColumnRequest": { "properties": { "column": { "$ref": "#/components/schemas/ColumnDef" } }, "required": [ "column" ], "title": "AddColumnRequest", "type": "object" }, "AddDatasetsResponse": { "properties": { "added": { "title": "Added", "type": "integer" } }, "required": [ "added" ], "title": "AddDatasetsResponse", "type": "object" }, "AdminApiKeyCreateRequest": { "properties": { "user_id": { "description": "ID of the user the new API key will belong to.", "format": "uuid", "title": "User Id", "type": "string" }, "name": { "description": "Human-readable label for the API key (e.g. 'CI pipeline', 'QGIS desktop').", "maxLength": 255, "minLength": 1, "title": "Name", "type": "string" }, "expires_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "Optional expiry timestamp (RFC 3339, timezone-aware). Omit or null for a non-expiring key; expired keys stop authenticating.", "title": "Expires At" }, "scope": { "default": "full", "description": "Privilege scope. 'full' impersonates the owner completely. 'read_only' authenticates GET, HEAD and OPTIONS requests only; any other method is refused with 403. A service-account key minted for an application is the usual case for 'read_only'.", "enum": [ "full", "read_only" ], "title": "Scope", "type": "string" } }, "required": [ "user_id", "name" ], "title": "AdminApiKeyCreateRequest", "type": "object" }, "AdminApiKeyListItem": { "properties": { "id": { "description": "Unique API key identifier.", "format": "uuid", "title": "Id", "type": "string" }, "user_id": { "description": "Owning user's ID.", "format": "uuid", "title": "User Id", "type": "string" }, "name": { "description": "Human-readable label.", "title": "Name", "type": "string" }, "fingerprint": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Non-secret key identifier; null for legacy keys.", "title": "Fingerprint" }, "is_active": { "description": "Whether the key is active. Inactive keys cannot authenticate.", "title": "Is Active", "type": "boolean" }, "expires_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "Expiry timestamp; null means the key does not expire.", "title": "Expires At" }, "scope": { "description": "Privilege scope: 'full' or 'read_only'.", "title": "Scope", "type": "string" }, "created_at": { "description": "Timestamp when the key was created.", "format": "date-time", "title": "Created At", "type": "string" }, "last_used_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "Timestamp of the most recent successful authentication using this key.", "title": "Last Used At" } }, "required": [ "id", "user_id", "name", "fingerprint", "is_active", "scope", "created_at", "last_used_at" ], "title": "AdminApiKeyListItem", "type": "object" }, "AdminApiKeyListResponse": { "properties": { "items": { "description": "Page of API keys.", "items": { "$ref": "#/components/schemas/AdminApiKeyListItem" }, "title": "Items", "type": "array" }, "total": { "description": "Total number of API keys matching the query.", "title": "Total", "type": "integer" } }, "required": [ "items", "total" ], "title": "AdminApiKeyListResponse", "type": "object" }, "AdminEmbedTokenListResponse": { "properties": { "tokens": { "items": { "$ref": "#/components/schemas/AdminEmbedTokenResponse" }, "title": "Tokens", "type": "array" }, "total": { "title": "Total", "type": "integer" } }, "required": [ "tokens", "total" ], "title": "AdminEmbedTokenListResponse", "type": "object" }, "AdminEmbedTokenResponse": { "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "map_id": { "format": "uuid", "title": "Map Id", "type": "string" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Name" }, "token_hint": { "title": "Token Hint", "type": "string" }, "scoped_dataset_ids": { "items": { "type": "string" }, "title": "Scoped Dataset Ids", "type": "array" }, "allowed_origins": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Allowed Origins" }, "expires_at": { "format": "date-time", "title": "Expires At", "type": "string" }, "is_active": { "title": "Is Active", "type": "boolean" }, "use_count": { "default": 0, "title": "Use Count", "type": "integer" }, "last_used_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Last Used At" }, "created_at": { "format": "date-time", "title": "Created At", "type": "string" }, "map_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Map Name" }, "creator_username": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Creator Username" } }, "required": [ "id", "map_id", "token_hint", "scoped_dataset_ids", "expires_at", "is_active", "created_at" ], "title": "AdminEmbedTokenResponse", "type": "object" }, "AdminJobListResponse": { "properties": { "jobs": { "description": "Page of ingestion jobs.", "items": { "$ref": "#/components/schemas/AdminJobResponse" }, "title": "Jobs", "type": "array" }, "total": { "description": "Total number of jobs matching the query.", "title": "Total", "type": "integer" } }, "required": [ "jobs", "total" ], "title": "AdminJobListResponse", "type": "object" }, "AdminJobResponse": { "properties": { "id": { "description": "Unique ingestion job identifier.", "format": "uuid", "title": "Id", "type": "string" }, "status": { "description": "Current job status: 'pending', 'running', 'complete', 'failed', 'cancelled', or 'fanned_out' (a multi-layer upload split into per-layer child jobs).", "enum": [ "pending", "running", "complete", "failed", "cancelled", "fanned_out" ], "title": "Status", "type": "string" }, "source_filename": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Original filename of the uploaded file, if applicable.", "title": "Source Filename" }, "dataset_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "description": "ID of the dataset created by this job, if completed successfully.", "title": "Dataset Id" }, "error_message": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Error details if the job failed.", "title": "Error Message" }, "error_code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Stable code for a fixed failure reason, so a client can show it in the reader's language; `error_message` keeps its English text. Null when the reason is free text.", "title": "Error Code" }, "review_state": { "anyOf": [ { "enum": [ "awaiting", "resolved" ], "type": "string" }, { "type": "null" } ], "description": "Set on a replacement the pipeline held for review rather than failed: 'awaiting' while the held run still needs a decision, 'resolved' once it was accepted. Null for every other job.", "title": "Review State" }, "can_retry": { "description": "Whether the failed job can be retried with its retained source.", "title": "Can Retry", "type": "boolean" }, "retry_reason": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Why the job cannot be retried, when retry is unavailable.", "title": "Retry Reason" }, "source_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "URL a service or file URL import was started from, with userinfo and credential query values redacted. Null for every other job.", "title": "Source Url" }, "restart_source": { "anyOf": [ { "enum": [ "url", "service" ], "type": "string" }, { "type": "null" } ], "description": "Import tab a failed job whose retry is refused can be started again from: 'url' for a file URL import, 'service' for a service import. Null otherwise.", "title": "Restart Source" }, "user_metadata": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Metadata captured with the job: the fields supplied at upload and commit (title, summary, tags, visibility, file_type, vrt_type, etc.) and outcomes such as warnings. Heterogeneous shape across ingest paths. Worker bookkeeping, such as staging keys and unpublished artifacts, is left out; null when nothing else is recorded.", "title": "User Metadata" }, "created_by": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "description": "ID of the user who initiated the job.", "title": "Created By" }, "username": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Username of the user who initiated the job.", "title": "Username" }, "started_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "Timestamp when the worker began processing the job.", "title": "Started At" }, "completed_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "Timestamp when the job finished (success or failure).", "title": "Completed At" }, "created_at": { "description": "Timestamp when the job was queued.", "format": "date-time", "title": "Created At", "type": "string" } }, "required": [ "id", "status", "source_filename", "dataset_id", "error_message", "can_retry", "retry_reason", "user_metadata", "created_by", "username", "started_at", "completed_at", "created_at" ], "title": "AdminJobResponse", "type": "object" }, "AdminPasswordReset": { "description": "Request body for POST /admin/users/{user_id}/reset-password/.\n\nSingle-purpose for the same reason as SamlToLocalConversion above: the\ngeneric UserUpdate schema has no password field, so an admin-set password\nlands as its own audited action ('user.password_reset') rather than\ndisappearing into 'user.update'.", "properties": { "password": { "description": "Replacement password for the account (policy: min 12 chars, 3+ character classes, at most 72 bytes UTF-8). The user can change this after their next login.", "maxLength": 256, "minLength": 8, "title": "Password", "type": "string" } }, "required": [ "password" ], "title": "AdminPasswordReset", "type": "object" }, "AdminShareTokenListResponse": { "properties": { "tokens": { "items": { "$ref": "#/components/schemas/AdminShareTokenResponse" }, "title": "Tokens", "type": "array" }, "total": { "title": "Total", "type": "integer" } }, "required": [ "tokens", "total" ], "title": "AdminShareTokenListResponse", "type": "object" }, "AdminShareTokenResponse": { "properties": { "id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Id" }, "map_id": { "format": "uuid", "title": "Map Id", "type": "string" }, "map_name": { "title": "Map Name", "type": "string" }, "token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Token" }, "is_active": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Is Active" }, "expires_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Expires At" }, "created_at": { "format": "date-time", "title": "Created At", "type": "string" }, "created_by": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Created By" }, "embed_token_count": { "default": 0, "title": "Embed Token Count", "type": "integer" } }, "required": [ "map_id", "map_name", "created_at", "created_by" ], "title": "AdminShareTokenResponse", "type": "object" }, "AdminUserCreate": { "properties": { "username": { "description": "Login username (3-150 chars). Must be unique across the system.", "maxLength": 150, "minLength": 3, "title": "Username", "type": "string" }, "password": { "description": "Initial password (policy: min 12 chars, 3+ character classes, at most 72 bytes UTF-8). The user can change this after first login.", "maxLength": 256, "minLength": 8, "title": "Password", "type": "string" }, "email": { "anyOf": [ { "format": "email", "maxLength": 255, "type": "string" }, { "type": "null" } ], "description": "Optional email address. Used for OAuth account linking and notifications.", "title": "Email" }, "role": { "default": "viewer", "description": "User role: 'admin', 'editor', or 'viewer'. Defaults to 'viewer'.", "title": "Role", "type": "string" } }, "required": [ "username", "password" ], "title": "AdminUserCreate", "type": "object" }, "AlterColumnTypeRequest": { "properties": { "new_type": { "description": "New column type: text/integer/real/boolean/date/timestamp.", "title": "New Type", "type": "string" } }, "required": [ "new_type" ], "title": "AlterColumnTypeRequest", "type": "object" }, "AnalysisMaterializeRequest": { "description": "Parameters for materializing an analysis result as a new dataset.", "properties": { "operation": { "enum": [ "buffer", "centroid", "clip", "dissolve", "spatial_join", "measure", "select_by_location", "intersect" ], "title": "Operation", "type": "string" }, "title": { "maxLength": 500, "minLength": 1, "title": "Title", "type": "string" }, "distance_meters": { "anyOf": [ { "exclusiveMinimum": 0.0, "maximum": 100000.0, "type": "number" }, { "type": "null" } ], "description": "Buffer distance in meters (buffer only)", "title": "Distance Meters" }, "mask": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "GeoJSON Polygon or MultiPolygon geometry in EPSG:4326 (clip and select_by_location)", "title": "Mask" }, "mask_dataset_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "description": "Polygon dataset supplying the second layer: the area clipped to, selected against, or overlaid with. For clip and select_by_location it is the alternative to `mask`; for intersect it is REQUIRED and `mask` is rejected, because an overlay carries the second layer's attributes onto its output and a drawn polygon has none.", "title": "Mask Dataset Id" }, "by_field": { "anyOf": [ { "maxLength": 63, "type": "string" }, { "type": "null" } ], "description": "Optional group-by column for dissolve", "title": "By Field" }, "join_dataset_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "description": "Dataset to join against; each source feature gains a count of the features from it that intersect (spatial_join only)", "title": "Join Dataset Id" }, "join_fields": { "anyOf": [ { "items": { "type": "string" }, "maxItems": 10, "type": "array" }, { "type": "null" } ], "description": "Columns to copy from the intersecting join feature, prefixed 'join_' in the output. Ties break on the lowest join-layer gid (spatial_join only)", "title": "Join Fields" }, "filter": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "CQL2-JSON filter on the source dataset, in the language /collections/{dataset_id}/items accepts as filter-lang=cql2-json. Only the features it keeps are analysed, counted, and checked against the operation's size limit.", "title": "Filter" }, "mask_filter": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "CQL2-JSON filter on the mask_dataset_id layer: only its matching features form the mask or overlay. Requires mask_dataset_id.", "title": "Mask Filter" }, "join_filter": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "CQL2-JSON filter on the join layer: only its matching features are joined (spatial_join only).", "title": "Join Filter" } }, "required": [ "operation", "title" ], "title": "AnalysisMaterializeRequest", "type": "object" }, "AnalysisMaterializeResponse": { "description": "Async materialize job handle; poll GET /jobs/{job_id} for progress.", "properties": { "job_id": { "format": "uuid", "title": "Job Id", "type": "string" }, "status": { "title": "Status", "type": "string" } }, "required": [ "job_id", "status" ], "title": "AnalysisMaterializeResponse", "type": "object" }, "AnalysisPreviewRequest": { "description": "Parameters for a synchronous analysis preview.\n\nDeliberately flat (no discriminated union) so SDK generators keep the\nendpoint; per-operation requiredness is enforced by the validator.", "properties": { "operation": { "enum": [ "buffer", "centroid", "clip", "spatial_join", "measure", "select_by_location", "intersect" ], "title": "Operation", "type": "string" }, "distance_meters": { "anyOf": [ { "exclusiveMinimum": 0.0, "maximum": 100000.0, "type": "number" }, { "type": "null" } ], "description": "Buffer distance in meters (buffer only)", "title": "Distance Meters" }, "mask": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "GeoJSON Polygon or MultiPolygon geometry in EPSG:4326 (clip and select_by_location)", "title": "Mask" }, "mask_dataset_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "description": "Polygon dataset supplying the second layer: the area clipped to, selected against, or overlaid with. For clip and select_by_location it is the alternative to `mask`; for intersect it is REQUIRED and `mask` is rejected, because an overlay carries the second layer's attributes onto its output and a drawn polygon has none.", "title": "Mask Dataset Id" }, "join_dataset_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "description": "Dataset to join against; each source feature gains a count of the features from it that intersect (spatial_join only)", "title": "Join Dataset Id" }, "join_fields": { "anyOf": [ { "items": { "type": "string" }, "maxItems": 10, "type": "array" }, { "type": "null" } ], "description": "Columns to copy from the intersecting join feature, prefixed 'join_' in the output. Ties break on the lowest join-layer gid (spatial_join only)", "title": "Join Fields" }, "bbox": { "anyOf": [ { "items": { "type": "number" }, "type": "array" }, { "type": "null" } ], "description": "[minx, miny, maxx, maxy] in EPSG:4326, typically the map's current viewport. When present, only source features intersecting the envelope are considered before the preview's row cap applies, so a capped result reflects what is on screen rather than an arbitrary sample in ingest order. Applies to every operation, not just one, so it is deliberately absent from _ANALYSIS_PARAM_OWNERS \u2014 omit it to preview the whole dataset, unchanged from before this field existed.", "title": "Bbox" }, "filter": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "CQL2-JSON filter on the source dataset, in the language /collections/{dataset_id}/items accepts as filter-lang=cql2-json. Only the features it keeps are analysed, counted, and checked against the operation's size limit.", "title": "Filter" }, "mask_filter": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "CQL2-JSON filter on the mask_dataset_id layer: only its matching features form the mask or overlay. Requires mask_dataset_id.", "title": "Mask Filter" }, "join_filter": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "CQL2-JSON filter on the join layer: only its matching features are joined (spatial_join only).", "title": "Join Filter" } }, "required": [ "operation" ], "title": "AnalysisPreviewRequest", "type": "object" }, "AnalysisPreviewResponse": { "description": "GeoJSON FeatureCollection preview of an analysis operation.", "properties": { "geojson": { "additionalProperties": true, "title": "Geojson", "type": "object" }, "feature_count": { "title": "Feature Count", "type": "integer" }, "truncated": { "title": "Truncated", "type": "boolean" }, "bbox": { "anyOf": [ { "items": { "type": "number" }, "type": "array" }, { "type": "null" } ], "title": "Bbox" }, "source_feature_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Total feature count of the source dataset (1:1 operations only; null when the operation filters rows, e.g. clip). When the request carried a bbox or a filter this is a live count of the rows intersecting the bbox and matching the filter rather than the dataset's cached whole-table total. It is also null, like match_count, when that live count could not be computed within the query budget", "title": "Source Feature Count" }, "match_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Exact total across the WHOLE source, not just the previewed features \u2014 WHOLE meaning the request's bbox when one was sent, the same sense source_feature_count uses that word, and always within the request's layer filters. What it counts is per-operation, so read it against the operation you sent rather than as one number: select_by_location gives the selected source features and intersect gives the output pieces, and for both of those it IS the output total; spatial_join gives intersecting source/join PAIRS, which is NOT the output total, because the join keeps every source row (use source_feature_count for that operation). intersect and spatial_join both scope this total to a bbox on the request; select_by_location's count is a separate uncapped query the request's bbox does not reach, so it stays unscoped even though its preview rows are viewport-limited too. Null for operations that report no such total, and when the count could not be computed within the query budget", "title": "Match Count" } }, "required": [ "geojson", "feature_count", "truncated" ], "title": "AnalysisPreviewResponse", "type": "object" }, "ApiKeyCreateRequest": { "properties": { "name": { "description": "Human-readable label for the API key", "maxLength": 255, "minLength": 1, "title": "Name", "type": "string" }, "expires_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "Optional expiry timestamp (RFC 3339, timezone-aware). Omit or null for a non-expiring key; expired keys stop authenticating.", "title": "Expires At" }, "scope": { "default": "full", "description": "Privilege scope. 'full' impersonates the owner completely. 'read_only' authenticates GET, HEAD and OPTIONS requests only; any other method is refused with 403.", "enum": [ "full", "read_only" ], "title": "Scope", "type": "string" } }, "required": [ "name" ], "title": "ApiKeyCreateRequest", "type": "object" }, "ApiKeyCreateResponse": { "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "key": { "description": "The API key secret (shown only once)", "title": "Key", "type": "string" }, "fingerprint": { "description": "Non-secret key identifier (prefix and last four characters)", "title": "Fingerprint", "type": "string" }, "name": { "title": "Name", "type": "string" }, "expires_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "Expiry timestamp; null means the key does not expire", "title": "Expires At" }, "scope": { "description": "Privilege scope: 'full' or 'read_only'", "title": "Scope", "type": "string" }, "created_at": { "format": "date-time", "title": "Created At", "type": "string" } }, "required": [ "id", "key", "fingerprint", "name", "scope", "created_at" ], "title": "ApiKeyCreateResponse", "type": "object" }, "ApiKeyListItem": { "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "name": { "title": "Name", "type": "string" }, "fingerprint": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Non-secret key identifier; null for keys created before fingerprint support", "title": "Fingerprint" }, "is_active": { "title": "Is Active", "type": "boolean" }, "expires_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "Expiry timestamp; null means the key does not expire", "title": "Expires At" }, "scope": { "description": "Privilege scope: 'full' or 'read_only'", "title": "Scope", "type": "string" }, "created_at": { "format": "date-time", "title": "Created At", "type": "string" }, "last_used_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Last Used At" } }, "required": [ "id", "name", "fingerprint", "is_active", "scope", "created_at", "last_used_at" ], "title": "ApiKeyListItem", "type": "object" }, "ApiKeyListResponse": { "properties": { "items": { "items": { "$ref": "#/components/schemas/ApiKeyListItem" }, "title": "Items", "type": "array" }, "total": { "title": "Total", "type": "integer" } }, "required": [ "items", "total" ], "title": "ApiKeyListResponse", "type": "object" }, "ApiKeyStatusResponse": { "description": "Response for GET /settings/api-key-status/.", "properties": { "anthropic_configured": { "description": "Whether ANTHROPIC_API_KEY is set in the environment.", "title": "Anthropic Configured", "type": "boolean" }, "openai_configured": { "description": "Whether OPENAI_API_KEY is set in the environment.", "title": "Openai Configured", "type": "boolean" } }, "required": [ "anthropic_configured", "openai_configured" ], "title": "ApiKeyStatusResponse", "type": "object" }, "ApproveRequest": { "properties": { "role": { "description": "Role to assign to the approved user: 'admin', 'editor', or 'viewer'.", "maxLength": 50, "title": "Role", "type": "string" } }, "required": [ "role" ], "title": "ApproveRequest", "type": "object" }, "ArcGISSignInRequest": { "description": "Portal address plus the credentials one generateToken call needs.\n\nNo character policy on the two credential fields, deliberately. They are\nform-encoded into the outbound body, which percent-escapes every value,\nso neither a control character nor a separator can smuggle a second field\ninto the request the way one can into a header line. The length bounds\nare here to keep an absurd body from reaching the portal at all.", "properties": { "portal_url": { "description": "ArcGIS portal URL, for example https://your-org.maps.arcgis.com. The /sharing/rest base is accepted too.", "maxLength": 2048, "minLength": 1, "title": "Portal Url", "type": "string" }, "username": { "description": "ArcGIS account name to sign in with.", "maxLength": 256, "minLength": 1, "title": "Username", "type": "string" }, "password": { "description": "Password for that ArcGIS account.", "maxLength": 1024, "minLength": 1, "title": "Password", "type": "string" } }, "required": [ "portal_url", "username", "password" ], "title": "ArcGISSignInRequest", "type": "object" }, "ArcGISSignInResponse": { "description": "The minted portal token and nothing else about the account.", "properties": { "token": { "description": "Short-lived ArcGIS portal token. Use it as the `token` field on probe, preview, commit and refresh.", "title": "Token", "type": "string" }, "expires_at": { "description": "UTC instant at which the portal stops accepting the token.", "format": "date-time", "title": "Expires At", "type": "string" } }, "required": [ "token", "expires_at" ], "title": "ArcGISSignInResponse", "type": "object" }, "AttributeMetadataListResponse": { "properties": { "attributes": { "items": { "$ref": "#/components/schemas/AttributeMetadataResponse" }, "title": "Attributes", "type": "array" }, "total": { "title": "Total", "type": "integer" } }, "required": [ "attributes", "total" ], "title": "AttributeMetadataListResponse", "type": "object" }, "AttributeMetadataResponse": { "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "dataset_id": { "format": "uuid", "title": "Dataset Id", "type": "string" }, "field_name": { "title": "Field Name", "type": "string" }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Title" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Description" }, "data_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Data Type" }, "units": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Units" }, "domain_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Domain Type" }, "semantic_role": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Inferred role: geometry, identifier, measure, etc.", "title": "Semantic Role" }, "example_values": { "anyOf": [ { "items": {}, "type": "array" }, { "type": "null" } ], "description": "Sample values from the column", "title": "Example Values" }, "ordinal_position": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Column position in the table (1-based)", "title": "Ordinal Position" }, "is_nullable": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Is Nullable" }, "is_current": { "description": "False if column was removed in a later version", "title": "Is Current", "type": "boolean" }, "user_modified_fields": { "description": "Field names manually edited by a user", "items": { "type": "string" }, "title": "User Modified Fields", "type": "array" } }, "required": [ "id", "dataset_id", "field_name", "title", "description", "data_type", "units", "domain_type", "is_current", "user_modified_fields" ], "title": "AttributeMetadataResponse", "type": "object" }, "AttributeMetadataUpdate": { "properties": { "title": { "anyOf": [ { "maxLength": 500, "type": "string" }, { "type": "null" } ], "description": "Human-friendly column display name", "title": "Title" }, "description": { "anyOf": [ { "maxLength": 2000, "type": "string" }, { "type": "null" } ], "title": "Description" }, "units": { "anyOf": [ { "maxLength": 50, "type": "string" }, { "type": "null" } ], "description": "Measurement units, e.g. meters, kg", "title": "Units" }, "semantic_role": { "anyOf": [ { "enum": [ "geometry", "identifier", "measure", "temporal", "categorical", "category", "label", "foreign_key", "other" ], "type": "string" }, { "type": "null" } ], "description": "Column role: geometry, identifier, measure, etc.", "title": "Semantic Role" }, "domain_type": { "anyOf": [ { "enum": [ "continuous", "discrete", "categorical", "coded", "codedValue", "boolean", "text", "date", "temporal", "geometry", "range" ], "type": "string" }, { "type": "null" } ], "description": "Value domain: continuous, categorical, coded, etc.", "title": "Domain Type" } }, "title": "AttributeMetadataUpdate", "type": "object" }, "AuditLogListResponse": { "properties": { "logs": { "items": { "$ref": "#/components/schemas/AuditLogResponse" }, "title": "Logs", "type": "array" }, "total": { "title": "Total", "type": "integer" } }, "required": [ "logs", "total" ], "title": "AuditLogListResponse", "type": "object" }, "AuditLogResponse": { "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "user_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "User Id" }, "username": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Username" }, "action": { "title": "Action", "type": "string" }, "resource_type": { "title": "Resource Type", "type": "string" }, "resource_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Resource Id" }, "resource_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Resource Name" }, "details": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Details" }, "ip_address": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Ip Address" }, "created_at": { "format": "date-time", "title": "Created At", "type": "string" } }, "required": [ "id", "user_id", "action", "resource_type", "resource_id", "details", "ip_address", "created_at" ], "title": "AuditLogResponse", "type": "object" }, "BackfillEstimate": { "description": "How long each backfill action should take, before starting one.\n\nBoth figures come from the throughput of the most recent completed run, so\nthey describe this deployment's own provider rather than a generic rate.", "properties": { "missing_seconds": { "description": "Estimated seconds to embed the records that lack a usable vector.", "title": "Missing Seconds", "type": "number" }, "all_seconds": { "description": "Estimated seconds to regenerate every record in the catalog.", "title": "All Seconds", "type": "number" } }, "required": [ "missing_seconds", "all_seconds" ], "title": "BackfillEstimate", "type": "object" }, "BackfillResponse": { "description": "Acknowledgement that a backfill run was queued.\n\nThe response carries no counts because the work runs asynchronously. Poll\n``GET /jobs/{job_id}`` for status.", "properties": { "job_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "description": "Identifier of the queued backfill job; poll /jobs/{job_id}. Null only with status 'already_running' when the caller may not read that run.", "title": "Job Id" }, "status": { "description": "'pending' when this request queued job_id. 'already_running' when an all_tenants request found a run in flight in the calling tenant; job_id is then that run, which this request did not queue. Run the backfill again once it ends.", "title": "Status", "type": "string" }, "other_tenants": { "description": "Runs queued for the other tenants by an all_tenants request in a multi-tenant deployment. Empty otherwise.", "items": { "$ref": "#/components/schemas/BackfillTenantRun" }, "title": "Other Tenants", "type": "array" } }, "required": [ "job_id", "status" ], "title": "BackfillResponse", "type": "object" }, "BackfillRunProgress": { "description": "The embedding backfill run currently holding the single run slot.", "properties": { "job_id": { "description": "Identifier of the run in flight.", "format": "uuid", "title": "Job Id", "type": "string" }, "status": { "description": "Job status: 'pending' or 'running'.", "title": "Status", "type": "string" }, "records_processed": { "description": "Records the run has embedded so far.", "title": "Records Processed", "type": "integer" }, "records_total": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Records the run will embed in total. Null until the run has selected its records.", "title": "Records Total" }, "started_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "When a worker picked the run up.", "title": "Started At" }, "heartbeat_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "Last time the running worker renewed its lease.", "title": "Heartbeat At" } }, "required": [ "job_id", "status", "records_processed" ], "title": "BackfillRunProgress", "type": "object" }, "BackfillRunSummary": { "description": "One finished embedding backfill run.", "properties": { "job_id": { "description": "Identifier of the finished run.", "format": "uuid", "title": "Job Id", "type": "string" }, "status": { "description": "How the run ended: 'complete', 'failed' or 'cancelled'.", "title": "Status", "type": "string" }, "started_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "When a worker picked the run up.", "title": "Started At" }, "finished_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "When the run reached its final status.", "title": "Finished At" }, "records_processed": { "description": "Records the run embedded.", "title": "Records Processed", "type": "integer" }, "records_failed": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Records the run could not embed, when the run recorded a count. A finished run with a non-zero figure here left coverage gaps.", "title": "Records Failed" }, "error_code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Short code identifying how a run failed, when it failed.", "title": "Error Code" } }, "required": [ "job_id", "status", "records_processed" ], "title": "BackfillRunSummary", "type": "object" }, "BackfillTenantRun": { "description": "What an all-tenant backfill request did for one other tenant.", "properties": { "tenant_id": { "description": "The tenant the run was queued for.", "format": "uuid", "title": "Tenant Id", "type": "string" }, "job_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "description": "Identifier of the job queued in that tenant, or null when none was queued.", "title": "Job Id" }, "status": { "description": "'pending' when a run was queued, 'already_running' when that tenant already had one in flight, 'not_queued' when queueing failed.", "enum": [ "pending", "already_running", "not_queued" ], "title": "Status", "type": "string" } }, "required": [ "tenant_id", "job_id", "status" ], "title": "BackfillTenantRun", "type": "object" }, "BasemapConfig": { "additionalProperties": false, "properties": { "label_mode": { "$ref": "#/components/schemas/BasemapLabelMode", "default": "full", "description": "Basemap label prominence." }, "road_visibility": { "$ref": "#/components/schemas/BasemapSublayerVisibility", "default": "full", "description": "Road and transit sublayer visibility where supported." }, "boundary_visibility": { "$ref": "#/components/schemas/BasemapSublayerVisibility", "default": "full", "description": "Administrative boundary sublayer visibility where supported." }, "building_visibility": { "default": true, "description": "Whether supported building/3D building basemap layers are shown.", "title": "Building Visibility", "type": "boolean" }, "land_water_tone": { "$ref": "#/components/schemas/BasemapLandWaterTone", "default": "default", "description": "Land and water color treatment where supported." }, "relief_contrast": { "anyOf": [ { "$ref": "#/components/schemas/BasemapReliefContrast" }, { "type": "null" } ], "description": "Optional contrast hint for relief-oriented basemap styling." }, "opacity": { "default": 1.0, "description": "Master basemap opacity 0.0-1.0", "maximum": 1.0, "minimum": 0.0, "title": "Opacity", "type": "number" }, "background_color": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Map canvas background color in #RRGGBB hex format, or null to use the basemap default.", "title": "Background Color" }, "sublayer_overrides": { "anyOf": [ { "additionalProperties": { "$ref": "#/components/schemas/SublayerOverride" }, "type": "object" }, { "type": "null" } ], "description": "Per-sublayer style overrides keyed by semantic sublayer ID (e.g. 'road', 'boundary', 'building'). The key set is opaque: a sublayer ID this release does not know is accepted and stored rather than rejected.", "title": "Sublayer Overrides" }, "basemap_position": { "anyOf": [ { "$ref": "#/components/schemas/BasemapPosition" }, { "type": "null" } ], "description": "Whether the basemap renders above ('top') or below ('bottom', default) the data layers. null/undefined loads as 'bottom' on the client." }, "projection": { "anyOf": [ { "$ref": "#/components/schemas/BasemapProjection" }, { "type": "null" } ], "description": "Map projection: 'mercator' (default) or experimental 'globe'. null/undefined loads as 'mercator' on the client." } }, "title": "BasemapConfig", "type": "object" }, "BasemapLabelMode": { "enum": [ "full", "subtle", "hidden" ], "title": "BasemapLabelMode", "type": "string" }, "BasemapLandWaterTone": { "enum": [ "default", "muted", "contrast", "monochrome" ], "title": "BasemapLandWaterTone", "type": "string" }, "BasemapPosition": { "description": "Whether the basemap renders below ('bottom', default) or above ('top') data layers.", "enum": [ "bottom", "top" ], "title": "BasemapPosition", "type": "string" }, "BasemapProjection": { "description": "Map projection. 'mercator' (default) or experimental 'globe'.", "enum": [ "mercator", "globe" ], "title": "BasemapProjection", "type": "string" }, "BasemapPublicResponse": { "description": "Public basemap response \u2014 excludes api_key.", "properties": { "id": { "description": "Unique basemap identifier.", "title": "Id", "type": "string" }, "label": { "description": "Display label.", "title": "Label", "type": "string" }, "url": { "description": "Tile URL or style JSON URL with API key already substituted (or omitted) for client use.", "title": "Url", "type": "string" }, "enabled": { "description": "Whether the basemap is currently selectable.", "title": "Enabled", "type": "boolean" }, "is_preset": { "description": "Whether this is a built-in preset.", "title": "Is Preset", "type": "boolean" }, "attribution": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Attribution string for the basemap source.", "title": "Attribution" } }, "required": [ "id", "label", "url", "enabled", "is_preset" ], "title": "BasemapPublicResponse", "type": "object" }, "BasemapReliefContrast": { "enum": [ "soft", "standard", "strong" ], "title": "BasemapReliefContrast", "type": "string" }, "BasemapSublayerVisibility": { "enum": [ "full", "subtle", "hidden" ], "title": "BasemapSublayerVisibility", "type": "string" }, "Body_login_auth_login_post": { "properties": { "grant_type": { "anyOf": [ { "pattern": "^password$", "type": "string" }, { "type": "null" } ], "title": "Grant Type" }, "username": { "title": "Username", "type": "string" }, "password": { "format": "password", "title": "Password", "type": "string" }, "scope": { "default": "", "title": "Scope", "type": "string" }, "client_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Client Id" }, "client_secret": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "format": "password", "title": "Client Secret" } }, "required": [ "username", "password" ], "title": "Body_login_auth_login_post", "type": "object" }, "Body_reupload_dataset_datasets__dataset_id__reupload_post": { "properties": { "file": { "contentMediaType": "application/octet-stream", "title": "File", "type": "string" } }, "required": [ "file" ], "title": "Body_reupload_dataset_datasets__dataset_id__reupload_post", "type": "object" }, "Body_upload_file_ingest_upload_post": { "properties": { "file": { "contentMediaType": "application/octet-stream", "title": "File", "type": "string" }, "kind": { "anyOf": [ { "pattern": "^(tiles3d|pointcloud)$", "type": "string" }, { "type": "null" } ], "description": "'tiles3d' uploads a 3D Tiles tileset as a .zip or .3tz archive holding tileset.json. Omit it for any other file; a .zip without it is read as geospatial data, and a .3tz without it is refused. 'pointcloud' uploads a COPC point cloud as a .laz file; a .laz without it is refused.", "title": "Kind" } }, "required": [ "file" ], "title": "Body_upload_file_ingest_upload_post", "type": "object" }, "Body_upload_map_icon_endpoint_maps_icons_post": { "properties": { "file": { "contentMediaType": "application/octet-stream", "title": "File", "type": "string" } }, "required": [ "file" ], "title": "Body_upload_map_icon_endpoint_maps_icons_post", "type": "object" }, "BrandingResponse": { "description": "Response for GET /settings/branding/.", "properties": { "show_badge": { "description": "Whether to show the 'Powered by GeoLens' label in public and shared footers. Badge-removal writes are restricted controls.", "title": "Show Badge", "type": "boolean" }, "privacy_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Operator-configured privacy-policy URL shown on the login and register pages, or null when unset (no link is shown). Must be an absolute http(s) URL with no embedded credentials; a query string or fragment is allowed and preserved as-is.", "title": "Privacy Url" } }, "required": [ "show_badge" ], "title": "BrandingResponse", "type": "object" }, "BulkDeleteItem": { "properties": { "dataset_id": { "format": "uuid", "title": "Dataset Id", "type": "string" }, "confirm_title": { "maxLength": 500, "title": "Confirm Title", "type": "string" } }, "required": [ "dataset_id", "confirm_title" ], "title": "BulkDeleteItem", "type": "object" }, "BulkDeleteLayersFailure": { "description": "A single layer that could not be deleted.", "properties": { "id": { "title": "Id", "type": "string" }, "reason": { "title": "Reason", "type": "string" } }, "required": [ "id", "reason" ], "title": "BulkDeleteLayersFailure", "type": "object" }, "BulkDeleteLayersRequest": { "description": "Request body for POST /maps/{map_id}/layers/bulk-delete.", "properties": { "layer_ids": { "description": "UUIDs of layers to delete. Must be 1\u2013200 elements (matches _MAX_LAYERS_PER_MAP).", "items": { "format": "uuid", "type": "string" }, "maxItems": 200, "minItems": 1, "title": "Layer Ids", "type": "array" } }, "required": [ "layer_ids" ], "title": "BulkDeleteLayersRequest", "type": "object" }, "BulkDeleteLayersResponse": { "description": "Response body for POST /maps/{map_id}/layers/bulk-delete.", "properties": { "deleted": { "items": { "type": "string" }, "title": "Deleted", "type": "array" }, "failed": { "items": { "$ref": "#/components/schemas/BulkDeleteLayersFailure" }, "title": "Failed", "type": "array" } }, "required": [ "deleted", "failed" ], "title": "BulkDeleteLayersResponse", "type": "object" }, "BulkDeleteRequest": { "properties": { "datasets": { "description": "1-100 datasets to delete", "items": { "$ref": "#/components/schemas/BulkDeleteItem" }, "maxItems": 100, "minItems": 1, "title": "Datasets", "type": "array" } }, "required": [ "datasets" ], "title": "BulkDeleteRequest", "type": "object" }, "BulkDeleteResponse": { "properties": { "deleted": { "title": "Deleted", "type": "integer" }, "errors": { "title": "Errors", "type": "integer" }, "results": { "items": { "$ref": "#/components/schemas/BulkDeleteResultItem" }, "title": "Results", "type": "array" } }, "required": [ "deleted", "errors", "results" ], "title": "BulkDeleteResponse", "type": "object" }, "BulkDeleteResultItem": { "properties": { "dataset_id": { "format": "uuid", "title": "Dataset Id", "type": "string" }, "status": { "title": "Status", "type": "string" }, "detail": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Detail" }, "code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Code" } }, "required": [ "dataset_id", "status" ], "title": "BulkDeleteResultItem", "type": "object" }, "BulkRegisterItem": { "properties": { "table_name": { "description": "PostgreSQL table name to register.", "maxLength": 63, "title": "Table Name", "type": "string" }, "title": { "description": "Human-readable dataset title.", "maxLength": 500, "title": "Title", "type": "string" }, "summary": { "anyOf": [ { "maxLength": 5000, "type": "string" }, { "type": "null" } ], "description": "Optional dataset description.", "title": "Summary" }, "visibility": { "default": "private", "description": "Dataset visibility level.", "enum": [ "private", "restricted", "internal", "public" ], "title": "Visibility", "type": "string" } }, "required": [ "table_name", "title" ], "title": "BulkRegisterItem", "type": "object" }, "BulkRegisterRequest": { "properties": { "tables": { "description": "Tables to register as datasets in a single request, at most 100.", "items": { "$ref": "#/components/schemas/BulkRegisterItem" }, "maxItems": 100, "title": "Tables", "type": "array" } }, "required": [ "tables" ], "title": "BulkRegisterRequest", "type": "object" }, "BulkRegisterResponse": { "properties": { "results": { "description": "Per-table registration results, in the same order as the request.", "items": { "$ref": "#/components/schemas/BulkRegisterResult" }, "title": "Results", "type": "array" } }, "required": [ "results" ], "title": "BulkRegisterResponse", "type": "object" }, "BulkRegisterResult": { "properties": { "table_name": { "description": "Source table that was processed.", "title": "Table Name", "type": "string" }, "status": { "description": "Per-row outcome: 'success', 'skipped', or 'error'.", "title": "Status", "type": "string" }, "dataset_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "description": "ID of the created dataset on success.", "title": "Dataset Id" }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Title of the created dataset on success.", "title": "Title" }, "error": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Error message on failure.", "title": "Error" } }, "required": [ "table_name", "status" ], "title": "BulkRegisterResult", "type": "object" }, "BulkRevokeRequest": { "properties": { "token_ids": { "items": { "format": "uuid", "type": "string" }, "maxItems": 100, "minItems": 1, "title": "Token Ids", "type": "array" } }, "required": [ "token_ids" ], "title": "BulkRevokeRequest", "type": "object" }, "BulkRevokeResponse": { "properties": { "revoked_count": { "title": "Revoked Count", "type": "integer" } }, "required": [ "revoked_count" ], "title": "BulkRevokeResponse", "type": "object" }, "CatalogStatsResponse": { "properties": { "total_datasets": { "description": "Total number of datasets in the catalog.", "title": "Total Datasets", "type": "integer" }, "recent_additions": { "description": "Number of datasets added in the last 30 days.", "title": "Recent Additions", "type": "integer" }, "total_storage_bytes": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Total storage used by all dataset tables, in bytes. Null if calculation is unavailable.", "title": "Total Storage Bytes" }, "datasets_by_geometry_type": { "additionalProperties": { "type": "integer" }, "description": "Histogram of datasets keyed by geometry type (Point, MultiPolygon, etc.).", "title": "Datasets By Geometry Type", "type": "object" }, "datasets_by_visibility": { "additionalProperties": { "type": "integer" }, "description": "Histogram of datasets keyed by visibility level (private, internal, restricted, public).", "title": "Datasets By Visibility", "type": "object" }, "users_by_status": { "additionalProperties": { "type": "integer" }, "default": {}, "description": "Histogram of users keyed by status (active, deactivated, pending).", "title": "Users By Status", "type": "object" }, "total_users": { "default": 0, "description": "Total number of users in the system.", "title": "Total Users", "type": "integer" } }, "required": [ "total_datasets", "recent_additions", "total_storage_bytes", "datasets_by_geometry_type", "datasets_by_visibility" ], "title": "CatalogStatsResponse", "type": "object" }, "ChangePasswordRequest": { "properties": { "current_password": { "maxLength": 256, "minLength": 1, "title": "Current Password", "type": "string" }, "new_password": { "description": "New password (policy: min 12 chars, 3+ character classes: lowercase, uppercase, digits, symbols; at most 72 bytes UTF-8). The min_length=8 here is a schema floor; the runtime validator enforces the full policy.", "maxLength": 256, "minLength": 8, "title": "New Password", "type": "string" } }, "required": [ "current_password", "new_password" ], "title": "ChangePasswordRequest", "type": "object" }, "ChatAction": { "properties": { "type": { "enum": [ "set_filter", "set_style", "set_data_driven_style", "set_label", "toggle_visibility", "add_layer", "remove_layer", "show_query_result", "set_opacity" ], "title": "Type", "type": "string" }, "layer_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Layer Id" }, "expression": { "anyOf": [ { "items": {}, "type": "array" }, { "type": "null" } ], "title": "Expression" }, "paint": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Paint" }, "clear_paint": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Clear Paint" }, "replace_paint": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Replace Paint" }, "style_config": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Style Config" }, "label_config": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Label Config" }, "dataset_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Dataset Id" }, "dataset_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Dataset Name" }, "visible": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Visible" }, "opacity": { "anyOf": [ { "maximum": 1.0, "minimum": 0.0, "type": "number" }, { "type": "null" } ], "title": "Opacity" }, "geojson": { "anyOf": [ { "$ref": "#/components/schemas/GeoJSONFeatureCollection" }, { "type": "null" } ] }, "bbox": { "anyOf": [ { "items": { "type": "number" }, "type": "array" }, { "type": "null" } ], "title": "Bbox" }, "rows": { "anyOf": [ { "items": { "items": {}, "type": "array" }, "type": "array" }, { "type": "null" } ], "title": "Rows" }, "columns": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Columns" }, "row_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Row Count" }, "truncated": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Truncated" }, "operation": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Operation" }, "distance_meters": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Distance Meters" } }, "required": [ "type" ], "title": "ChatAction", "type": "object" }, "ChatHistoryMessage": { "description": "A single message in the conversation history.", "properties": { "role": { "enum": [ "user", "assistant" ], "title": "Role", "type": "string" }, "content": { "maxLength": 20000, "title": "Content", "type": "string" } }, "required": [ "role", "content" ], "title": "ChatHistoryMessage", "type": "object" }, "ChatMapLayer": { "description": "Layer state sent from frontend for chat context.", "properties": { "id": { "title": "Id", "type": "string" }, "name": { "title": "Name", "type": "string" }, "dataset_id": { "title": "Dataset Id", "type": "string" }, "dataset_table_name": { "title": "Dataset Table Name", "type": "string" }, "geometry_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Geometry Type" }, "layer_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Layer Type" }, "column_info": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "title": "Column Info" }, "dataset_title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Dataset Title" }, "feature_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Feature Count" }, "sample_values": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Sample Values" }, "visible": { "default": true, "title": "Visible", "type": "boolean" }, "filter": { "anyOf": [ { "items": {}, "type": "array" }, { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Filter" }, "label_config": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Label Config" }, "style_config": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Style Config" }, "paint": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Paint" } }, "required": [ "id", "name", "dataset_id", "dataset_table_name" ], "title": "ChatMapLayer", "type": "object" }, "ChatRequest": { "properties": { "message": { "maxLength": 2000, "minLength": 1, "title": "Message", "type": "string" }, "map_id": { "title": "Map Id", "type": "string" }, "layers": { "items": { "$ref": "#/components/schemas/ChatMapLayer" }, "maxItems": 50, "title": "Layers", "type": "array" }, "language": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Language" }, "history": { "items": { "$ref": "#/components/schemas/ChatHistoryMessage" }, "maxItems": 20, "title": "History", "type": "array" } }, "required": [ "message", "map_id", "layers" ], "title": "ChatRequest", "type": "object" }, "ChatResponse": { "properties": { "explanation": { "title": "Explanation", "type": "string" }, "actions": { "items": { "$ref": "#/components/schemas/ChatAction" }, "title": "Actions", "type": "array" } }, "required": [ "explanation", "actions" ], "title": "ChatResponse", "type": "object" }, "CollectionAddDatasetsRequest": { "properties": { "dataset_ids": { "description": "Dataset IDs to add to the collection (1-100)", "items": { "format": "uuid", "type": "string" }, "maxItems": 100, "minItems": 1, "title": "Dataset Ids", "type": "array" } }, "required": [ "dataset_ids" ], "title": "CollectionAddDatasetsRequest", "type": "object" }, "CollectionCreate": { "properties": { "name": { "description": "Display name for the collection", "example": "NYC Open Data", "maxLength": 255, "minLength": 1, "title": "Name", "type": "string" }, "description": { "anyOf": [ { "maxLength": 2000, "type": "string" }, { "type": "null" } ], "description": "Optional text description", "example": "Datasets from the NYC Open Data portal", "title": "Description" } }, "required": [ "name" ], "title": "CollectionCreate", "type": "object" }, "CollectionFacetItem": { "description": "A collection facet entry.", "properties": { "id": { "title": "Id", "type": "string" }, "name": { "title": "Name", "type": "string" }, "dataset_count": { "title": "Dataset Count", "type": "integer" } }, "required": [ "id", "name", "dataset_count" ], "title": "CollectionFacetItem", "type": "object" }, "CollectionListResponse": { "properties": { "collections": { "items": { "$ref": "#/components/schemas/CollectionResponse" }, "title": "Collections", "type": "array" }, "total": { "title": "Total", "type": "integer" } }, "required": [ "collections", "total" ], "title": "CollectionListResponse", "type": "object" }, "CollectionRef": { "description": "Minimal reference to a collection a dataset belongs to.", "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "name": { "title": "Name", "type": "string" } }, "required": [ "id", "name" ], "title": "CollectionRef", "type": "object" }, "CollectionResponse": { "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "name": { "title": "Name", "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Description" }, "created_by": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Created By" }, "created_at": { "format": "date-time", "title": "Created At", "type": "string" }, "updated_at": { "format": "date-time", "title": "Updated At", "type": "string" }, "dataset_count": { "title": "Dataset Count", "type": "integer" }, "extent_bbox": { "anyOf": [ { "items": { "type": "number" }, "type": "array" }, { "type": "null" } ], "title": "Extent Bbox" }, "temporal_start": { "anyOf": [ { "format": "date", "type": "string" }, { "type": "null" } ], "title": "Temporal Start" }, "temporal_end": { "anyOf": [ { "format": "date", "type": "string" }, { "type": "null" } ], "title": "Temporal End" } }, "required": [ "id", "name", "description", "created_by", "created_at", "updated_at", "dataset_count" ], "title": "CollectionResponse", "type": "object" }, "CollectionUpdate": { "properties": { "name": { "anyOf": [ { "maxLength": 255, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "Updated display name", "title": "Name" }, "description": { "anyOf": [ { "maxLength": 2000, "type": "string" }, { "type": "null" } ], "description": "Updated description", "title": "Description" } }, "title": "CollectionUpdate", "type": "object" }, "ColumnChange": { "properties": { "name": { "title": "Name", "type": "string" }, "type": { "title": "Type", "type": "string" } }, "required": [ "name", "type" ], "title": "ColumnChange", "type": "object" }, "ColumnDdlEntry": { "description": "A single column-DDL audit event for the owner-facing feed endpoint.\n\nOmits PII beyond the actor's username (no email or sensitive details).\nMirrors AuditLogResponse shape, scoped to column-DDL events only.", "properties": { "action": { "title": "Action", "type": "string" }, "created_at": { "format": "date-time", "title": "Created At", "type": "string" }, "details": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Details" }, "user_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "User Id" }, "username": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Username" } }, "required": [ "action", "created_at", "details", "user_id" ], "title": "ColumnDdlEntry", "type": "object" }, "ColumnDdlFeedResponse": { "description": "Paginated response for GET /api/audit/datasets/{dataset_id}/column-ddl.", "properties": { "items": { "items": { "$ref": "#/components/schemas/ColumnDdlEntry" }, "title": "Items", "type": "array" }, "total": { "title": "Total", "type": "integer" }, "limit": { "title": "Limit", "type": "integer" }, "offset": { "title": "Offset", "type": "integer" } }, "required": [ "items", "total", "limit", "offset" ], "title": "ColumnDdlFeedResponse", "type": "object" }, "ColumnDef": { "properties": { "name": { "title": "Name", "type": "string" }, "type": { "title": "Type", "type": "string" } }, "required": [ "name", "type" ], "title": "ColumnDef", "type": "object" }, "ColumnDefinition": { "properties": { "name": { "title": "Name", "type": "string" }, "type": { "enum": [ "text", "integer", "float", "date", "boolean" ], "title": "Type", "type": "string" } }, "required": [ "name", "type" ], "title": "ColumnDefinition", "type": "object" }, "ColumnInfo": { "description": "Describes a single column in a dataset's attribute table.", "properties": { "name": { "title": "Name", "type": "string" }, "type": { "title": "Type", "type": "string" }, "semantic_role": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Semantic Role" }, "domain_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Domain Type" }, "sample_values": { "anyOf": [ { "items": {}, "type": "array" }, { "type": "null" } ], "title": "Sample Values" }, "stats": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Stats" } }, "required": [ "name", "type" ], "title": "ColumnInfo", "type": "object" }, "ColumnListResponse": { "properties": { "columns": { "items": { "additionalProperties": true, "type": "object" }, "title": "Columns", "type": "array" } }, "required": [ "columns" ], "title": "ColumnListResponse", "type": "object" }, "ColumnPreview": { "properties": { "name": { "title": "Name", "type": "string" }, "type": { "title": "Type", "type": "string" } }, "required": [ "name", "type" ], "title": "ColumnPreview", "type": "object" }, "ColumnReferencesResponse": { "description": "How many saved maps reference a column in their layer config.", "properties": { "map_count": { "description": "Distinct saved maps whose styles/filters/labels/popups reference this column", "title": "Map Count", "type": "integer" } }, "required": [ "map_count" ], "title": "ColumnReferencesResponse", "type": "object" }, "ColumnStatsResponse": { "properties": { "min": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Min" }, "max": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Max" }, "count": { "default": 0, "title": "Count", "type": "integer" }, "mean": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Mean" }, "quantiles": { "default": [], "items": { "type": "number" }, "title": "Quantiles", "type": "array" }, "stddev": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Stddev" }, "data_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "'categorical' for non-numeric columns; null for numeric.", "title": "Data Type" }, "distinct_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Distinct non-null value count (categorical columns only).", "title": "Distinct Count" } }, "title": "ColumnStatsResponse", "type": "object" }, "ColumnValuesResponse": { "properties": { "values": { "items": { "anyOf": [ { "type": "boolean" }, { "type": "string" }, { "type": "integer" }, { "type": "number" }, { "type": "null" } ] }, "title": "Values", "type": "array" }, "count": { "title": "Count", "type": "integer" } }, "required": [ "values", "count" ], "title": "ColumnValuesResponse", "type": "object" }, "CommitRequest": { "description": "Wire-level schema for ``POST /ingest/commit/{job_id}``.\n\nPreserved as a flat union of all possible commit fields so that the\nFastAPI route signature renders correctly in OpenAPI and so that the\nfrontend's ``CommitImportRequest`` TypeScript type stays unchanged.\n\nThe route handler re-validates the body against a subclass chosen by\n``_pick_commit_subclass(job)`` (see ``app.ingest.router``):\n\n - ``VectorCommitRequest`` \u2014 default for file uploads\n - ``RasterCommitRequest`` \u2014 when ``job.user_metadata['file_type'] == 'raster'``\n - ``ServiceCommitRequest`` \u2014 when ``job.source_url`` is set and ``job.file_path`` is None\n - ``TilesetCommitRequest`` \u2014 when ``job.user_metadata['file_type'] == 'tiles3d'``\n\nFor new internal code that constructs a commit view, prefer importing\nthe appropriate subclass directly. This flat class is the wire contract,\nnot an implementation detail.", "properties": { "title": { "description": "Human-readable dataset title.", "maxLength": 500, "minLength": 1, "title": "Title", "type": "string" }, "summary": { "anyOf": [ { "maxLength": 5000, "type": "string" }, { "type": "null" } ], "description": "Optional dataset description shown in the catalog.", "title": "Summary" }, "visibility": { "default": "private", "description": "Dataset visibility level: 'private' (owner-only), 'restricted' (RBAC-controlled), 'internal' (all users), 'public' (anonymous access).", "enum": [ "private", "restricted", "internal", "public" ], "title": "Visibility", "type": "string" }, "srid_override": { "anyOf": [ { "maximum": 998999.0, "minimum": 1.0, "type": "integer" }, { "type": "null" } ], "description": "EPSG code to use when the source CRS is missing or incorrect. Assigns (relabels) the CRS the source is read under rather than reprojecting from it: raster pixel values are unchanged, and vector geometries are reprojected to EPSG:4326 from the assigned CRS as usual.", "title": "Srid Override" }, "token": { "anyOf": [ { "maxLength": 1000, "type": "string" }, { "type": "null" } ], "description": "Optional auth token for a protected remote service, read only when the job imports a service layer (WFS, OGC API Features, or ArcGIS). At most 1000 characters. Never persisted to the database. Ignored on file-upload jobs. Deprecated: use the auth object with method bearer.", "title": "Token" }, "temporal_start": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "ISO 8601 start of the dataset's temporal extent.", "title": "Temporal Start" }, "temporal_end": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "ISO 8601 end of the dataset's temporal extent.", "title": "Temporal End" }, "compression": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Raster only: target compression for COG output (e.g. 'LZW', 'DEFLATE').", "title": "Compression" }, "resampling": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Raster only: resampling method for COG conversion (e.g. 'nearest', 'bilinear', 'cubic').", "title": "Resampling" }, "nodata_override": { "anyOf": [ { "type": "number" }, { "type": "string" }, { "type": "null" } ], "description": "Raster only: nodata value to use when source has none defined.", "title": "Nodata Override" }, "layer_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Multi-layer source only: name of the specific layer to ingest.", "title": "Layer Name" }, "x_column": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "CSV/Excel only: name of the longitude/X coordinate column.", "title": "X Column" }, "y_column": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "CSV/Excel only: name of the latitude/Y coordinate column.", "title": "Y Column" }, "geom_column": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "CSV/Excel only: name of the WKT geometry column (alternative to x_column/y_column).", "title": "Geom Column" }, "auth": { "anyOf": [ { "$ref": "#/components/schemas/ServiceAuthRequest" }, { "type": "null" } ], "description": "Structured credential for a protected service. Mutually exclusive with the token field." }, "strict_cog": { "default": false, "description": "Raster only: reject a non-COG TIFF instead of converting it. False (the default) converts the source to a COG during ingest. True fails the job when the source is not already a compliant COG, and cannot be combined with resampling, nodata_override, srid_override or a compression other than the default DEFLATE: each of those is applied by a conversion, so the commit is refused with a 422 naming the fields that clash.", "title": "Strict Cog", "type": "boolean" } }, "required": [ "title" ], "title": "CommitRequest", "type": "object" }, "CommitResponse": { "properties": { "job_id": { "description": "Identifier of the committed ingestion job.", "format": "uuid", "title": "Job Id", "type": "string" }, "status": { "description": "Updated job status after commit.", "title": "Status", "type": "string" }, "message": { "description": "Human-readable commit result.", "title": "Message", "type": "string" } }, "required": [ "job_id", "status", "message" ], "title": "CommitResponse", "type": "object" }, "ConfigImportRequest": { "description": "Payload for importing configuration.", "properties": { "settings": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Optional settings to import. Omit to import only OAuth providers.", "title": "Settings" }, "oauth_providers": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "description": "Optional OAuth providers to import. Client secrets must be re-supplied via the admin UI after import.", "title": "Oauth Providers" } }, "title": "ConfigImportRequest", "type": "object" }, "ConfigModeResponse": { "description": "Response for GET /settings/config-mode/.", "properties": { "env_only": { "description": "True if the instance is configured via environment variables only (admin UI is read-only).", "title": "Env Only", "type": "boolean" } }, "required": [ "env_only" ], "title": "ConfigModeResponse", "type": "object" }, "ConfigResponse": { "properties": { "registration_enabled": { "description": "Whether self-service registration is open. Single sign-on can create accounts whenever this is true.", "title": "Registration Enabled", "type": "boolean" }, "allow_signup": { "default": false, "description": "Whether password sign-up is open: registration is enabled and password login is enabled. Login UI uses this to show/hide the signup link.", "title": "Allow Signup", "type": "boolean" }, "email_verification_required": { "default": false, "description": "When true, new self-registered users must verify their email before logging in. Default false for back-compat-safe parsing by older clients.", "title": "Email Verification Required", "type": "boolean" }, "auth_methods": { "description": "Auth methods contributed by the active AuthExtension. Empty by default; compatible deployments may add methods such as ['saml']. Login UI can render conditional sign-in options without needing admin OAuthProvider access.", "items": { "type": "string" }, "title": "Auth Methods", "type": "array" }, "landing_first": { "default": false, "description": "When true, unauthenticated visits to '/' are redirected to '/login' as the product landing page. Default false (search catalog is the root).", "title": "Landing First", "type": "boolean" }, "banner_enabled": { "default": false, "description": "When true and banner_text is non-empty, the site-wide announcement banner is shown. Default false.", "title": "Banner Enabled", "type": "boolean" }, "banner_text": { "default": "", "description": "Admin-configured site-wide announcement banner text. Empty string means no banner is shown.", "title": "Banner Text", "type": "string" }, "banner_color": { "default": "warning", "description": "Theme token for the site banner color: warning | info | success | destructive.", "title": "Banner Color", "type": "string" }, "password_login_enabled": { "default": true, "description": "When false, password login is disabled for users without manage_settings. Default true for back-compat-safe parsing by older clients.", "title": "Password Login Enabled", "type": "boolean" } }, "required": [ "registration_enabled" ], "title": "ConfigResponse", "type": "object" }, "ConformanceResponse": { "properties": { "conformsTo": { "description": "List of conformance class URIs declaring which OGC API standards this server implements.", "items": { "type": "string" }, "title": "Conformsto", "type": "array" } }, "required": [ "conformsTo" ], "title": "ConformanceResponse", "type": "object" }, "ConnectivityResult": { "description": "Aggregate connectivity validation result.", "properties": { "storage": { "$ref": "#/components/schemas/ServiceProbeResult", "description": "Object storage probe result." }, "cache": { "$ref": "#/components/schemas/ServiceProbeResult", "description": "Cache backend probe result." }, "credential_store": { "$ref": "#/components/schemas/ServiceProbeResult", "description": "Shared credential handoff probe result." }, "oidc_providers": { "additionalProperties": { "$ref": "#/components/schemas/ServiceProbeResult" }, "description": "Per-provider OIDC discovery probe results, keyed by provider slug.", "title": "Oidc Providers", "type": "object" } }, "required": [ "storage", "cache", "credential_store", "oidc_providers" ], "title": "ConnectivityResult", "type": "object" }, "ConnectorDefinitionResponse": { "description": "Public, non-secret connector capabilities advertised by an overlay.", "properties": { "name": { "title": "Name", "type": "string" }, "display_name": { "title": "Display Name", "type": "string" }, "config_schema": { "additionalProperties": true, "title": "Config Schema", "type": "object" }, "supports_credentials": { "default": false, "title": "Supports Credentials", "type": "boolean" }, "supports_scheduled_sync": { "default": false, "title": "Supports Scheduled Sync", "type": "boolean" } }, "required": [ "name", "display_name", "config_schema" ], "title": "ConnectorDefinitionResponse", "type": "object" }, "ConnectorDiscoverRequest": { "properties": { "credential_id": { "anyOf": [ { "maxLength": 255, "minLength": 1, "type": "string" }, { "type": "null" } ], "title": "Credential Id" }, "config": { "additionalProperties": true, "title": "Config", "type": "object" } }, "title": "ConnectorDiscoverRequest", "type": "object" }, "ConnectorDiscoverResponse": { "properties": { "resources": { "items": { "$ref": "#/components/schemas/ConnectorResourceResponse" }, "title": "Resources", "type": "array" } }, "required": [ "resources" ], "title": "ConnectorDiscoverResponse", "type": "object" }, "ConnectorIngestRequest": { "properties": { "credential_id": { "anyOf": [ { "maxLength": 255, "minLength": 1, "type": "string" }, { "type": "null" } ], "title": "Credential Id" }, "config": { "additionalProperties": true, "title": "Config", "type": "object" }, "resource_id": { "description": "API-safe opaque handle returned by connector discovery.", "maxLength": 255, "minLength": 1, "pattern": "^[A-Za-z0-9][A-Za-z0-9._~-]{0,254}$", "title": "Resource Id", "type": "string" } }, "required": [ "resource_id" ], "title": "ConnectorIngestRequest", "type": "object" }, "ConnectorIngestResponse": { "properties": { "job_id": { "description": "API-safe opaque handle for the dispatched ingest job.", "maxLength": 255, "minLength": 1, "pattern": "^[A-Za-z0-9][A-Za-z0-9._~-]{0,254}$", "title": "Job Id", "type": "string" }, "status": { "const": "queued", "default": "queued", "title": "Status", "type": "string" } }, "required": [ "job_id" ], "title": "ConnectorIngestResponse", "type": "object" }, "ConnectorListResponse": { "properties": { "connectors": { "items": { "$ref": "#/components/schemas/ConnectorDefinitionResponse" }, "title": "Connectors", "type": "array" } }, "required": [ "connectors" ], "title": "ConnectorListResponse", "type": "object" }, "ConnectorResourceResponse": { "properties": { "id": { "description": "API-safe opaque resource handle. This is never a provider URL, signed locator, or credential.", "maxLength": 255, "minLength": 1, "pattern": "^[A-Za-z0-9][A-Za-z0-9._~-]{0,254}$", "title": "Id", "type": "string" }, "name": { "maxLength": 500, "minLength": 1, "title": "Name", "type": "string" }, "kind": { "maxLength": 64, "minLength": 1, "pattern": "^[a-z][a-z0-9_-]{0,63}$", "title": "Kind", "type": "string" }, "metadata": { "additionalProperties": true, "title": "Metadata", "type": "object" } }, "required": [ "id", "name", "kind" ], "title": "ConnectorResourceResponse", "type": "object" }, "ContactCreate": { "properties": { "role": { "description": "ISO CI_RoleCode, e.g. pointOfContact, author", "maxLength": 30, "title": "Role", "type": "string" }, "name": { "anyOf": [ { "maxLength": 500, "type": "string" }, { "type": "null" } ], "title": "Name" }, "email": { "anyOf": [ { "format": "email", "type": "string" }, { "type": "null" } ], "title": "Email" }, "organization": { "anyOf": [ { "maxLength": 500, "type": "string" }, { "type": "null" } ], "title": "Organization" }, "phone": { "anyOf": [ { "maxLength": 50, "type": "string" }, { "type": "null" } ], "title": "Phone" }, "extra_json": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Arbitrary extra fields stored as JSON", "title": "Extra Json" }, "sort_order": { "default": 0, "description": "Display ordering (lower first)", "maximum": 9999.0, "minimum": 0.0, "title": "Sort Order", "type": "integer" } }, "required": [ "role" ], "title": "ContactCreate", "type": "object" }, "ContactListResponse": { "properties": { "contacts": { "items": { "$ref": "#/components/schemas/ContactResponse" }, "title": "Contacts", "type": "array" }, "total": { "title": "Total", "type": "integer" } }, "required": [ "contacts", "total" ], "title": "ContactListResponse", "type": "object" }, "ContactResponse": { "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "record_id": { "format": "uuid", "title": "Record Id", "type": "string" }, "role": { "title": "Role", "type": "string" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Name" }, "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Email" }, "organization": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Organization" }, "phone": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Phone" }, "extra_json": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Extra Json" }, "sort_order": { "title": "Sort Order", "type": "integer" } }, "required": [ "id", "record_id", "role", "name", "email", "organization", "phone", "extra_json", "sort_order" ], "title": "ContactResponse", "type": "object" }, "ContactUpdate": { "properties": { "role": { "anyOf": [ { "maxLength": 30, "type": "string" }, { "type": "null" } ], "title": "Role" }, "name": { "anyOf": [ { "maxLength": 500, "type": "string" }, { "type": "null" } ], "title": "Name" }, "email": { "anyOf": [ { "format": "email", "type": "string" }, { "type": "null" } ], "title": "Email" }, "organization": { "anyOf": [ { "maxLength": 500, "type": "string" }, { "type": "null" } ], "title": "Organization" }, "phone": { "anyOf": [ { "maxLength": 50, "type": "string" }, { "type": "null" } ], "title": "Phone" }, "extra_json": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Extra Json" }, "sort_order": { "anyOf": [ { "maximum": 9999.0, "minimum": 0.0, "type": "integer" }, { "type": "null" } ], "title": "Sort Order" } }, "title": "ContactUpdate", "type": "object" }, "CreateEmptyDatasetRequest": { "properties": { "title": { "maxLength": 500, "title": "Title", "type": "string" }, "columns": { "items": { "$ref": "#/components/schemas/ColumnDefinition" }, "title": "Columns", "type": "array" } }, "required": [ "title", "columns" ], "title": "CreateEmptyDatasetRequest", "type": "object" }, "CreateLayerRequest": { "properties": { "title": { "description": "Display name for the new layer", "example": "Survey Points", "maxLength": 500, "minLength": 1, "title": "Title", "type": "string" }, "geometry_type": { "description": "OGC geometry type: Point, MultiPoint, LineString, MultiLineString, Polygon, or MultiPolygon", "example": "Point", "title": "Geometry Type", "type": "string" }, "summary": { "anyOf": [ { "maxLength": 5000, "type": "string" }, { "type": "null" } ], "description": "Optional text description of the layer", "title": "Summary" }, "columns": { "anyOf": [ { "items": { "$ref": "#/components/schemas/ColumnDef" }, "type": "array" }, { "type": "null" } ], "description": "Optional initial column definitions", "title": "Columns" } }, "required": [ "title", "geometry_type" ], "title": "CreateLayerRequest", "type": "object" }, "CreateLayerResponse": { "properties": { "id": { "description": "Dataset ID of the created layer", "format": "uuid", "title": "Id", "type": "string" }, "title": { "description": "Display name", "title": "Title", "type": "string" }, "table_name": { "description": "PostGIS table name in the data schema", "title": "Table Name", "type": "string" }, "geometry_type": { "description": "OGC geometry type", "title": "Geometry Type", "type": "string" }, "feature_count": { "description": "Number of features (0 for new layers)", "title": "Feature Count", "type": "integer" }, "visibility": { "description": "Visibility level: private, internal, or public", "title": "Visibility", "type": "string" }, "created_at": { "description": "Creation timestamp", "format": "date-time", "title": "Created At", "type": "string" } }, "required": [ "id", "title", "table_name", "geometry_type", "feature_count", "visibility", "created_at" ], "title": "CreateLayerResponse", "type": "object" }, "DatasetChatRequest": { "description": "Dataset-scoped chat: no map, no client-supplied layer state.\n\nThe server resolves ALL dataset context (table name, columns, samples)\nauthoritatively from the DB \u2014 the client only names the dataset.", "properties": { "message": { "maxLength": 2000, "minLength": 1, "title": "Message", "type": "string" }, "dataset_id": { "title": "Dataset Id", "type": "string" }, "language": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Language" }, "history": { "items": { "$ref": "#/components/schemas/ChatHistoryMessage" }, "maxItems": 20, "title": "History", "type": "array" } }, "required": [ "message", "dataset_id" ], "title": "DatasetChatRequest", "type": "object" }, "DatasetDeleteRequest": { "properties": { "confirm_title": { "description": "Must match the dataset title to confirm deletion", "maxLength": 500, "title": "Confirm Title", "type": "string" } }, "required": [ "confirm_title" ], "title": "DatasetDeleteRequest", "type": "object" }, "DatasetListResponse": { "properties": { "datasets": { "items": { "$ref": "#/components/schemas/DatasetResponse" }, "title": "Datasets", "type": "array" }, "total": { "title": "Total", "type": "integer" } }, "required": [ "datasets", "total" ], "title": "DatasetListResponse", "type": "object" }, "DatasetMeta": { "description": "Partial-update payload for dataset metadata.\n\nThe class name remains ``DatasetMeta`` for generated-SDK compatibility;\nnew backend call sites use the ``DatasetMetaUpdate`` alias below.", "examples": [ { "summary": "Revised from the 2026 authoritative release.", "title": "Updated flood zones", "visibility": "public" } ], "properties": { "title": { "anyOf": [ { "maxLength": 500, "type": "string" }, { "type": "null" } ], "title": "Title" }, "summary": { "anyOf": [ { "maxLength": 5000, "type": "string" }, { "type": "null" } ], "title": "Summary" }, "visibility": { "anyOf": [ { "enum": [ "private", "restricted", "internal", "public" ], "type": "string" }, { "type": "null" } ], "description": "Access level: private, restricted, internal, or public", "title": "Visibility" }, "license": { "anyOf": [ { "maxLength": 1000, "type": "string" }, { "type": "null" } ], "title": "License" }, "attribution": { "anyOf": [ { "maxLength": 5000, "type": "string" }, { "type": "null" } ], "description": "Credit line displayed with the data. Null clears it; the ingest tail seeds it from a manifest's metadata.attribution.", "title": "Attribution" }, "source_organization": { "anyOf": [ { "maxLength": 1000, "type": "string" }, { "type": "null" } ], "title": "Source Organization" }, "data_vintage_start": { "anyOf": [ { "format": "date", "type": "string" }, { "type": "null" } ], "description": "Start of temporal coverage", "title": "Data Vintage Start" }, "data_vintage_end": { "anyOf": [ { "format": "date", "type": "string" }, { "type": "null" } ], "description": "End of temporal coverage", "title": "Data Vintage End" }, "lineage_summary": { "anyOf": [ { "maxLength": 5000, "type": "string" }, { "type": "null" } ], "description": "Free-text provenance / lineage statement", "title": "Lineage Summary" }, "update_frequency": { "anyOf": [ { "maxLength": 30, "type": "string" }, { "type": "null" } ], "description": "ISO maintenance frequency code", "title": "Update Frequency" }, "usage_constraints": { "anyOf": [ { "maxLength": 1000, "type": "string" }, { "type": "null" } ], "title": "Usage Constraints" }, "access_constraints": { "anyOf": [ { "maxLength": 1000, "type": "string" }, { "type": "null" } ], "title": "Access Constraints" }, "sensitivity_classification": { "anyOf": [ { "maxLength": 20, "type": "string" }, { "type": "null" } ], "description": "e.g. public, confidential, restricted", "title": "Sensitivity Classification" }, "theme_category": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "description": "ISO topic category codes", "title": "Theme Category" }, "record_status": { "anyOf": [ { "maxLength": 20, "type": "string" }, { "type": "null" } ], "description": "Lifecycle status. Deliberately not pinned to an enum: the values come from the workflow extension's status_order(), so an overlay may define its own. Community default order: draft, ready, internal, published.", "title": "Record Status" }, "owner_org": { "anyOf": [ { "maxLength": 1000, "type": "string" }, { "type": "null" } ], "description": "Owning organization name", "title": "Owner Org" }, "quality_statement": { "anyOf": [ { "maxLength": 5000, "type": "string" }, { "type": "null" } ], "title": "Quality Statement" }, "source_url": { "anyOf": [ { "maxLength": 2000, "type": "string" }, { "type": "null" } ], "description": "URL the data was originally fetched from", "title": "Source Url" }, "language": { "anyOf": [ { "maxLength": 35, "type": "string" }, { "type": "null" } ], "description": "BCP 47 primary language tag, e.g. en, fr, or pt-BR", "title": "Language" }, "is_dem": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "description": "Flag raster as a Digital Elevation Model for terrain rendering", "title": "Is Dem" }, "tile_columns": { "anyOf": [ { "items": { "type": "string" }, "maxItems": 100, "type": "array" }, { "type": "null" } ], "description": "Ordered vector-tile property allowlist; null restores zoom defaults, [] emits geometry-only tiles, list emits those properties at any zoom.", "title": "Tile Columns" }, "owner_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "description": "Admin only: transfer the dataset to this active user.", "title": "Owner Id" } }, "title": "DatasetMeta", "type": "object" }, "DatasetRefreshRequest": { "description": "Body of a one-request refresh. Carries no source pointer.\n\nEverything about WHERE the data comes from is read server-side from the\ndataset's stored origin binding \u2014 that is the whole feature. A client\ncannot re-point a dataset through this door, and a client that has been\nshown the wrong URL cannot refresh from it.", "properties": { "token": { "anyOf": [ { "maxLength": 1000, "type": "string" }, { "type": "null" } ], "description": "Transient credential for a protected service. Used for this refresh only and never persisted: it is handed to the worker through a single-use, short-lived reference and is gone once claimed. A retry needs a new token. Deprecated: use the auth object with method bearer.", "title": "Token" }, "verification_policy": { "default": "standard", "description": "Verification policy for this refresh. arcgis_id_set_v1 performs the stronger ArcGIS object-ID membership check.", "enum": [ "standard", "arcgis_id_set_v1" ], "title": "Verification Policy", "type": "string" }, "accept_blocked_run_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "description": "A blocked run whose reviewed source and staged content may be accepted. The refresh that uses the acceptance holds it until it ends, and a cancelled or failed refresh gives it back. A different result blocks again. A blocked file replacement is accepted from the upload its run kept.", "title": "Accept Blocked Run Id" }, "auth": { "anyOf": [ { "$ref": "#/components/schemas/ServiceAuthRequest" }, { "type": "null" } ], "description": "Structured credential for a protected service. Mutually exclusive with the token field." } }, "title": "DatasetRefreshRequest", "type": "object" }, "DatasetRefreshResponse": { "description": "Accepted dispatch of a refresh run.\n\nReturns the run id as well as the job id: the run is the durable history\nrow (``GET /datasets/{id}/refresh-runs``) and outlives the job, which the\nretention purge eventually removes.", "properties": { "run_id": { "format": "uuid", "title": "Run Id", "type": "string" }, "job_id": { "format": "uuid", "title": "Job Id", "type": "string" }, "dataset_id": { "format": "uuid", "title": "Dataset Id", "type": "string" }, "origin_kind": { "description": "The origin this refresh re-pulled from", "title": "Origin Kind", "type": "string" }, "trigger": { "description": "api for this endpoint; cli for the CLI door", "title": "Trigger", "type": "string" }, "status": { "default": "pending", "title": "Status", "type": "string" }, "message": { "title": "Message", "type": "string" } }, "required": [ "run_id", "job_id", "dataset_id", "origin_kind", "trigger", "message" ], "title": "DatasetRefreshResponse", "type": "object" }, "DatasetRefreshRunListResponse": { "properties": { "runs": { "items": { "$ref": "#/components/schemas/DatasetRefreshRunResponse" }, "title": "Runs", "type": "array" }, "total": { "title": "Total", "type": "integer" } }, "required": [ "runs", "total" ], "title": "DatasetRefreshRunListResponse", "type": "object" }, "DatasetRefreshRunResponse": { "description": "One refresh attempt, including failures.\n\nRefresh details are redacted for callers who are neither the dataset owner nor\nan admin: ``triggered_by``, ``triggered_by_username``, ``error_code``,\n``error_message``, ``schema_diff`` and ``verification``. A public dataset's refresh history\notherwise enumerates who edits it, and failure text leaks internal origin\ndetail.", "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "dataset_id": { "format": "uuid", "title": "Dataset Id", "type": "string" }, "dataset_version_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "description": "The version this run produced. Null for a run that never committed a swap.", "title": "Dataset Version Id" }, "ingest_job_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "description": "The ingest job that carried out the work. Nulls out when the job row is purged by retention; the run itself survives.", "title": "Ingest Job Id" }, "origin_kind": { "description": "The run's execution door, not the dataset's origin: upload, postgis, service, stac, raster, or restore (the previous version published again). The two can visibly diverge; for example a STAC-imported raster's pending or failed replace run is recorded 'upload' while the dataset's origin stays 'stac' until the replace succeeds. 'raster' itself is reserved for a future, distinct raster-replace door label, with today's raster-replace runs recorded 'upload'.", "title": "Origin Kind", "type": "string" }, "trigger": { "description": "manual, api, cli, or scheduled", "title": "Trigger", "type": "string" }, "scheduled_for": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "The scheduled occurrence time. Null for manual, API, and CLI runs.", "title": "Scheduled For" }, "claim_deadline": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "The immutable admission deadline for a scheduled or keyed run. Null for legacy runs without an admission fence.", "title": "Claim Deadline" }, "status": { "description": "pending, running, succeeded, failed, cancelled, or blocked", "title": "Status", "type": "string" }, "triggered_by": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Triggered By" }, "triggered_by_username": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Triggered By Username" }, "started_at": { "description": "Dispatch time, not claim time \u2014 queue wait is visible", "format": "date-time", "title": "Started At", "type": "string" }, "claimed_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "When a worker began executing the run. Queue wait is this minus started_at; null while the run is still queued.", "title": "Claimed At" }, "finished_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Finished At" }, "feature_count_before": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Feature Count Before" }, "feature_count_after": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Feature Count After" }, "schema_diff": { "anyOf": [ { "$ref": "#/components/schemas/SchemaDiff" }, { "type": "null" } ], "description": "Schema drift measured against the incoming data at swap time. Null for a run that never reached the swap." }, "verification": { "anyOf": [ { "$ref": "#/components/schemas/RefreshVerification" }, { "type": "null" } ], "description": "Pre-publication count evidence, review reasons, and publication decision." }, "error_code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Error Code" }, "error_message": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Short redacted failure reason", "title": "Error Message" } }, "required": [ "id", "dataset_id", "origin_kind", "trigger", "status", "started_at" ], "title": "DatasetRefreshRunResponse", "type": "object" }, "DatasetRelationshipCreate": { "properties": { "target_dataset_id": { "description": "UUID of the dataset to link to", "format": "uuid", "title": "Target Dataset Id", "type": "string" }, "source_column": { "description": "Join column in the source dataset", "maxLength": 63, "title": "Source Column", "type": "string" }, "target_column": { "default": "gid", "description": "Join column in the target dataset", "maxLength": 63, "title": "Target Column", "type": "string" }, "label": { "anyOf": [ { "maxLength": 500, "type": "string" }, { "type": "null" } ], "description": "Optional display label for this relationship", "title": "Label" } }, "required": [ "target_dataset_id", "source_column" ], "title": "DatasetRelationshipCreate", "type": "object" }, "DatasetRelationshipListResponse": { "description": "Paginated list envelope for dataset FK relationships.\n\nMirrors the ``{: [...], total: int}`` convention used by every other\npaginated list endpoint (e.g. AttributeMetadataListResponse,\nVrtGenerationListResponse) so callers can detect whether more pages exist.\n``total`` is the count of *visible* relationships before skip/limit.", "properties": { "relationships": { "items": { "$ref": "#/components/schemas/DatasetRelationshipResponse" }, "title": "Relationships", "type": "array" }, "total": { "title": "Total", "type": "integer" } }, "required": [ "relationships", "total" ], "title": "DatasetRelationshipListResponse", "type": "object" }, "DatasetRelationshipResponse": { "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "source_dataset_id": { "format": "uuid", "title": "Source Dataset Id", "type": "string" }, "target_dataset_id": { "format": "uuid", "title": "Target Dataset Id", "type": "string" }, "source_column": { "title": "Source Column", "type": "string" }, "target_column": { "title": "Target Column", "type": "string" }, "relationship_type": { "title": "Relationship Type", "type": "string" }, "label": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Label" }, "target_dataset_title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Target Dataset Title" }, "broken": { "default": false, "description": "True when a join column no longer exists in its dataset. Related-records reads for it fail until the relationship is deleted or recreated.", "title": "Broken", "type": "boolean" } }, "required": [ "id", "source_dataset_id", "target_dataset_id", "source_column", "target_column", "relationship_type", "label" ], "title": "DatasetRelationshipResponse", "type": "object" }, "DatasetResponse": { "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "record_id": { "description": "Parent catalog record UUID", "format": "uuid", "title": "Record Id", "type": "string" }, "table_name": { "description": "Internal PostGIS table name", "title": "Table Name", "type": "string" }, "title": { "title": "Title", "type": "string" }, "summary": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Summary" }, "srid": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Current EPSG SRID of stored geometry", "title": "Srid" }, "geometry_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "OGC geometry type, e.g. MultiPolygon", "title": "Geometry Type" }, "has_generic_geometry": { "default": false, "description": "True when the underlying column is generic GEOMETRY (created sketch datasets): the dataset accepts ANY geometry subtype on write regardless of the display geometry_type above. Computed on the detail endpoint only; list endpoints always report false.", "title": "Has Generic Geometry", "type": "boolean" }, "is_3d": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "description": "True if geometry has Z dimension", "title": "Is 3D" }, "n_dims": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Number of coordinate dimensions (2, 3, or 4)", "title": "N Dims" }, "z_min": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Minimum Z value across all features", "title": "Z Min" }, "z_max": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Maximum Z value across all features", "title": "Z Max" }, "feature_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Feature Count" }, "extent_bbox": { "anyOf": [ { "items": { "type": "number" }, "type": "array" }, { "type": "null" } ], "description": "Bounding box [west, south, east, north] per RFC 7946 \u00a75.2. west > east on an antimeridian-crossing extent.", "title": "Extent Bbox" }, "column_info": { "anyOf": [ { "items": { "$ref": "#/components/schemas/ColumnInfo" }, "type": "array" }, { "type": "null" } ], "description": "Column names, types, and stats", "title": "Column Info" }, "license": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "License" }, "attribution": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Credit line the source's terms require to be displayed wherever the data is rendered. Shown verbatim in the map viewer's attribution control.", "title": "Attribution" }, "source_organization": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Source Organization" }, "data_vintage_start": { "anyOf": [ { "format": "date", "type": "string" }, { "type": "null" } ], "description": "Start of temporal coverage", "title": "Data Vintage Start" }, "data_vintage_end": { "anyOf": [ { "format": "date", "type": "string" }, { "type": "null" } ], "description": "End of temporal coverage", "title": "Data Vintage End" }, "quality_detail": { "anyOf": [ { "$ref": "#/components/schemas/QualityDetail" }, { "type": "null" } ], "description": "Automated quality assessment results" }, "source_format": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Original file format, e.g. GPKG, SHP", "title": "Source Format" }, "source_filename": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Source Filename" }, "tile_columns": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "description": "Ordered vector-tile property allowlist; null uses zoom defaults, [] emits geometry-only tiles, list emits those properties at any zoom.", "title": "Tile Columns" }, "original_srid": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "EPSG SRID of the uploaded source file", "title": "Original Srid" }, "current_version": { "default": 1, "description": "Monotonic version counter", "title": "Current Version", "type": "integer" }, "source_url": { "anyOf": [ { "maxLength": 2000, "type": "string" }, { "type": "null" } ], "description": "URL the data was originally fetched from", "title": "Source Url" }, "origin": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "How the data entered the catalog: upload, postgis, service, stac, or created. Computed from source_format and record_type, not stored; null for collections and VRTs, which have no origin of their own.", "title": "Origin" }, "origin_uri": { "anyOf": [ { "maxLength": 2000, "type": "string" }, { "type": "null" } ], "description": "Machine-readable pointer back to the origin, written only by ingest and refresh. Distinct from source_url, which is editable descriptive metadata. Null for uploads and created datasets. It is also null for any reader who is neither the dataset's owner nor an admin \u2014 origin (above) and the freshness/health fields below are not gated and still describe the dataset's capabilities.", "title": "Origin Uri" }, "origin_ref": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Typed per-origin payload with a `kind` discriminator, e.g. {\"kind\": \"service\", \"service_type\": \"wfs\", \"url\": \"...\", \"layer_id\": \"0\"}. Never contains credentials. owner-or-admin only, same redaction as origin_uri.", "title": "Origin Ref" }, "last_refreshed_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "Last committed successful refresh \u2014 not the last attempt", "title": "Last Refreshed At" }, "last_checked_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "Last time GeoLens contacted the origin at all, whether the attempt succeeded or failed", "title": "Last Checked At" }, "source_health": { "default": "unknown", "description": "healthy, missing, inaccessible, or unknown. 'unknown' means never probed, or an origin kind with nothing to probe.", "title": "Source Health", "type": "string" }, "source_health_detail": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Why the origin is not healthy, as one of a fixed set of GeoLens codes: auth_required, blocked_by_policy, item_withdrawn, network_error, not_found, server_error, timeout, unauthorized, unexpected_status. Null when healthy or never probed. Never provider text, a URL, or a response body \u2014 nothing the origin sent is stored here.", "title": "Source Health Detail" }, "schema_drift_status": { "default": "unknown", "description": "none, drifted, or unknown. Set at refresh commit from the schema diff; 'unknown' until a refresh has run.", "title": "Schema Drift Status", "type": "string" }, "source_freshness": { "default": "unknown", "description": "fresh, due, overdue, or unknown, computed from last_refreshed_at against the declared update_frequency: due past one declared period, overdue past two. 'unknown' when the origin cannot be refreshed at all (created), when no cadence is declared (asNeeded, irregular, notPlanned, unknown), or when nothing has been refreshed yet. Advisory only; never blocks an operation. Distinct from the quality score's own freshness, which measures quality_detail.computed_at rather than the source.", "title": "Source Freshness", "type": "string" }, "quality_statement": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Quality Statement" }, "visibility": { "description": "Access level: private, restricted, internal, public", "title": "Visibility", "type": "string" }, "created_by": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Created By" }, "created_by_display": { "title": "Created By Display", "type": "string" }, "created_at": { "format": "date-time", "title": "Created At", "type": "string" }, "updated_at": { "format": "date-time", "title": "Updated At", "type": "string" }, "last_edited_by_display": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Last Edited By Display" }, "last_edited_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Last Edited At" }, "collections": { "anyOf": [ { "items": { "$ref": "#/components/schemas/CollectionRef" }, "type": "array" }, { "type": "null" } ], "title": "Collections" }, "record_status": { "default": "draft", "description": "Lifecycle status. Deliberately not pinned to an enum: the values come from the workflow extension's status_order(), so an overlay may define its own. Community default order: draft, ready, internal, published.", "title": "Record Status", "type": "string" }, "lineage_summary": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Free-text provenance / lineage statement", "title": "Lineage Summary" }, "derived_from": { "anyOf": [ { "$ref": "#/components/schemas/DerivedFromResponse" }, { "type": "null" } ], "description": "Provenance for an analysis output. Null for a dataset that was not derived, and also for a requester who cannot access the source dataset \u2014 the two are deliberately indistinguishable." }, "update_frequency": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "ISO maintenance frequency code", "title": "Update Frequency" }, "usage_constraints": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Usage Constraints" }, "access_constraints": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Access Constraints" }, "sensitivity_classification": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "e.g. public, confidential, restricted", "title": "Sensitivity Classification" }, "theme_category": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "description": "ISO topic category codes", "title": "Theme Category" }, "owner_org": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Owning organization name", "title": "Owner Org" }, "published_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Published At" }, "updated_by": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Updated By" }, "record_type": { "default": "vector_dataset", "description": "Record type: 'vector_dataset' (spatial features), 'raster_dataset' (single COG), 'vrt_dataset' (VRT mosaic), 'table' (non-spatial tabular), 'map' (saved map), 'service' (catalogued remote service), 'collection' (flat dataset group), 'tiles3d_dataset' (3D Tiles tileset), 'pointcloud_dataset' (COPC point cloud).", "title": "Record Type", "type": "string" }, "raster": { "anyOf": [ { "$ref": "#/components/schemas/RasterMetadata" }, { "type": "null" } ], "description": "Raster-specific metadata (null for vectors)" }, "tileset": { "anyOf": [ { "$ref": "#/components/schemas/TilesetMetadata" }, { "type": "null" } ], "description": "3D Tiles metadata on the dataset detail response; null for other record types and before a tileset is published" }, "pointcloud": { "anyOf": [ { "$ref": "#/components/schemas/PointCloudMetadata" }, { "type": "null" } ], "description": "COPC point cloud metadata on the dataset detail response; null for other record types and before a point cloud is published" }, "stac_assets": { "anyOf": [ { "additionalProperties": { "$ref": "#/components/schemas/StacAsset" }, "type": "object" }, { "type": "null" } ], "description": "STAC-style asset dictionary", "title": "Stac Assets" }, "stac_extensions": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Stac Extensions" }, "language": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "ISO 639-1 language code, e.g. en, fr", "title": "Language" }, "metadata_warnings": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "description": "Advisory warnings produced by a metadata update \u2014 e.g. a visibility or status change exposing keywords inherited from an analysis source the new audience cannot open. Only ever set on the PATCH response; the change has already applied.", "title": "Metadata Warnings" }, "previous_version": { "anyOf": [ { "$ref": "#/components/schemas/PreviousVersionResponse" }, { "type": "null" } ], "description": "The data the last replacement or restore replaced, which POST /previous-version/restore publishes again. Set on the detail endpoint only; null elsewhere and when there is none." } }, "required": [ "id", "record_id", "table_name", "title", "summary", "feature_count", "source_filename", "visibility", "created_by", "created_by_display", "created_at", "updated_at" ], "title": "DatasetResponse", "type": "object" }, "DatasetRowsResponse": { "properties": { "columns": { "items": { "$ref": "#/components/schemas/ColumnChange" }, "title": "Columns", "type": "array" }, "rows": { "items": { "additionalProperties": true, "type": "object" }, "title": "Rows", "type": "array" }, "approximate_total": { "description": "Estimated total row count (may use pg stats)", "title": "Approximate Total", "type": "integer" }, "next_cursor": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Cursor value for the next page, null if last", "title": "Next Cursor" } }, "required": [ "columns", "rows", "approximate_total" ], "title": "DatasetRowsResponse", "type": "object" }, "DatasetVersionListResponse": { "properties": { "versions": { "items": { "$ref": "#/components/schemas/DatasetVersionResponse" }, "title": "Versions", "type": "array" }, "total": { "title": "Total", "type": "integer" } }, "required": [ "versions", "total" ], "title": "DatasetVersionListResponse", "type": "object" }, "DatasetVersionResponse": { "description": "One version in a dataset's history.\n\n``file_hash`` and ``uploaded_by`` are null for callers who are neither the\ndataset owner nor an administrator. This prevents public version history\nfrom identifying editors.", "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "dataset_id": { "format": "uuid", "title": "Dataset Id", "type": "string" }, "version_number": { "title": "Version Number", "type": "integer" }, "source_filename": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Source Filename" }, "source_format": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Source Format" }, "feature_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Feature Count" }, "srid": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Srid" }, "geometry_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Geometry Type" }, "file_hash": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "File Hash" }, "uploaded_by": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Uploaded By" }, "uploaded_at": { "format": "date-time", "title": "Uploaded At", "type": "string" }, "restored_from_version": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "The version a restore published again as this one", "title": "Restored From Version" } }, "required": [ "id", "dataset_id", "version_number", "source_filename", "source_format", "feature_count", "srid", "geometry_type", "file_hash", "uploaded_by", "uploaded_at" ], "title": "DatasetVersionResponse", "type": "object" }, "DbfTruncationCollisionWarning": { "additionalProperties": false, "properties": { "kind": { "const": "dbf_truncation_collision", "title": "Kind", "type": "string" }, "details": { "items": { "$ref": "#/components/schemas/DbfTruncationDetail" }, "title": "Details", "type": "array" } }, "required": [ "kind", "details" ], "title": "DbfTruncationCollisionWarning", "type": "object" }, "DbfTruncationDetail": { "additionalProperties": false, "properties": { "truncated": { "title": "Truncated", "type": "string" }, "originals": { "items": { "type": "string" }, "title": "Originals", "type": "array" } }, "required": [ "truncated", "originals" ], "title": "DbfTruncationDetail", "type": "object" }, "DerivedFromResponse": { "description": "Provenance for an analysis output: what it came from, and how.\n\n``params`` stays untyped on purpose: it is the operation's own parameter\ndictionary, so its keys differ by operation. It is also redacted for each\nrequester: dataset ids that the caller cannot access are omitted.", "properties": { "dataset_id": { "description": "The dataset this one was derived from", "format": "uuid", "title": "Dataset Id", "type": "string" }, "source_filter": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "CQL2-JSON filter that selected the source features, or null when the whole source dataset was used", "title": "Source Filter" }, "operation": { "description": "Analysis operation that produced it", "title": "Operation", "type": "string" }, "params": { "additionalProperties": true, "description": "Operation parameters, minus any dataset reference the requester cannot access", "title": "Params", "type": "object" }, "created_at": { "format": "date-time", "title": "Created At", "type": "string" } }, "required": [ "dataset_id", "operation", "params", "created_at" ], "title": "DerivedFromResponse", "type": "object" }, "DetectEmbeddingDimsResponse": { "description": "Response for POST /settings/detect-embedding-dims/.", "properties": { "dimensions": { "description": "Number of dimensions in the embedding vector returned by the configured embedding provider.", "title": "Dimensions", "type": "integer" } }, "required": [ "dimensions" ], "title": "DetectEmbeddingDimsResponse", "type": "object" }, "DiscoverResponse": { "properties": { "tables": { "description": "Tables in the `data` schema not yet registered as datasets. `refusal_reason` marks those discovery knows registration would refuse.", "items": { "$ref": "#/components/schemas/DiscoveredTable" }, "title": "Tables", "type": "array" } }, "required": [ "tables" ], "title": "DiscoverResponse", "type": "object" }, "DiscoveredTable": { "properties": { "table_name": { "description": "PostgreSQL table name in the `data` schema.", "title": "Table Name", "type": "string" }, "geometry_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Detected geometry type, or null for non-spatial tables.", "title": "Geometry Type" }, "srid": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Coordinate reference system EPSG code, if defined.", "title": "Srid" }, "estimated_rows": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "PostgreSQL row count estimate from `pg_class.reltuples`.", "title": "Estimated Rows" }, "refusal_reason": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Why registration would refuse this table, as one of a fixed set of GeoLens codes: source_srid_undeclared, source_gid_unusable. Null when discovery finds none, though registration can still refuse a table for a reason discovery does not check.", "title": "Refusal Reason" } }, "required": [ "table_name", "geometry_type", "srid", "estimated_rows" ], "title": "DiscoveredTable", "type": "object" }, "DistributionCreate": { "properties": { "distribution_type": { "description": "e.g. download, api, ogc_wms, ogc_wfs", "maxLength": 30, "title": "Distribution Type", "type": "string" }, "format": { "description": "File or service format, e.g. GeoJSON, SHP, WMS", "maxLength": 50, "title": "Format", "type": "string" }, "url": { "description": "Access URL for this distribution", "maxLength": 2048, "title": "Url", "type": "string" }, "title": { "anyOf": [ { "maxLength": 500, "type": "string" }, { "type": "null" } ], "title": "Title" }, "description": { "anyOf": [ { "maxLength": 2000, "type": "string" }, { "type": "null" } ], "title": "Description" }, "protocol": { "anyOf": [ { "maxLength": 100, "type": "string" }, { "type": "null" } ], "description": "Transfer protocol, e.g. HTTPS, OGC:WFS", "title": "Protocol" }, "media_type": { "anyOf": [ { "maxLength": 100, "type": "string" }, { "type": "null" } ], "description": "IANA media type, e.g. application/geo+json", "title": "Media Type" }, "is_primary": { "default": false, "description": "Mark as the preferred distribution", "title": "Is Primary", "type": "boolean" } }, "required": [ "distribution_type", "format", "url" ], "title": "DistributionCreate", "type": "object" }, "DistributionListResponse": { "properties": { "distributions": { "items": { "$ref": "#/components/schemas/DistributionResponse" }, "title": "Distributions", "type": "array" }, "total": { "title": "Total", "type": "integer" } }, "required": [ "distributions", "total" ], "title": "DistributionListResponse", "type": "object" }, "DistributionResponse": { "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "record_id": { "format": "uuid", "title": "Record Id", "type": "string" }, "distribution_type": { "title": "Distribution Type", "type": "string" }, "format": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Format" }, "url": { "title": "Url", "type": "string" }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Title" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Description" }, "protocol": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Protocol" }, "media_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Media Type" }, "is_primary": { "title": "Is Primary", "type": "boolean" }, "auto_generated": { "description": "True if created automatically by the system", "title": "Auto Generated", "type": "boolean" } }, "required": [ "id", "record_id", "distribution_type", "format", "url", "title", "description", "protocol", "media_type", "is_primary", "auto_generated" ], "title": "DistributionResponse", "type": "object" }, "DistributionUpdate": { "properties": { "distribution_type": { "anyOf": [ { "maxLength": 30, "type": "string" }, { "type": "null" } ], "title": "Distribution Type" }, "format": { "anyOf": [ { "maxLength": 50, "type": "string" }, { "type": "null" } ], "title": "Format" }, "url": { "anyOf": [ { "maxLength": 2048, "type": "string" }, { "type": "null" } ], "title": "Url" }, "title": { "anyOf": [ { "maxLength": 500, "type": "string" }, { "type": "null" } ], "title": "Title" }, "description": { "anyOf": [ { "maxLength": 2000, "type": "string" }, { "type": "null" } ], "title": "Description" }, "protocol": { "anyOf": [ { "maxLength": 100, "type": "string" }, { "type": "null" } ], "title": "Protocol" }, "media_type": { "anyOf": [ { "maxLength": 100, "type": "string" }, { "type": "null" } ], "title": "Media Type" }, "is_primary": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Is Primary" } }, "title": "DistributionUpdate", "type": "object" }, "DownloadTokenResponse": { "properties": { "token": { "description": "Short-lived download-scoped JWT (typ='download', TTL \u2264 120s)", "title": "Token", "type": "string" }, "expires_in": { "default": 120, "description": "Seconds until the download token expires", "title": "Expires In", "type": "integer" } }, "required": [ "token" ], "title": "DownloadTokenResponse", "type": "object" }, "DryRunResponse": { "description": "Result of a dry-run import showing what would change.", "properties": { "settings": { "additionalProperties": true, "description": "Per-setting diff result keyed by setting name.", "title": "Settings", "type": "object" }, "oauth_providers": { "additionalProperties": true, "description": "Per-provider diff result keyed by slug.", "title": "Oauth Providers", "type": "object" }, "preview_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Short-lived signed confirmation token required to apply an overwrite, or a merge that would delete the stored embeddings. Bound to the normalized payload, mode, and current configuration state.", "title": "Preview Token" } }, "required": [ "settings", "oauth_providers" ], "title": "DryRunResponse", "type": "object" }, "DuplicateMapResponse": { "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "name": { "title": "Name", "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Description" }, "notes": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Notes" }, "center_lng": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Center Lng" }, "center_lat": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Center Lat" }, "zoom": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Zoom" }, "bearing": { "title": "Bearing", "type": "number" }, "pitch": { "title": "Pitch", "type": "number" }, "basemap_style": { "title": "Basemap Style", "type": "string" }, "show_basemap_labels": { "title": "Show Basemap Labels", "type": "boolean" }, "basemap_config": { "anyOf": [ { "$ref": "#/components/schemas/BasemapConfig" }, { "type": "null" } ] }, "terrain_config": { "anyOf": [ { "$ref": "#/components/schemas/TerrainConfig" }, { "type": "null" } ] }, "visibility": { "$ref": "#/components/schemas/MapVisibility" }, "thumbnail_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Thumbnail Url" }, "og_image_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Og Image Url" }, "forked_from_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "description": "Source map UUID if this is a fork", "title": "Forked From Id" }, "forked_from_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Forked From Name" }, "created_by": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Created By" }, "created_by_username": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Created By Username" }, "created_at": { "format": "date-time", "title": "Created At", "type": "string" }, "updated_at": { "format": "date-time", "title": "Updated At", "type": "string" }, "layers": { "items": { "$ref": "#/components/schemas/MapLayerResponse" }, "title": "Layers", "type": "array" }, "layer_count": { "title": "Layer Count", "type": "integer" }, "plugins": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Plugins" }, "legend_title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Legend Title" }, "excluded_layer_count": { "default": 0, "description": "Layers skipped due to access restrictions", "title": "Excluded Layer Count", "type": "integer" } }, "required": [ "id", "name", "description", "center_lng", "center_lat", "zoom", "bearing", "pitch", "basemap_style", "show_basemap_labels", "visibility", "created_by", "created_at", "updated_at", "layers", "layer_count" ], "title": "DuplicateMapResponse", "type": "object" }, "EditionInfoResponse": { "description": "Response for runtime capability metadata.", "properties": { "edition": { "description": "Runtime capability channel.", "title": "Edition", "type": "string" }, "features": { "description": "List of enabled runtime feature flags.", "items": { "type": "string" }, "title": "Features", "type": "array" }, "tenancy_mode": { "default": "single_tenant", "description": "Deployment tenancy mode.", "title": "Tenancy Mode", "type": "string" } }, "required": [ "edition", "features" ], "title": "EditionInfoResponse", "type": "object" }, "EmbedTokenCreate": { "properties": { "expires_in_days": { "default": 30, "description": "Token lifetime in days (1-365). The default 30-day lifetime is always available; custom lifetimes require advanced sharing controls.", "example": 90, "maximum": 365.0, "minimum": 1.0, "title": "Expires In Days", "type": "integer" }, "name": { "anyOf": [ { "maxLength": 255, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "Human-readable label for the token", "example": "Public dashboard embed", "title": "Name" }, "allowed_origins": { "anyOf": [ { "items": { "type": "string" }, "maxItems": 50, "type": "array" }, { "type": "null" } ], "description": "Restrict embedding to these origins. Omit or null allows any origin; non-empty origin restrictions require advanced sharing controls.", "example": [ "https://dashboard.example.com" ], "title": "Allowed Origins" } }, "title": "EmbedTokenCreate", "type": "object" }, "EmbedTokenCreatedResponse": { "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "map_id": { "format": "uuid", "title": "Map Id", "type": "string" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Name" }, "token_hint": { "title": "Token Hint", "type": "string" }, "scoped_dataset_ids": { "items": { "type": "string" }, "title": "Scoped Dataset Ids", "type": "array" }, "allowed_origins": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Allowed Origins" }, "expires_at": { "format": "date-time", "title": "Expires At", "type": "string" }, "is_active": { "title": "Is Active", "type": "boolean" }, "use_count": { "default": 0, "title": "Use Count", "type": "integer" }, "last_used_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Last Used At" }, "created_at": { "format": "date-time", "title": "Created At", "type": "string" }, "raw_token": { "title": "Raw Token", "type": "string" } }, "required": [ "id", "map_id", "token_hint", "scoped_dataset_ids", "expires_at", "is_active", "created_at", "raw_token" ], "title": "EmbedTokenCreatedResponse", "type": "object" }, "EmbedTokenListResponse": { "properties": { "tokens": { "items": { "$ref": "#/components/schemas/EmbedTokenResponse" }, "title": "Tokens", "type": "array" }, "total": { "title": "Total", "type": "integer" } }, "required": [ "tokens", "total" ], "title": "EmbedTokenListResponse", "type": "object" }, "EmbedTokenResponse": { "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "map_id": { "format": "uuid", "title": "Map Id", "type": "string" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Name" }, "token_hint": { "title": "Token Hint", "type": "string" }, "scoped_dataset_ids": { "items": { "type": "string" }, "title": "Scoped Dataset Ids", "type": "array" }, "allowed_origins": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Allowed Origins" }, "expires_at": { "format": "date-time", "title": "Expires At", "type": "string" }, "is_active": { "title": "Is Active", "type": "boolean" }, "use_count": { "default": 0, "title": "Use Count", "type": "integer" }, "last_used_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Last Used At" }, "created_at": { "format": "date-time", "title": "Created At", "type": "string" } }, "required": [ "id", "map_id", "token_hint", "scoped_dataset_ids", "expires_at", "is_active", "created_at" ], "title": "EmbedTokenResponse", "type": "object" }, "EmbedTokenUpdate": { "properties": { "allowed_origins": { "anyOf": [ { "items": { "type": "string" }, "maxItems": 50, "type": "array" }, { "type": "null" } ], "description": "Updated list of allowed embedding origins. Null clears restrictions; non-empty origin restrictions require advanced sharing controls.", "title": "Allowed Origins" } }, "title": "EmbedTokenUpdate", "type": "object" }, "EmbeddingStatsResponse": { "properties": { "total_records": { "description": "Total number of records in the catalog.", "title": "Total Records", "type": "integer" }, "embedded_records": { "description": "Number of records with an embedding for the ACTIVE embedding model \u2014 the only vectors semantic search can use.", "title": "Embedded Records", "type": "integer" }, "missing_records": { "description": "Number of records without an active-model embedding (total_records - embedded_records).", "title": "Missing Records", "type": "integer" }, "stale_records": { "description": "Subset of missing_records whose only stored embeddings belong to other models. Regenerating all embeddings clears these; generating missing ones does not.", "title": "Stale Records", "type": "integer" }, "coverage_percent": { "description": "Embedding coverage as a percentage (0-100).", "title": "Coverage Percent", "type": "number" }, "current_run": { "anyOf": [ { "$ref": "#/components/schemas/BackfillRunProgress" }, { "type": "null" } ], "description": "The backfill run in flight, or null when none is running." }, "recent_runs": { "description": "The most recent finished backfill runs, newest first.", "items": { "$ref": "#/components/schemas/BackfillRunSummary" }, "title": "Recent Runs", "type": "array" }, "estimate": { "anyOf": [ { "$ref": "#/components/schemas/BackfillEstimate" }, { "type": "null" } ], "description": "Expected duration of each backfill action, or null until one run has completed and measured this deployment's throughput." } }, "required": [ "total_records", "embedded_records", "missing_records", "stale_records", "coverage_percent" ], "title": "EmbeddingStatsResponse", "type": "object" }, "EnterpriseTabsResponse": { "description": "Response for restricted Settings tab keys.", "properties": { "tabs": { "description": "Tab keys (e.g. 'branding', 'appearance') restricted by the current runtime. Sorted alphabetically for stable client-side comparison.", "items": { "type": "string" }, "title": "Tabs", "type": "array" } }, "required": [ "tabs" ], "title": "EnterpriseTabsResponse", "type": "object" }, "ExportFormat": { "enum": [ "gpkg", "geojson", "shp", "csv", "parquet", "fgb", "pmtiles" ], "title": "ExportFormat", "type": "string" }, "FacetCountResponse": { "description": "Multi-group facet counts for the search sidebar.", "properties": { "record_type": { "additionalProperties": { "type": "integer" }, "description": "Hit counts keyed by record type", "title": "Record Type", "type": "object" }, "keywords": { "default": [], "description": "Top keyword tags with counts", "items": { "$ref": "#/components/schemas/FacetValueCount" }, "title": "Keywords", "type": "array" }, "source_organization": { "default": [], "description": "Top organizations with counts", "items": { "$ref": "#/components/schemas/FacetValueCount" }, "title": "Source Organization", "type": "array" }, "srid": { "default": [], "description": "Top SRIDs with counts", "items": { "$ref": "#/components/schemas/FacetValueCount" }, "title": "Srid", "type": "array" }, "collections": { "default": [], "description": "Collections containing matched records", "items": { "$ref": "#/components/schemas/CollectionFacetItem" }, "title": "Collections", "type": "array" } }, "required": [ "record_type" ], "title": "FacetCountResponse", "type": "object" }, "FacetValueCount": { "description": "A single facet value with count.", "properties": { "value": { "title": "Value", "type": "string" }, "count": { "title": "Count", "type": "integer" } }, "required": [ "value", "count" ], "title": "FacetValueCount", "type": "object" }, "FanOutCommitRequest": { "description": "Request body for POST /ingest/commit-fan-out/{job_id}.\n\nConverts one pending IngestJob (multi-layer file) into N independent\ningest tasks \u2014 one per requested layer. Maximum 50 layers per request.", "properties": { "layers": { "description": "Layers to ingest as separate datasets. Maximum 50 per request.", "items": { "$ref": "#/components/schemas/FanOutLayerRequest" }, "maxItems": 50, "minItems": 1, "title": "Layers", "type": "array" } }, "required": [ "layers" ], "title": "FanOutCommitRequest", "type": "object" }, "FanOutCommitResponse": { "description": "Response from POST /ingest/commit-fan-out/{job_id}.", "properties": { "fan_out_id": { "description": "The original job_id (parent). Use for client-side correlation.", "format": "uuid", "title": "Fan Out Id", "type": "string" }, "results": { "description": "Per-layer outcomes in the same order as the request layers.", "items": { "$ref": "#/components/schemas/FanOutLayerResult" }, "title": "Results", "type": "array" } }, "required": [ "fan_out_id", "results" ], "title": "FanOutCommitResponse", "type": "object" }, "FanOutLayerRequest": { "description": "One layer to ingest as a separate dataset from a multi-layer source.", "properties": { "layer_name": { "description": "Name of the layer within the source file (e.g. GeoPackage layer name).", "maxLength": 500, "minLength": 1, "title": "Layer Name", "type": "string" }, "title": { "anyOf": [ { "maxLength": 500, "type": "string" }, { "type": "null" } ], "description": "Optional human-readable title override. Defaults to '{filename}: {layer_name}'.", "title": "Title" } }, "required": [ "layer_name" ], "title": "FanOutLayerRequest", "type": "object" }, "FanOutLayerResult": { "description": "Per-layer outcome from the fan-out commit operation.", "properties": { "layer_name": { "description": "Layer name from the request.", "title": "Layer Name", "type": "string" }, "new_job_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "description": "ID of the cloned IngestJob queued for this layer. Null on failure.", "title": "New Job Id" }, "dataset_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "description": "ID of the new Dataset record created for this layer. Null on failure.", "title": "Dataset Id" }, "status": { "description": "'queued' if the task was dispatched; 'failed' if an error occurred.", "enum": [ "queued", "failed" ], "title": "Status", "type": "string" }, "error": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "User-safe error description when status='failed'. Never contains internal file paths.", "title": "Error" } }, "required": [ "layer_name", "status" ], "title": "FanOutLayerResult", "type": "object" }, "FeatureCreate": { "description": "GeoJSON-style feature for insertion.", "properties": { "geometry": { "anyOf": [ { "$ref": "#/components/schemas/GeoJSONGeometryCollection" }, { "$ref": "#/components/schemas/GeoJSONGeometry" } ], "title": "Geometry" }, "properties": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Properties" } }, "required": [ "geometry" ], "title": "FeatureCreate", "type": "object" }, "FeatureFlagsResponse": { "description": "Public feature flags readable by any authenticated user.", "properties": { "enable_dataset_editing": { "default": false, "title": "Enable Dataset Editing", "type": "boolean" }, "require_metadata_for_publish": { "default": false, "title": "Require Metadata For Publish", "type": "boolean" }, "restrict_public_visibility": { "default": false, "title": "Restrict Public Visibility", "type": "boolean" } }, "title": "FeatureFlagsResponse", "type": "object" }, "FeatureReplace": { "description": "Full feature replacement (PUT semantics).", "properties": { "geometry": { "anyOf": [ { "$ref": "#/components/schemas/GeoJSONGeometryCollection" }, { "$ref": "#/components/schemas/GeoJSONGeometry" } ], "title": "Geometry" }, "properties": { "additionalProperties": true, "type": "object", "title": "Properties" } }, "required": [ "geometry", "properties" ], "title": "FeatureReplace", "type": "object" }, "FeatureUpdate": { "description": "Partial feature update (PATCH semantics).", "properties": { "geometry": { "anyOf": [ { "$ref": "#/components/schemas/GeoJSONGeometryCollection" }, { "$ref": "#/components/schemas/GeoJSONGeometry" }, { "type": "null" } ], "title": "Geometry" }, "properties": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Properties" } }, "title": "FeatureUpdate", "type": "object" }, "GeoJSONFeature": { "additionalProperties": true, "description": "A GeoJSON Feature.", "properties": { "type": { "default": "Feature", "title": "Type", "type": "string" }, "geometry": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Geometry" }, "properties": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Properties" } }, "title": "GeoJSONFeature", "type": "object" }, "GeoJSONFeatureCollection": { "additionalProperties": true, "description": "A GeoJSON FeatureCollection.", "properties": { "type": { "default": "FeatureCollection", "title": "Type", "type": "string" }, "features": { "default": [], "items": { "$ref": "#/components/schemas/GeoJSONFeature" }, "title": "Features", "type": "array" } }, "title": "GeoJSONFeatureCollection", "type": "object" }, "GeoJSONGeometry": { "description": "A GeoJSON geometry object (RFC 7946).", "properties": { "type": { "enum": [ "Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon" ], "title": "Type", "type": "string" }, "coordinates": { "items": {}, "title": "Coordinates", "type": "array" } }, "required": [ "type", "coordinates" ], "title": "GeoJSONGeometry", "type": "object" }, "GeoJSONGeometryCollection": { "description": "A GeoJSON GeometryCollection (RFC 7946 \u00a73.1.8).\n\nGeometry collections carry ``geometries`` instead of ``coordinates``.\nOnly generic-geometry datasets accept them on write.\n\nNested collections are rejected because PostGIS cannot round-trip them\nthrough the GeoJSON boundary.", "properties": { "type": { "const": "GeometryCollection", "title": "Type", "type": "string" }, "geometries": { "items": { "$ref": "#/components/schemas/GeoJSONGeometry" }, "title": "Geometries", "type": "array" } }, "required": [ "type", "geometries" ], "title": "GeoJSONGeometryCollection", "type": "object" }, "HealthResponse": { "properties": { "status": { "title": "Status", "type": "string" }, "version": { "title": "Version", "type": "string" }, "build": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Build" }, "providers": { "additionalProperties": { "$ref": "#/components/schemas/ServiceHealth" }, "title": "Providers", "type": "object" } }, "required": [ "status", "version", "providers" ], "title": "HealthResponse", "type": "object" }, "ImportResult": { "description": "Summary of what was applied during an import.", "properties": { "settings_applied": { "description": "Number of settings successfully updated.", "title": "Settings Applied", "type": "integer" }, "settings_skipped": { "description": "Number of settings skipped (no change, unknown key, or restricted key not writable by the current runtime).", "title": "Settings Skipped", "type": "integer" }, "settings_skipped_restricted": { "description": "Names of restricted setting keys that were skipped by the current runtime.", "items": { "type": "string" }, "title": "Settings Skipped Restricted", "type": "array" }, "oauth_created": { "description": "Number of new OAuth providers created.", "title": "Oauth Created", "type": "integer" }, "oauth_updated": { "description": "Number of existing OAuth providers updated.", "title": "Oauth Updated", "type": "integer" }, "oauth_deleted": { "description": "Number of OAuth providers deleted (overwrite mode only).", "title": "Oauth Deleted", "type": "integer" }, "oauth_accounts_deleted": { "default": 0, "description": "Number of dependent OAuth account links cascade-deleted in overwrite mode.", "minimum": 0.0, "title": "Oauth Accounts Deleted", "type": "integer" } }, "required": [ "settings_applied", "settings_skipped", "oauth_created", "oauth_updated", "oauth_deleted" ], "title": "ImportResult", "type": "object" }, "InfrastructureConfig": { "properties": { "storage_provider": { "description": "Active storage backend ('local' or 's3').", "title": "Storage Provider", "type": "string" }, "cache_provider": { "description": "Active cache backend ('memory' or 'redis').", "title": "Cache Provider", "type": "string" }, "database_type": { "description": "Database flavor (e.g. 'postgres', 'managed-postgres').", "title": "Database Type", "type": "string" }, "database_pooler": { "description": "Active connection pooler mode ('sqlalchemy' or 'external').", "title": "Database Pooler", "type": "string" }, "tile_cache": { "description": "Tile caching backend in use.", "title": "Tile Cache", "type": "string" }, "tile_cache_ttl": { "description": "Tile cache TTL in seconds.", "title": "Tile Cache Ttl", "type": "integer" }, "cdn_configured": { "description": "Whether a CDN base URL is configured for tile delivery.", "title": "Cdn Configured", "type": "boolean" } }, "required": [ "storage_provider", "cache_provider", "database_type", "database_pooler", "tile_cache", "tile_cache_ttl", "cdn_configured" ], "title": "InfrastructureConfig", "type": "object" }, "InfrastructureResponse": { "properties": { "config": { "$ref": "#/components/schemas/InfrastructureConfig", "description": "Snapshot of active infrastructure configuration." }, "health": { "additionalProperties": { "$ref": "#/components/schemas/ProviderHealth" }, "description": "Health probe results keyed by provider name (db, storage, cache, llm, embedding).", "title": "Health", "type": "object" }, "oidc_providers": { "additionalProperties": { "$ref": "#/components/schemas/ProviderHealth" }, "default": {}, "description": "Health probe results for configured OAuth/OIDC providers, keyed by slug.", "title": "Oidc Providers", "type": "object" } }, "required": [ "config", "health" ], "title": "InfrastructureResponse", "type": "object" }, "JobCancelResponse": { "description": "Outcome of ``POST /jobs/{id}/cancel``.\n\n``run_id`` is the ``dataset_refresh_runs`` row this cancel finalized, when\nthe job had one bound (refreshes and reuploads do; plain imports don't).\n``already`` is True when the job was cancelled before this request \u2014 the\nrepeat is idempotent and nothing was written.", "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "status": { "const": "cancelled", "title": "Status", "type": "string" }, "run_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Run Id" }, "already": { "default": false, "title": "Already", "type": "boolean" } }, "required": [ "id", "status", "run_id" ], "title": "JobCancelResponse", "type": "object" }, "JobStatusResponse": { "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "status": { "enum": [ "pending", "running", "complete", "failed", "cancelled", "fanned_out" ], "title": "Status", "type": "string" }, "dataset_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Dataset Id" }, "source_filename": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Source Filename" }, "error_message": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Error Message" }, "error_code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Stable code for a fixed failure reason, so a client can show it in the reader's language; `error_message` keeps its English text. Null when the reason is free text.", "title": "Error Code" }, "can_retry": { "title": "Can Retry", "type": "boolean" }, "retry_reason": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Retry Reason" }, "warning_message": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Warning Message" }, "warnings": { "items": { "discriminator": { "mapping": { "dbf_truncation_collision": "#/components/schemas/DbfTruncationCollisionWarning", "mercator_clip": "#/components/schemas/MercatorClipWarning", "reserved_rename": "#/components/schemas/ReservedRenameWarning" }, "propertyName": "kind" }, "oneOf": [ { "$ref": "#/components/schemas/ReservedRenameWarning" }, { "$ref": "#/components/schemas/DbfTruncationCollisionWarning" }, { "$ref": "#/components/schemas/MercatorClipWarning" } ] }, "title": "Warnings", "type": "array" }, "progress": { "anyOf": [ { "maximum": 1.0, "minimum": 0.0, "type": "number" }, { "type": "null" } ], "title": "Progress" }, "current_step": { "anyOf": [ { "enum": [ "queued", "downloading", "validating", "ogr2ogr", "finalize", "complete", "cog_convert", "quicklook", "analyzing", "registering" ], "type": "string" }, { "type": "null" } ], "title": "Current Step" }, "rows_processed": { "anyOf": [ { "minimum": 0.0, "type": "integer" }, { "type": "null" } ], "title": "Rows Processed" }, "rows_failed": { "anyOf": [ { "minimum": 0.0, "type": "integer" }, { "type": "null" } ], "title": "Rows Failed" }, "archive_failed": { "default": false, "title": "Archive Failed", "type": "boolean" }, "quicklook_pending": { "default": false, "description": "True while the dataset's quicklook image is still owed after publication, so a client showing the thumbnail can poll again until the image has been replaced.", "title": "Quicklook Pending", "type": "boolean" }, "temporal_parse_errors": { "additionalProperties": { "type": "string" }, "propertyNames": { "enum": [ "temporal_start", "temporal_end" ] }, "title": "Temporal Parse Errors", "type": "object" }, "started_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Started At" }, "completed_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Completed At" }, "created_at": { "format": "date-time", "title": "Created At", "type": "string" } }, "required": [ "id", "status", "dataset_id", "source_filename", "error_message", "can_retry", "retry_reason", "started_at", "completed_at", "created_at" ], "title": "JobStatusResponse", "type": "object" }, "KeywordCreate": { "properties": { "keyword": { "maxLength": 500, "title": "Keyword", "type": "string" }, "vocabulary_uri": { "anyOf": [ { "maxLength": 2048, "type": "string" }, { "type": "null" } ], "description": "URI of the controlled vocabulary", "title": "Vocabulary Uri" }, "keyword_type": { "default": "theme", "description": "ISO MD_KeywordTypeCode, e.g. theme, place, discipline", "maxLength": 20, "title": "Keyword Type", "type": "string" } }, "required": [ "keyword" ], "title": "KeywordCreate", "type": "object" }, "KeywordListResponse": { "properties": { "keywords": { "items": { "$ref": "#/components/schemas/KeywordResponse" }, "title": "Keywords", "type": "array" }, "total": { "title": "Total", "type": "integer" }, "inherited_audience_gap": { "default": false, "description": "True when at least one keyword is inherited AND this record's audience \u2014 at its stored state, or at the counterfactual audience_visibility/audience_record_status query parameters, which are honored only for the record's owner and admins \u2014 includes someone who cannot open the source dataset.", "title": "Inherited Audience Gap", "type": "boolean" } }, "required": [ "keywords", "total" ], "title": "KeywordListResponse", "type": "object" }, "KeywordResponse": { "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "record_id": { "format": "uuid", "title": "Record Id", "type": "string" }, "keyword": { "title": "Keyword", "type": "string" }, "vocabulary_uri": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Vocabulary Uri" }, "keyword_type": { "title": "Keyword Type", "type": "string" }, "inherited": { "default": false, "description": "True when this keyword also exists on the dataset this record was derived from. Derived at read time from derived_from; only ever true for a requester who can access that source dataset, so everyone else sees false \u2014 matching the derived_from redaction.", "title": "Inherited", "type": "boolean" } }, "required": [ "id", "record_id", "keyword", "vocabulary_uri", "keyword_type" ], "title": "KeywordResponse", "type": "object" }, "KeywordSuggestion": { "description": "A single keyword suggestion with classification.", "properties": { "keyword": { "description": "Lowercase keyword", "title": "Keyword", "type": "string" }, "keyword_type": { "description": "Classification: theme, place, or temporal", "title": "Keyword Type", "type": "string" } }, "required": [ "keyword", "keyword_type" ], "title": "KeywordSuggestion", "type": "object" }, "KeywordSuggestionsResponse": { "description": "AI-suggested keywords for a dataset.", "properties": { "keywords": { "description": "List of suggested keywords with classification (5-10 items)", "items": { "$ref": "#/components/schemas/KeywordSuggestion" }, "title": "Keywords", "type": "array" } }, "required": [ "keywords" ], "title": "KeywordSuggestionsResponse", "type": "object" }, "LandingPage": { "properties": { "title": { "description": "OGC API landing page title.", "title": "Title", "type": "string" }, "description": { "description": "Human-readable API description.", "title": "Description", "type": "string" }, "links": { "description": "Top-level navigation links to conformance, collections, and API document.", "items": { "$ref": "#/components/schemas/OGCLink" }, "title": "Links", "type": "array" } }, "required": [ "title", "description", "links" ], "title": "LandingPage", "type": "object" }, "LayerInfo": { "properties": { "name": { "description": "Internal layer identifier used by the source service.", "title": "Name", "type": "string" }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Human-readable layer title from the service capabilities.", "title": "Title" }, "geometry_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Detected geometry type for the layer.", "title": "Geometry Type" }, "feature_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Total feature count if reported by the service.", "title": "Feature Count" }, "layer_type": { "default": "layer", "description": "Layer kind: 'layer' (spatial) or 'table' (non-spatial attribute table).", "title": "Layer Type", "type": "string" }, "source_layer_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "ArcGIS sub-layer type as the service reports it, for example 'Feature Layer', 'Table', 'Group Layer', 'Raster Layer' or 'Annotation Layer'. Null for other service types.", "title": "Source Layer Type" }, "parent_layer_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "ArcGIS ID of the group layer that contains this layer, if any.", "title": "Parent Layer Id" }, "importable": { "default": true, "description": "False when the layer holds no features (ArcGIS composite, raster and annotation layers) and a preview of it is refused with 'unsupported_layer_type'.", "title": "Importable", "type": "boolean" }, "layer_id": { "anyOf": [ { "type": "integer" }, { "type": "string" }, { "type": "null" } ], "description": "Numeric or string layer ID used by ArcGIS services.", "title": "Layer Id" }, "object_id_field": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "ArcGIS object ID field name, used for stable pagination.", "title": "Object Id Field" }, "kind": { "default": "vector", "description": "Backend-classified layer kind. 'vector' = point/line/polygon feature data. 'raster' = imagery/coverage. Classified as 'raster' when geometry_type contains 'raster', the adapter is STAC, the layer declares coverage_format or bands, or one of its links has a media type of image/*. Everything else, including a layer with no geometry_type at all, defaults to 'vector'.", "enum": [ "vector", "raster" ], "title": "Kind", "type": "string" } }, "required": [ "name" ], "title": "LayerInfo", "type": "object" }, "LayerPreview": { "properties": { "name": { "title": "Name", "type": "string" }, "feature_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Feature Count" }, "field_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Field Count" } }, "required": [ "name" ], "title": "LayerPreview", "type": "object" }, "LineageDraftResponse": { "description": "AI-generated lineage draft for a dataset.", "properties": { "draft": { "description": "AI-generated lineage summary (1-3 sentences)", "title": "Draft", "type": "string" } }, "required": [ "draft" ], "title": "LineageDraftResponse", "type": "object" }, "ManifestApplyEntryResult": { "properties": { "dataset_key": { "title": "Dataset Key", "type": "string" }, "action": { "description": "What apply did with the entry. `blocked` means the entry is unchanged since its last apply, whose replacement is held for review, so nothing was queued. Accept it by sending `run_id` as `accept_blocked_run_id` to the dataset's refresh endpoint, or change the entry.", "enum": [ "create", "update", "skip", "blocked", "error" ], "title": "Action", "type": "string" }, "job_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Job Id" }, "dataset_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Dataset Id" }, "run_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "description": "The blocked refresh run to accept, when action is `blocked`.", "title": "Run Id" }, "review_reasons": { "description": "Why the blocked run needs review, when action is `blocked`.", "items": { "type": "string" }, "title": "Review Reasons", "type": "array" }, "message": { "title": "Message", "type": "string" }, "errors": { "items": { "type": "string" }, "title": "Errors", "type": "array" } }, "required": [ "dataset_key", "action", "message" ], "title": "ManifestApplyEntryResult", "type": "object" }, "ManifestApplyRequest": { "additionalProperties": false, "properties": { "manifest_version": { "const": "1", "title": "Manifest Version", "type": "string" }, "catalog": { "$ref": "#/components/schemas/ManifestCatalog" }, "datasets": { "items": { "$ref": "#/components/schemas/ManifestDataset" }, "maxItems": 100, "minItems": 1, "title": "Datasets", "type": "array" }, "dry_run": { "default": false, "title": "Dry Run", "type": "boolean" } }, "required": [ "manifest_version", "catalog", "datasets" ], "title": "ManifestApplyRequest", "type": "object" }, "ManifestApplyResponse": { "properties": { "accepted": { "title": "Accepted", "type": "boolean" }, "dry_run": { "title": "Dry Run", "type": "boolean" }, "results": { "items": { "$ref": "#/components/schemas/ManifestApplyEntryResult" }, "title": "Results", "type": "array" } }, "required": [ "accepted", "dry_run", "results" ], "title": "ManifestApplyResponse", "type": "object" }, "ManifestCatalog": { "additionalProperties": false, "properties": { "title": { "maxLength": 500, "minLength": 1, "title": "Title", "type": "string" }, "description": { "anyOf": [ { "maxLength": 5000, "minLength": 1, "type": "string" }, { "type": "null" } ], "title": "Description" }, "organization": { "anyOf": [ { "maxLength": 500, "minLength": 1, "type": "string" }, { "type": "null" } ], "title": "Organization" }, "contact": { "anyOf": [ { "$ref": "#/components/schemas/ManifestContact" }, { "type": "null" } ] } }, "required": [ "title" ], "title": "ManifestCatalog", "type": "object" }, "ManifestContact": { "additionalProperties": false, "properties": { "name": { "anyOf": [ { "maxLength": 500, "minLength": 1, "type": "string" }, { "type": "null" } ], "title": "Name" }, "email": { "anyOf": [ { "format": "email", "maxLength": 320, "type": "string" }, { "type": "null" } ], "title": "Email" }, "url": { "anyOf": [ { "maxLength": 2000, "pattern": "^https?://[^\\s]+$", "type": "string" }, { "type": "null" } ], "title": "Url" } }, "title": "ManifestContact", "type": "object" }, "ManifestDataset": { "additionalProperties": false, "properties": { "key": { "description": "Stable dataset identity key used for idempotent apply operations.", "maxLength": 128, "minLength": 1, "pattern": "^[a-z0-9][a-z0-9._-]{0,127}$", "title": "Key", "type": "string" }, "title": { "maxLength": 500, "minLength": 1, "title": "Title", "type": "string" }, "description": { "anyOf": [ { "maxLength": 5000, "minLength": 1, "type": "string" }, { "type": "null" } ], "title": "Description" }, "sources": { "items": { "$ref": "#/components/schemas/ManifestSource" }, "maxItems": 1, "minItems": 1, "title": "Sources", "type": "array" }, "metadata": { "anyOf": [ { "$ref": "#/components/schemas/ManifestMetadata" }, { "type": "null" } ] }, "publication": { "$ref": "#/components/schemas/ManifestPublication" } }, "required": [ "key", "title", "sources", "publication" ], "title": "ManifestDataset", "type": "object" }, "ManifestMetadata": { "additionalProperties": false, "properties": { "tags": { "anyOf": [ { "items": { "maxLength": 100, "minLength": 1, "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Tags" }, "organization": { "anyOf": [ { "maxLength": 500, "minLength": 1, "type": "string" }, { "type": "null" } ], "title": "Organization" }, "crs": { "anyOf": [ { "pattern": "^EPSG:[0-9]{1,6}$", "type": "string" }, { "type": "null" } ], "title": "Crs" }, "license": { "anyOf": [ { "maxLength": 500, "minLength": 1, "type": "string" }, { "type": "null" } ], "title": "License" }, "attribution": { "anyOf": [ { "maxLength": 5000, "minLength": 1, "type": "string" }, { "type": "null" } ], "title": "Attribution" }, "bbox": { "anyOf": [ { "description": "WGS84 bbox hint.", "items": { "maximum": 180.0, "minimum": -180.0, "type": "number" }, "maxItems": 4, "minItems": 4, "type": "array" }, { "type": "null" } ], "title": "Bbox" } }, "title": "ManifestMetadata", "type": "object" }, "ManifestPublication": { "additionalProperties": false, "properties": { "intent": { "description": "Publication intent. Deliberately not pinned to an enum: the values come from the workflow extension's status_order(), so an overlay may define its own, and apply validates against the live extension. Community default order: draft, ready, internal, published.", "maxLength": 20, "minLength": 1, "title": "Intent", "type": "string" } }, "required": [ "intent" ], "title": "ManifestPublication", "type": "object" }, "ManifestSource": { "additionalProperties": false, "properties": { "type": { "description": "Source modality. Vector sources require zip, gpkg, geojson, json, csv, xlsx, xls, fgb, kml, or kmz; raster_cog sources require tif or tiff.", "enum": [ "vector", "raster_cog" ], "title": "Type", "type": "string" }, "uri": { "description": "Relative path (no `..` traversal), HTTP(S) URL, or s3:// storage URI.", "maxLength": 2000, "minLength": 1, "pattern": "^(?:(?:\\./)?[^\\s:/][^\\s:]*|https?://[^\\s]+|s3://[^\\s]+)$", "title": "Uri", "type": "string" }, "title": { "anyOf": [ { "maxLength": 500, "minLength": 1, "type": "string" }, { "type": "null" } ], "title": "Title" }, "description": { "anyOf": [ { "maxLength": 5000, "minLength": 1, "type": "string" }, { "type": "null" } ], "title": "Description" }, "format": { "anyOf": [ { "maxLength": 100, "minLength": 1, "type": "string" }, { "type": "null" } ], "title": "Format" }, "layer": { "anyOf": [ { "maxLength": 500, "minLength": 1, "type": "string" }, { "type": "null" } ], "title": "Layer" }, "checksum": { "anyOf": [ { "description": "Declared SHA-256 digest of the source bytes, as 'sha256:<64 lowercase hex characters>'. Apply uses this only as a change-detection input alongside the rest of the entry; it is not verified against the fetched bytes. For a vector source, bump it when the file under a stable URI changes, to force apply to reclassify the entry as an update instead of skipping it. Manifest raster updates are not supported: do not set or change checksum on a raster_cog source, because a changed value there makes apply report that entry as an error ('Manifest raster updates are not supported; create a new raster dataset instead.'), not a skip. An unchanged raster entry, checksum included, still skips normally.", "maxLength": 71, "minLength": 71, "pattern": "^sha256:[0-9a-f]{64}$", "type": "string" }, { "type": "null" } ], "title": "Checksum" } }, "required": [ "type", "uri" ], "title": "ManifestSource", "type": "object" }, "MapAccessResponse": { "properties": { "can_view": { "description": "True when the current request may read the map", "title": "Can View", "type": "boolean" }, "can_edit": { "description": "True when the current request may open the map builder", "title": "Can Edit", "type": "boolean" } }, "required": [ "can_view", "can_edit" ], "title": "MapAccessResponse", "type": "object" }, "MapCreate": { "properties": { "name": { "description": "Map display name", "example": "NYC Infrastructure", "maxLength": 255, "minLength": 1, "title": "Name", "type": "string" }, "description": { "anyOf": [ { "maxLength": 2000, "type": "string" }, { "type": "null" } ], "description": "Short description for sharing", "example": "Buildings, parks, and transit routes in Manhattan", "title": "Description" }, "notes": { "anyOf": [ { "maxLength": 50000, "type": "string" }, { "type": "null" } ], "description": "Private notes (not shown publicly)", "title": "Notes" }, "terrain_config": { "anyOf": [ { "$ref": "#/components/schemas/TerrainConfig" }, { "type": "null" } ], "description": "Map-level terrain source and exaggeration preferences" }, "basemap_config": { "anyOf": [ { "$ref": "#/components/schemas/BasemapConfig" }, { "type": "null" } ], "description": "Curated map-level basemap appearance preferences" } }, "required": [ "name" ], "title": "MapCreate", "type": "object" }, "MapDefaultsResponse": { "properties": { "center_lat": { "description": "Currently configured initial center latitude.", "maximum": 90.0, "minimum": -90.0, "title": "Center Lat", "type": "number" }, "center_lng": { "description": "Currently configured initial center longitude.", "maximum": 180.0, "minimum": -180.0, "title": "Center Lng", "type": "number" }, "zoom": { "description": "Currently configured initial zoom level.", "maximum": 22.0, "minimum": 0.0, "title": "Zoom", "type": "number" } }, "required": [ "center_lat", "center_lng", "zoom" ], "title": "MapDefaultsResponse", "type": "object" }, "MapGenerateRequest": { "properties": { "prompt": { "maxLength": 1000, "minLength": 3, "title": "Prompt", "type": "string" }, "language": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Language" } }, "required": [ "prompt" ], "title": "MapGenerateRequest", "type": "object" }, "MapGenerateResponse": { "properties": { "map_id": { "title": "Map Id", "type": "string" }, "map_name": { "title": "Map Name", "type": "string" }, "explanation": { "title": "Explanation", "type": "string" }, "datasets_used": { "items": { "type": "string" }, "title": "Datasets Used", "type": "array" } }, "required": [ "map_id", "map_name", "explanation", "datasets_used" ], "title": "MapGenerateResponse", "type": "object" }, "MapHistoryEventResponse": { "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "map_id": { "format": "uuid", "title": "Map Id", "type": "string" }, "actor_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Actor Id" }, "actor_username": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Actor Username" }, "target_type": { "title": "Target Type", "type": "string" }, "target_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Target Id" }, "target_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Target Name" }, "action": { "title": "Action", "type": "string" }, "summary": { "title": "Summary", "type": "string" }, "details": { "additionalProperties": true, "title": "Details", "type": "object" }, "created_at": { "format": "date-time", "title": "Created At", "type": "string" } }, "required": [ "id", "map_id", "target_type", "action", "summary", "created_at" ], "title": "MapHistoryEventResponse", "type": "object" }, "MapHistoryListResponse": { "properties": { "events": { "items": { "$ref": "#/components/schemas/MapHistoryEventResponse" }, "title": "Events", "type": "array" }, "total": { "title": "Total", "type": "integer" }, "skip": { "title": "Skip", "type": "integer" }, "limit": { "title": "Limit", "type": "integer" } }, "required": [ "events", "total", "skip", "limit" ], "title": "MapHistoryListResponse", "type": "object" }, "MapIconListResponse": { "properties": { "icons": { "items": { "$ref": "#/components/schemas/MapIconResponse" }, "title": "Icons", "type": "array" } }, "required": [ "icons" ], "title": "MapIconListResponse", "type": "object" }, "MapIconResponse": { "properties": { "id": { "title": "Id", "type": "string" }, "name": { "title": "Name", "type": "string" }, "slug": { "title": "Slug", "type": "string" }, "media_type": { "title": "Media Type", "type": "string" }, "url": { "title": "Url", "type": "string" }, "sprite_id": { "title": "Sprite Id", "type": "string" }, "size_bytes": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Size Bytes" }, "builtin": { "default": false, "title": "Builtin", "type": "boolean" } }, "required": [ "id", "name", "slug", "media_type", "url", "sprite_id" ], "title": "MapIconResponse", "type": "object" }, "MapLayerDiffRequest": { "properties": { "added": { "description": "Layers to append (max 200)", "items": { "$ref": "#/components/schemas/MapLayerInput" }, "maxItems": 200, "title": "Added", "type": "array" }, "updated": { "items": { "$ref": "#/components/schemas/MapLayerPatch" }, "title": "Updated", "type": "array" }, "removed": { "items": { "format": "uuid", "type": "string" }, "title": "Removed", "type": "array" }, "order": { "anyOf": [ { "items": { "format": "uuid", "type": "string" }, "type": "array" }, { "type": "null" } ], "description": "Optional stable layer ID order for existing layers", "title": "Order" }, "fallback_full_replace": { "default": false, "description": "Client hint only; PATCH never performs full replacement", "title": "Fallback Full Replace", "type": "boolean" } }, "title": "MapLayerDiffRequest", "type": "object" }, "MapLayerInput": { "properties": { "id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "description": "Existing layer id to update in place (full-save reconcile)", "title": "Id" }, "dataset_id": { "format": "uuid", "title": "Dataset Id", "type": "string" }, "sort_order": { "default": 0, "description": "Draw order (lower draws first)", "maximum": 32767.0, "minimum": 0.0, "title": "Sort Order", "type": "integer" }, "visible": { "default": true, "title": "Visible", "type": "boolean" }, "opacity": { "default": 1.0, "description": "Layer opacity 0.0-1.0", "maximum": 1.0, "minimum": 0.0, "title": "Opacity", "type": "number" }, "paint": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "MapLibre paint properties override", "title": "Paint" }, "layout": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "MapLibre layout properties override", "title": "Layout" }, "display_name": { "anyOf": [ { "maxLength": 255, "type": "string" }, { "type": "null" } ], "description": "Label shown in the layer list", "title": "Display Name" }, "filter": { "anyOf": [ { "items": {}, "type": "array" }, { "type": "null" } ], "description": "MapLibre filter expression", "title": "Filter" }, "label_config": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Text label configuration. Accepted keys: allowOverlap, column, fontSize, haloColor, haloWidth, maxZoom, minZoom, placement, textAnchor, textColor, textOffset, textOpacity. Unknown keys are dropped when the map is exported as a MapLibre style. See https://docs.getgeolens.com/guides/api/publishing-from-desktop-gis/", "title": "Label Config" }, "popup_config": { "anyOf": [ { "$ref": "#/components/schemas/PopupConfig" }, { "type": "null" } ], "description": "Popup configuration: {enabled, expression, visible_fields}" }, "style_config": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Data-driven and builder UI style configuration. Accepted top-level keys: breaks, builder, categories, classCount, colorLabel, colors, column, heatmapPaint, legendLabel, method, mode, ramp, render_mode, reversed, savedCirclePaint, sizeLabel, sizeRange, sizes, symbol, target; other top-level keys are dropped when the map is exported as a MapLibre style. Builder-only state lives under builder, whose interpreted keys are arrow_color, arrow_size, arrow_spacing, cluster_color, cluster_color_ramp, cluster_max_zoom, cluster_radius, cluster_show_counts, cluster_text_color, cluster_text_size, colormap, extrusion_min_zoom, extrusion_opacity, fill_color_saved, fill_disabled, fill_opacity_saved, folder_group_expanded, folder_group_id, folder_group_name, heatmap_ramp, heatmap_reversed, heatmap_weight_column, height_column, height_scale, hypso_enabled, hypso_ramp, hypso_reversed, lineGradient, outline_color, outline_width, outline_width_saved, pmax, pmin, sigma, stretch, stroke_disabled, symbol. Other builder keys are stored and exported unchanged but have no effect. See https://docs.getgeolens.com/guides/api/publishing-from-desktop-gis/", "title": "Style Config" }, "layer_type": { "anyOf": [ { "pattern": "^(vector_geolens|raster_geolens|geojson)$", "type": "string" }, { "type": "null" } ], "description": "Auto-detected from record_type if omitted", "title": "Layer Type" }, "show_in_legend": { "default": true, "description": "Whether to include in the map legend", "title": "Show In Legend", "type": "boolean" } }, "required": [ "dataset_id" ], "title": "MapLayerInput", "type": "object" }, "MapLayerPatch": { "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "sort_order": { "anyOf": [ { "maximum": 32767.0, "minimum": 0.0, "type": "integer" }, { "type": "null" } ], "title": "Sort Order" }, "visible": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Visible" }, "opacity": { "anyOf": [ { "maximum": 1.0, "minimum": 0.0, "type": "number" }, { "type": "null" } ], "title": "Opacity" }, "paint": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "MapLibre paint properties override", "title": "Paint" }, "layout": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "MapLibre layout properties override", "title": "Layout" }, "display_name": { "anyOf": [ { "maxLength": 255, "type": "string" }, { "type": "null" } ], "title": "Display Name" }, "filter": { "anyOf": [ { "items": {}, "type": "array" }, { "type": "null" } ], "description": "MapLibre filter expression", "title": "Filter" }, "label_config": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Text label configuration", "title": "Label Config" }, "popup_config": { "anyOf": [ { "$ref": "#/components/schemas/PopupConfig" }, { "type": "null" } ] }, "style_config": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Style Config" }, "layer_type": { "anyOf": [ { "pattern": "^(vector_geolens|raster_geolens|geojson)$", "type": "string" }, { "type": "null" } ], "title": "Layer Type" }, "show_in_legend": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Show In Legend" } }, "required": [ "id" ], "title": "MapLayerPatch", "type": "object" }, "MapLayerResponse": { "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "dataset_id": { "format": "uuid", "title": "Dataset Id", "type": "string" }, "dataset_name": { "title": "Dataset Name", "type": "string" }, "dataset_geometry_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Dataset Geometry Type" }, "dataset_table_name": { "title": "Dataset Table Name", "type": "string" }, "dataset_extent_bbox": { "anyOf": [ { "items": { "type": "number" }, "type": "array" }, { "type": "null" } ], "title": "Dataset Extent Bbox" }, "dataset_column_info": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "title": "Dataset Column Info" }, "dataset_feature_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Dataset Feature Count" }, "dataset_sample_values": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Dataset Sample Values" }, "display_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Display Name" }, "sort_order": { "title": "Sort Order", "type": "integer" }, "visible": { "title": "Visible", "type": "boolean" }, "opacity": { "title": "Opacity", "type": "number" }, "paint": { "additionalProperties": true, "title": "Paint", "type": "object" }, "layout": { "additionalProperties": true, "title": "Layout", "type": "object" }, "layer_type": { "default": "vector_geolens", "title": "Layer Type", "type": "string" }, "dataset_record_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Dataset Record Type" }, "filter": { "anyOf": [ { "items": {}, "type": "array" }, { "type": "null" } ], "title": "Filter" }, "label_config": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Label Config" }, "popup_config": { "anyOf": [ { "$ref": "#/components/schemas/PopupConfig" }, { "type": "null" } ] }, "style_config": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Style Config" }, "show_in_legend": { "default": true, "title": "Show In Legend", "type": "boolean" }, "is_3d": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Is 3D" }, "is_dem": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Is Dem" }, "dem_vertical_units": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Dem Vertical Units" }, "band_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Band Count" }, "tile_version": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Tile Version" }, "publication_version": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Publication Version" }, "dataset_visibility": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Dataset Visibility" }, "dataset_status": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Dataset Status" }, "dataset_attribution": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Dataset Attribution" } }, "required": [ "id", "dataset_id", "dataset_name", "dataset_geometry_type", "dataset_table_name", "dataset_extent_bbox", "sort_order", "visible", "opacity", "paint", "layout" ], "title": "MapLayerResponse", "type": "object" }, "MapListResponse": { "properties": { "maps": { "items": { "$ref": "#/components/schemas/MapSummaryResponse" }, "title": "Maps", "type": "array" }, "total": { "title": "Total", "type": "integer" } }, "required": [ "maps", "total" ], "title": "MapListResponse", "type": "object" }, "MapPatch": { "additionalProperties": false, "description": "Partial map update. PUT /maps/{map_id} edits the map's content.", "properties": { "owner_id": { "description": "Admin only: transfer the map to this active user.", "format": "uuid", "title": "Owner Id", "type": "string" } }, "required": [ "owner_id" ], "title": "MapPatch", "type": "object" }, "MapResponse": { "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "name": { "title": "Name", "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Description" }, "notes": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Notes" }, "center_lng": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Center Lng" }, "center_lat": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Center Lat" }, "zoom": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Zoom" }, "bearing": { "title": "Bearing", "type": "number" }, "pitch": { "title": "Pitch", "type": "number" }, "basemap_style": { "title": "Basemap Style", "type": "string" }, "show_basemap_labels": { "title": "Show Basemap Labels", "type": "boolean" }, "basemap_config": { "anyOf": [ { "$ref": "#/components/schemas/BasemapConfig" }, { "type": "null" } ] }, "terrain_config": { "anyOf": [ { "$ref": "#/components/schemas/TerrainConfig" }, { "type": "null" } ] }, "visibility": { "$ref": "#/components/schemas/MapVisibility" }, "thumbnail_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Thumbnail Url" }, "og_image_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Og Image Url" }, "forked_from_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "description": "Source map UUID if this is a fork", "title": "Forked From Id" }, "forked_from_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Forked From Name" }, "created_by": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Created By" }, "created_by_username": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Created By Username" }, "created_at": { "format": "date-time", "title": "Created At", "type": "string" }, "updated_at": { "format": "date-time", "title": "Updated At", "type": "string" }, "layers": { "items": { "$ref": "#/components/schemas/MapLayerResponse" }, "title": "Layers", "type": "array" }, "layer_count": { "title": "Layer Count", "type": "integer" }, "plugins": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Plugins" }, "legend_title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Legend Title" } }, "required": [ "id", "name", "description", "center_lng", "center_lat", "zoom", "bearing", "pitch", "basemap_style", "show_basemap_labels", "visibility", "created_by", "created_at", "updated_at", "layers", "layer_count" ], "title": "MapResponse", "type": "object" }, "MapSpriteEntry": { "description": "One entry of the MapLibre array-form ``sprite`` ({id, url}).", "properties": { "id": { "maxLength": 255, "title": "Id", "type": "string" }, "url": { "maxLength": 2000, "title": "Url", "type": "string" } }, "required": [ "id", "url" ], "title": "MapSpriteEntry", "type": "object" }, "MapStyleImportRequest": { "additionalProperties": true, "description": "Typed request body for POST /maps/import.\n\nMirrors the top-level keys of the MapLibre Style Specification that\n``parse_maplibre_style_import`` actually reads. ``extra=\"allow\"`` keeps\nforward-compatibility with future MapLibre fields (e.g. ``projection``,\n``light``, ``transition``) so adding a new key on the client side\ndoesn't require a server release.\n\nReplacing the previous bare-``dict`` body parameter removes\n``additionalProperties: true`` from the OpenAPI schema and lets\nopenapi-python-client generate a navigable named model class.", "properties": { "version": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "MapLibre style version (always 8 in current spec)", "title": "Version" }, "name": { "anyOf": [ { "maxLength": 255, "type": "string" }, { "type": "null" } ], "description": "Display name for the imported map", "title": "Name" }, "metadata": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Free-form metadata bag (used by GeoLens for center/zoom/basemap hints)", "title": "Metadata" }, "center": { "anyOf": [ { "items": { "type": "number" }, "type": "array" }, { "type": "null" } ], "description": "[longitude, latitude] map center", "title": "Center" }, "zoom": { "anyOf": [ { "maximum": 24.0, "minimum": 0.0, "type": "number" }, { "type": "null" } ], "title": "Zoom" }, "bearing": { "anyOf": [ { "maximum": 180.0, "minimum": -180.0, "type": "number" }, { "type": "null" } ], "title": "Bearing" }, "pitch": { "anyOf": [ { "maximum": 85.0, "minimum": 0.0, "type": "number" }, { "type": "null" } ], "title": "Pitch" }, "sources": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "MapLibre sources object keyed by source id", "title": "Sources" }, "sprite": { "anyOf": [ { "maxLength": 2000, "type": "string" }, { "items": { "$ref": "#/components/schemas/MapSpriteEntry" }, "type": "array" }, { "type": "null" } ], "description": "MapLibre sprite: base URL string or array of {id, url} entries (the array form is what GeoLens style exports emit)", "title": "Sprite" }, "glyphs": { "anyOf": [ { "maxLength": 2000, "type": "string" }, { "type": "null" } ], "title": "Glyphs" }, "terrain": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "MapLibre terrain config (source + exaggeration)", "title": "Terrain" }, "layers": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "maxItems": 1000, "type": "array" }, { "type": "null" } ], "description": "MapLibre layer specifications", "title": "Layers" } }, "title": "MapStyleImportRequest", "type": "object" }, "MapStyleImportResponse": { "properties": { "map": { "$ref": "#/components/schemas/MapResponse" }, "summary": { "$ref": "#/components/schemas/MapStyleImportSummary" } }, "required": [ "map", "summary" ], "title": "MapStyleImportResponse", "type": "object" }, "MapStyleImportSummary": { "properties": { "sources_matched": { "default": 0, "title": "Sources Matched", "type": "integer" }, "sources_unsupported": { "default": 0, "title": "Sources Unsupported", "type": "integer" }, "layers_imported": { "default": 0, "title": "Layers Imported", "type": "integer" }, "layers_skipped": { "default": 0, "title": "Layers Skipped", "type": "integer" }, "warnings": { "items": { "$ref": "#/components/schemas/MapStyleImportWarning" }, "title": "Warnings", "type": "array" }, "warnings_truncated": { "default": 0, "description": "Warnings produced beyond the reported list", "minimum": 0.0, "title": "Warnings Truncated", "type": "integer" } }, "title": "MapStyleImportSummary", "type": "object" }, "MapStyleImportWarning": { "properties": { "code": { "title": "Code", "type": "string" }, "message": { "title": "Message", "type": "string" }, "source_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Source Id" }, "layer_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Layer Id" } }, "required": [ "code", "message" ], "title": "MapStyleImportWarning", "type": "object" }, "MapSummaryResponse": { "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "name": { "title": "Name", "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Description" }, "visibility": { "$ref": "#/components/schemas/MapVisibility" }, "thumbnail_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Thumbnail Url" }, "thumbnail_updated_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Thumbnail Updated At" }, "layer_count": { "title": "Layer Count", "type": "integer" }, "created_by_username": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Created By Username" }, "created_at": { "format": "date-time", "title": "Created At", "type": "string" }, "updated_at": { "format": "date-time", "title": "Updated At", "type": "string" }, "created_by": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Created By" } }, "required": [ "id", "name", "description", "visibility", "layer_count", "created_at", "updated_at" ], "title": "MapSummaryResponse", "type": "object" }, "MapUpdate": { "properties": { "name": { "anyOf": [ { "maxLength": 255, "type": "string" }, { "type": "null" } ], "title": "Name" }, "description": { "anyOf": [ { "maxLength": 2000, "type": "string" }, { "type": "null" } ], "title": "Description" }, "notes": { "anyOf": [ { "maxLength": 50000, "type": "string" }, { "type": "null" } ], "title": "Notes" }, "center_lng": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Map center longitude", "title": "Center Lng" }, "center_lat": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Map center latitude", "title": "Center Lat" }, "zoom": { "anyOf": [ { "maximum": 24.0, "minimum": 0.0, "type": "number" }, { "type": "null" } ], "description": "Map zoom level", "title": "Zoom" }, "bearing": { "anyOf": [ { "maximum": 180.0, "minimum": -180.0, "type": "number" }, { "type": "null" } ], "description": "Map rotation in degrees", "title": "Bearing" }, "pitch": { "anyOf": [ { "maximum": 85.0, "minimum": 0.0, "type": "number" }, { "type": "null" } ], "description": "Map tilt in degrees (0-85)", "title": "Pitch" }, "basemap_style": { "anyOf": [ { "maxLength": 2000, "type": "string" }, { "type": "null" } ], "description": "Basemap style ID or URL", "title": "Basemap Style" }, "show_basemap_labels": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Show Basemap Labels" }, "basemap_config": { "anyOf": [ { "$ref": "#/components/schemas/BasemapConfig" }, { "type": "null" } ], "description": "Curated map-level basemap appearance preferences" }, "terrain_config": { "anyOf": [ { "$ref": "#/components/schemas/TerrainConfig" }, { "type": "null" } ], "description": "Map-level terrain source and exaggeration preferences" }, "visibility": { "anyOf": [ { "$ref": "#/components/schemas/MapVisibility" }, { "type": "null" } ], "description": "private, internal, or public" }, "layers": { "anyOf": [ { "items": { "$ref": "#/components/schemas/MapLayerInput" }, "maxItems": 200, "type": "array" }, { "type": "null" } ], "description": "Full replacement layer list (max 200 layers)", "title": "Layers" }, "plugins": { "anyOf": [ { "items": { "type": "string" }, "maxItems": 50, "type": "array" }, { "type": "null" } ], "description": "Enabled plugin IDs, e.g. ['measurement']", "title": "Plugins" }, "legend_title": { "anyOf": [ { "maxLength": 120, "type": "string" }, { "type": "null" } ], "description": "Custom map-level legend title. Null or empty leaves the legend without a heading override. At most 120 characters.", "title": "Legend Title" } }, "title": "MapUpdate", "type": "object" }, "MapVisibility": { "enum": [ "private", "internal", "public" ], "title": "MapVisibility", "type": "string" }, "MercatorClipDetail": { "additionalProperties": false, "description": "Counts geometry changed by the Web Mercator clamp.\n\nThe clamp is a box, not a latitude cutoff: longitude -180 to 180 and\nlatitude -85.06 to 85.06. Either bound can be the one that cost the user\ngeometry, so clients must not present this as a latitude-only problem.\n\n``dropped_features`` lost their geometry entirely (a valid point at lat\n-89.95 becomes ``MULTIPOINT EMPTY``); ``clipped_features`` survived in\nreduced form.", "properties": { "dropped_features": { "minimum": 0.0, "title": "Dropped Features", "type": "integer" }, "clipped_features": { "minimum": 0.0, "title": "Clipped Features", "type": "integer" }, "clip_skipped": { "default": false, "title": "Clip Skipped", "type": "boolean" } }, "required": [ "dropped_features", "clipped_features" ], "title": "MercatorClipDetail", "type": "object" }, "MercatorClipWarning": { "additionalProperties": false, "properties": { "kind": { "const": "mercator_clip", "title": "Kind", "type": "string" }, "details": { "$ref": "#/components/schemas/MercatorClipDetail" } }, "required": [ "kind", "details" ], "title": "MercatorClipWarning", "type": "object" }, "MetadataAssistRequest": { "description": "Request body for metadata AI endpoints.", "properties": { "dataset_id": { "description": "UUID of the dataset to generate metadata for", "title": "Dataset Id", "type": "string" } }, "required": [ "dataset_id" ], "title": "MetadataAssistRequest", "type": "object" }, "NotificationStatusResponse": { "description": "Response for GET /settings/notifications/status/.\n\nReturns only boolean presence flags \u2014 never a secret value (SMTP password,\nwebhook URL, or webhook secret).", "properties": { "notifications_enabled": { "description": "Whether the NOTIFICATIONS_ENABLED master toggle is set to true.", "title": "Notifications Enabled", "type": "boolean" }, "smtp_configured": { "description": "Whether an SMTP host is configured (SMTP_HOST is set). Does not echo the host value.", "title": "Smtp Configured", "type": "boolean" }, "webhook_configured": { "description": "Whether a notification webhook URL is configured (NOTIFICATION_WEBHOOK_URL is set). Does not echo the URL.", "title": "Webhook Configured", "type": "boolean" } }, "required": [ "notifications_enabled", "smtp_configured", "webhook_configured" ], "title": "NotificationStatusResponse", "type": "object" }, "NotificationTestChannelResult": { "description": "Per-channel result from POST /settings/notifications/test/.\n\nThe ``error`` field contains only the exception type name and a short\nsafe message \u2014 never the SMTP password, webhook URL, or webhook secret.", "properties": { "channel": { "description": "Channel name, e.g. 'smtp' or 'webhook'.", "title": "Channel", "type": "string" }, "ok": { "description": "True if the channel delivered the test notification without error.", "title": "Ok", "type": "boolean" }, "error": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Safe error string (exception type name + short message) if ok=False, else null. Never contains secrets.", "title": "Error" } }, "required": [ "channel", "ok" ], "title": "NotificationTestChannelResult", "type": "object" }, "NotificationTestResponse": { "description": "Response for POST /settings/notifications/test/.\n\nAlways returns HTTP 200 \u2014 a channel delivery failure is captured in the\nper-channel ``channels`` list rather than as a 5xx. Never contains secret\nvalues.", "properties": { "sent": { "description": "True if at least one channel successfully delivered the test notification.", "title": "Sent", "type": "boolean" }, "channels": { "description": "Per-channel delivery results. Empty when no channel is configured.", "items": { "$ref": "#/components/schemas/NotificationTestChannelResult" }, "title": "Channels", "type": "array" }, "message": { "description": "Human-readable summary of the test result.", "title": "Message", "type": "string" } }, "required": [ "sent", "channels", "message" ], "title": "NotificationTestResponse", "type": "object" }, "OAuthProviderCreate": { "description": "Schema for creating a new OAuth provider.", "properties": { "slug": { "description": "URL-safe identifier used in callback URLs (e.g. 'google', 'azure-ad'). Lowercase, digits, and hyphens only.", "maxLength": 50, "minLength": 1, "pattern": "^[a-z0-9-]+$", "title": "Slug", "type": "string" }, "display_name": { "description": "Human-readable label shown on the login page button.", "maxLength": 100, "minLength": 1, "title": "Display Name", "type": "string" }, "provider_type": { "description": "OAuth or SAML provider type. 'google' and 'microsoft' auto-populate the discovery URL; 'oidc' is generic OAuth/OIDC; 'github' uses GitHub's fixed OAuth2 endpoints (no discovery URL); 'saml' is available only on SAML-enabled deployments.", "enum": [ "google", "microsoft", "oidc", "saml", "github" ], "title": "Provider Type", "type": "string" }, "client_id": { "anyOf": [ { "maxLength": 500, "type": "string" }, { "type": "null" } ], "description": "OAuth client ID issued by the IdP. Required for OAuth/OIDC providers; omit for SAML.", "title": "Client Id" }, "client_secret": { "anyOf": [ { "maxLength": 1000, "type": "string" }, { "type": "null" } ], "description": "OAuth client secret issued by the IdP. Stored encrypted; never returned in responses. Required for OAuth/OIDC providers; omit for SAML.", "title": "Client Secret" }, "discovery_url": { "anyOf": [ { "maxLength": 512, "type": "string" }, { "type": "null" } ], "description": "OIDC discovery URL ending in `.well-known/openid-configuration`. Auto-populated for Google and Microsoft.", "title": "Discovery Url" }, "authorize_url": { "anyOf": [ { "maxLength": 512, "type": "string" }, { "type": "null" } ], "description": "Authorization endpoint. Only needed when discovery_url is not set.", "title": "Authorize Url" }, "token_url": { "anyOf": [ { "maxLength": 512, "type": "string" }, { "type": "null" } ], "description": "Token endpoint. Only needed when discovery_url is not set.", "title": "Token Url" }, "userinfo_url": { "anyOf": [ { "maxLength": 512, "type": "string" }, { "type": "null" } ], "description": "Userinfo endpoint. Only needed when discovery_url is not set.", "title": "Userinfo Url" }, "idp_entity_id": { "anyOf": [ { "maxLength": 512, "type": "string" }, { "type": "null" } ], "description": "SAML IdP entityID. Required for SAML providers.", "title": "Idp Entity Id" }, "idp_sso_url": { "anyOf": [ { "maxLength": 512, "type": "string" }, { "type": "null" } ], "description": "SAML IdP SSO URL (HTTP-Redirect or HTTP-POST binding). Required for SAML providers.", "title": "Idp Sso Url" }, "idp_certificate": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "SAML IdP signing certificate (PEM). Required for SAML providers. Stored Fernet-encrypted at rest; never returned in responses.", "title": "Idp Certificate" }, "sp_entity_id": { "anyOf": [ { "maxLength": 512, "type": "string" }, { "type": "null" } ], "description": "SP entityID for this provider. Required for SAML providers. Default suggestion: {public_api_url}/auth/saml/{slug}.", "title": "Sp Entity Id" }, "scopes": { "default": "openid profile email", "description": "Space-separated OAuth scopes.", "maxLength": 500, "title": "Scopes", "type": "string" }, "default_role": { "default": "viewer", "description": "Role assigned to new users created via this provider: 'viewer', 'editor', or 'admin'.", "maxLength": 50, "title": "Default Role", "type": "string" }, "group_claim": { "anyOf": [ { "maxLength": 100, "type": "string" }, { "type": "null" } ], "description": "Name of the JWT/userinfo claim (or SAML attribute) that contains group memberships. Set to enable group-based role mapping.", "title": "Group Claim" }, "group_role_mapping": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "JSON object mapping IdP group names to GeoLens roles ('viewer', 'editor' or 'admin'). A user in several mapped groups gets the most privileged of their roles; a user in none gets default_role.", "title": "Group Role Mapping" }, "enabled": { "default": true, "description": "Whether the provider button appears on the login page.", "title": "Enabled", "type": "boolean" } }, "required": [ "slug", "display_name", "provider_type" ], "title": "OAuthProviderCreate", "type": "object" }, "OAuthProviderPublic": { "description": "Minimal provider info for the login page (no secrets, no config).", "properties": { "slug": { "description": "URL-safe identifier used in the callback URL.", "title": "Slug", "type": "string" }, "display_name": { "description": "Label shown on the login page button.", "title": "Display Name", "type": "string" }, "provider_type": { "description": "Provider type, used by the frontend to pick the right icon.", "title": "Provider Type", "type": "string" } }, "required": [ "slug", "display_name", "provider_type" ], "title": "OAuthProviderPublic", "type": "object" }, "OAuthProviderResponse": { "description": "Response schema for OAuth/SAML provider.\n\nWrite-only credentials are never exposed:\n - ``client_secret_encrypted`` (OAuth client secret) \u2014 excluded.\n - ``idp_certificate`` (SAML IdP signing cert, Fernet-encrypted at rest) \u2014 excluded.\n\nThe 3 non-secret SAML fields (``idp_entity_id``, ``idp_sso_url``,\n``sp_entity_id``) ARE exposed so the admin UI can display them.\n\nThose 3 fields are declared with ``deferred=True`` on the OAuth ORM\nmodel so community DBs (which lack the columns) do not crash on\nSELECT. Pydantic's ``from_attributes=True`` would normally trigger an\nimplicit deferred load on attribute access, which fails under FastAPI's\nasync context with ``MissingGreenlet``. The ``model_validator(mode=\"before\")``\nbelow reads the SAML fields directly from ``obj.__dict__`` so unloaded\nattributes default to None instead of triggering IO. SAML admin endpoints\nthat need the values must use ``undefer_group(\"saml\")`` at query time.", "properties": { "id": { "description": "Unique provider identifier.", "format": "uuid", "title": "Id", "type": "string" }, "slug": { "description": "URL-safe identifier used in the callback URL.", "title": "Slug", "type": "string" }, "display_name": { "description": "Label shown on the login page button.", "title": "Display Name", "type": "string" }, "provider_type": { "description": "Provider type: 'google', 'microsoft', 'oidc', or 'saml'.", "title": "Provider Type", "type": "string" }, "client_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "OAuth client ID. Visible to admins; never exposes client_secret. Null for SAML providers.", "title": "Client Id" }, "discovery_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "OIDC discovery URL.", "title": "Discovery Url" }, "authorize_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Authorization endpoint.", "title": "Authorize Url" }, "token_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Token endpoint.", "title": "Token Url" }, "userinfo_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Userinfo endpoint.", "title": "Userinfo Url" }, "idp_entity_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "SAML IdP entityID (SAML providers only).", "title": "Idp Entity Id" }, "idp_sso_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "SAML IdP SSO URL (SAML providers only).", "title": "Idp Sso Url" }, "sp_entity_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "SP entityID for this SAML provider (SAML providers only).", "title": "Sp Entity Id" }, "scopes": { "description": "Space-separated OAuth scopes.", "title": "Scopes", "type": "string" }, "default_role": { "description": "Default role assigned to new users.", "title": "Default Role", "type": "string" }, "group_claim": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Claim name used for group-based role mapping.", "title": "Group Claim" }, "group_role_mapping": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Group-to-role mapping rules.", "title": "Group Role Mapping" }, "enabled": { "description": "Whether the provider button appears on the login page.", "title": "Enabled", "type": "boolean" }, "created_at": { "description": "Timestamp the provider was created.", "format": "date-time", "title": "Created At", "type": "string" }, "updated_at": { "description": "Timestamp the provider was last updated.", "format": "date-time", "title": "Updated At", "type": "string" } }, "required": [ "id", "slug", "display_name", "provider_type", "scopes", "default_role", "enabled", "created_at", "updated_at" ], "title": "OAuthProviderResponse", "type": "object" }, "OAuthProviderUpdate": { "description": "Schema for updating an existing OAuth provider. All fields optional.", "properties": { "slug": { "anyOf": [ { "maxLength": 50, "minLength": 1, "pattern": "^[a-z0-9-]+$", "type": "string" }, { "type": "null" } ], "description": "New slug. Changes the callback URL \u2014 coordinate with the IdP before updating.", "title": "Slug" }, "display_name": { "anyOf": [ { "maxLength": 100, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "New display label.", "title": "Display Name" }, "provider_type": { "anyOf": [ { "enum": [ "google", "microsoft", "oidc", "saml", "github" ], "type": "string" }, { "type": "null" } ], "description": "New provider type. Rarely changed after creation.", "title": "Provider Type" }, "client_id": { "anyOf": [ { "maxLength": 500, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "New client ID. Set when rotating credentials.", "title": "Client Id" }, "client_secret": { "anyOf": [ { "maxLength": 1000, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "New client secret. Omit to leave unchanged; setting this rotates the stored secret.", "title": "Client Secret" }, "discovery_url": { "anyOf": [ { "maxLength": 512, "type": "string" }, { "type": "null" } ], "description": "Updated OIDC discovery URL.", "title": "Discovery Url" }, "authorize_url": { "anyOf": [ { "maxLength": 512, "type": "string" }, { "type": "null" } ], "description": "Updated authorization endpoint.", "title": "Authorize Url" }, "token_url": { "anyOf": [ { "maxLength": 512, "type": "string" }, { "type": "null" } ], "description": "Updated token endpoint.", "title": "Token Url" }, "userinfo_url": { "anyOf": [ { "maxLength": 512, "type": "string" }, { "type": "null" } ], "description": "Updated userinfo endpoint.", "title": "Userinfo Url" }, "idp_entity_id": { "anyOf": [ { "maxLength": 512, "type": "string" }, { "type": "null" } ], "description": "Updated SAML IdP entityID.", "title": "Idp Entity Id" }, "idp_sso_url": { "anyOf": [ { "maxLength": 512, "type": "string" }, { "type": "null" } ], "description": "Updated SAML IdP SSO URL.", "title": "Idp Sso Url" }, "idp_certificate": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Updated SAML IdP signing certificate (PEM). Setting this rotates the stored cert; omit to leave unchanged.", "title": "Idp Certificate" }, "sp_entity_id": { "anyOf": [ { "maxLength": 512, "type": "string" }, { "type": "null" } ], "description": "Updated SP entityID.", "title": "Sp Entity Id" }, "scopes": { "anyOf": [ { "maxLength": 500, "type": "string" }, { "type": "null" } ], "description": "Updated space-separated scopes.", "title": "Scopes" }, "default_role": { "anyOf": [ { "maxLength": 50, "type": "string" }, { "type": "null" } ], "description": "Updated default role for new users: 'viewer', 'editor', or 'admin'.", "title": "Default Role" }, "group_claim": { "anyOf": [ { "maxLength": 100, "type": "string" }, { "type": "null" } ], "description": "Updated group claim name.", "title": "Group Claim" }, "group_role_mapping": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Updated group-to-role mapping, with the same rules as on create. Pass an empty object to clear.", "title": "Group Role Mapping" }, "enabled": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "description": "Set to false to hide the provider button without deleting the configuration.", "title": "Enabled" } }, "title": "OAuthProviderUpdate", "type": "object" }, "OGCAsset": { "description": "STAC-style asset entry for an OGC Record.", "properties": { "href": { "title": "Href", "type": "string" }, "type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Type" }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Title" }, "roles": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Roles" } }, "required": [ "href" ], "title": "OGCAsset", "type": "object" }, "OGCCollectionMetadata": { "description": "Per-dataset collection metadata per OGC API Features.", "properties": { "id": { "description": "Stable collection identifier (typically the dataset ID).", "title": "Id", "type": "string" }, "title": { "description": "Human-readable collection title.", "title": "Title", "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Collection description.", "title": "Description" }, "extent": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Spatial and temporal extent (OGC API Features extent object).", "title": "Extent" }, "itemType": { "default": "feature", "description": "Type of items in the collection: 'feature' for vector feature collections, 'coverage' for raster/VRT collections (which expose tiles instead of feature items).", "title": "Itemtype", "type": "string" }, "crs": { "default": [ "http://www.opengis.net/def/crs/OGC/1.3/CRS84" ], "description": "Coordinate reference systems supported for items in this collection.", "items": { "type": "string" }, "title": "Crs", "type": "array" }, "links": { "description": "Collection navigation links (self, items, queryables, etc.).", "items": { "$ref": "#/components/schemas/OGCLink" }, "title": "Links", "type": "array" } }, "required": [ "id", "title", "links" ], "title": "OGCCollectionMetadata", "type": "object" }, "OGCCollectionMetadataResponse": { "description": "Response for /collections/datasets single collection metadata.", "properties": { "id": { "title": "Id", "type": "string" }, "title": { "title": "Title", "type": "string" }, "description": { "title": "Description", "type": "string" }, "itemType": { "default": "record", "title": "Itemtype", "type": "string" }, "links": { "items": { "additionalProperties": true, "type": "object" }, "title": "Links", "type": "array" }, "extent": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Extent" }, "summaries": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Summaries" } }, "required": [ "id", "title", "description", "links" ], "title": "OGCCollectionMetadataResponse", "type": "object" }, "OGCCollectionsResponse": { "description": "Response for /collections listing all available OGC collections.", "properties": { "collections": { "items": { "additionalProperties": true, "type": "object" }, "title": "Collections", "type": "array" }, "links": { "default": [], "items": { "$ref": "#/components/schemas/OGCRecordLink" }, "title": "Links", "type": "array" } }, "required": [ "collections" ], "title": "OGCCollectionsResponse", "type": "object" }, "OGCFeatureCollectionResponse": { "description": "OGC API Records FeatureCollection with match counts.", "properties": { "type": { "default": "FeatureCollection", "title": "Type", "type": "string" }, "timeStamp": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Timestamp" }, "numberMatched": { "description": "Total records matching the query", "title": "Numbermatched", "type": "integer" }, "numberMatchedAllTypes": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Total records matching the query with record_type removed and every other filter kept; present only when record_type is set", "title": "Numbermatchedalltypes" }, "numberReturned": { "description": "Number of records in this response page", "title": "Numberreturned", "type": "integer" }, "features": { "items": { "$ref": "#/components/schemas/OGCRecordResponse" }, "title": "Features", "type": "array" }, "links": { "anyOf": [ { "items": { "$ref": "#/components/schemas/OGCRecordLink" }, "type": "array" }, { "type": "null" } ], "description": "Pagination and self links", "title": "Links" } }, "required": [ "numberMatched", "numberReturned", "features" ], "title": "OGCFeatureCollectionResponse", "type": "object" }, "OGCLink": { "properties": { "href": { "description": "Target URL of the link.", "title": "Href", "type": "string" }, "rel": { "description": "Link relation type per RFC 8288 (e.g. 'self', 'next', 'prev', 'data', 'collection').", "title": "Rel", "type": "string" }, "type": { "description": "Media type of the linked resource (e.g. 'application/json', 'application/geo+json').", "title": "Type", "type": "string" }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Optional human-readable label for the link.", "title": "Title" } }, "required": [ "href", "rel", "type" ], "title": "OGCLink", "type": "object" }, "OGCRasterBand": { "description": "One entry in the raster:bands STAC extension array.\n\nThis matches the per-band data returned by catalog search. ``statistics``\nuses the normalized raster band metadata shape.", "properties": { "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Name" }, "data_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Data Type" }, "nodata": { "anyOf": [ { "type": "string" }, { "type": "integer" }, { "type": "number" }, { "type": "null" } ], "title": "Nodata" }, "statistics": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Statistics" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Description" } }, "title": "OGCRasterBand", "type": "object" }, "OGCRecordLink": { "description": "Link object in OGC API Records.", "properties": { "rel": { "title": "Rel", "type": "string" }, "href": { "title": "Href", "type": "string" }, "type": { "title": "Type", "type": "string" } }, "required": [ "rel", "href", "type" ], "title": "OGCRecordLink", "type": "object" }, "OGCRecordProperties": { "description": "Properties block of an OGC API Records Feature.", "properties": { "type": { "default": "dataset", "title": "Type", "type": "string" }, "title": { "title": "Title", "type": "string" }, "description": { "title": "Description", "type": "string" }, "keywords": { "items": { "type": "string" }, "title": "Keywords", "type": "array" }, "created": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Created" }, "updated": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Updated" }, "updated_by_display": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Updated By Display" }, "never_edited": { "default": false, "title": "Never Edited", "type": "boolean" }, "crs": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Crs" }, "record_type": { "default": "vector_dataset", "title": "Record Type", "type": "string" }, "band_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Band Count" }, "geometry_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Geometry Type" }, "feature_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Feature Count" }, "row_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Row count for tabular records (alias for feature_count when record_type='table').", "title": "Row Count" }, "column_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Number of columns in the dataset (populated from column_info length).", "title": "Column Count" }, "license": { "title": "License", "type": "string" }, "source_organization": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Source Organization" }, "source_format": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Ingest source format ('geojson', 'shapefile', 'geotiff', 'wfs', 'stac', 'created', ...). Null for datasets registered from existing PostGIS tables and for composed VRT datasets.", "title": "Source Format" }, "quality_detail": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Quality Detail" }, "quality_statement": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Quality Statement" }, "formats": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Formats" }, "language": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Language" }, "externalIds": { "description": "Identifiers assigned by the described resource's source system.", "items": { "type": "string" }, "title": "Externalids", "type": "array" }, "themes": { "items": { "additionalProperties": true, "type": "object" }, "title": "Themes", "type": "array" }, "rights": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Rights" }, "contacts": { "items": { "additionalProperties": true, "type": "object" }, "title": "Contacts", "type": "array" }, "time": { "additionalProperties": true, "title": "Time", "type": "object" }, "lineage": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Lineage" }, "update_frequency": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Update Frequency" }, "source_freshness": { "default": "unknown", "description": "fresh, due, overdue, or unknown \u2014 how the dataset's last refresh compares to its declared update_frequency. 'unknown' for origins nothing can refresh. Advisory only, and distinct from the quality score's own freshness.", "title": "Source Freshness", "type": "string" }, "source_health": { "default": "unknown", "description": "healthy, missing, inaccessible, or unknown. 'unknown' means never probed, or an origin kind with nothing to probe.", "title": "Source Health", "type": "string" }, "last_checked_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "Last time GeoLens contacted the origin, whether the attempt succeeded or failed.", "title": "Last Checked At" }, "last_refreshed_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "Last committed successful refresh \u2014 not the last attempt.", "title": "Last Refreshed At" }, "constraints": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Constraints" }, "distributions": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "title": "Distributions" }, "record_status": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Record Status" }, "has_quicklook": { "default": false, "title": "Has Quicklook", "type": "boolean" }, "quicklook_version": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Changes whenever the quicklook image is replaced. Pass it as the `v` query parameter of the quicklook request so caches fetch the new image.", "title": "Quicklook Version" }, "gsd": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Gsd" }, "res_x": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Res X" }, "res_y": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Res Y" }, "crs_is_geographic": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "description": "True when the raster CRS is geographic (gsd/res are degrees, not meters); None when the CRS class is unknown.", "title": "Crs Is Geographic" }, "vrt_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Vrt Type" }, "source_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Source Count" }, "dataset_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Dataset Count" }, "proj:code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Proj:Code" }, "proj:shape": { "anyOf": [ { "maxItems": 2, "minItems": 2, "prefixItems": [ { "type": "integer" }, { "type": "integer" } ], "type": "array" }, { "type": "null" } ], "description": "[height, width] in pixels.", "title": "Proj:Shape" }, "raster:bands": { "anyOf": [ { "items": { "$ref": "#/components/schemas/OGCRasterBand" }, "type": "array" }, { "type": "null" } ], "title": "Raster:Bands" } }, "required": [ "title", "description", "keywords", "license", "themes", "contacts", "time" ], "title": "OGCRecordProperties", "type": "object" }, "OGCRecordResponse": { "description": "Single OGC API Records Feature.", "properties": { "type": { "default": "Feature", "title": "Type", "type": "string" }, "id": { "title": "Id", "type": "string" }, "conformsTo": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Conformsto" }, "time": { "additionalProperties": true, "title": "Time", "type": "object" }, "geometry": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Geometry" }, "properties": { "$ref": "#/components/schemas/OGCRecordProperties" }, "links": { "items": { "$ref": "#/components/schemas/OGCRecordLink" }, "title": "Links", "type": "array" }, "assets": { "anyOf": [ { "additionalProperties": { "$ref": "#/components/schemas/OGCAsset" }, "type": "object" }, { "type": "null" } ], "title": "Assets" }, "bbox": { "anyOf": [ { "items": { "type": "number" }, "type": "array" }, { "type": "null" } ], "title": "Bbox" } }, "required": [ "id", "time", "properties", "links" ], "title": "OGCRecordResponse", "type": "object" }, "OgImageUploadRequest": { "description": "JSON body for PUT /maps/{map_id}/og-image/.\n\nAccepts a base64 data URI up to 750 KB (as a string). This generous\nceiling accommodates a 1200x630 JPEG at quality 0.85, which encodes\nto roughly 150-400 KB raw and ~200-540 KB as a base64 string.\n\n- ``min_length=22``: same floor as ThumbnailUploadRequest \u2014 rejects\n empty/clearly-malformed URIs without false-positives.\n- ``max_length=750_000``: ~562 KB decoded \u2014 generous for 1200x630 JPEG.\n DO NOT raise ThumbnailUploadRequest.max_length to match this value;\n the 100KB thumbnail cap is a locked contract.", "properties": { "data_uri": { "maxLength": 750000, "minLength": 22, "title": "Data Uri", "type": "string" } }, "required": [ "data_uri" ], "title": "OgImageUploadRequest", "type": "object" }, "PermissionsResponse": { "properties": { "permissions": { "additionalProperties": { "type": "boolean" }, "description": "Map of permission names to granted/denied", "title": "Permissions", "type": "object" } }, "required": [ "permissions" ], "title": "PermissionsResponse", "type": "object" }, "PointCloudMetadata": { "description": "A COPC point cloud's published file.", "properties": { "url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "URL path of the COPC file on the app origin, e.g. /api/datasets/{id}/copc/{attempt}/data.copc.laz. A replaced file gets a new URL", "title": "Url" }, "size_bytes": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Size of the COPC file in bytes", "title": "Size Bytes" }, "point_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Number of points, from the file's header", "title": "Point Count" }, "point_format": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "LAS point data record format: 6 (no colour), 7 (RGB) or 8 (RGB and near infrared)", "title": "Point Format" }, "vertical_crs": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Name of the file's vertical CRS, when its WKT gives one", "title": "Vertical Crs" } }, "title": "PointCloudMetadata", "type": "object" }, "PointCloudPreviewResponse": { "description": "What a staged COPC point cloud holds, read from its header and hierarchy.", "properties": { "job_id": { "description": "Identifier of the point cloud ingestion job being previewed.", "format": "uuid", "title": "Job Id", "type": "string" }, "source_filename": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Original filename of the uploaded point cloud.", "title": "Source Filename" }, "point_count": { "description": "Number of points in the file.", "title": "Point Count", "type": "integer" }, "point_format": { "description": "The file's LAS point data record format.", "enum": [ 6, 7, 8 ], "title": "Point Format", "type": "integer" }, "srid": { "description": "EPSG code of the horizontal coordinate reference system.", "title": "Srid", "type": "integer" }, "vertical_crs": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Name of the vertical coordinate reference system, if any.", "title": "Vertical Crs" }, "extent_bbox": { "description": "The extent as [west, south, east, north] in degrees; west > east when it crosses the antimeridian.", "items": { "type": "number" }, "title": "Extent Bbox", "type": "array" }, "z_min": { "description": "Lowest elevation, in the file's units.", "title": "Z Min", "type": "number" }, "z_max": { "description": "Highest elevation, in the file's units.", "title": "Z Max", "type": "number" }, "size_bytes": { "description": "Size of the file in bytes.", "title": "Size Bytes", "type": "integer" } }, "required": [ "job_id", "source_filename", "point_count", "point_format", "srid", "vertical_crs", "extent_bbox", "z_min", "z_max", "size_bytes" ], "title": "PointCloudPreviewResponse", "type": "object" }, "PopupConfig": { "additionalProperties": false, "description": "Per-layer popup configuration: enable/disable + custom title template\n+ ordered visible-fields allowlist. Persisted as JSONB on map_layers.", "properties": { "enabled": { "title": "Enabled", "type": "boolean" }, "expression": { "anyOf": [ { "maxLength": 500, "type": "string" }, { "type": "null" } ], "description": "Title template with {column_name} placeholders", "title": "Expression" }, "visible_fields": { "anyOf": [ { "items": { "maxLength": 128, "minLength": 1, "type": "string" }, "maxItems": 100, "type": "array" }, { "type": "null" } ], "description": "Ordered allowlist of property keys; null = all, [] = none, ordered list = those in order", "title": "Visible Fields" } }, "required": [ "enabled" ], "title": "PopupConfig", "type": "object" }, "PresignedCompleteRequest": { "properties": { "parts": { "default": [], "description": "Ordered list of uploaded parts (etag + part_number) used to complete a multipart upload.", "items": { "$ref": "#/components/schemas/PresignedPartInfo" }, "title": "Parts", "type": "array" } }, "title": "PresignedCompleteRequest", "type": "object" }, "PresignedPartInfo": { "properties": { "etag": { "description": "ETag returned by S3 for an uploaded multipart part.", "title": "Etag", "type": "string" }, "part_number": { "description": "1-indexed part number of the uploaded part.", "title": "Part Number", "type": "integer" } }, "required": [ "etag", "part_number" ], "title": "PresignedPartInfo", "type": "object" }, "PresignedUploadRequest": { "properties": { "filename": { "description": "Original filename being uploaded. Used to determine the file extension and content disposition.", "maxLength": 255, "minLength": 1, "title": "Filename", "type": "string" }, "file_size": { "description": "Total file size in bytes. Used to decide between single-part and multipart upload.", "minimum": 1.0, "title": "File Size", "type": "integer" }, "content_type": { "default": "application/octet-stream", "description": "MIME type to associate with the uploaded object.", "maxLength": 255, "title": "Content Type", "type": "string" }, "kind": { "anyOf": [ { "enum": [ "tiles3d", "pointcloud" ], "type": "string" }, { "type": "null" } ], "description": "'tiles3d' uploads a 3D Tiles tileset as a .zip or .3tz archive holding tileset.json. Omit it for any other file; a .zip without it is read as geospatial data, and a .3tz without it is refused. 'pointcloud' uploads a COPC point cloud as a .laz file; a .laz without it is refused.", "title": "Kind" } }, "required": [ "filename", "file_size" ], "title": "PresignedUploadRequest", "type": "object" }, "PresignedUploadResponse": { "properties": { "job_id": { "description": "Identifier of the ingestion job created for this upload.", "format": "uuid", "title": "Job Id", "type": "string" }, "urls": { "description": "One presigned PUT URL per part. Single-element list for single-part uploads.", "items": { "type": "string" }, "title": "Urls", "type": "array" }, "s3_key": { "description": "Object key in the S3 bucket where the file will be stored.", "title": "S3 Key", "type": "string" }, "upload_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "S3 multipart upload ID, set only for multipart uploads.", "title": "Upload Id" }, "part_size": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Byte size of each part in a multipart upload.", "title": "Part Size" } }, "required": [ "job_id", "urls", "s3_key" ], "title": "PresignedUploadResponse", "type": "object" }, "PreviewResponse": { "properties": { "job_id": { "description": "Identifier of the ingestion job being previewed.", "format": "uuid", "title": "Job Id", "type": "string" }, "source_filename": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Original filename of the uploaded file, if known.", "title": "Source Filename" }, "columns": { "description": "Detected attribute columns. Each entry includes name, type, and nullability.", "items": { "$ref": "#/components/schemas/ColumnPreview" }, "title": "Columns", "type": "array" }, "crs": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Detected coordinate reference system EPSG code, or null if undetermined.", "title": "Crs" }, "geometry_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Detected geometry type (Point, LineString, Polygon, MultiPolygon, etc.), or null for non-spatial data.", "title": "Geometry Type" }, "feature_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Total number of features in the source file, if known.", "title": "Feature Count" }, "sample_rows": { "description": "Up to 5 sample rows from the source file for preview purposes.", "items": { "additionalProperties": true, "type": "object" }, "title": "Sample Rows", "type": "array" }, "layer_name": { "description": "Name of the layer being previewed. Defaults to the source filename for single-layer files.", "title": "Layer Name", "type": "string" }, "layers": { "anyOf": [ { "items": { "$ref": "#/components/schemas/LayerPreview" }, "type": "array" }, { "type": "null" } ], "description": "List of all layers in multi-layer sources (e.g. GeoPackage). Null for single-layer files.", "title": "Layers" }, "detected_geometry_columns": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Auto-detected lat/lon or geometry columns for CSV/Excel sources. Null for native geospatial formats.", "title": "Detected Geometry Columns" } }, "required": [ "job_id", "source_filename", "columns", "crs", "geometry_type", "feature_count", "sample_rows", "layer_name" ], "title": "PreviewResponse", "type": "object" }, "PreviousVersionResponse": { "description": "The data a replacement or restore replaced, kept until the next one.", "properties": { "version_number": { "description": "The version whose data is kept", "title": "Version Number", "type": "integer" }, "retained_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Retained At" }, "size_bytes": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Its table's size; not counted toward quota", "title": "Size Bytes" }, "feature_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "As recorded on that version", "title": "Feature Count" } }, "required": [ "version_number" ], "title": "PreviousVersionResponse", "type": "object" }, "ProbeRequest": { "properties": { "url": { "description": "Service URL to probe. May be a WFS GetCapabilities URL or an ArcGIS service endpoint.", "maxLength": 2048, "minLength": 1, "title": "Url", "type": "string" }, "token": { "anyOf": [ { "maxLength": 1000, "type": "string" }, { "type": "null" } ], "description": "Optional auth token for protected services (passed as query parameter or bearer token depending on service type). Deprecated: use the auth object with method bearer.", "title": "Token" }, "auth": { "anyOf": [ { "$ref": "#/components/schemas/ServiceAuthRequest" }, { "type": "null" } ], "description": "Structured credential for a protected service. Mutually exclusive with the token field." } }, "required": [ "url" ], "title": "ProbeRequest", "type": "object" }, "ProbeResponse": { "properties": { "service_type": { "description": "Detected service type, e.g. 'WFS 2.0' or 'ArcGIS FeatureServer'.", "title": "Service Type", "type": "string" }, "url": { "description": "Normalized service URL after probing.", "title": "Url", "type": "string" }, "layers": { "description": "Layers exposed by the probed service.", "items": { "$ref": "#/components/schemas/LayerInfo" }, "title": "Layers", "type": "array" }, "selected_layer_id": { "anyOf": [ { "type": "integer" }, { "type": "string" }, { "type": "null" } ], "description": "Auto-selected layer ID when the input URL contained a specific layer number.", "title": "Selected Layer Id" } }, "required": [ "service_type", "url", "layers" ], "title": "ProbeResponse", "type": "object" }, "ProblemDetail": { "examples": [ { "detail": "Dataset not found", "status": 404, "title": "Not Found", "type": "about:blank" } ], "properties": { "type": { "default": "about:blank", "title": "Type", "type": "string" }, "title": { "title": "Title", "type": "string" }, "status": { "title": "Status", "type": "integer" }, "detail": { "anyOf": [ { "type": "string" }, { "additionalProperties": true, "type": "object" }, { "items": {}, "type": "array" } ], "title": "Detail" } }, "required": [ "title", "status", "detail" ], "title": "ProblemDetail", "type": "object" }, "ProviderHealth": { "properties": { "status": { "description": "Provider health status: 'ok' or 'error'.", "title": "Status", "type": "string" }, "latency_ms": { "description": "Latency of the most recent health probe in milliseconds.", "title": "Latency Ms", "type": "number" }, "error": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Error message when status is 'error'.", "title": "Error" } }, "required": [ "status", "latency_ms" ], "title": "ProviderHealth", "type": "object" }, "QualityDetail": { "description": "Automated quality assessment results.", "properties": { "overall": { "maximum": 100.0, "minimum": 0.0, "title": "Overall", "type": "number" }, "metadata_completeness": { "maximum": 100.0, "minimum": 0.0, "title": "Metadata Completeness", "type": "number" }, "geometry_validity": { "anyOf": [ { "maximum": 100.0, "minimum": 0.0, "type": "number" }, { "type": "null" } ], "title": "Geometry Validity" }, "attribute_completeness": { "anyOf": [ { "maximum": 100.0, "minimum": 0.0, "type": "number" }, { "type": "null" } ], "title": "Attribute Completeness" }, "crs_defined": { "anyOf": [ { "maximum": 100.0, "minimum": 0.0, "type": "number" }, { "type": "null" } ], "title": "Crs Defined" }, "computed_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Computed At" } }, "required": [ "overall", "metadata_completeness", "attribute_completeness" ], "title": "QualityDetail", "type": "object" }, "QualityStatementDraftResponse": { "description": "AI-generated quality statement draft for a dataset.", "properties": { "draft": { "description": "AI-generated quality statement (2-4 sentences)", "title": "Draft", "type": "string" } }, "required": [ "draft" ], "title": "QualityStatementDraftResponse", "type": "object" }, "RasterBandInfo": { "properties": { "index": { "description": "1-based band index", "title": "Index", "type": "integer" }, "dtype": { "description": "Pixel data type, e.g. uint8, float32", "title": "Dtype", "type": "string" }, "nodata": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Nodata sentinel value for this band", "title": "Nodata" }, "color_interp": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Color interpretation, e.g. Red, Green, Gray", "title": "Color Interp" } }, "required": [ "index", "dtype" ], "title": "RasterBandInfo", "type": "object" }, "RasterConnect": { "properties": { "download_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Direct file download URL", "title": "Download Url" }, "tile_url": { "description": "Titiler tile endpoint for this raster", "title": "Tile Url", "type": "string" }, "s3_uri": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "S3 object URI, e.g. s3://bucket/key.tif", "title": "S3 Uri" } }, "required": [ "tile_url" ], "title": "RasterConnect", "type": "object" }, "RasterMetadata": { "properties": { "epsg": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "EPSG code of the raster CRS", "title": "Epsg" }, "crs_is_geographic": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "description": "True when the raster CRS is geographic (res_x/res_y are degrees, not meters); None when the CRS class is unknown.", "title": "Crs Is Geographic" }, "res_x": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Pixel resolution in X (CRS units)", "title": "Res X" }, "res_y": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Pixel resolution in Y (CRS units)", "title": "Res Y" }, "band_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Band Count" }, "is_dem": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "description": "True if this raster is a DEM (single-band float) usable for 3D terrain/hillshade", "title": "Is Dem" }, "nodata": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Global nodata sentinel value", "title": "Nodata" }, "compression": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Internal compression, e.g. DEFLATE, LZW", "title": "Compression" }, "width": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Raster width in pixels", "title": "Width" }, "height": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Raster height in pixels", "title": "Height" }, "size_bytes": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "File size on disk in bytes", "title": "Size Bytes" }, "tile_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Titiler XYZ tile endpoint", "title": "Tile Url" }, "bands": { "default": [], "items": { "$ref": "#/components/schemas/RasterBandInfo" }, "title": "Bands", "type": "array" }, "connect": { "anyOf": [ { "$ref": "#/components/schemas/RasterConnect" }, { "type": "null" } ] }, "status": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Processing status, e.g. ready, failed", "title": "Status" }, "vrt_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "VRT variant: mosaic or timeseries", "title": "Vrt Type" }, "source_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Number of source rasters in a VRT mosaic", "title": "Source Count" }, "resolution_strategy": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "VRT resolution strategy, e.g. highest, average", "title": "Resolution Strategy" } }, "title": "RasterMetadata", "type": "object" }, "RasterPreviewResponse": { "properties": { "job_id": { "description": "Identifier of the raster ingestion job being previewed.", "format": "uuid", "title": "Job Id", "type": "string" }, "source_filename": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Original filename of the uploaded raster file.", "title": "Source Filename" }, "crs_epsg": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Detected EPSG code for the raster's CRS, if available.", "title": "Crs Epsg" }, "crs_wkt": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Full WKT representation of the raster's CRS.", "title": "Crs Wkt" }, "band_count": { "description": "Number of raster bands.", "title": "Band Count", "type": "integer" }, "width": { "description": "Raster width in pixels.", "title": "Width", "type": "integer" }, "height": { "description": "Raster height in pixels.", "title": "Height", "type": "integer" }, "dtype": { "description": "Pixel data type (e.g. 'uint8', 'float32').", "title": "Dtype", "type": "string" }, "nodata": { "anyOf": [ { "type": "number" }, { "type": "string" }, { "type": "null" } ], "description": "Nodata value for the raster, if defined.", "title": "Nodata" }, "res_x": { "description": "Pixel resolution along the X axis in CRS units.", "title": "Res X", "type": "number" }, "res_y": { "description": "Pixel resolution along the Y axis in CRS units.", "title": "Res Y", "type": "number" }, "compression": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Existing compression method (e.g. 'LZW', 'DEFLATE'), or null for uncompressed.", "title": "Compression" }, "file_size_bytes": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Source file size in bytes.", "title": "File Size Bytes" }, "is_cog_compliant": { "description": "Whether the source file is already a Cloud-Optimized GeoTIFF.", "title": "Is Cog Compliant", "type": "boolean" }, "compliance_reason": { "description": "Explanation of COG compliance status. Lists missing requirements when not compliant.", "title": "Compliance Reason", "type": "string" }, "temporal_start": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "ISO 8601 acquisition timestamp parsed from raster metadata, if present.", "title": "Temporal Start" } }, "required": [ "job_id", "source_filename", "crs_epsg", "crs_wkt", "band_count", "width", "height", "dtype", "nodata", "res_x", "res_y", "compression", "file_size_bytes", "is_cog_compliant", "compliance_reason" ], "title": "RasterPreviewResponse", "type": "object" }, "RasterTileToken": { "description": "A raster tile template, signed like its vector sibling.\n\n``tile_url`` includes ``sig``, ``exp``, and ``scope`` in its query string,\nso MapLibre can request private tiles without attaching an API key. The\nsignature expires, and its fields are also returned separately for clients\nthat rebuild the URL.", "properties": { "kind": { "const": "raster", "title": "Kind", "type": "string" }, "tile_url": { "title": "Tile Url", "type": "string" }, "sig": { "title": "Sig", "type": "string" }, "exp": { "title": "Exp", "type": "integer" }, "scope": { "title": "Scope", "type": "string" }, "expires_in": { "title": "Expires In", "type": "integer" }, "bounds": { "anyOf": [ { "items": { "type": "number" }, "type": "array" }, { "type": "null" } ], "title": "Bounds" }, "minzoom": { "title": "Minzoom", "type": "integer" }, "maxzoom": { "title": "Maxzoom", "type": "integer" }, "tile_size": { "title": "Tile Size", "type": "integer" }, "format": { "title": "Format", "type": "string" } }, "required": [ "kind", "tile_url", "sig", "exp", "scope", "expires_in", "bounds", "minzoom", "maxzoom", "tile_size", "format" ], "title": "RasterTileToken", "type": "object" }, "RefreshRequest": { "properties": { "refresh_token": { "maxLength": 512, "title": "Refresh Token", "type": "string" } }, "required": [ "refresh_token" ], "title": "RefreshRequest", "type": "object" }, "RefreshVerification": { "properties": { "decision": { "enum": [ "allowed", "blocked", "rejected" ], "title": "Decision", "type": "string" }, "source_binding": { "additionalProperties": true, "title": "Source Binding", "type": "object" }, "source_binding_fingerprint": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Source Binding Fingerprint" }, "source_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Source Count" }, "fetched_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Fetched Count" }, "count_status": { "enum": [ "matched", "mismatched", "unavailable" ], "title": "Count Status", "type": "string" }, "identity_check": { "enum": [ "unavailable", "content_digest", "arcgis_id_set" ], "title": "Identity Check", "type": "string" }, "content_digest": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Content Digest" }, "arcgis_id_coverage": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Arcgis Id Coverage" }, "staged_geometry_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Staged Geometry Type" }, "staged_srid": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Staged Srid" }, "staged_coordinate_dimension": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Staged Coordinate Dimension" }, "geometry_contract": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Geometry Contract" }, "review_reasons": { "items": { "enum": [ "source_count_unavailable", "empty_result", "destructive_schema_change", "geometry_type_changed", "srid_changed", "coordinate_dimension_reduced", "arcgis_id_coverage_unavailable", "arcgis_source_membership_changed", "live_data_changed" ], "type": "string" }, "title": "Review Reasons", "type": "array" }, "review_fingerprint": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Identifies what a blocked run asks a person to accept. A service refresh fingerprints all of its evidence, so its acceptance must fetch the same data again. A file replacement or service re-upload fingerprints only its review reasons, removed columns, type changes and, for a geometry reason, the geometry facts, which is what its preview shows. A run held because features were edited while it ran also names the edits it found, so accepting it does not cover a later edit.", "title": "Review Fingerprint" }, "review_acknowledged_by": { "anyOf": [ { "enum": [ "preview", "accepted_run" ], "type": "string" }, { "type": "null" } ], "description": "Why a replacement judged on its preview published: its commit carried the preview's fingerprint, or a person accepted a blocked run with the same changes.", "title": "Review Acknowledged By" }, "accepted_blocked_run_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Accepted Blocked Run Id" }, "acceptance_consumed_by_run_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Acceptance Consumed By Run Id" } }, "required": [ "decision", "source_binding", "source_count", "fetched_count", "count_status", "identity_check", "review_reasons", "review_fingerprint", "accepted_blocked_run_id" ], "title": "RefreshVerification", "type": "object" }, "RegisterRequest": { "properties": { "table_name": { "description": "PostgreSQL table name in the `data` schema (max 63 chars per PostgreSQL identifier limit).", "maxLength": 63, "minLength": 1, "title": "Table Name", "type": "string" }, "title": { "description": "Human-readable dataset title shown in the catalog.", "maxLength": 500, "title": "Title", "type": "string" }, "summary": { "anyOf": [ { "maxLength": 5000, "type": "string" }, { "type": "null" } ], "description": "Optional dataset description.", "title": "Summary" }, "visibility": { "default": "private", "description": "Dataset visibility level.", "enum": [ "private", "restricted", "internal", "public" ], "title": "Visibility", "type": "string" } }, "required": [ "table_name", "title" ], "title": "RegisterRequest", "type": "object" }, "RegisterResponse": { "properties": { "message": { "title": "Message", "type": "string" }, "next_step": { "anyOf": [ { "enum": [ "verify_email", "await_approval" ], "type": "string" }, { "type": "null" } ], "description": "Post-registration step for the client to display: 'verify_email' when a verification email was (or, for a swallowed collision, would have been) sent; 'await_approval' for the admin-approval path. None on non-register responses.", "title": "Next Step" } }, "required": [ "message" ], "title": "RegisterResponse", "type": "object" }, "RelatedDatasetItem": { "properties": { "id": { "title": "Id", "type": "string" }, "name": { "title": "Name", "type": "string" }, "geometry_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Geometry Type" }, "similarity": { "description": "Cosine similarity score (0-1)", "title": "Similarity", "type": "number" }, "record_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Record Type" }, "feature_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Feature Count" }, "band_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Band Count" } }, "required": [ "id", "name", "geometry_type", "similarity" ], "title": "RelatedDatasetItem", "type": "object" }, "RelatedDatasetsResponse": { "properties": { "items": { "items": { "$ref": "#/components/schemas/RelatedDatasetItem" }, "title": "Items", "type": "array" }, "total": { "title": "Total", "type": "integer" } }, "required": [ "items", "total" ], "title": "RelatedDatasetsResponse", "type": "object" }, "RenameColumnRequest": { "properties": { "new_name": { "description": "New column name (lowercase identifier).", "title": "New Name", "type": "string" } }, "required": [ "new_name" ], "title": "RenameColumnRequest", "type": "object" }, "ResendVerificationRequest": { "properties": { "email": { "description": "Email address to resend the verification link to", "format": "email", "title": "Email", "type": "string" } }, "required": [ "email" ], "title": "ResendVerificationRequest", "type": "object" }, "ReservedRenameDetail": { "additionalProperties": false, "properties": { "original": { "title": "Original", "type": "string" }, "renamed": { "title": "Renamed", "type": "string" } }, "required": [ "original", "renamed" ], "title": "ReservedRenameDetail", "type": "object" }, "ReservedRenameWarning": { "additionalProperties": false, "properties": { "kind": { "const": "reserved_rename", "title": "Kind", "type": "string" }, "details": { "items": { "$ref": "#/components/schemas/ReservedRenameDetail" }, "title": "Details", "type": "array" } }, "required": [ "kind", "details" ], "title": "ReservedRenameWarning", "type": "object" }, "RestorePreviousVersionRequest": { "properties": { "expected_version_number": { "description": "The previous version the caller confirmed restoring", "title": "Expected Version Number", "type": "integer" } }, "required": [ "expected_version_number" ], "title": "RestorePreviousVersionRequest", "type": "object" }, "RestorePreviousVersionResponse": { "properties": { "job_id": { "format": "uuid", "title": "Job Id", "type": "string" }, "run_id": { "format": "uuid", "title": "Run Id", "type": "string" } }, "required": [ "job_id", "run_id" ], "title": "RestorePreviousVersionResponse", "type": "object" }, "ReuploadCommitRequest": { "properties": { "srid_override": { "anyOf": [ { "maximum": 998999.0, "minimum": 1.0, "type": "integer" }, { "type": "null" } ], "title": "Srid Override" }, "expected_origin_kind": { "anyOf": [ { "enum": [ "upload", "postgis", "service", "stac", "created" ], "type": "string" }, { "type": "null" } ], "description": "The dataset origin the client saw when it staged this replacement. When set, the commit is refused with 409 `origin_changed` if the dataset's origin no longer matches, so a service, STAC or registered-table binding established after the upload is not silently rebound to an upload. A client may omit the field to skip this concurrency check.", "title": "Expected Origin Kind" }, "token": { "anyOf": [ { "maxLength": 1000, "type": "string" }, { "type": "null" } ], "description": "Deprecated: use the auth object with method bearer.", "title": "Token" }, "layer_name": { "anyOf": [ { "maxLength": 500, "type": "string" }, { "type": "null" } ], "title": "Layer Name" }, "auth": { "anyOf": [ { "$ref": "#/components/schemas/ServiceAuthRequest" }, { "type": "null" } ], "description": "Structured credential for a protected service. Mutually exclusive with the token field." }, "review_fingerprint": { "anyOf": [ { "pattern": "^[0-9a-f]{64}$", "type": "string" }, { "type": "null" } ], "description": "The preview's `review_fingerprint`, sent once a person has seen the changes it describes. A file replacement or service re-upload with review reasons publishes only when the worker's own fingerprint matches; otherwise its run ends `blocked`.", "title": "Review Fingerprint" } }, "title": "ReuploadCommitRequest", "type": "object" }, "ReuploadCommitResponse": { "properties": { "job_id": { "format": "uuid", "title": "Job Id", "type": "string" }, "status": { "title": "Status", "type": "string" }, "message": { "title": "Message", "type": "string" } }, "required": [ "job_id", "status", "message" ], "title": "ReuploadCommitResponse", "type": "object" }, "ReuploadPreviewRequest": { "properties": { "layer_name": { "anyOf": [ { "maxLength": 500, "type": "string" }, { "type": "null" } ], "title": "Layer Name" }, "srid_override": { "anyOf": [ { "maximum": 998999.0, "minimum": 1.0, "type": "integer" }, { "type": "null" } ], "description": "The SRID override the commit will send, so the preview judges the coordinate system the replacement will be stored in.", "title": "Srid Override" } }, "title": "ReuploadPreviewRequest", "type": "object" }, "ReuploadPreviewResponse": { "properties": { "job_id": { "format": "uuid", "title": "Job Id", "type": "string" }, "source_filename": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Source Filename" }, "columns": { "items": { "$ref": "#/components/schemas/ColumnChange" }, "title": "Columns", "type": "array" }, "crs": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Crs" }, "geometry_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Geometry Type" }, "feature_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Feature Count" }, "sample_rows": { "items": { "additionalProperties": true, "type": "object" }, "title": "Sample Rows", "type": "array" }, "layer_name": { "title": "Layer Name", "type": "string" }, "schema_diff": { "$ref": "#/components/schemas/SchemaDiff" }, "all_layers": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "title": "All Layers" }, "previous_source_layer": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Previous Source Layer" }, "review_reasons": { "description": "Changes in this file replacement or service re-upload that hold it for review.", "items": { "enum": [ "source_count_unavailable", "empty_result", "destructive_schema_change", "geometry_type_changed", "srid_changed", "coordinate_dimension_reduced", "arcgis_id_coverage_unavailable", "arcgis_source_membership_changed", "live_data_changed" ], "type": "string" }, "title": "Review Reasons", "type": "array" }, "review_fingerprint": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Fingerprint of the reviewed changes. Send it as the commit's `review_fingerprint` once a person has seen them; null when nothing needs review.", "title": "Review Fingerprint" } }, "required": [ "job_id", "source_filename", "columns", "crs", "geometry_type", "feature_count", "sample_rows", "layer_name", "schema_diff" ], "title": "ReuploadPreviewResponse", "type": "object" }, "ReuploadResponse": { "properties": { "job_id": { "format": "uuid", "title": "Job Id", "type": "string" }, "status": { "default": "pending", "title": "Status", "type": "string" }, "message": { "title": "Message", "type": "string" } }, "required": [ "job_id", "message" ], "title": "ReuploadResponse", "type": "object" }, "ReuploadServicePreviewRequest": { "properties": { "url": { "maxLength": 2048, "title": "Url", "type": "string" }, "service_type": { "maxLength": 50, "title": "Service Type", "type": "string" }, "layer_name": { "maxLength": 500, "title": "Layer Name", "type": "string" }, "layer_title": { "anyOf": [ { "maxLength": 500, "type": "string" }, { "type": "null" } ], "title": "Layer Title" }, "layer_id": { "anyOf": [ { "type": "integer" }, { "type": "string" }, { "type": "null" } ], "title": "Layer Id" }, "token": { "anyOf": [ { "maxLength": 1000, "type": "string" }, { "type": "null" } ], "description": "Deprecated: use the auth object with method bearer.", "title": "Token" }, "object_id_field": { "anyOf": [ { "maxLength": 200, "type": "string" }, { "type": "null" } ], "title": "Object Id Field" }, "auth": { "anyOf": [ { "$ref": "#/components/schemas/ServiceAuthRequest" }, { "type": "null" } ], "description": "Structured credential for a protected service. Mutually exclusive with the token field." } }, "required": [ "url", "service_type", "layer_name" ], "title": "ReuploadServicePreviewRequest", "type": "object" }, "SSEActionsEvent": { "description": "Validated map-edit actions produced by streaming chat.", "properties": { "type": { "const": "actions", "title": "Type", "type": "string" }, "actions": { "items": { "$ref": "#/components/schemas/ChatAction" }, "title": "Actions", "type": "array" } }, "required": [ "type", "actions" ], "title": "SSEActionsEvent", "type": "object" }, "SSEChatDoneEvent": { "description": "Terminal payload for a successful streaming chat request.", "properties": { "type": { "const": "done", "title": "Type", "type": "string" }, "explanation": { "title": "Explanation", "type": "string" } }, "required": [ "type", "explanation" ], "title": "SSEChatDoneEvent", "type": "object" }, "SSEErrorEvent": { "description": "Error payload carried inside an already-open SSE response.", "properties": { "type": { "const": "error", "title": "Type", "type": "string" }, "message": { "anyOf": [ { "type": "string" }, { "additionalProperties": true, "type": "object" }, { "items": {}, "type": "array" } ], "title": "Message" }, "status": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "description": "HTTP-equivalent status for router-level failures; provider and model errors raised inside the stream may omit it.", "title": "Status" } }, "required": [ "type", "message" ], "title": "SSEErrorEvent", "type": "object" }, "SSEMapDoneEvent": { "description": "Terminal payload for a successful streaming map-generation request.", "properties": { "type": { "const": "done", "title": "Type", "type": "string" }, "map_id": { "title": "Map Id", "type": "string" }, "map_name": { "title": "Map Name", "type": "string" }, "explanation": { "title": "Explanation", "type": "string" }, "datasets_used": { "items": { "type": "string" }, "title": "Datasets Used", "type": "array" } }, "required": [ "type", "map_id", "map_name", "explanation", "datasets_used" ], "title": "SSEMapDoneEvent", "type": "object" }, "SSETokenEvent": { "description": "Token payload carried by a ``token`` server-sent event.", "properties": { "type": { "const": "token", "title": "Type", "type": "string" }, "text": { "title": "Text", "type": "string" } }, "required": [ "type", "text" ], "title": "SSETokenEvent", "type": "object" }, "SSEToolResultEvent": { "description": "Progress payload emitted when an AI tool finishes.", "properties": { "type": { "const": "tool_result", "title": "Type", "type": "string" }, "tool": { "title": "Tool", "type": "string" }, "success": { "title": "Success", "type": "boolean" } }, "required": [ "type", "tool", "success" ], "title": "SSEToolResultEvent", "type": "object" }, "SSEToolStartEvent": { "description": "Progress payload emitted when an AI tool starts.", "properties": { "type": { "const": "tool_start", "title": "Type", "type": "string" }, "tool": { "title": "Tool", "type": "string" }, "label": { "title": "Label", "type": "string" } }, "required": [ "type", "tool", "label" ], "title": "SSEToolStartEvent", "type": "object" }, "SandboxQueryRequest": { "description": "One read-only SELECT plus its mandatory table scope.", "properties": { "sql": { "description": "A single SELECT statement over `data.*` tables.", "maxLength": 20000, "minLength": 1, "title": "Sql", "type": "string" }, "restrict_tables": { "description": "Table names (without the `data.` prefix) the query may touch. Required and non-empty; intersected with your access \u2014 it can only narrow what you already see, never widen it.", "items": { "type": "string" }, "maxItems": 25, "minItems": 1, "title": "Restrict Tables", "type": "array" }, "row_limit": { "default": 100, "description": "Maximum rows to return.", "maximum": 1000.0, "minimum": 1.0, "title": "Row Limit", "type": "integer" } }, "required": [ "sql", "restrict_tables" ], "title": "SandboxQueryRequest", "type": "object" }, "SandboxResult": { "description": "Structured result from sandbox query execution.\n\nUses list-of-lists for rows (not list-of-dicts) for serialization performance.", "properties": { "rows": { "items": { "items": {}, "type": "array" }, "title": "Rows", "type": "array" }, "columns": { "items": { "type": "string" }, "title": "Columns", "type": "array" }, "row_count": { "title": "Row Count", "type": "integer" }, "truncated": { "title": "Truncated", "type": "boolean" } }, "required": [ "rows", "columns", "row_count", "truncated" ], "title": "SandboxResult", "type": "object" }, "SavedSearchCreate": { "description": "Request body for creating a saved search.", "properties": { "name": { "maxLength": 255, "minLength": 1, "title": "Name", "type": "string" }, "params": { "additionalProperties": true, "description": "Serialized SearchParams filters to replay, at most 64 KiB as JSON", "title": "Params", "type": "object" } }, "required": [ "name", "params" ], "title": "SavedSearchCreate", "type": "object" }, "SavedSearchListResponse": { "description": "Response wrapping a list of saved searches.", "properties": { "searches": { "items": { "$ref": "#/components/schemas/SavedSearchResponse" }, "title": "Searches", "type": "array" }, "total": { "title": "Total", "type": "integer" } }, "required": [ "searches", "total" ], "title": "SavedSearchListResponse", "type": "object" }, "SavedSearchResponse": { "description": "Response for a single saved search.", "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "name": { "title": "Name", "type": "string" }, "params": { "additionalProperties": true, "title": "Params", "type": "object" }, "created_at": { "format": "date-time", "title": "Created At", "type": "string" }, "updated_at": { "format": "date-time", "title": "Updated At", "type": "string" } }, "required": [ "id", "name", "params", "created_at", "updated_at" ], "title": "SavedSearchResponse", "type": "object" }, "SchemaDiff": { "properties": { "columns_added": { "description": "Columns present in new but not old schema", "items": { "$ref": "#/components/schemas/ColumnChange" }, "title": "Columns Added", "type": "array" }, "columns_removed": { "description": "Columns present in old but not new schema", "items": { "$ref": "#/components/schemas/ColumnChange" }, "title": "Columns Removed", "type": "array" }, "type_changes": { "description": "Columns whose data type changed", "items": { "$ref": "#/components/schemas/TypeChange" }, "title": "Type Changes", "type": "array" }, "row_count_old": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Row Count Old" }, "row_count_new": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Row Count New" }, "row_count_delta": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "row_count_new minus row_count_old, or null when either side is unknown", "title": "Row Count Delta" } }, "required": [ "columns_added", "columns_removed", "type_changes", "row_count_old", "row_count_new", "row_count_delta" ], "title": "SchemaDiff", "type": "object" }, "ServiceAuthRequest": { "description": "How one request authenticates to the remote service it names.", "properties": { "method": { "description": "How the credential is presented to the remote service. Omit the whole auth object for a public service.", "enum": [ "bearer", "basic", "header" ], "title": "Method", "type": "string" }, "token": { "anyOf": [ { "maxLength": 1000, "type": "string" }, { "type": "null" } ], "description": "Bearer token or API key, for method bearer.", "title": "Token" }, "username": { "anyOf": [ { "maxLength": 255, "type": "string" }, { "type": "null" } ], "description": "Username, for method basic.", "title": "Username" }, "password": { "anyOf": [ { "maxLength": 1000, "type": "string" }, { "type": "null" } ], "description": "Password, for method basic.", "title": "Password" }, "header_name": { "anyOf": [ { "maxLength": 255, "type": "string" }, { "type": "null" } ], "description": "Name of the header the key is sent under, for method header.", "title": "Header Name" }, "header_value": { "anyOf": [ { "maxLength": 1000, "type": "string" }, { "type": "null" } ], "description": "Value of the header the key is sent under, for method header.", "title": "Header Value" } }, "required": [ "method" ], "title": "ServiceAuthRequest", "type": "object" }, "ServiceHealth": { "properties": { "status": { "title": "Status", "type": "string" }, "latency_ms": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Latency Ms" }, "error": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Error" } }, "required": [ "status" ], "title": "ServiceHealth", "type": "object" }, "ServicePreviewRequest": { "properties": { "url": { "description": "Normalized service URL from a previous probe response.", "maxLength": 2048, "minLength": 1, "title": "Url", "type": "string" }, "service_type": { "description": "Service type from the probe response, e.g. 'WFS 2.0.0' or 'ArcGIS FeatureServer'.", "maxLength": 100, "minLength": 1, "title": "Service Type", "type": "string" }, "layer_name": { "description": "Name of the specific layer to preview, from the probe layers list.", "maxLength": 500, "minLength": 1, "title": "Layer Name", "type": "string" }, "layer_title": { "anyOf": [ { "maxLength": 500, "type": "string" }, { "type": "null" } ], "description": "Human-readable layer title from the probe LayerInfo.", "title": "Layer Title" }, "layer_id": { "anyOf": [ { "type": "integer" }, { "type": "string" }, { "type": "null" } ], "description": "ArcGIS layer ID, when applicable.", "title": "Layer Id" }, "token": { "anyOf": [ { "maxLength": 1000, "type": "string" }, { "type": "null" } ], "description": "Optional auth token for protected services. Deprecated: use the auth object with method bearer.", "title": "Token" }, "object_id_field": { "anyOf": [ { "maxLength": 200, "type": "string" }, { "type": "null" } ], "description": "ArcGIS OID field name used for orderByFields during preview pagination.", "title": "Object Id Field" }, "auth": { "anyOf": [ { "$ref": "#/components/schemas/ServiceAuthRequest" }, { "type": "null" } ], "description": "Structured credential for a protected service. Mutually exclusive with the token field." } }, "required": [ "url", "service_type", "layer_name" ], "title": "ServicePreviewRequest", "type": "object" }, "ServicePreviewResponse": { "properties": { "job_id": { "description": "IngestJob ID for the preview. Use this to commit the import.", "format": "uuid", "title": "Job Id", "type": "string" }, "source_filename": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Layer name acting as a source filename for downstream ingestion logic.", "title": "Source Filename" }, "columns": { "description": "Detected attribute columns: [{'name': str, 'type': str}, ...].", "items": { "additionalProperties": { "type": "string" }, "type": "object" }, "title": "Columns", "type": "array" }, "crs": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Detected EPSG code for the layer's CRS.", "title": "Crs" }, "geometry_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Detected geometry type.", "title": "Geometry Type" }, "feature_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Total feature count if reported by the source service.", "title": "Feature Count" }, "sample_rows": { "description": "Up to 5 sample rows for preview display.", "items": { "additionalProperties": true, "type": "object" }, "title": "Sample Rows", "type": "array" }, "layer_name": { "description": "Layer name as it appears in the remote service.", "title": "Layer Name", "type": "string" } }, "required": [ "job_id", "source_filename", "columns", "crs", "geometry_type", "feature_count", "sample_rows", "layer_name" ], "title": "ServicePreviewResponse", "type": "object" }, "ServiceProbeResult": { "description": "Result of a single service connectivity probe.", "properties": { "name": { "description": "Service name (e.g. 'storage', 'cache', 'oidc:google').", "title": "Name", "type": "string" }, "status": { "description": "Probe outcome.", "enum": [ "ok", "error" ], "title": "Status", "type": "string" }, "latency_ms": { "description": "Round-trip latency in milliseconds.", "title": "Latency Ms", "type": "number" }, "error": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Error message when status is 'error'.", "title": "Error" } }, "required": [ "name", "status", "latency_ms" ], "title": "ServiceProbeResult", "type": "object" }, "SettingItem": { "description": "A single setting in the unified response.", "properties": { "key": { "description": "Setting key (e.g. 'login_rate_limit', 'basemaps').", "title": "Key", "type": "string" }, "value": { "description": "Current value. Type depends on the setting.", "title": "Value" }, "source": { "description": "Where the value came from: 'default' (built-in default), 'overridden' (admin set via UI), or 'env_only' (configured via environment variable, read-only).", "title": "Source", "type": "string" }, "label": { "description": "Human-readable label for display in the admin UI.", "title": "Label", "type": "string" }, "default_value": { "description": "Runtime default the setting resets to. Reported only for embedding_dims, so the UI can tell whether a reset changes the live width.", "title": "Default Value" } }, "required": [ "key", "value", "source", "label" ], "title": "SettingItem", "type": "object" }, "SettingsAllResponse": { "description": "Response for GET /settings/all/.", "properties": { "env_only": { "description": "Whether the instance is in env-only mode (settings are read-only and managed via environment variables).", "title": "Env Only", "type": "boolean" }, "tabs": { "additionalProperties": { "items": { "$ref": "#/components/schemas/SettingItem" }, "type": "array" }, "description": "Settings grouped by admin UI tab (general, auth, ai, etc.).", "title": "Tabs", "type": "object" } }, "required": [ "env_only", "tabs" ], "title": "SettingsAllResponse", "type": "object" }, "SettingsResetRequest": { "description": "Request for POST /settings/reset/.", "properties": { "keys": { "description": "List of setting keys to reset to their default values. Maximum 100 keys per request.", "items": { "type": "string" }, "maxItems": 100, "title": "Keys", "type": "array" } }, "required": [ "keys" ], "title": "SettingsResetRequest", "type": "object" }, "SettingsUpdateRequest": { "description": "Request for PUT /settings/.", "properties": { "settings": { "additionalProperties": true, "description": "Map of setting keys to new values. Maximum 50 settings per request.", "title": "Settings", "type": "object" } }, "required": [ "settings" ], "title": "SettingsUpdateRequest", "type": "object" }, "ShareTokenRequest": { "properties": { "expires_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "Expiration timestamp; must carry a UTC offset. Null creates a non-expiring share link. A custom expiration requires advanced sharing controls.", "title": "Expires At" }, "expires_in_days": { "anyOf": [ { "enum": [ 1, 7, 30, 90 ], "type": "integer" }, { "type": "null" } ], "description": "Server-calculated expiration preset. Choose 1, 7, 30, or 90 days.", "title": "Expires In Days" } }, "title": "ShareTokenRequest", "type": "object" }, "ShareTokenResponse": { "properties": { "token": { "description": "Raw token on create, hint on retrieve", "title": "Token", "type": "string" }, "share_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Full shareable URL \u2014 only returned on create", "title": "Share Url" }, "expires_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Expires At" }, "is_active": { "default": true, "title": "Is Active", "type": "boolean" } }, "required": [ "token" ], "title": "ShareTokenResponse", "type": "object" }, "SharedLayerResponse": { "properties": { "id": { "title": "Id", "type": "string" }, "dataset_id": { "title": "Dataset Id", "type": "string" }, "dataset_name": { "title": "Dataset Name", "type": "string" }, "display_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Display Name" }, "table_name": { "title": "Table Name", "type": "string" }, "geometry_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Geometry Type" }, "column_info": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "title": "Column Info" }, "sort_order": { "title": "Sort Order", "type": "integer" }, "visible": { "title": "Visible", "type": "boolean" }, "opacity": { "title": "Opacity", "type": "number" }, "paint": { "additionalProperties": true, "title": "Paint", "type": "object" }, "layout": { "additionalProperties": true, "title": "Layout", "type": "object" }, "layer_type": { "default": "vector_geolens", "title": "Layer Type", "type": "string" }, "dataset_record_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Dataset Record Type" }, "filter": { "anyOf": [ { "items": {}, "type": "array" }, { "type": "null" } ], "title": "Filter" }, "label_config": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Label Config" }, "popup_config": { "anyOf": [ { "$ref": "#/components/schemas/PopupConfig" }, { "type": "null" } ] }, "style_config": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Style Config" }, "show_in_legend": { "default": true, "title": "Show In Legend", "type": "boolean" }, "tile_url": { "title": "Tile Url", "type": "string" }, "is_dem": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Is Dem" }, "dem_vertical_units": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Dem Vertical Units" }, "is_3d": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Is 3D" }, "feature_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Feature Count" }, "tile_version": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Tile Version" }, "dataset_attribution": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Dataset Attribution" }, "dataset_extent_bbox": { "anyOf": [ { "items": { "type": "number" }, "type": "array" }, { "type": "null" } ], "title": "Dataset Extent Bbox" } }, "required": [ "id", "dataset_id", "dataset_name", "table_name", "geometry_type", "sort_order", "visible", "opacity", "paint", "layout", "tile_url" ], "title": "SharedLayerResponse", "type": "object" }, "SharedMapResponse": { "properties": { "name": { "title": "Name", "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Description" }, "center_lng": { "title": "Center Lng", "type": "number" }, "center_lat": { "title": "Center Lat", "type": "number" }, "zoom": { "title": "Zoom", "type": "number" }, "bearing": { "title": "Bearing", "type": "number" }, "pitch": { "title": "Pitch", "type": "number" }, "basemap_style": { "title": "Basemap Style", "type": "string" }, "show_basemap_labels": { "default": true, "title": "Show Basemap Labels", "type": "boolean" }, "basemap_config": { "anyOf": [ { "$ref": "#/components/schemas/BasemapConfig" }, { "type": "null" } ] }, "terrain_config": { "anyOf": [ { "$ref": "#/components/schemas/TerrainConfig" }, { "type": "null" } ] }, "has_non_public_layers": { "default": false, "title": "Has Non Public Layers", "type": "boolean" }, "legend_title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Legend Title" }, "layers": { "items": { "$ref": "#/components/schemas/SharedLayerResponse" }, "title": "Layers", "type": "array" } }, "required": [ "name", "description", "center_lng", "center_lat", "zoom", "bearing", "pitch", "basemap_style", "layers" ], "title": "SharedMapResponse", "type": "object" }, "SourceHealthResponse": { "description": "Result of one on-demand origin probe.\n\nThe values align with ``VrtSourceHealth.status`` so clients can use one\nlegend for VRT members and standalone origins. ``stale`` applies only to\nVRT members, while ``unknown`` represents health that has not been checked;\nthis endpoint always performs a probe and returns neither value.", "properties": { "dataset_id": { "format": "uuid", "title": "Dataset Id", "type": "string" }, "origin": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Origin kind that was probed: service or stac.", "title": "Origin" }, "source_health": { "description": "healthy \u2014 the origin answered and the resource is there. missing \u2014 the origin answered authoritatively that it is gone (404/410). inaccessible \u2014 GeoLens could not determine either way, which includes 401/403: access was lost, the data may be intact.", "enum": [ "healthy", "missing", "inaccessible" ], "title": "Source Health", "type": "string" }, "source_health_detail": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Why the origin is not healthy, as one of a fixed set of GeoLens codes: auth_required, blocked_by_policy, item_withdrawn, network_error, not_found, server_error, timeout, unauthorized, unexpected_status. Null when healthy or never probed. Never provider text, a URL, or a response body \u2014 nothing the origin sent is stored here.", "title": "Source Health Detail" }, "last_checked_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "description": "When GeoLens last contacted this origin, success or failure.", "title": "Last Checked At" } }, "required": [ "dataset_id", "origin", "source_health" ], "title": "SourceHealthResponse", "type": "object" }, "SsoExchangeRequest": { "properties": { "code": { "description": "The one-time code from the `code` parameter of the sign-in redirect's URL fragment.", "maxLength": 64, "title": "Code", "type": "string" }, "nonce": { "description": "The nonce the page sent when it started this sign-in.", "maxLength": 64, "title": "Nonce", "type": "string" } }, "required": [ "code", "nonce" ], "title": "SsoExchangeRequest", "type": "object" }, "StacAsset": { "properties": { "href": { "title": "Href", "type": "string" }, "type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Type" }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Title" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Description" }, "roles": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Roles" }, "size_bytes": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Size Bytes" } }, "required": [ "href" ], "title": "StacAsset", "type": "object" }, "StacAssetSize": { "properties": { "id": { "description": "STAC item ID.", "title": "Id", "type": "string" }, "size_bytes": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Asset size in bytes, or null when the server did not report one.", "title": "Size Bytes" } }, "required": [ "id" ], "title": "StacAssetSize", "type": "object" }, "StacAssetSizeTarget": { "properties": { "id": { "description": "STAC item ID the asset belongs to.", "maxLength": 2048, "title": "Id", "type": "string" }, "href": { "description": "URL of the item's data asset.", "maxLength": 4096, "title": "Href", "type": "string" } }, "required": [ "id", "href" ], "title": "StacAssetSizeTarget", "type": "object" }, "StacAssetSizesRequest": { "properties": { "url": { "description": "STAC API root URL the assets were found in.", "maxLength": 2048, "minLength": 1, "title": "Url", "type": "string" }, "assets": { "description": "Assets to measure (max 50 per request).", "items": { "$ref": "#/components/schemas/StacAssetSizeTarget" }, "maxItems": 50, "minItems": 1, "title": "Assets", "type": "array" }, "auth": { "anyOf": [ { "$ref": "#/components/schemas/ServiceAuthRequest" }, { "type": "null" } ], "description": "Credential for a protected catalog. It is sent only to assets on the catalog's own origin." } }, "required": [ "url", "assets" ], "title": "StacAssetSizesRequest", "type": "object" }, "StacAssetSizesResponse": { "properties": { "sizes": { "description": "One entry per requested asset.", "items": { "$ref": "#/components/schemas/StacAssetSize" }, "title": "Sizes", "type": "array" } }, "required": [ "sizes" ], "title": "StacAssetSizesResponse", "type": "object" }, "StacCatalog": { "description": "STAC Catalog / landing page response.", "properties": { "type": { "default": "Catalog", "description": "STAC object type. Always 'Catalog' for the landing page.", "title": "Type", "type": "string" }, "id": { "description": "Stable identifier for the catalog.", "title": "Id", "type": "string" }, "stac_version": { "default": "1.0.0", "description": "STAC specification version implemented.", "title": "Stac Version", "type": "string" }, "title": { "description": "Catalog title.", "title": "Title", "type": "string" }, "description": { "description": "Human-readable catalog description.", "title": "Description", "type": "string" }, "conformsTo": { "description": "List of conformance URIs declaring which STAC and OGC API standards the catalog implements.", "items": { "type": "string" }, "title": "Conformsto", "type": "array" }, "links": { "description": "Catalog navigation links (self, root, search, collections, etc.).", "items": { "$ref": "#/components/schemas/StacLink" }, "title": "Links", "type": "array" } }, "required": [ "id", "title", "description", "conformsTo", "links" ], "title": "StacCatalog", "type": "object" }, "StacCollection": { "additionalProperties": true, "description": "A single STAC Collection response (permissive \u2014 allows extra STAC fields).", "properties": { "type": { "default": "Collection", "description": "STAC object type.", "title": "Type", "type": "string" }, "stac_version": { "default": "1.0.0", "description": "STAC specification version.", "title": "Stac Version", "type": "string" }, "id": { "description": "Stable collection identifier.", "title": "Id", "type": "string" }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Human-readable collection title.", "title": "Title" }, "description": { "default": "", "description": "Collection description.", "title": "Description", "type": "string" }, "license": { "default": "proprietary", "description": "SPDX license identifier or 'proprietary'.", "title": "License", "type": "string" }, "extent": { "additionalProperties": true, "description": "Spatial and temporal extent of items in the collection.", "title": "Extent", "type": "object" }, "links": { "description": "Collection navigation links.", "items": { "$ref": "#/components/schemas/StacLink" }, "title": "Links", "type": "array" } }, "required": [ "id", "extent", "links" ], "title": "StacCollection", "type": "object" }, "StacCollectionListResponse": { "description": "STAC collections list response.", "properties": { "collections": { "description": "List of STAC collections.", "items": { "$ref": "#/components/schemas/StacCollection" }, "title": "Collections", "type": "array" }, "links": { "description": "Top-level collection navigation links.", "items": { "$ref": "#/components/schemas/StacLink" }, "title": "Links", "type": "array" } }, "required": [ "collections", "links" ], "title": "StacCollectionListResponse", "type": "object" }, "StacCollectionSummary": { "properties": { "id": { "description": "Collection identifier.", "title": "Id", "type": "string" }, "title": { "description": "Collection title.", "title": "Title", "type": "string" }, "description": { "description": "Collection description.", "title": "Description", "type": "string" }, "license": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "SPDX license identifier.", "title": "License" }, "keywords": { "default": [], "description": "Collection keywords.", "items": { "type": "string" }, "title": "Keywords", "type": "array" }, "bbox": { "anyOf": [ { "items": { "type": "number" }, "type": "array" }, { "type": "null" } ], "description": "Spatial extent as [west, south, east, north].", "title": "Bbox" }, "temporal_start": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Start of temporal extent (ISO 8601).", "title": "Temporal Start" }, "temporal_end": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "End of temporal extent (ISO 8601).", "title": "Temporal End" }, "item_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Number of items if reported by the API.", "title": "Item Count" } }, "required": [ "id", "title", "description" ], "title": "StacCollectionSummary", "type": "object" }, "StacCollectionsResponse": { "properties": { "url": { "description": "STAC API URL that was queried.", "title": "Url", "type": "string" }, "collections": { "description": "Available collections.", "items": { "$ref": "#/components/schemas/StacCollectionSummary" }, "title": "Collections", "type": "array" } }, "required": [ "url", "collections" ], "title": "StacCollectionsResponse", "type": "object" }, "StacConformance": { "description": "STAC conformance response.", "properties": { "conformsTo": { "description": "List of conformance class URIs.", "items": { "type": "string" }, "title": "Conformsto", "type": "array" } }, "required": [ "conformsTo" ], "title": "StacConformance", "type": "object" }, "StacConnectRequest": { "properties": { "url": { "description": "STAC API root URL to connect to.", "maxLength": 2048, "minLength": 1, "title": "Url", "type": "string" }, "token": { "anyOf": [ { "maxLength": 1000, "type": "string" }, { "type": "null" } ], "description": "Optional auth token for a protected STAC catalog. Deprecated: use the auth object with method bearer.", "title": "Token" }, "auth": { "anyOf": [ { "$ref": "#/components/schemas/ServiceAuthRequest" }, { "type": "null" } ], "description": "Structured credential for a protected service. Mutually exclusive with the token field." } }, "required": [ "url" ], "title": "StacConnectRequest", "type": "object" }, "StacConnectResponse": { "properties": { "url": { "description": "Normalized STAC API URL.", "title": "Url", "type": "string" }, "catalog_id": { "description": "Catalog identifier from the landing page.", "title": "Catalog Id", "type": "string" }, "title": { "description": "Catalog title.", "title": "Title", "type": "string" }, "description": { "description": "Catalog description.", "title": "Description", "type": "string" }, "stac_version": { "description": "STAC specification version.", "title": "Stac Version", "type": "string" }, "conforms_to": { "description": "Conformance classes from the landing page conformsTo, which tell a client which search extensions the catalog supports.", "items": { "type": "string" }, "title": "Conforms To", "type": "array" } }, "required": [ "url", "catalog_id", "title", "description", "stac_version" ], "title": "StacConnectResponse", "type": "object" }, "StacContext": { "additionalProperties": true, "description": "Paging metadata emitted with STAC ItemCollections.", "properties": { "limit": { "title": "Limit", "type": "integer" }, "returned": { "title": "Returned", "type": "integer" }, "matched": { "title": "Matched", "type": "integer" } }, "required": [ "limit", "returned", "matched" ], "title": "StacContext", "type": "object" }, "StacImportItem": { "properties": { "id": { "description": "STAC item ID.", "maxLength": 2048, "title": "Id", "type": "string" }, "collection": { "anyOf": [ { "maxLength": 255, "type": "string" }, { "type": "null" } ], "description": "Parent collection ID.", "title": "Collection" }, "title": { "description": "Title to use for the GeoLens dataset.", "maxLength": 500, "title": "Title", "type": "string" }, "data_asset_href": { "description": "URL of the COG asset to reference.", "maxLength": 4096, "title": "Data Asset Href", "type": "string" }, "item_href": { "anyOf": [ { "maxLength": 4096, "type": "string" }, { "type": "null" } ], "description": "The item's own canonical URL, echoed from search results.", "title": "Item Href" }, "data_asset_key": { "anyOf": [ { "maxLength": 255, "type": "string" }, { "type": "null" } ], "description": "The asset key on the item, echoed from search results.", "title": "Data Asset Key" }, "data_asset_type": { "anyOf": [ { "maxLength": 100, "type": "string" }, { "type": "null" } ], "description": "Media type of the data asset, echoed from search results.", "title": "Data Asset Type" }, "bbox": { "anyOf": [ { "items": { "type": "number" }, "type": "array" }, { "type": "null" } ], "description": "Item bounding box.", "title": "Bbox" }, "epsg": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "EPSG code.", "title": "Epsg" }, "datetime_start": { "anyOf": [ { "maxLength": 50, "type": "string" }, { "type": "null" } ], "description": "Temporal start.", "title": "Datetime Start" }, "datetime_end": { "anyOf": [ { "maxLength": 50, "type": "string" }, { "type": "null" } ], "description": "Temporal end.", "title": "Datetime End" }, "keywords": { "default": [], "description": "Keywords from STAC collection.", "items": { "type": "string" }, "maxItems": 100, "title": "Keywords", "type": "array" } }, "required": [ "id", "title", "data_asset_href" ], "title": "StacImportItem", "type": "object" }, "StacImportRequest": { "properties": { "url": { "description": "STAC API URL for provenance.", "maxLength": 2048, "minLength": 1, "title": "Url", "type": "string" }, "items": { "description": "Items to import (max 50 per request).", "items": { "$ref": "#/components/schemas/StacImportItem" }, "maxItems": 50, "minItems": 1, "title": "Items", "type": "array" }, "visibility": { "default": "private", "description": "Visibility for imported datasets.", "enum": [ "private", "restricted", "internal", "public" ], "title": "Visibility", "type": "string" }, "catalog_auth_required": { "default": false, "description": "Whether browsing this catalog needed a credential. Set it when the search that produced these items carried one, so the first refresh asks for a credential instead of failing anonymously.", "title": "Catalog Auth Required", "type": "boolean" } }, "required": [ "url", "items" ], "title": "StacImportRequest", "type": "object" }, "StacImportResponse": { "properties": { "results": { "description": "Per-item import results.", "items": { "$ref": "#/components/schemas/StacImportResult" }, "title": "Results", "type": "array" }, "created": { "description": "Number of datasets created.", "title": "Created", "type": "integer" }, "skipped": { "description": "Number of items skipped (duplicates).", "title": "Skipped", "type": "integer" }, "errors": { "description": "Number of items that failed.", "title": "Errors", "type": "integer" } }, "required": [ "results", "created", "skipped", "errors" ], "title": "StacImportResponse", "type": "object" }, "StacImportResult": { "properties": { "item_id": { "description": "STAC item ID that was processed.", "title": "Item Id", "type": "string" }, "dataset_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "description": "Created GeoLens dataset ID.", "title": "Dataset Id" }, "status": { "description": "Import result status.", "enum": [ "created", "skipped", "error" ], "title": "Status", "type": "string" }, "error": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Error message if failed.", "title": "Error" } }, "required": [ "item_id", "status" ], "title": "StacImportResult", "type": "object" }, "StacItemAsset": { "additionalProperties": true, "description": "A STAC asset attached to an Item.", "properties": { "href": { "description": "URL of the asset resource.", "title": "Href", "type": "string" }, "type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Asset media type.", "title": "Type" }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Human-readable asset title.", "title": "Title" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Human-readable asset description.", "title": "Description" }, "roles": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "description": "Semantic roles such as data or visual.", "title": "Roles" } }, "required": [ "href" ], "title": "StacItemAsset", "type": "object" }, "StacItemCollectionResponse": { "additionalProperties": true, "description": "Typed OpenAPI representation of a STAC ItemCollection.", "examples": [ { "context": { "limit": 10, "matched": 0, "returned": 0 }, "features": [], "links": [], "numberMatched": 0, "numberReturned": 0, "type": "FeatureCollection" } ], "properties": { "type": { "const": "FeatureCollection", "default": "FeatureCollection", "title": "Type", "type": "string" }, "features": { "items": { "$ref": "#/components/schemas/StacItemResponse" }, "title": "Features", "type": "array" }, "links": { "items": { "$ref": "#/components/schemas/StacLink" }, "title": "Links", "type": "array" }, "numberMatched": { "title": "Numbermatched", "type": "integer" }, "numberReturned": { "title": "Numberreturned", "type": "integer" }, "context": { "$ref": "#/components/schemas/StacContext" } }, "required": [ "features", "links", "numberMatched", "numberReturned", "context" ], "title": "StacItemCollectionResponse", "type": "object" }, "StacItemProperties": { "additionalProperties": true, "description": "Core STAC Item properties plus extension-defined fields.", "properties": { "datetime": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Item timestamp, or null when a temporal interval is supplied.", "title": "Datetime" }, "start_datetime": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Start of the item's temporal interval.", "title": "Start Datetime" }, "end_datetime": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "End of the item's temporal interval.", "title": "End Datetime" }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Human-readable item title.", "title": "Title" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Human-readable item description.", "title": "Description" } }, "required": [ "datetime" ], "title": "StacItemProperties", "type": "object" }, "StacItemResponse": { "additionalProperties": true, "description": "A GeoJSON Feature conforming to the STAC Item specification.", "examples": [ { "assets": {}, "collection": "geolens-unassigned", "id": "0190f4c8-8c6a-7a21-9a34-13bc2f31dc02", "links": [], "properties": { "datetime": "2026-01-15T00:00:00Z" }, "stac_version": "1.0.0", "type": "Feature" } ], "properties": { "type": { "const": "Feature", "default": "Feature", "title": "Type", "type": "string" }, "stac_version": { "description": "STAC specification version.", "title": "Stac Version", "type": "string" }, "stac_extensions": { "description": "STAC extension schema URIs in use.", "items": { "type": "string" }, "title": "Stac Extensions", "type": "array" }, "id": { "description": "Stable item identifier.", "title": "Id", "type": "string" }, "geometry": { "anyOf": [ { "$ref": "#/components/schemas/GeoJSONGeometryCollection" }, { "$ref": "#/components/schemas/GeoJSONGeometry" }, { "type": "null" } ], "description": "Item footprint as GeoJSON, or null when unavailable.", "title": "Geometry" }, "bbox": { "anyOf": [ { "maxItems": 4, "minItems": 4, "prefixItems": [ { "type": "number" }, { "type": "number" }, { "type": "number" }, { "type": "number" } ], "type": "array" }, { "maxItems": 6, "minItems": 6, "prefixItems": [ { "type": "number" }, { "type": "number" }, { "type": "number" }, { "type": "number" }, { "type": "number" }, { "type": "number" } ], "type": "array" }, { "type": "null" } ], "description": "Item bounding box with exactly four 2D or six 3D coordinates.", "title": "Bbox" }, "properties": { "$ref": "#/components/schemas/StacItemProperties" }, "links": { "items": { "$ref": "#/components/schemas/StacLink" }, "title": "Links", "type": "array" }, "assets": { "additionalProperties": { "$ref": "#/components/schemas/StacItemAsset" }, "title": "Assets", "type": "object" }, "collection": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Identifier of the containing STAC Collection.", "title": "Collection" } }, "required": [ "stac_version", "id", "geometry", "properties", "links", "assets" ], "title": "StacItemResponse", "type": "object" }, "StacItemSummary": { "properties": { "id": { "description": "Item identifier.", "title": "Id", "type": "string" }, "collection": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Parent collection ID.", "title": "Collection" }, "item_href": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The item's own canonical URL, from its rel=self link. Echo it back on import so the dataset's origin can point at the item as well as the asset; null when the catalog omits a self link.", "title": "Item Href" }, "title": { "description": "Item title (falls back to ID).", "title": "Title", "type": "string" }, "bbox": { "anyOf": [ { "items": { "type": "number" }, "type": "array" }, { "type": "null" } ], "description": "Item bounding box.", "title": "Bbox" }, "datetime": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Primary datetime (ISO 8601).", "title": "Datetime" }, "datetime_start": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Start datetime for ranges.", "title": "Datetime Start" }, "datetime_end": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "End datetime for ranges.", "title": "Datetime End" }, "epsg": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "EPSG code from proj extension.", "title": "Epsg" }, "gsd": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Ground sample distance in meters.", "title": "Gsd" }, "cloud_cover": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Cloud cover percentage (eo extension).", "title": "Cloud Cover" }, "data_asset_href": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "URL of the primary data asset (COG).", "title": "Data Asset Href" }, "data_asset_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Media type of the data asset.", "title": "Data Asset Type" }, "data_asset_key": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The key the data asset is published under on the item. Echo it back on import so the dataset records which asset it came from. The key remains stable when the href changes.", "title": "Data Asset Key" }, "data_asset_size_bytes": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Size of the primary data asset in bytes (from STAC file:size). None when not in manifest.", "title": "Data Asset Size Bytes" }, "data_asset_import_refusal": { "anyOf": [ { "enum": [ "not_http", "credentials", "too_long" ], "type": "string" }, { "type": "null" } ], "description": "Why /import would refuse this item's data asset, based on its URL alone, or null if the href passes import's format, length and credential checks. 'not_http' for a scheme other than http/https, such as s3://; 'credentials' for a URL carrying a credential query parameter GeoLens won't store; 'too_long' for a URL over the length import allows. Import also checks each asset's host, and can still refuse a null item there as a per-item failure that leaves the rest of the batch importing.", "title": "Data Asset Import Refusal" }, "thumbnail_href": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Thumbnail URL if available.", "title": "Thumbnail Href" }, "asset_count": { "description": "Number of assets on this item.", "title": "Asset Count", "type": "integer" } }, "required": [ "id", "title", "asset_count" ], "title": "StacItemSummary", "type": "object" }, "StacLink": { "description": "A single STAC link object.", "properties": { "href": { "description": "Target URL of the link.", "title": "Href", "type": "string" }, "rel": { "description": "Link relation type (e.g. 'self', 'root', 'parent', 'item', 'data').", "title": "Rel", "type": "string" }, "type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Media type of the linked resource (e.g. 'application/json').", "title": "Type" }, "method": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "HTTP method to use (defaults to GET).", "title": "Method" } }, "required": [ "href", "rel" ], "title": "StacLink", "type": "object" }, "StacNextPage": { "description": "Opaque handle for the next page of a search.", "properties": { "cursor": { "anyOf": [ { "maxLength": 32768, "type": "string" }, { "type": "null" } ], "description": "Server-issued token for the next page. Echo the next_page of the previous response unchanged, with the same url and collections; a missing or altered cursor is refused.", "title": "Cursor" } }, "title": "StacNextPage", "type": "object" }, "StacSearchBody": { "description": "JSON body for POST /search.", "examples": [ { "bbox": [ -77.2, 38.7, -76.8, 39.1 ], "collections": [ "geolens-unassigned" ], "limit": 25 } ], "properties": { "bbox": { "anyOf": [ { "items": { "type": "number" }, "type": "array" }, { "type": "null" } ], "title": "Bbox" }, "datetime": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Datetime" }, "collections": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Collections" }, "ids": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Ids" }, "intersects": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Intersects" }, "limit": { "default": 10, "description": "Maximum number of items returned. Values above 200 are clamped to 200.", "minimum": 1.0, "title": "Limit", "type": "integer" }, "offset": { "default": 0, "description": "Number of items to skip for pagination.", "minimum": 0.0, "title": "Offset", "type": "integer" } }, "title": "StacSearchBody", "type": "object" }, "StacSearchRequest": { "properties": { "url": { "description": "STAC API root URL.", "maxLength": 2048, "minLength": 1, "title": "Url", "type": "string" }, "collections": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "description": "Filter by collection IDs.", "title": "Collections" }, "bbox": { "anyOf": [ { "items": { "type": "number" }, "maxItems": 4, "minItems": 4, "type": "array" }, { "type": "null" } ], "description": "Bounding box filter as [west, south, east, north].", "title": "Bbox" }, "datetime_range": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Temporal filter in STAC datetime format (e.g. '2023-01-01/2023-12-31').", "title": "Datetime Range" }, "limit": { "default": 20, "description": "Maximum items to return.", "maximum": 100.0, "minimum": 1.0, "title": "Limit", "type": "integer" }, "token": { "anyOf": [ { "maxLength": 1000, "type": "string" }, { "type": "null" } ], "description": "Optional auth token for a protected STAC catalog. Deprecated: use the auth object with method bearer.", "title": "Token" }, "auth": { "anyOf": [ { "$ref": "#/components/schemas/ServiceAuthRequest" }, { "type": "null" } ], "description": "Structured credential for a protected service. Mutually exclusive with the token field." }, "max_cloud_cover": { "anyOf": [ { "maximum": 100.0, "minimum": 0.0, "type": "number" }, { "type": "null" } ], "description": "Only items at or below this eo:cloud_cover percentage.", "title": "Max Cloud Cover" }, "cloud_cover_mode": { "anyOf": [ { "enum": [ "query", "filter" ], "type": "string" }, { "type": "null" } ], "description": "How to send max_cloud_cover: 'query' for the STAC Query extension, 'filter' for CQL2 JSON. Pick the one the catalog lists in its landing page conformsTo.", "title": "Cloud Cover Mode" }, "next_page": { "anyOf": [ { "$ref": "#/components/schemas/StacNextPage" }, { "type": "null" } ], "description": "The next_page of the previous response, to fetch the page after it. Send the same filters as the first request." } }, "required": [ "url" ], "title": "StacSearchRequest", "type": "object" }, "StacSearchResponse": { "properties": { "items": { "description": "Matching items.", "items": { "$ref": "#/components/schemas/StacItemSummary" }, "title": "Items", "type": "array" }, "matched": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Total matches (if reported by API).", "title": "Matched" }, "returned": { "description": "Number of items in this response.", "title": "Returned", "type": "integer" }, "next_page": { "anyOf": [ { "$ref": "#/components/schemas/StacNextPage" }, { "type": "null" } ], "description": "Link to the next page of results, or null on the last page. Send it back as next_page with the same filters." } }, "required": [ "items", "returned" ], "title": "StacSearchResponse", "type": "object" }, "StaleCleanupResponse": { "properties": { "pending_failed": { "title": "Pending Failed", "type": "integer" }, "running_failed": { "title": "Running Failed", "type": "integer" }, "total_cleaned": { "title": "Total Cleaned", "type": "integer" }, "vrt_assets_recovered": { "title": "Vrt Assets Recovered", "type": "integer" }, "vrt_generations_failed": { "title": "Vrt Generations Failed", "type": "integer" }, "terminal_jobs_purged": { "title": "Terminal Jobs Purged", "type": "integer" }, "staged_paths_considered": { "title": "Staged Paths Considered", "type": "integer" }, "local_files_reaped": { "title": "Local Files Reaped", "type": "integer" }, "storage_objects_reaped": { "title": "Storage Objects Reaped", "type": "integer" }, "staged_paths_skipped": { "title": "Staged Paths Skipped", "type": "integer" }, "staged_cleanup_failures": { "title": "Staged Cleanup Failures", "type": "integer" }, "total_affected": { "title": "Total Affected", "type": "integer" } }, "required": [ "pending_failed", "running_failed", "total_cleaned", "vrt_assets_recovered", "vrt_generations_failed", "terminal_jobs_purged", "staged_paths_considered", "local_files_reaped", "storage_objects_reaped", "staged_paths_skipped", "staged_cleanup_failures", "total_affected" ], "title": "StaleCleanupResponse", "type": "object" }, "StatusUpdate": { "examples": [ { "status": "published" } ], "properties": { "status": { "maxLength": 20, "title": "Status", "type": "string" } }, "required": [ "status" ], "title": "StatusUpdate", "type": "object" }, "StatusUpdateResponse": { "examples": [ { "id": "0190f4c8-8c6a-7a21-9a34-13bc2f31dc02", "record_status": "published" } ], "properties": { "id": { "title": "Id", "type": "string" }, "record_status": { "title": "Record Status", "type": "string" }, "metadata_warnings": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "description": "Advisory warnings from the status change \u2014 the same inherited-keyword disclosure check the metadata PATCH runs. The transition has already applied.", "title": "Metadata Warnings" } }, "required": [ "id", "record_status" ], "title": "StatusUpdateResponse", "type": "object" }, "SublayerOverride": { "additionalProperties": false, "description": "Per-sublayer style override for a single basemap sublayer.\n\nAll fields are nullable \u2014 a ``None`` value means \"use the basemap default\".\nOnly ``#RRGGBB`` hex strings are accepted for color fields; ``None`` means\nthe basemap default color is preserved. Numeric ranges are clamped at\nvalidation time (Pydantic ``ge``/``le`` constraints).\n\nThe key set of ``BasemapConfig.sublayer_overrides`` is treated as opaque\n(forward-compatible with future sublayer IDs).\n\nSecurity:\n extra=\"forbid\" locks the scope guardrail: unknown style axes such as\n dash patterns, line caps, halo blur, and text-font are rejected at\n validation time.", "properties": { "stroke_color": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Stroke color in #RRGGBB hex format, or null to use the basemap default.", "title": "Stroke Color" }, "stroke_width": { "anyOf": [ { "maximum": 20.0, "minimum": 0.0, "type": "number" }, { "type": "null" } ], "description": "Stroke width in pixels (0-20), or null to use the basemap default.", "title": "Stroke Width" }, "casing_color": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Casing color in #RRGGBB hex format, or null to use the basemap default.", "title": "Casing Color" }, "casing_width": { "anyOf": [ { "maximum": 20.0, "minimum": 0.0, "type": "number" }, { "type": "null" } ], "description": "Casing width in pixels (0-20), or null to use the basemap default.", "title": "Casing Width" }, "min_zoom": { "anyOf": [ { "maximum": 24.0, "minimum": 0.0, "type": "number" }, { "type": "null" } ], "description": "Minimum zoom level at which the sublayer is visible (0-24), or null for default.", "title": "Min Zoom" }, "max_zoom": { "anyOf": [ { "maximum": 24.0, "minimum": 0.0, "type": "number" }, { "type": "null" } ], "description": "Maximum zoom level at which the sublayer is visible (0-24), or null for default.", "title": "Max Zoom" }, "opacity": { "anyOf": [ { "maximum": 1.0, "minimum": 0.0, "type": "number" }, { "type": "null" } ], "description": "Per-sublayer opacity (0-1), or null to use the basemap default. Composes on top of BasemapConfig.opacity (the whole-basemap master opacity). The rendered opacity is the sublayer override multiplied by the master opacity.", "title": "Opacity" } }, "title": "SublayerOverride", "type": "object" }, "SummaryDraftResponse": { "description": "AI-generated summary draft for a dataset.", "properties": { "draft": { "description": "AI-generated summary text (2-4 sentences)", "title": "Draft", "type": "string" } }, "required": [ "draft" ], "title": "SummaryDraftResponse", "type": "object" }, "TableRegisterResponse": { "properties": { "dataset_id": { "description": "Identifier of the newly registered dataset.", "format": "uuid", "title": "Dataset Id", "type": "string" }, "title": { "description": "Title of the registered dataset.", "title": "Title", "type": "string" }, "table_name": { "description": "Source PostgreSQL table that was registered.", "title": "Table Name", "type": "string" } }, "required": [ "dataset_id", "title", "table_name" ], "title": "TableRegisterResponse", "type": "object" }, "TerrainConfig": { "additionalProperties": false, "properties": { "enabled": { "default": false, "title": "Enabled", "type": "boolean" }, "source_dataset_id": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Source Dataset Id" }, "exaggeration": { "default": 1.0, "maximum": 3.0, "minimum": 0.0, "title": "Exaggeration", "type": "number" } }, "title": "TerrainConfig", "type": "object" }, "ThumbnailUploadRequest": { "description": "JSON body for PUT /maps/{map_id}/thumbnail/.\n\nReplaces a previous text/plain body shape that openapi-python-client\ncould not parse (would silently skip endpoint).\n\n``data_uri`` carries explicit length bounds so\nPydantic surfaces a 422 with field-level detail (better SDK-consumer\nUX than a generic 400) and the OpenAPI schema documents the limit.\nThe router still validates the ``data:image/`` prefix and base64\nencoding; those are content-shape checks Pydantic length cannot\ncover.\n\n- ``min_length=22``: a minimal valid prefix is ``data:image/x;base64,``\n (20 chars) plus at least one payload byte (e.g.,\n ``data:image/x;base64,XX``). Use 22 as a pragmatic floor that\n rejects empty / clearly-malformed values without false-positives\n on the smallest legitimate payloads.\n- ``max_length=100_000``: matches the previous router-side 100KB cap.", "properties": { "data_uri": { "maxLength": 100000, "minLength": 22, "title": "Data Uri", "type": "string" } }, "required": [ "data_uri" ], "title": "ThumbnailUploadRequest", "type": "object" }, "TileConfigResponse": { "properties": { "cdn_base_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "CDN origin URL for tile delivery, if configured.", "title": "Cdn Base Url" }, "public_app_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Explicitly configured PUBLIC_APP_URL, or null when unset. Never derived from PUBLIC_API_URL or from the request, because a share or embed URL built on a derived value points at a host that does not serve the app.", "title": "Public App Url" }, "public_api_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Externally-reachable API base URL used in OGC self-links.", "title": "Public Api Url" }, "public_base_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Deprecated alias for public_api_url. Will be removed in a future release.", "title": "Public Base Url" }, "mvt_source_layer_prefix": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": "data", "description": "Schema prefix emitted inside vector-tile source-layer names. Null when a multi-tenant request has no resolved tenant context.", "title": "Mvt Source Layer Prefix" } }, "title": "TileConfigResponse", "type": "object" }, "TileTokenBatchRequest": { "description": "Batch request for tile tokens \u2014 accepts up to 50 dataset IDs.", "properties": { "dataset_ids": { "description": "Dataset IDs to generate tokens for. Must be unique; duplicates deduplicated server-side.", "items": { "format": "uuid", "type": "string" }, "maxItems": 50, "minItems": 1, "title": "Dataset Ids", "type": "array" } }, "required": [ "dataset_ids" ], "title": "TileTokenBatchRequest", "type": "object" }, "TileTokenBatchResponse": { "description": "Batch response mapping dataset_id (string) to token or error.\n\nEach entry is either a VectorTileToken, a RasterTileToken, or a\n``{\"error\": \"...\"}`` object describing why the token could not be\ngenerated (404 dataset, 403 forbidden, etc.). The batch call itself\nsucceeds even if individual datasets fail \u2014 clients should check each\nentry for the ``error`` key.", "properties": { "tokens": { "additionalProperties": { "anyOf": [ { "$ref": "#/components/schemas/VectorTileToken" }, { "$ref": "#/components/schemas/RasterTileToken" }, { "additionalProperties": true, "type": "object" } ] }, "title": "Tokens", "type": "object" } }, "required": [ "tokens" ], "title": "TileTokenBatchResponse", "type": "object" }, "TilesetMetadata": { "description": "A 3D Tiles dataset's published tileset.", "properties": { "url": { "description": "URL path of the tileset's tileset.json on the app origin, e.g. /api/datasets/{id}/tiles3d/tileset.json", "title": "Url", "type": "string" }, "size_bytes": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Unpacked size of the tileset in bytes", "title": "Size Bytes" }, "version": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The tileset's asset.version: '1.0' or '1.1'", "title": "Version" }, "geometric_error": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "The root tile's geometricError, when tileset.json gives one", "title": "Geometric Error" }, "bounding_volume": { "anyOf": [ { "enum": [ "region", "box", "sphere" ], "type": "string" }, { "type": "null" } ], "description": "The kind of the root tile's bounding volume. A box or sphere not in Earth-centred coordinates leaves the dataset's extent null.", "title": "Bounding Volume" }, "content_types": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "description": "The tile formats in the tileset, sorted: b3dm, i3dm, pnts, cmpt, glb, gltf, subtree, vctr or geom, including the tiles inside a cmpt. Null for a tileset published before GeoLens recorded them.", "title": "Content Types" }, "extensions_required": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "description": "Every extension a client must support to load the tileset, sorted: the extensionsRequired of its tileset JSON, external tilesets included, and of its glTF content. Null for a tileset published before GeoLens recorded them.", "title": "Extensions Required" } }, "required": [ "url" ], "title": "TilesetMetadata", "type": "object" }, "TilesetPreviewResponse": { "description": "What a staged 3D Tiles tileset archive holds, read without unpacking it.", "properties": { "job_id": { "description": "Identifier of the tileset ingestion job being previewed.", "format": "uuid", "title": "Job Id", "type": "string" }, "source_filename": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Original filename of the uploaded tileset archive.", "title": "Source Filename" }, "version": { "description": "The tileset's asset.version from its tileset.json.", "enum": [ "1.0", "1.1" ], "title": "Version", "type": "string" }, "geometric_error": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "The root tile's geometricError, or null when tileset.json gives none.", "title": "Geometric Error" }, "bounding_volume": { "description": "The kind of the root tile's bounding volume.", "enum": [ "region", "box", "sphere" ], "title": "Bounding Volume", "type": "string" }, "extent_bbox": { "anyOf": [ { "items": { "type": "number" }, "type": "array" }, { "type": "null" } ], "description": "The root bounding volume's extent as [west, south, east, north] in degrees; west > east when it crosses the antimeridian. Null for a box or sphere that is not placed in Earth-centred coordinates.", "title": "Extent Bbox" }, "unpacked_bytes": { "description": "Total size of the archive's files once unpacked.", "title": "Unpacked Bytes", "type": "integer" }, "entry_count": { "description": "Number of entries, files and folders, in the archive.", "title": "Entry Count", "type": "integer" } }, "required": [ "job_id", "source_filename", "version", "geometric_error", "bounding_volume", "extent_bbox", "unpacked_bytes", "entry_count" ], "title": "TilesetPreviewResponse", "type": "object" }, "TokenResponse": { "properties": { "access_token": { "description": "JWT access token for Authorization header", "title": "Access Token", "type": "string" }, "refresh_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Opaque token used to obtain a new access token. Always present for programmatic callers (CLI, SDKs, CI). Null when the caller opted into the browser cookie flow with 'X-GeoLens-Auth-Mode: cookie', in which case the token is delivered as an httpOnly cookie instead (GH-1302).", "title": "Refresh Token" }, "token_type": { "default": "bearer", "title": "Token Type", "type": "string" }, "expires_in": { "description": "Seconds until the access token expires", "title": "Expires In", "type": "integer" } }, "required": [ "access_token", "refresh_token", "expires_in" ], "title": "TokenResponse", "type": "object" }, "TranslationListResponse": { "properties": { "translations": { "items": { "$ref": "#/components/schemas/TranslationResponse" }, "title": "Translations", "type": "array" }, "total": { "title": "Total", "type": "integer" } }, "required": [ "translations", "total" ], "title": "TranslationListResponse", "type": "object" }, "TranslationResponse": { "properties": { "record_id": { "format": "uuid", "title": "Record Id", "type": "string" }, "language": { "title": "Language", "type": "string" }, "title": { "title": "Title", "type": "string" }, "summary": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Summary" } }, "required": [ "record_id", "language", "title", "summary" ], "title": "TranslationResponse", "type": "object" }, "TranslationUpsert": { "properties": { "title": { "maxLength": 500, "minLength": 1, "title": "Title", "type": "string" }, "summary": { "anyOf": [ { "maxLength": 5000, "type": "string" }, { "type": "null" } ], "title": "Summary" } }, "required": [ "title" ], "title": "TranslationUpsert", "type": "object" }, "TypeChange": { "properties": { "name": { "title": "Name", "type": "string" }, "old_type": { "title": "Old Type", "type": "string" }, "new_type": { "title": "New Type", "type": "string" } }, "required": [ "name", "old_type", "new_type" ], "title": "TypeChange", "type": "object" }, "UploadConfigResponse": { "properties": { "presigned_uploads": { "description": "Whether presigned S3 uploads are enabled (requires `STORAGE_PROVIDER=s3`).", "title": "Presigned Uploads", "type": "boolean" }, "presigned_threshold_bytes": { "description": "File size threshold (bytes) above which multipart presigned URLs are used.", "title": "Presigned Threshold Bytes", "type": "integer" }, "max_file_size_bytes": { "description": "Maximum allowed upload size in bytes.", "title": "Max File Size Bytes", "type": "integer" }, "allowed_extensions": { "description": "Comma-separated list of allowed file extensions.", "title": "Allowed Extensions", "type": "string" }, "remaining_dataset_quota": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Datasets the caller may still create before hitting the per-user count cap, or null when no count cap is configured (unlimited). Advisory UX hint only \u2014 the cap is enforced server-side at upload.", "title": "Remaining Dataset Quota" } }, "required": [ "presigned_uploads", "presigned_threshold_bytes", "max_file_size_bytes", "allowed_extensions" ], "title": "UploadConfigResponse", "type": "object" }, "UploadResponse": { "properties": { "job_id": { "description": "Unique identifier for the ingestion job. Use this to poll status and to commit the upload.", "format": "uuid", "title": "Job Id", "type": "string" }, "status": { "default": "pending", "description": "Initial job status. 'pending' means the file is staged and ready to preview; 'running' means the server is still fetching it, as it is for a URL import.", "title": "Status", "type": "string" }, "message": { "description": "Human-readable message describing the upload result.", "title": "Message", "type": "string" } }, "required": [ "job_id", "message" ], "title": "UploadResponse", "type": "object" }, "UrlUploadRequest": { "description": "Request body for importing a file from a URL.\n\nThe server validates the URL for SSRF, enforces the size limit, and stages\nthe file through the same preview and commit flow as a direct upload.", "properties": { "url": { "description": "HTTP(S) URL of the file to import. The server validates the URL against SSRF, downloads it with the configured size cap, and stages it like a direct upload.", "maxLength": 2000, "minLength": 1, "title": "Url", "type": "string" }, "filename": { "anyOf": [ { "maxLength": 255, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "Filename override for URLs whose path does not end in the actual file name (e.g. download links keyed by query id). Must carry an allowed extension. Defaults to the URL path's basename.", "title": "Filename" }, "kind": { "anyOf": [ { "const": "tiles3d", "type": "string" }, { "type": "null" } ], "description": "'tiles3d' uploads a 3D Tiles tileset as a .zip or .3tz archive holding tileset.json. Omit it for any other file; a .zip without it is read as geospatial data, and a .3tz without it is refused.", "title": "Kind" } }, "required": [ "url" ], "title": "UrlUploadRequest", "type": "object" }, "UserCreate": { "properties": { "username": { "description": "Unique login name", "example": "jdoe", "maxLength": 150, "minLength": 3, "title": "Username", "type": "string" }, "password": { "description": "Plaintext password (policy: min 12 chars, 3+ character classes, at most 72 bytes UTF-8)", "maxLength": 256, "minLength": 8, "title": "Password", "type": "string" }, "email": { "anyOf": [ { "format": "email", "maxLength": 255, "type": "string" }, { "type": "null" } ], "description": "Optional email address", "example": "jdoe@example.com", "title": "Email" } }, "required": [ "username", "password" ], "title": "UserCreate", "type": "object" }, "UserListResponse": { "properties": { "users": { "description": "Page of users matching the query.", "items": { "$ref": "#/components/schemas/UserResponse" }, "title": "Users", "type": "array" }, "total": { "description": "Total number of users matching the query (across all pages).", "title": "Total", "type": "integer" } }, "required": [ "users", "total" ], "title": "UserListResponse", "type": "object" }, "UserNameItem": { "properties": { "id": { "description": "Unique user identifier.", "format": "uuid", "title": "Id", "type": "string" }, "username": { "description": "User's login username.", "title": "Username", "type": "string" } }, "required": [ "id", "username" ], "title": "UserNameItem", "type": "object" }, "UserQuotaUsage": { "description": "Per-user quota usage: current consumption vs configured caps.", "properties": { "bytes_used": { "title": "Bytes Used", "type": "integer" }, "dataset_count": { "title": "Dataset Count", "type": "integer" }, "storage_cap": { "title": "Storage Cap", "type": "integer" }, "count_cap": { "title": "Count Cap", "type": "integer" } }, "required": [ "bytes_used", "dataset_count", "storage_cap", "count_cap" ], "title": "UserQuotaUsage", "type": "object" }, "UserResponse": { "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "username": { "title": "Username", "type": "string" }, "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Email" }, "is_active": { "title": "Is Active", "type": "boolean" }, "status": { "description": "Account status: active, pending, suspended, or deactivated.", "enum": [ "active", "pending", "suspended", "deactivated" ], "title": "Status", "type": "string" }, "last_login_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Last Login At" }, "created_at": { "format": "date-time", "title": "Created At", "type": "string" }, "roles": { "description": "Assigned role names, e.g. ['admin', 'editor']", "items": { "type": "string" }, "title": "Roles", "type": "array" }, "can_reset_password": { "description": "Whether an administrator can set a local password for this account. True for local accounts even when an identity provider is also linked.", "title": "Can Reset Password", "type": "boolean" }, "quota_usage": { "anyOf": [ { "$ref": "#/components/schemas/UserQuotaUsage" }, { "type": "null" } ], "description": "Per-user storage quota usage. Populated only on admin list responses; None when the caller did not load usage (e.g. /auth/me, single-user GET)." } }, "required": [ "id", "username", "email", "is_active", "status", "last_login_at", "created_at", "roles", "can_reset_password" ], "title": "UserResponse", "type": "object" }, "UserUpdate": { "properties": { "email": { "anyOf": [ { "format": "email", "type": "string" }, { "type": "null" } ], "description": "New email address. Set to update, send null or an empty string to clear it, omit to leave unchanged.", "title": "Email" }, "is_active": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "description": "Legacy account-state toggle. False maps to 'deactivated' and true maps to 'active'. Prefer the explicit status field.", "title": "Is Active" }, "status": { "anyOf": [ { "enum": [ "active", "suspended", "deactivated" ], "type": "string" }, { "type": "null" } ], "description": "Explicit account lifecycle state. Pending registrations must use the approve/reject endpoints.", "title": "Status" }, "role": { "anyOf": [ { "maxLength": 50, "type": "string" }, { "type": "null" } ], "description": "New role: 'admin', 'editor', or 'viewer'. Omit to leave unchanged.", "title": "Role" } }, "title": "UserUpdate", "type": "object" }, "ValidationIssue": { "properties": { "field": { "title": "Field", "type": "string" }, "message": { "title": "Message", "type": "string" }, "severity": { "enum": [ "error", "warning" ], "title": "Severity", "type": "string" } }, "required": [ "field", "message", "severity" ], "title": "ValidationIssue", "type": "object" }, "ValidationResultResponse": { "properties": { "is_valid": { "title": "Is Valid", "type": "boolean" }, "errors": { "items": { "$ref": "#/components/schemas/ValidationIssue" }, "title": "Errors", "type": "array" }, "warnings": { "items": { "$ref": "#/components/schemas/ValidationIssue" }, "title": "Warnings", "type": "array" }, "quality_score": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "title": "Quality Score" } }, "required": [ "is_valid", "errors", "warnings" ], "title": "ValidationResultResponse", "type": "object" }, "VectorTileToken": { "properties": { "kind": { "const": "vector", "title": "Kind", "type": "string" }, "sig": { "title": "Sig", "type": "string" }, "exp": { "title": "Exp", "type": "integer" }, "scope": { "title": "Scope", "type": "string" }, "expires_in": { "title": "Expires In", "type": "integer" } }, "required": [ "kind", "sig", "exp", "scope", "expires_in" ], "title": "VectorTileToken", "type": "object" }, "VerifyEmailRequest": { "properties": { "token": { "description": "Raw opaque verification token from the email link", "maxLength": 128, "title": "Token", "type": "string" } }, "required": [ "token" ], "title": "VerifyEmailRequest", "type": "object" }, "VisibilityCheckResponse": { "properties": { "non_public_datasets": { "description": "Titles of datasets not publicly visible", "items": { "type": "string" }, "title": "Non Public Datasets", "type": "array" }, "has_non_public": { "description": "True if any layer references a non-public dataset", "title": "Has Non Public", "type": "boolean" } }, "required": [ "non_public_datasets", "has_non_public" ], "title": "VisibilityCheckResponse", "type": "object" }, "VrtActiveGeneration": { "properties": { "generation_id": { "format": "uuid", "title": "Generation Id", "type": "string" }, "started_at": { "format": "date-time", "title": "Started At", "type": "string" }, "elapsed_seconds": { "title": "Elapsed Seconds", "type": "number" } }, "required": [ "generation_id", "started_at", "elapsed_seconds" ], "title": "VrtActiveGeneration", "type": "object" }, "VrtAddSourceRequest": { "properties": { "source_dataset_id": { "description": "Raster dataset ID to add as an additional source to the existing VRT.", "format": "uuid", "title": "Source Dataset Id", "type": "string" } }, "required": [ "source_dataset_id" ], "title": "VrtAddSourceRequest", "type": "object" }, "VrtCreateRequest": { "properties": { "source_dataset_ids": { "description": "Source raster dataset IDs to include in the VRT mosaic or band stack (2-500).", "items": { "format": "uuid", "type": "string" }, "maxItems": 500, "minItems": 2, "title": "Source Dataset Ids", "type": "array" }, "vrt_type": { "description": "Type of VRT to create. 'mosaic' tiles sources spatially; 'band_stack' aligns same-extent sources as multi-band output.", "enum": [ "mosaic", "band_stack" ], "title": "Vrt Type", "type": "string" }, "resolution_strategy": { "description": "How to resolve mismatched source resolutions: 'finest' uses the highest, 'coarsest' uses the lowest, 'average' computes the mean.", "enum": [ "finest", "coarsest", "average" ], "title": "Resolution Strategy", "type": "string" }, "title": { "description": "Human-readable title for the resulting VRT dataset.", "maxLength": 500, "title": "Title", "type": "string" }, "summary": { "anyOf": [ { "maxLength": 5000, "type": "string" }, { "type": "null" } ], "description": "Optional description for the VRT dataset.", "title": "Summary" }, "visibility": { "default": "private", "description": "Visibility level for the resulting VRT dataset.", "enum": [ "private", "restricted", "internal", "public" ], "title": "Visibility", "type": "string" } }, "required": [ "source_dataset_ids", "vrt_type", "resolution_strategy", "title" ], "title": "VrtCreateRequest", "type": "object" }, "VrtCreateResponse": { "properties": { "job_id": { "description": "Identifier of the asynchronous VRT creation job.", "format": "uuid", "title": "Job Id", "type": "string" }, "status": { "default": "accepted", "description": "Initial job status. Always 'accepted' on creation.", "title": "Status", "type": "string" }, "message": { "description": "Human-readable acceptance message.", "title": "Message", "type": "string" } }, "required": [ "job_id", "message" ], "title": "VrtCreateResponse", "type": "object" }, "VrtGenerationItem": { "properties": { "id": { "format": "uuid", "title": "Id", "type": "string" }, "status": { "title": "Status", "type": "string" }, "started_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Started At" }, "completed_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Completed At" }, "duration_seconds": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Duration Seconds" }, "error_message": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Error Message" }, "source_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Source Count" }, "triggered_by": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Triggered By" } }, "required": [ "id", "status" ], "title": "VrtGenerationItem", "type": "object" }, "VrtGenerationListResponse": { "properties": { "generations": { "items": { "$ref": "#/components/schemas/VrtGenerationItem" }, "title": "Generations", "type": "array" }, "total": { "title": "Total", "type": "integer" } }, "required": [ "generations", "total" ], "title": "VrtGenerationListResponse", "type": "object" }, "VrtMutationResponse": { "properties": { "job_id": { "description": "Identifier of the asynchronous VRT mutation job.", "format": "uuid", "title": "Job Id", "type": "string" }, "status": { "default": "accepted", "description": "Initial job status.", "title": "Status", "type": "string" }, "message": { "description": "Human-readable acceptance message.", "title": "Message", "type": "string" } }, "required": [ "job_id", "message" ], "title": "VrtMutationResponse", "type": "object" }, "VrtSourceHealth": { "properties": { "dataset_id": { "format": "uuid", "title": "Dataset Id", "type": "string" }, "title": { "title": "Title", "type": "string" }, "status": { "enum": [ "healthy", "missing", "inaccessible", "stale" ], "title": "Status", "type": "string" } }, "required": [ "dataset_id", "title", "status" ], "title": "VrtSourceHealth", "type": "object" }, "VrtSourceItem": { "properties": { "dataset_id": { "format": "uuid", "title": "Dataset Id", "type": "string" }, "title": { "title": "Title", "type": "string" }, "position": { "title": "Position", "type": "integer" }, "band_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Band Count" }, "resolution_x": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Resolution X" }, "resolution_y": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Resolution Y" }, "crs_epsg": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Crs Epsg" }, "extent_bbox": { "anyOf": [ { "items": { "type": "number" }, "type": "array" }, { "type": "null" } ], "title": "Extent Bbox" } }, "required": [ "dataset_id", "title", "position" ], "title": "VrtSourceItem", "type": "object" }, "VrtSourceListResponse": { "properties": { "sources": { "items": { "$ref": "#/components/schemas/VrtSourceItem" }, "title": "Sources", "type": "array" } }, "required": [ "sources" ], "title": "VrtSourceListResponse", "type": "object" }, "VrtStatusResponse": { "properties": { "status": { "enum": [ "ready", "regenerating", "failed" ], "title": "Status", "type": "string" }, "last_generation_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Last Generation At" }, "source_count": { "title": "Source Count", "type": "integer" }, "active_generation": { "anyOf": [ { "$ref": "#/components/schemas/VrtActiveGeneration" }, { "type": "null" } ] }, "source_health": { "items": { "$ref": "#/components/schemas/VrtSourceHealth" }, "title": "Source Health", "type": "array" } }, "required": [ "status", "source_count", "source_health" ], "title": "VrtStatusResponse", "type": "object" } }, "securitySchemes": { "ApiKeyHeader": { "description": "GeoLens API key. Preferred API-key transport.", "in": "header", "name": "X-Api-Key", "type": "apiKey" }, "ApiKeyQuery": { "description": "Legacy API-key query parameter, accepted on GET/HEAD/OPTIONS only; ignored on any other method. Prefer X-Api-Key.", "in": "query", "name": "api_key", "type": "apiKey" }, "OAuth2PasswordBearer": { "flows": { "password": { "scopes": {}, "tokenUrl": "/api/auth/login" } }, "type": "oauth2" } } }, "info": { "contact": { "name": "GeoLens", "url": "https://github.com/geolens-io/geolens" }, "description": "## Overview\n\nGeoLens is a self-hosted spatial data catalog that ingests vector files\n(GeoPackage, Shapefile, GeoJSON, CSV), stores them in PostGIS, and exposes\nthem through OGC API endpoints.\n\n## OGC Conformance Classes\n\n`GET /api/conformance` is the machine-readable list and the one a client\nshould read. This is the same set in prose:\n\n* OGC API Common 1.0 -- Core, Landing Page, JSON\n* OGC API Features Part 1 -- Core, GeoJSON\n* OGC API Features Part 3 -- Queryables, Filter, Features Filter\n* CQL2 1.0 -- CQL2-Text, CQL2-JSON, Basic CQL2, advanced comparison\n operators, basic spatial functions\n* OGC API Records Part 1 -- Record Core, core query parameters, sorting, JSON\n\nThe OAS 3.0 classes of Common and Features Part 1 are NOT claimed: this\nserver publishes its API document as OpenAPI 3.1.\n\n## QGIS Quick-start\n\n1. **Layer > Add Layer > WFS / OGC API Features**\n2. URL: `{your-server}/api/`\n3. GeoLens advertises collections automatically.\n\n## GDAL / ogr2ogr Quick-start\n\n```bash\n# List collections\nogrinfo OAPIF:{your-server}/api/\n\n# Download a collection to GeoPackage\nogr2ogr -f GPKG output.gpkg OAPIF:{your-server}/api/ {collection-id}\n```\n\n## Authentication\n\nGeoLens supports three authentication methods. Public datasets are accessible\nwithout credentials; private/restricted datasets require one of:\n\n| Method | Usage |\n|--------|-------|\n| **API Key header** | `X-Api-Key: ` |\n| **JWT Bearer token** | `Authorization: Bearer ` |\n| **API Key query param** (deprecated) | `?api_key=` |\n\nPriority: header API key > query param API key > JWT > anonymous.\n\n**The `?api_key=` query parameter is deprecated, and it authenticates reads\nonly.** A key sent in the URL is recorded by server access logs and by any\nproxy or CDN that terminates TLS in front of GeoLens, so it authenticates\n`GET`, `HEAD` and `OPTIONS` and nothing else. On any other method the key is\nignored and the request is answered as if no credential had been sent. Prefer the `X-Api-Key` header, which carries reads\nand writes alike; keep the query parameter only for clients that cannot send\nheaders (e.g. XYZ tile URLs in desktop GIS tools).\n\nAPI keys may carry an optional expiry (`expires_at` at mint time). Expired\nkeys stop authenticating, and keys are also invalidated by security events\non the owner's account (password change or role change). Logging out of the\nweb UI does not affect API keys.\n\n### What a rejected credential looks like\n\nSend no credential and you are served anonymously: public datasets come\nback, private ones do not.\n\nSend a credential that cannot be resolved (expired, revoked, or mistyped)\nand every endpoint that reads credentials answers `401`, including the ones\nthat also serve anonymous callers. It is never quietly ignored. A `200`\ncarrying only the public subset would look exactly like a catalog holding\nnothing more, so a client whose key died overnight would go on working\nagainst a smaller view of the data and never be told. The `401` is also the\nsignal a client needs to refresh and retry.\n\nThree cases sit outside that rule.\n\n`POST /auth/logout` accepts a dead access token so a stale session can still\nbe cleared, and falls back to the refresh credential. It still answers `401`\nwhen nothing you present resolves.\n\nA request that something other than your identity already authorized is\nserved, and the dead credential is ignored: a valid `X-Embed-Token`, or a\nvalid signed tile template (`sig`, `exp`, `scope`). Each authorizes one\nspecific resource on its own, so an embed viewer carrying a stale browser\nsession still renders. An invalid or absent capability puts the request back\nunder the rule above, so a junk `X-Embed-Token` cannot be used to suppress\nthe `401`.\n\n`GET /maps/shared/{token}` answers `404` for an unknown share link and `410`\nfor a revoked one whatever you send. No credential could have made that link\nwork, and reporting the credential instead would hide the answer you can act\non.\n\nA few endpoints read no credential at all, such as the landing page and the\nconformance declaration, and answer `200` either way.\n\n### GDAL / ogr2ogr with API Key\n\n```bash\n# List collections (including private ones accessible to your key)\nogrinfo --config GDAL_HTTP_HEADERS \"X-Api-Key: YOUR_KEY\" \"OAPIF:{your-server}/api/\"\n\n# Download a private collection\nogr2ogr -f GPKG out.gpkg --config GDAL_HTTP_HEADERS \"X-Api-Key: YOUR_KEY\" \"OAPIF:{your-server}/api/\" {collection-id}\n```\n\n### QGIS with API Key\n\nIn the WFS / OGC API Features connection dialog, append `?api_key=YOUR_KEY`\nto the server URL (the connection dialog cannot send custom headers; this is\nthe main remaining use of the deprecated query parameter).\n", "license": { "name": "Apache 2.0", "url": "https://www.apache.org/licenses/LICENSE-2.0" }, "summary": "PostGIS-native geospatial data catalog with OGC API Features and Records support", "termsOfService": "https://github.com/geolens-io/geolens/blob/main/LICENSE", "title": "GeoLens API", "version": "1.24.0" }, "openapi": "3.1.0", "paths": { "/": { "get": { "description": "OGC API landing page -- entry point for machine clients.", "operationId": "landing_page__get", "parameters": [ { "in": "query", "name": "f", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "F" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LandingPage" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Landing Page", "tags": [ "OGC Features" ] } }, "/admin/ai-status/": { "get": { "description": "Return single-deployment AI status; no provider-routing policy controls (admin only).", "operationId": "get_ai_status_admin_ai_status__get", "parameters": [ { "description": "When true, run a minimal LIVE provider call per purpose (chat + embeddings) to verify the configured key actually works. Costs a real provider API call \u2014 never enabled by dashboards.", "in": "query", "name": "probe", "required": false, "schema": { "default": false, "description": "When true, run a minimal LIVE provider call per purpose (chat + embeddings) to verify the configured key actually works. Costs a real provider API call \u2014 never enabled by dashboards.", "title": "Probe", "type": "boolean" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AIStatusResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Ai Status", "tags": [ "Admin" ] }, "patch": { "description": "Toggle base AI features on/off at runtime; no provider-routing policy controls (admin only).", "operationId": "update_ai_status_admin_ai_status__patch", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AIStatusUpdate" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AIStatusResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Update Ai Status", "tags": [ "Admin" ] } }, "/admin/api-keys/": { "get": { "description": "List all API keys (admin only). Never returns the raw key.", "operationId": "list_api_keys_admin_api_keys__get", "parameters": [ { "in": "query", "name": "skip", "required": false, "schema": { "default": 0, "minimum": 0, "title": "Skip", "type": "integer" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer" } }, { "description": "Filter by user ID", "in": "query", "name": "user_id", "required": false, "schema": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "description": "Filter by user ID", "title": "User Id" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AdminApiKeyListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List Api Keys", "tags": [ "Admin" ] }, "post": { "description": "Create an API key for a user (admin only).\n\nThe raw key is returned only in this response and cannot be retrieved again.\nRequires a signed-in session: a request that presents an API key gets 403.", "operationId": "create_api_key_admin_api_keys__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AdminApiKeyCreateRequest" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiKeyCreateResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] } ], "summary": "Create Api Key", "tags": [ "Admin" ] } }, "/admin/api-keys/{key_id}": { "delete": { "description": "Revoke (soft-delete) an API key (admin only).", "operationId": "revoke_api_key_admin_api_keys__key_id__delete", "parameters": [ { "in": "path", "name": "key_id", "required": true, "schema": { "format": "uuid", "title": "Key Id", "type": "string" } } ], "responses": { "204": { "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Revoke Api Key", "tags": [ "Admin" ] } }, "/admin/audit-logs/": { "get": { "description": "Query audit logs with optional filters and sort (admin only).\n\n`sort` and `order` are closed enums, so an unrecognised value is refused\nwith a 422 and never reaches the query.", "operationId": "list_audit_logs_admin_audit_logs__get", "parameters": [ { "in": "query", "name": "user_id", "required": false, "schema": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "User Id" } }, { "in": "query", "name": "action", "required": false, "schema": { "anyOf": [ { "maxLength": 200, "type": "string" }, { "type": "null" } ], "title": "Action" } }, { "in": "query", "name": "resource_type", "required": false, "schema": { "anyOf": [ { "maxLength": 200, "type": "string" }, { "type": "null" } ], "title": "Resource Type" } }, { "in": "query", "name": "resource_id", "required": false, "schema": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Resource Id" } }, { "in": "query", "name": "date_from", "required": false, "schema": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Date From" } }, { "in": "query", "name": "date_to", "required": false, "schema": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Date To" } }, { "in": "query", "name": "search", "required": false, "schema": { "anyOf": [ { "maxLength": 200, "type": "string" }, { "type": "null" } ], "title": "Search" } }, { "in": "query", "name": "skip", "required": false, "schema": { "default": 0, "minimum": 0, "title": "Skip", "type": "integer" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer" } }, { "description": "Column to order by. Resource name is not sortable: it is resolved per page after the query, so the database cannot order by it.", "in": "query", "name": "sort", "required": false, "schema": { "default": "created_at", "description": "Column to order by. Resource name is not sortable: it is resolved per page after the query, so the database cannot order by it.", "enum": [ "created_at", "action", "resource_type", "ip_address", "username" ], "title": "Sort", "type": "string" } }, { "description": "Sort direction.", "in": "query", "name": "order", "required": false, "schema": { "default": "desc", "description": "Sort direction.", "enum": [ "asc", "desc" ], "title": "Order", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AuditLogListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List Audit Logs", "tags": [ "Admin" ] } }, "/admin/audit-logs/export/{format}": { "get": { "description": "Export up to 100,000 audit log rows as CSV or JSON, newest first.", "operationId": "export_audit_logs_admin_audit_logs_export__format__get", "parameters": [ { "in": "path", "name": "format", "required": true, "schema": { "title": "Format", "type": "string" } }, { "in": "query", "name": "user_id", "required": false, "schema": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "User Id" } }, { "in": "query", "name": "action", "required": false, "schema": { "anyOf": [ { "maxLength": 200, "type": "string" }, { "type": "null" } ], "title": "Action" } }, { "in": "query", "name": "resource_type", "required": false, "schema": { "anyOf": [ { "maxLength": 200, "type": "string" }, { "type": "null" } ], "title": "Resource Type" } }, { "in": "query", "name": "resource_id", "required": false, "schema": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Resource Id" } }, { "in": "query", "name": "date_from", "required": false, "schema": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Date From" } }, { "in": "query", "name": "date_to", "required": false, "schema": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Date To" } }, { "in": "query", "name": "search", "required": false, "schema": { "anyOf": [ { "maxLength": 200, "type": "string" }, { "type": "null" } ], "title": "Search" } }, { "in": "query", "name": "max_rows", "required": false, "schema": { "default": 100000, "maximum": 100000, "minimum": 1, "title": "Max Rows", "type": "integer" } } ], "responses": { "200": { "content": { "text/csv": { "schema": { "format": "binary", "type": "string" } } }, "description": "The CSV file, or a JSON file when the format is json" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Download audit records", "tags": [ "Admin" ] } }, "/admin/backfill-embeddings/": { "post": { "description": "Queue semantic-search embedding generation for records (admin only).\n\nPass ?force=true to regenerate every record and replace its stored vectors.\nWithout it, the run embeds only records that lack a current-model embedding.\n\nThe run covers the calling tenant's records. In a multi-tenant deployment\nthe embedding model and width are shared by every tenant, so a change\nleaves each tenant to regenerate. Pass ?all_tenants=true to also queue a\nrun for every other registered tenant; there it needs\nmanage_tenants instead of manage_users, and ``other_tenants`` reports\neach run. When the calling tenant already has a run in flight, the status\nis ``already_running``, ``job_id`` is that run (null when the caller may\nnot read it) and the other tenants are still queued. This request did not queue that run and it may predate the\nchange, so run the backfill again once it ends. A single-tenant\ndeployment ignores the flag.\n\nThe run happens on the job queue because a full regeneration can exceed\nrequest timeouts. This endpoint returns the job id; poll\n``GET /jobs/{job_id}`` for the outcome.", "operationId": "trigger_backfill_admin_backfill_embeddings__post", "parameters": [ { "in": "query", "name": "force", "required": false, "schema": { "default": false, "title": "Force", "type": "boolean" } }, { "in": "query", "name": "all_tenants", "required": false, "schema": { "default": false, "title": "All Tenants", "type": "boolean" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BackfillResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the background job queue could not be reached" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Trigger Backfill", "tags": [ "Admin" ] } }, "/admin/embed-tokens/": { "get": { "description": "List basic embed-token inventory across maps; no quota or domain-policy controls (admin only).", "operationId": "list_all_embed_tokens_admin_embed_tokens__get", "parameters": [ { "in": "query", "name": "skip", "required": false, "schema": { "default": 0, "minimum": 0, "title": "Skip", "type": "integer" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer" } }, { "in": "query", "name": "map_id", "required": false, "schema": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Map Id" } }, { "in": "query", "name": "map_search", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Map Search" } }, { "in": "query", "name": "creator", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Creator" } }, { "in": "query", "name": "status", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Status" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AdminEmbedTokenListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List All Embed Tokens", "tags": [ "Admin Embed Tokens" ] } }, "/admin/embed-tokens/bulk-revoke/": { "post": { "description": "Bulk-revoke basic embed tokens; no quota or domain-policy controls (admin only).", "operationId": "bulk_revoke_admin_embed_tokens_bulk_revoke__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BulkRevokeRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BulkRevokeResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Bulk Revoke", "tags": [ "Admin Embed Tokens" ] } }, "/admin/embedding-stats/": { "get": { "description": "Return embedding coverage and the state of the backfill runs (admin only).", "operationId": "get_embedding_stats_admin_embedding_stats__get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EmbeddingStatsResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Embedding Stats", "tags": [ "Admin" ] } }, "/admin/infrastructure/": { "get": { "description": "Return infrastructure configuration, live health status, and OIDC provider connectivity.", "operationId": "get_infrastructure_admin_infrastructure__get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/InfrastructureResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Infrastructure", "tags": [ "Admin" ] } }, "/admin/jobs/": { "get": { "description": "List all ingestion jobs with optional status/user/search/sort filters (admin only).\n\n`sort` and `order` are closed enums, so an unrecognised value is refused\nwith a 422 and never reaches the query.", "operationId": "list_admin_jobs_admin_jobs__get", "parameters": [ { "description": "Job status to match. 'failed' leaves out replacements held for review, which 'awaiting_review' lists while their run still needs a decision.", "in": "query", "name": "status", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Job status to match. 'failed' leaves out replacements held for review, which 'awaiting_review' lists while their run still needs a decision.", "title": "Status" } }, { "in": "query", "name": "user_id", "required": false, "schema": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "User Id" } }, { "in": "query", "name": "search", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Search" } }, { "in": "query", "name": "skip", "required": false, "schema": { "default": 0, "minimum": 0, "title": "Skip", "type": "integer" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer" } }, { "description": "Column to order by. Duration orders by the completed_at - started_at interval, so unfinished jobs sort last either way.", "in": "query", "name": "sort", "required": false, "schema": { "default": "created_at", "description": "Column to order by. Duration orders by the completed_at - started_at interval, so unfinished jobs sort last either way.", "enum": [ "created_at", "source_filename", "status", "username", "duration" ], "title": "Sort", "type": "string" } }, { "description": "Sort direction.", "in": "query", "name": "order", "required": false, "schema": { "default": "desc", "description": "Sort direction.", "enum": [ "asc", "desc" ], "title": "Order", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AdminJobListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List Admin Jobs", "tags": [ "Admin" ] } }, "/admin/share-tokens/": { "get": { "description": "List basic share-token inventory with map info; no quotas or domain controls (admin only).\n\n`sort` and `order` are closed enums, so an unrecognised value is refused\nwith a 422 and never reaches the query.", "operationId": "list_share_tokens_endpoint_admin_share_tokens__get", "parameters": [ { "in": "query", "name": "skip", "required": false, "schema": { "default": 0, "minimum": 0, "title": "Skip", "type": "integer" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer" } }, { "in": "query", "name": "search", "required": false, "schema": { "anyOf": [ { "maxLength": 200, "type": "string" }, { "type": "null" } ], "title": "Search" } }, { "in": "query", "name": "status", "required": false, "schema": { "anyOf": [ { "pattern": "^(active|expired|revoked)$", "type": "string" }, { "type": "null" } ], "title": "Status" } }, { "description": "Column to order by. Link status is not sortable: it is derived from is_active and expires_at after the query returns.", "in": "query", "name": "sort", "required": false, "schema": { "default": "created_at", "description": "Column to order by. Link status is not sortable: it is derived from is_active and expires_at after the query returns.", "enum": [ "map_name", "created_at", "creator", "expires_at", "embed_token_count" ], "title": "Sort", "type": "string" } }, { "description": "Sort direction.", "in": "query", "name": "order", "required": false, "schema": { "default": "desc", "description": "Sort direction.", "enum": [ "asc", "desc" ], "title": "Order", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AdminShareTokenListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List Share Tokens Endpoint", "tags": [ "Admin" ] } }, "/admin/share-tokens/{token_id}": { "delete": { "description": "Revoke a basic share token and cascade to its embed tokens; no quota controls (admin only).", "operationId": "admin_revoke_share_token_admin_share_tokens__token_id__delete", "parameters": [ { "in": "path", "name": "token_id", "required": true, "schema": { "format": "uuid", "title": "Token Id", "type": "string" } } ], "responses": { "204": { "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Admin Revoke Share Token", "tags": [ "Admin" ] } }, "/admin/stats/": { "get": { "description": "Return catalog statistics: counts, storage, breakdowns (admin only).", "operationId": "get_catalog_stats_admin_stats__get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CatalogStatsResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Catalog Stats", "tags": [ "Admin" ] } }, "/admin/users/": { "get": { "description": "List users with optional status, role, search, and sort filters (admin only).\n\n`sort` and `order` are closed enums, so an unrecognised value is refused\nwith a 422 and never reaches the query.", "operationId": "list_users_admin_users__get", "parameters": [ { "in": "query", "name": "skip", "required": false, "schema": { "default": 0, "minimum": 0, "title": "Skip", "type": "integer" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer" } }, { "in": "query", "name": "status", "required": false, "schema": { "anyOf": [ { "maxLength": 50, "type": "string" }, { "type": "null" } ], "title": "Status" } }, { "description": "Assigned role membership to match.", "in": "query", "name": "role", "required": false, "schema": { "anyOf": [ { "enum": [ "admin", "editor", "viewer" ], "type": "string" }, { "type": "null" } ], "description": "Assigned role membership to match.", "title": "Role" } }, { "in": "query", "name": "search", "required": false, "schema": { "anyOf": [ { "maxLength": 200, "type": "string" }, { "type": "null" } ], "title": "Search" } }, { "description": "Column to order by. Roles and storage are not sortable: roles is a many-to-many and storage is aggregated per page after the query.", "in": "query", "name": "sort", "required": false, "schema": { "default": "created_at", "description": "Column to order by. Roles and storage are not sortable: roles is a many-to-many and storage is aggregated per page after the query.", "enum": [ "username", "email", "status", "last_login_at", "created_at" ], "title": "Sort", "type": "string" } }, { "description": "Sort direction.", "in": "query", "name": "order", "required": false, "schema": { "default": "asc", "description": "Sort direction.", "enum": [ "asc", "desc" ], "title": "Order", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List Users", "tags": [ "Admin" ] }, "post": { "description": "Create a new user with the specified role (admin only).", "operationId": "create_user_admin_users__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AdminUserCreate" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Create User", "tags": [ "Admin" ] } }, "/admin/users/export.csv": { "get": { "description": "Export all registered users as a hardened CSV file (admin only).\n\nColumns: email, display_name, auth_provider, status, created_at.\nRows are ordered by created_at ASC and streamed without full materialisation.\nCells starting with =, +, -, or @ are tab-prefixed (CSV injection hardening).", "operationId": "export_users_csv_admin_users_export_csv_get", "responses": { "200": { "content": { "text/csv": { "schema": { "format": "binary", "type": "string" } } }, "description": "The CSV file" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Export registered users as CSV", "tags": [ "Admin", "Admin" ] } }, "/admin/users/names/": { "get": { "description": "Return lightweight id+username list for filter dropdowns.\n\nPaginated to bound response size on deployments with many users. Default\npage size of 500 is enough for typical admin dropdowns; the limit cap of\n1000 matches the previous hard cap. Clients needing the full list should\npage by incrementing ``skip``.", "operationId": "list_user_names_admin_users_names__get", "parameters": [ { "in": "query", "name": "skip", "required": false, "schema": { "default": 0, "minimum": 0, "title": "Skip", "type": "integer" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 500, "maximum": 1000, "minimum": 1, "title": "Limit", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "items": { "$ref": "#/components/schemas/UserNameItem" }, "title": "Response List User Names Admin Users Names Get", "type": "array" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List User Names", "tags": [ "Admin" ] } }, "/admin/users/{user_id}": { "delete": { "description": "Hard-delete a user (admin only). Returns 400 for self-deletion or last-admin.", "operationId": "delete_user_admin_users__user_id__delete", "parameters": [ { "in": "path", "name": "user_id", "required": true, "schema": { "format": "uuid", "title": "User Id", "type": "string" } } ], "responses": { "204": { "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Delete User", "tags": [ "Admin" ] }, "get": { "description": "Get a specific user by ID (admin only).", "operationId": "get_user_admin_users__user_id__get", "parameters": [ { "in": "path", "name": "user_id", "required": true, "schema": { "format": "uuid", "title": "User Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get User", "tags": [ "Admin" ] }, "patch": { "description": "Update a user's fields and/or role (admin only).", "operationId": "update_user_admin_users__user_id__patch", "parameters": [ { "in": "path", "name": "user_id", "required": true, "schema": { "format": "uuid", "title": "User Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserUpdate" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Update User", "tags": [ "Admin" ] } }, "/admin/users/{user_id}/approve/": { "post": { "description": "Approve a pending user with the specified role (admin only).", "operationId": "approve_user_admin_users__user_id__approve__post", "parameters": [ { "in": "path", "name": "user_id", "required": true, "schema": { "format": "uuid", "title": "User Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApproveRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Approve User", "tags": [ "Admin" ] } }, "/admin/users/{user_id}/deactivate/": { "post": { "description": "Deactivate a user (admin only).", "operationId": "deactivate_user_admin_users__user_id__deactivate__post", "parameters": [ { "in": "path", "name": "user_id", "required": true, "schema": { "format": "uuid", "title": "User Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Deactivate User", "tags": [ "Admin" ] } }, "/admin/users/{user_id}/reject/": { "post": { "description": "Reject a pending user by hard-deleting them (admin only).", "operationId": "reject_user_admin_users__user_id__reject__post", "parameters": [ { "in": "path", "name": "user_id", "required": true, "schema": { "format": "uuid", "title": "User Id", "type": "string" } } ], "responses": { "204": { "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Reject User", "tags": [ "Admin" ] } }, "/admin/users/{user_id}/reset-password/": { "post": { "description": "Set a user's password (admin only).\n\nThe ``manage_users`` permission authorizes this recovery path, so no current\npassword is required. The submitted password is stored only as a hash and\nis omitted from audit details, logs, and the response.\n\nReturns 422 when the target signs in through an identity provider and has\nno local password, or 404 when the user does not exist.\n\nResetting your own password is permitted and ends every session the\naccount holds, including the one making this request, because the reset\nrevokes the account's credentials.", "operationId": "reset_user_password_admin_users__user_id__reset_password__post", "parameters": [ { "in": "path", "name": "user_id", "required": true, "schema": { "format": "uuid", "title": "User Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AdminPasswordReset" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Reset User Password", "tags": [ "Admin" ] } }, "/ai/availability/": { "get": { "description": "Report whether builder AI chat is usable.\n\nRequires ``use_ai_chat``. Returns ``available=false`` when provider keys\nare missing and 403 when the caller lacks permission.", "operationId": "ai_availability_endpoint_ai_availability__get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AIAvailabilityResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Ai Availability Endpoint", "tags": [ "Maps" ] } }, "/ai/chat/": { "post": { "description": "Chat-based map editing: send a message and get back edit actions.", "operationId": "chat_endpoint_ai_chat__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ChatRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ChatResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "502": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad gateway \u2014 an upstream provider failed" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Chat Endpoint", "tags": [ "Maps" ] } }, "/ai/chat/dataset/stream/": { "post": { "description": "Dataset-scoped AI chat: ask questions about a single dataset's data.\n\nRead-only by construction \u2014 ``can_edit=False`` selects the query_data-only\ntool set, and a dataset-framed system prompt replaces the map-editing one.\nReuses the whole map-chat streaming pipeline (SQL generation, sandbox\nvalidation, RBAC table allowlist, token budgeting) with one synthetic\nserver-built layer.", "operationId": "dataset_chat_stream_endpoint_ai_chat_dataset_stream__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DatasetChatRequest" } } }, "required": true }, "responses": { "200": { "content": { "text/event-stream": { "example": "event: token\ndata: {\"type\":\"token\",\"text\":\"Updated \"}\n\nevent: actions\ndata: {\"type\":\"actions\",\"actions\":[]}\n\nevent: done\ndata: {\"type\":\"done\",\"explanation\":\"Updated the map\"}\n\n", "schema": { "description": "UTF-8 server-sent event frames. Each data field contains one JSON event payload described by x-geolens-event-schema.", "type": "string" }, "x-geolens-event-schema": { "oneOf": [ { "$ref": "#/components/schemas/SSETokenEvent" }, { "$ref": "#/components/schemas/SSEToolStartEvent" }, { "$ref": "#/components/schemas/SSEToolResultEvent" }, { "$ref": "#/components/schemas/SSEActionsEvent" }, { "$ref": "#/components/schemas/SSEChatDoneEvent" }, { "$ref": "#/components/schemas/SSEErrorEvent" } ] } } }, "description": "Server-Sent Events stream" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Dataset Chat Stream Endpoint", "tags": [ "Maps" ] } }, "/ai/chat/stream/": { "post": { "description": "Chat-based map editing with server-sent event streaming.", "operationId": "chat_stream_endpoint_ai_chat_stream__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ChatRequest" } } }, "required": true }, "responses": { "200": { "content": { "text/event-stream": { "example": "event: token\ndata: {\"type\":\"token\",\"text\":\"Updated \"}\n\nevent: actions\ndata: {\"type\":\"actions\",\"actions\":[]}\n\nevent: done\ndata: {\"type\":\"done\",\"explanation\":\"Updated the map\"}\n\n", "schema": { "description": "UTF-8 server-sent event frames. Each data field contains one JSON event payload described by x-geolens-event-schema.", "type": "string" }, "x-geolens-event-schema": { "oneOf": [ { "$ref": "#/components/schemas/SSETokenEvent" }, { "$ref": "#/components/schemas/SSEToolStartEvent" }, { "$ref": "#/components/schemas/SSEToolResultEvent" }, { "$ref": "#/components/schemas/SSEActionsEvent" }, { "$ref": "#/components/schemas/SSEChatDoneEvent" }, { "$ref": "#/components/schemas/SSEErrorEvent" } ] } } }, "description": "Server-Sent Events stream" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Chat Stream Endpoint", "tags": [ "Maps" ] } }, "/ai/generate-map/": { "post": { "description": "Generate a map from a natural language prompt using an LLM.", "operationId": "generate_map_endpoint_ai_generate_map__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MapGenerateRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MapGenerateResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "502": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad gateway \u2014 an upstream provider failed" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Generate Map Endpoint", "tags": [ "Maps" ] } }, "/ai/generate-map/stream/": { "post": { "description": "Generate a map from a natural language prompt with streaming progress events.", "operationId": "generate_map_stream_endpoint_ai_generate_map_stream__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MapGenerateRequest" } } }, "required": true }, "responses": { "200": { "content": { "text/event-stream": { "example": "event: tool_start\ndata: {\"type\":\"tool_start\",\"tool\":\"create_map\",\"label\":\"Building map...\"}\n\nevent: done\ndata: {\"type\":\"done\",\"map_id\":\"0190...\",\"map_name\":\"Flood risk\",\"explanation\":\"Created the map\",\"datasets_used\":[\"Flood zones\"]}\n\n", "schema": { "description": "UTF-8 server-sent event frames. Each data field contains one JSON event payload described by x-geolens-event-schema.", "type": "string" }, "x-geolens-event-schema": { "oneOf": [ { "$ref": "#/components/schemas/SSEToolStartEvent" }, { "$ref": "#/components/schemas/SSEToolResultEvent" }, { "$ref": "#/components/schemas/SSEMapDoneEvent" }, { "$ref": "#/components/schemas/SSEErrorEvent" } ] } } }, "description": "Server-Sent Events stream" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Generate Map Stream Endpoint", "tags": [ "Maps" ] } }, "/ai/metadata/keywords/": { "post": { "description": "Generate AI-suggested keywords for a dataset.", "operationId": "generate_metadata_keywords_ai_metadata_keywords__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MetadataAssistRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/KeywordSuggestionsResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "502": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad gateway \u2014 an upstream provider failed" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Generate Metadata Keywords", "tags": [ "Maps" ] } }, "/ai/metadata/lineage/": { "post": { "description": "Generate an AI-drafted lineage summary for a dataset.", "operationId": "generate_metadata_lineage_ai_metadata_lineage__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MetadataAssistRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LineageDraftResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "502": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad gateway \u2014 an upstream provider failed" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Generate Metadata Lineage", "tags": [ "Maps" ] } }, "/ai/metadata/quality-statement/": { "post": { "description": "Generate an AI-drafted quality statement for a dataset.", "operationId": "generate_metadata_quality_statement_ai_metadata_quality_statement__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MetadataAssistRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/QualityStatementDraftResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "502": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad gateway \u2014 an upstream provider failed" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Generate Metadata Quality Statement", "tags": [ "Maps" ] } }, "/ai/metadata/summary/": { "post": { "description": "Generate an AI-drafted summary for a dataset.", "operationId": "generate_metadata_summary_ai_metadata_summary__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MetadataAssistRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SummaryDraftResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "502": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad gateway \u2014 an upstream provider failed" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Generate Metadata Summary", "tags": [ "Maps" ] } }, "/audit/datasets/{dataset_id}/column-ddl": { "get": { "description": "Return the column-DDL audit history for a dataset.\n\nSurfaces the column-DDL events to dataset owners so they can detect\neditor-initiated schema changes.\n\nOwners and administrators can read the feed, because the entries identify\neditors. Other authenticated users receive 403 for a dataset they can see,\nsuch as a public one, and 404 for one they can't. Anonymous callers\nreceive 401.\n\nThe dataset 404-before-auth-query ordering ensures non-existent datasets\nreturn 404 without leaking audit log details.", "operationId": "get_column_ddl_feed_audit_datasets__dataset_id__column_ddl_get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer" } }, { "description": "Number of audit entries to skip.", "in": "query", "name": "skip", "required": false, "schema": { "default": 0, "description": "Number of audit entries to skip.", "minimum": 0, "title": "Skip", "type": "integer" } }, { "deprecated": true, "description": "Deprecated alias for skip; takes precedence when supplied.", "in": "query", "name": "offset", "required": false, "schema": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ], "deprecated": true, "description": "Deprecated alias for skip; takes precedence when supplied.", "title": "Offset" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ColumnDdlFeedResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Column Ddl Feed", "tags": [ "Audit" ] } }, "/auth/api-keys/": { "get": { "description": "List the current user's API keys.", "operationId": "list_my_api_keys_auth_api_keys__get", "parameters": [ { "in": "query", "name": "skip", "required": false, "schema": { "default": 0, "minimum": 0, "title": "Skip", "type": "integer" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiKeyListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List My Api Keys", "tags": [ "Auth" ] }, "post": { "description": "Create an API key for the current user.\n\nThe raw key is returned only in this response and cannot be retrieved again.\nRequires a signed-in session: a request that presents an API key gets 403.", "operationId": "create_my_api_key_auth_api_keys__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiKeyCreateRequest" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiKeyCreateResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] } ], "summary": "Create My Api Key", "tags": [ "Auth" ] } }, "/auth/api-keys/{key_id}": { "delete": { "description": "Revoke (soft-delete) one of the current user's API keys.", "operationId": "revoke_my_api_key_auth_api_keys__key_id__delete", "parameters": [ { "in": "path", "name": "key_id", "required": true, "schema": { "format": "uuid", "title": "Key Id", "type": "string" } } ], "responses": { "204": { "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Revoke My Api Key", "tags": [ "Auth" ] } }, "/auth/change-password/": { "post": { "description": "Change the current user's password (requires current password).", "operationId": "change_password_auth_change_password__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ChangePasswordRequest" } } }, "required": true }, "responses": { "204": { "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Change Password", "tags": [ "Auth" ] } }, "/auth/config/": { "get": { "description": "Return public auth configuration (no authentication required).", "operationId": "config_auth_config__get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ConfigResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Config", "tags": [ "Auth" ] } }, "/auth/download-token/{dataset_id}": { "post": { "description": "Mint a short-lived download-scoped JWT for a single dataset.\n\nThe COG download URL path requires a\n``typ='download'`` JWT on the ``?token=`` query parameter \u2014 session JWTs\nare rejected. This endpoint issues that token after verifying the caller\nhas read access to the dataset.\n\nAnonymous callers are allowed for public datasets. The returned token has\n``typ='download'``, ``scope='dataset:{dataset_id}'``, and a TTL of 120s.", "operationId": "create_download_token_endpoint_auth_download_token__dataset_id__post", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DownloadTokenResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Create Download Token Endpoint", "tags": [ "Auth" ] } }, "/auth/login": { "post": { "description": "Authenticate with username and password, receive a JWT token.\n\nGH-1302: a caller sending ``X-GeoLens-Auth-Mode: cookie`` receives the\nrefresh token as an httpOnly cookie and a null ``refresh_token`` in the\nbody. Without that header the response is unchanged, which is what keeps\nthe CLI, the generated SDKs, Postman, and CI logins working.", "operationId": "login_auth_login_post", "parameters": [ { "description": "Browser session-transport negotiation. Send `cookie` to carry the refresh token in an httpOnly `geolens_refresh` cookie, paired with a script-readable `geolens_csrf` cookie, and receive a null `refresh_token` in the response body. When the header is absent (the default) the refresh token is returned in the response body, which is the contract every non-browser caller uses.", "in": "header", "name": "X-GeoLens-Auth-Mode", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Browser session-transport negotiation. Send `cookie` to carry the refresh token in an httpOnly `geolens_refresh` cookie, paired with a script-readable `geolens_csrf` cookie, and receive a null `refresh_token` in the response body. When the header is absent (the default) the refresh token is returned in the response body, which is the contract every non-browser caller uses.", "title": "X-Geolens-Auth-Mode" } } ], "requestBody": { "content": { "application/x-www-form-urlencoded": { "schema": { "$ref": "#/components/schemas/Body_login_auth_login_post" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TokenResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Login", "tags": [ "Auth" ] } }, "/auth/logout/": { "post": { "description": "Revoke all refresh tokens and bump token_version for the current user.\n\nLogout invalidates the access JWT used for this call and all other active\nbrowser sessions.\n\nAPI keys remain valid because they are independent of browser sessions.\nPassword and role changes still revoke them.\n\nA refresh cookie can authenticate logout after the access token expires.\nCookie-authenticated requests require CSRF validation.", "operationId": "logout_auth_logout__post", "parameters": [ { "description": "Double-submit CSRF token, enforced only when the refresh cookie is what authenticates the call. Echo the value of the `geolens_csrf` cookie issued alongside the refresh cookie. Callers presenting a refresh token in the request body do not send it.", "in": "header", "name": "X-CSRF-Token", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Double-submit CSRF token, enforced only when the refresh cookie is what authenticates the call. Echo the value of the `geolens_csrf` cookie issued alongside the refresh cookie. Callers presenting a refresh token in the request body do not send it.", "title": "X-Csrf-Token" } } ], "requestBody": { "content": { "application/json": { "schema": { "anyOf": [ { "$ref": "#/components/schemas/RefreshRequest" }, { "type": "null" } ], "title": "Body" } } } }, "responses": { "204": { "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Logout", "tags": [ "Auth" ] } }, "/auth/logout/session/": { "post": { "description": "Revoke only the presented session's refresh-token family.\n\nOther devices and API keys survive. Access JWTs remain usable until their\nnormal expiry; /logout/ still immediately revokes every access and refresh\nsession. A valid signed access JWT with sid, a refresh body token, or a\nrefresh cookie authorizes this operation. Legacy JWTs without sid must use\nthe refresh credential. Cookie authorization requires double-submit CSRF.\n\nBearer/body revocation does not change cookies, allowing a captured old\nsession to be discarded safely after a newer login. Cookie authorization\nclears the browser's refresh and CSRF cookies.", "operationId": "logout_current_session_auth_logout_session__post", "parameters": [ { "in": "header", "name": "authorization", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Authorization" } }, { "description": "Double-submit CSRF token, enforced only when the refresh cookie is what authenticates the call. Echo the value of the `geolens_csrf` cookie issued alongside the refresh cookie. Callers presenting a refresh token in the request body do not send it.", "in": "header", "name": "X-CSRF-Token", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Double-submit CSRF token, enforced only when the refresh cookie is what authenticates the call. Echo the value of the `geolens_csrf` cookie issued alongside the refresh cookie. Callers presenting a refresh token in the request body do not send it.", "title": "X-Csrf-Token" } } ], "requestBody": { "content": { "application/json": { "schema": { "anyOf": [ { "$ref": "#/components/schemas/RefreshRequest" }, { "type": "null" } ], "title": "Body" } } } }, "responses": { "204": { "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Logout Current Session", "tags": [ "Auth" ] } }, "/auth/me/": { "get": { "description": "Return the currently authenticated user's profile and roles.", "operationId": "me_auth_me__get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Me", "tags": [ "Auth" ] } }, "/auth/me/permissions/": { "get": { "description": "Return the effective permissions for the currently authenticated user.", "operationId": "me_permissions_auth_me_permissions__get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PermissionsResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Me Permissions", "tags": [ "Auth" ] } }, "/auth/me/usage/": { "get": { "description": "Return the authenticated user's own storage and dataset quota usage.", "operationId": "me_usage_auth_me_usage__get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserQuotaUsage" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Me Usage", "tags": [ "Auth" ] } }, "/auth/oauth/exchange/": { "post": { "description": "Exchange a single sign-on code for a browser session.\n\nWhen the SPA shares the API's origin, an OAuth or SAML callback redirects\nwith a one-time code in the URL fragment instead of setting the refresh\ncookie. The sign-in page posts that code here, and the response sets the\nhttpOnly refresh cookie and its CSRF cookie the way ``/auth/login`` does\nin cookie mode, with a null ``refresh_token`` in the body.\n\nA code is valid once, for two minutes, only from the browser the\ncallback redirected, and only with the nonce the page started the sign-in\nwith. Every refusal is the same 401.", "operationId": "exchange_sign_in_code_auth_oauth_exchange__post", "parameters": [ { "description": "Must be `cookie`: this call only establishes a browser cookie session.", "in": "header", "name": "X-GeoLens-Auth-Mode", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Must be `cookie`: this call only establishes a browser cookie session.", "title": "X-Geolens-Auth-Mode" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SsoExchangeRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TokenResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Exchange Sign In Code", "tags": [ "Auth" ] } }, "/auth/oauth/providers/": { "get": { "description": "Return the list of enabled OAuth providers for the login page.", "operationId": "list_public_providers_auth_oauth_providers__get", "responses": { "200": { "content": { "application/json": { "schema": { "items": { "$ref": "#/components/schemas/OAuthProviderPublic" }, "title": "Response List Public Providers Auth Oauth Providers Get", "type": "array" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "List Public Providers", "tags": [ "Auth" ] } }, "/auth/oauth/{provider_slug}/callback": { "get": { "description": "Handle IdP callback: exchange code, find/create user, redirect to frontend.\n\nThe frontend redirect carries a one-time sign-in code, or on a\ncross-origin deployment the tokens, in the URL fragment. Without\nexplicit-config resolution, an attacker controlling ``X-Forwarded-Host``\ncould steer the post-callback redirect to attacker.com and capture them.\nForce explicit-config resolution by passing ``for_external_use=True``.", "operationId": "oauth_callback_auth_oauth__provider_slug__callback_get", "parameters": [ { "in": "path", "name": "provider_slug", "required": true, "schema": { "title": "Provider Slug", "type": "string" } } ], "responses": { "200": { "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Oauth Callback", "tags": [ "Auth" ] } }, "/auth/oauth/{provider_slug}/login": { "get": { "description": "Redirect user to the IdP authorization URL with PKCE parameters.\n\nThe redirect_uri is handed to the IdP, where an\nattacker-controlled origin (via ``X-Forwarded-Host``) would otherwise\nenable auth-code theft. We force explicit-config resolution by\npassing ``for_external_use=True``; falling back to the request-origin\nis refused.", "operationId": "oauth_login_auth_oauth__provider_slug__login_get", "parameters": [ { "in": "path", "name": "provider_slug", "required": true, "schema": { "title": "Provider Slug", "type": "string" } }, { "description": "A random 256-bit value, base64url without padding, that the page starting this sign-in keeps. The callback hands it back, and the page completes only a sign-in carrying its own value.", "in": "query", "name": "nonce", "required": true, "schema": { "description": "A random 256-bit value, base64url without padding, that the page starting this sign-in keeps. The callback hands it back, and the page completes only a sign-in carrying its own value.", "pattern": "^[A-Za-z0-9_-]{43}$", "title": "Nonce", "type": "string" } } ], "responses": { "307": { "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Oauth Login", "tags": [ "Auth" ] } }, "/auth/refresh/": { "post": { "description": "Exchange a valid refresh token for a new access + refresh token pair.\n\nMulti-tenant clients must call this endpoint on their tenant host. Refresh\ntokens are opaque and carry no bearer ``tid`` claim, so tenant middleware\nbinds the database transaction from that same-origin host before the user\nrow is resolved and the next tenant-bound access token is minted.\n\nGH-1302: with ``X-GeoLens-Auth-Mode: cookie`` the presented token is read\nfrom the httpOnly cookie (falling back to the body once, so a session\nestablished before the cookie flow shipped migrates on its next refresh\ninstead of being logged out), the double-submit CSRF token is enforced, and\nthe rotated token goes back out as a cookie with a null body\n``refresh_token``. Without the header this endpoint behaves exactly as\nbefore.", "operationId": "refresh_auth_refresh__post", "parameters": [ { "description": "Browser session-transport negotiation. Send `cookie` to carry the refresh token in an httpOnly `geolens_refresh` cookie, paired with a script-readable `geolens_csrf` cookie, and receive a null `refresh_token` in the response body. When the header is absent (the default) the refresh token is returned in the response body, which is the contract every non-browser caller uses.", "in": "header", "name": "X-GeoLens-Auth-Mode", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Browser session-transport negotiation. Send `cookie` to carry the refresh token in an httpOnly `geolens_refresh` cookie, paired with a script-readable `geolens_csrf` cookie, and receive a null `refresh_token` in the response body. When the header is absent (the default) the refresh token is returned in the response body, which is the contract every non-browser caller uses.", "title": "X-Geolens-Auth-Mode" } }, { "description": "Double-submit CSRF token, enforced only when the refresh cookie is what authenticates the call. Echo the value of the `geolens_csrf` cookie issued alongside the refresh cookie. Callers presenting a refresh token in the request body do not send it.", "in": "header", "name": "X-CSRF-Token", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Double-submit CSRF token, enforced only when the refresh cookie is what authenticates the call. Echo the value of the `geolens_csrf` cookie issued alongside the refresh cookie. Callers presenting a refresh token in the request body do not send it.", "title": "X-Csrf-Token" } } ], "requestBody": { "content": { "application/json": { "schema": { "anyOf": [ { "$ref": "#/components/schemas/RefreshRequest" }, { "type": "null" } ], "title": "Body" } } } }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TokenResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Refresh", "tags": [ "Auth" ] } }, "/auth/register/": { "post": { "description": "Create a password account.\n\nNeeds both self-registration and password login enabled; otherwise 403.\nWhen the allowed email domains list is set, an email address in one of\nthose domains is required.\n\nIf email verification is required, the request includes an email address\nand the server has SMTP configured, the account activates when its owner\nfollows the emailed link and gets the default self-registration role.\nOtherwise it stays pending until an administrator approves it with a role.\nThe response is the same whether or not the username or email was taken.", "operationId": "register_auth_register__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserCreate" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RegisterResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "502": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad gateway \u2014 an upstream provider failed" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Register", "tags": [ "Auth" ] } }, "/auth/resend-verification/": { "post": { "description": "Re-issue and re-send a verification email.\n\nEnumeration-safe: ALWAYS returns the same 200 body\nregardless of whether the email exists, is unknown, or is already verified.\nSend errors are logged server-side only and never branch the HTTP response.", "operationId": "resend_verification_auth_resend_verification__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ResendVerificationRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RegisterResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Resend Verification", "tags": [ "Auth" ] } }, "/auth/verify-email/": { "post": { "description": "Redeem a verification token to activate the account.\n\nA valid single-use expiring token flips email_verified=True,\nis_active=True, and status=\"active\" so the user can log in via the\nexisting auth gate in dependencies.py.\n\nExpired, unknown, and already-consumed tokens all return the same\n\"Invalid or expired\" error (enumeration-safe).", "operationId": "verify_email_auth_verify_email__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VerifyEmailRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RegisterResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Verify Email", "tags": [ "Auth" ] } }, "/catalog/collections/": { "get": { "description": "List all collections with dataset_count and extent computed per-user.", "operationId": "list_collections_endpoint_catalog_collections__get", "parameters": [ { "in": "query", "name": "skip", "required": false, "schema": { "default": 0, "minimum": 0, "title": "Skip", "type": "integer" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CollectionListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List Collections Endpoint", "tags": [ "Datasets" ] }, "post": { "description": "Create a new collection.", "operationId": "create_collection_endpoint_catalog_collections__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CollectionCreate" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CollectionResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Create Collection Endpoint", "tags": [ "Datasets" ] } }, "/catalog/collections/{collection_id}": { "delete": { "description": "Delete a collection. Owner or admin only.", "operationId": "delete_collection_endpoint_catalog_collections__collection_id__delete", "parameters": [ { "in": "path", "name": "collection_id", "required": true, "schema": { "format": "uuid", "title": "Collection Id", "type": "string" } } ], "responses": { "204": { "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Delete Collection Endpoint", "tags": [ "Datasets" ] }, "get": { "description": "Get a single collection with dataset_count and extent.", "operationId": "get_collection_endpoint_catalog_collections__collection_id__get", "parameters": [ { "in": "path", "name": "collection_id", "required": true, "schema": { "format": "uuid", "title": "Collection Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CollectionResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Collection Endpoint", "tags": [ "Datasets" ] }, "patch": { "description": "Update a collection's name and/or description. Owner or admin only.", "operationId": "update_collection_endpoint_catalog_collections__collection_id__patch", "parameters": [ { "in": "path", "name": "collection_id", "required": true, "schema": { "format": "uuid", "title": "Collection Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CollectionUpdate" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CollectionResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Update Collection Endpoint", "tags": [ "Datasets" ] } }, "/catalog/collections/{collection_id}/datasets/": { "get": { "description": "Get datasets in a collection with RBAC filtering.", "operationId": "get_collection_datasets_endpoint_catalog_collections__collection_id__datasets__get", "parameters": [ { "in": "path", "name": "collection_id", "required": true, "schema": { "format": "uuid", "title": "Collection Id", "type": "string" } }, { "in": "query", "name": "skip", "required": false, "schema": { "default": 0, "minimum": 0, "title": "Skip", "type": "integer" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DatasetListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Collection Datasets Endpoint", "tags": [ "Datasets" ] }, "post": { "description": "Add datasets to a collection. Collection owner or admin only.", "operationId": "add_datasets_endpoint_catalog_collections__collection_id__datasets__post", "parameters": [ { "in": "path", "name": "collection_id", "required": true, "schema": { "format": "uuid", "title": "Collection Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CollectionAddDatasetsRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AddDatasetsResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Add Datasets Endpoint", "tags": [ "Datasets" ] } }, "/catalog/collections/{collection_id}/datasets/{dataset_id}": { "delete": { "description": "Remove a dataset from a collection. Collection owner or admin only.", "operationId": "remove_dataset_endpoint_catalog_collections__collection_id__datasets__dataset_id__delete", "parameters": [ { "in": "path", "name": "collection_id", "required": true, "schema": { "format": "uuid", "title": "Collection Id", "type": "string" } }, { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "responses": { "204": { "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Remove Dataset Endpoint", "tags": [ "Datasets" ] } }, "/collections": { "get": { "description": "List available OGC collections (catalog + per-dataset feature collections).", "operationId": "list_collections_collections_get", "parameters": [ { "description": "Pagination offset for per-dataset collections", "in": "query", "name": "offset", "required": false, "schema": { "default": 0, "description": "Pagination offset for per-dataset collections", "minimum": 0, "title": "Offset", "type": "integer" } }, { "description": "Max per-dataset collections to return", "in": "query", "name": "limit", "required": false, "schema": { "default": 50, "description": "Max per-dataset collections to return", "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OGCCollectionsResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List Collections", "tags": [ "OGC Features" ] } }, "/collections/datasets": { "get": { "description": "Get metadata for the datasets collection.", "operationId": "get_collection_metadata_collections_datasets_get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OGCCollectionMetadataResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Collection Metadata", "tags": [ "OGC Features" ] } }, "/collections/datasets/items": { "get": { "description": "OGC API Records items endpoint -- mirrors /search/datasets.", "operationId": "collection_items_collections_datasets_items_get", "parameters": [ { "description": "Public OGC resource types as repeated or comma-separated values (for example, type=dataset,collection)", "explode": false, "in": "query", "name": "type", "required": false, "schema": { "description": "Public OGC resource types as repeated or comma-separated values (for example, type=dataset,collection)", "items": { "type": "string" }, "title": "Type", "type": "array" }, "style": "form" }, { "description": "Record IDs as repeated or comma-separated UUID values", "explode": false, "in": "query", "name": "ids", "required": false, "schema": { "description": "Record IDs as repeated or comma-separated UUID values", "items": { "type": "string" }, "title": "Ids", "type": "array" }, "style": "form" }, { "description": "Source-system resource identifiers as repeated or comma-separated values", "explode": false, "in": "query", "name": "externalIds", "required": false, "schema": { "description": "Source-system resource identifiers as repeated or comma-separated values", "items": { "type": "string" }, "title": "Externalids", "type": "array" }, "style": "form" }, { "description": "OGC sortby: +field or -field", "in": "query", "name": "sortby", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "OGC sortby: +field or -field", "title": "Sortby" } }, { "deprecated": true, "description": "Deprecated singular compatibility alias for externalIds (matches a dataset UUID)", "in": "query", "name": "externalId", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "deprecated": true, "description": "Deprecated singular compatibility alias for externalIds (matches a dataset UUID)", "title": "Externalid" } }, { "in": "query", "name": "q", "required": false, "schema": { "anyOf": [ { "maxLength": 1000, "type": "string" }, { "type": "null" } ], "title": "Q" } }, { "in": "query", "name": "bbox", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Bbox" } }, { "in": "query", "name": "geometry_type", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Geometry Type" } }, { "in": "query", "name": "srid", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Srid" } }, { "in": "query", "name": "source_organization", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Source Organization" } }, { "in": "query", "name": "record_type", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Record Type" } }, { "in": "query", "name": "date_from", "required": false, "schema": { "anyOf": [ { "format": "date", "type": "string" }, { "type": "null" } ], "title": "Date From" } }, { "in": "query", "name": "date_to", "required": false, "schema": { "anyOf": [ { "format": "date", "type": "string" }, { "type": "null" } ], "title": "Date To" } }, { "in": "query", "name": "vintage_start", "required": false, "schema": { "anyOf": [ { "format": "date", "type": "string" }, { "type": "null" } ], "title": "Vintage Start" } }, { "in": "query", "name": "vintage_end", "required": false, "schema": { "anyOf": [ { "format": "date", "type": "string" }, { "type": "null" } ], "title": "Vintage End" } }, { "in": "query", "name": "sort_by", "required": false, "schema": { "default": "relevance", "title": "Sort By", "type": "string" } }, { "in": "query", "name": "sort_desc", "required": false, "schema": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Sort Desc" } }, { "in": "query", "name": "offset", "required": false, "schema": { "default": 0, "minimum": 0, "title": "Offset", "type": "integer" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 10, "minimum": 1, "title": "Limit", "type": "integer" } }, { "in": "query", "name": "filter", "required": false, "schema": { "anyOf": [ { "maxLength": 10000, "type": "string" }, { "type": "null" } ], "title": "Filter" } }, { "in": "query", "name": "datetime", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Datetime" } }, { "in": "query", "name": "exclude_synthetic", "required": false, "schema": { "default": true, "title": "Exclude Synthetic", "type": "boolean" } }, { "in": "query", "name": "spatial_predicate", "required": false, "schema": { "default": "intersects", "enum": [ "intersects", "within" ], "title": "Spatial Predicate", "type": "string" } }, { "in": "query", "name": "geometry", "required": false, "schema": { "anyOf": [ { "maxLength": 50000, "type": "string" }, { "type": "null" } ], "title": "Geometry" } }, { "in": "query", "name": "collection_id", "required": false, "schema": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "title": "Collection Id" } }, { "description": "Filter by keywords", "in": "query", "name": "keywords", "required": false, "schema": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "description": "Filter by keywords", "title": "Keywords" } }, { "description": "Filter language: cql2-text or cql2-json", "in": "query", "name": "filter-lang", "required": false, "schema": { "default": "cql2-text", "description": "Filter language: cql2-text or cql2-json", "title": "Filter-Lang", "type": "string" } } ], "responses": { "200": { "content": { "application/geo+json": { "schema": { "$ref": "#/components/schemas/OGCFeatureCollectionResponse" } }, "application/json": { "schema": {} } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Collection Items", "tags": [ "OGC Features" ] } }, "/collections/datasets/items/{record_id}": { "get": { "description": "Get a single dataset as an OGC Record Feature.", "operationId": "get_collection_item_collections_datasets_items__record_id__get", "parameters": [ { "in": "path", "name": "record_id", "required": true, "schema": { "format": "uuid", "title": "Record Id", "type": "string" } } ], "responses": { "200": { "content": { "application/geo+json": { "schema": { "$ref": "#/components/schemas/OGCRecordResponse" } }, "application/json": { "schema": {} } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Collection Item", "tags": [ "OGC Features" ] } }, "/collections/datasets/queryables": { "get": { "description": "Queryable properties for the datasets collection (OGC API Features Part 3).", "operationId": "get_queryables_collections_datasets_queryables_get", "responses": { "200": { "content": { "application/json": { "schema": {} } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Get Queryables", "tags": [ "OGC Features" ] } }, "/collections/datasets/schema": { "get": { "description": "JSON Schema describing a catalog record (OGC API Common Part 3).", "operationId": "get_record_schema_collections_datasets_schema_get", "responses": { "200": { "content": { "application/json": { "schema": {} } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Get Record Schema", "tags": [ "OGC Features" ] } }, "/collections/datasets/sortables": { "get": { "description": "Sortable properties for the datasets collection (OGC API Records).", "operationId": "get_sortables_collections_datasets_sortables_get", "responses": { "200": { "content": { "application/json": { "schema": {} } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Get Sortables", "tags": [ "OGC Features" ] } }, "/collections/{dataset_id}": { "get": { "description": "Per-dataset OGC collection metadata with extent, CRS, and items link.", "operationId": "get_dataset_collection_collections__dataset_id__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "query", "name": "f", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "F" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OGCCollectionMetadata" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Dataset Collection", "tags": [ "OGC Features" ] } }, "/collections/{dataset_id}/items": { "get": { "description": "OGC API Features items endpoint -- returns GeoJSON FeatureCollection for a dataset.\n\nNote: ``datetime`` is accepted per OGC API Features Core but acts as a\nno-op for per-dataset feature queries. Per-dataset feature tables contain\nuser-uploaded data with no standard temporal column, so the spec provision\n\"if the collection does not include temporal information, the datetime\nparameter SHALL be ignored\" applies (OGC 17-069r4 \u00a77.15.5).", "operationId": "get_collection_items_collections__dataset_id__items_get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "description": "Page size for bulk GeoJSON export. The maximum is an admin-configurable ceiling (default 1000; Network settings tab, `ogc_items_max_page_size`) rather than the 200 used by offset-paged list endpoints, because this route pages via the constant-time `after_gid` keyset cursor. Per OGC API Features Core /req/core/fc-limit-response-1(C) a value above the ceiling is clamped to it, not rejected.", "in": "query", "name": "limit", "required": false, "schema": { "default": 10, "description": "Page size for bulk GeoJSON export. The maximum is an admin-configurable ceiling (default 1000; Network settings tab, `ogc_items_max_page_size`) rather than the 200 used by offset-paged list endpoints, because this route pages via the constant-time `after_gid` keyset cursor. Per OGC API Features Core /req/core/fc-limit-response-1(C) a value above the ceiling is clamped to it, not rejected.", "minimum": 1, "title": "Limit", "type": "integer" } }, { "description": "Legacy offset-based pagination. Prefer `after_gid` keyset cursor (via the `next` link) \u2014 offset is retained for backward compatibility but is O(N) at high values.", "in": "query", "name": "offset", "required": false, "schema": { "default": 0, "description": "Legacy offset-based pagination. Prefer `after_gid` keyset cursor (via the `next` link) \u2014 offset is retained for backward compatibility but is O(N) at high values.", "minimum": 0, "title": "Offset", "type": "integer" } }, { "description": "Keyset cursor: returns features with gid > after_gid. The preferred pagination path; use the rel=next link for follow-up pages.", "in": "query", "name": "after_gid", "required": false, "schema": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ], "description": "Keyset cursor: returns features with gid > after_gid. The preferred pagination path; use the rel=next link for follow-up pages.", "title": "After Gid" } }, { "description": "Bounding box: minx,miny,maxx,maxy", "in": "query", "name": "bbox", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Bounding box: minx,miny,maxx,maxy", "title": "Bbox" } }, { "description": "OGC datetime interval: instant, start/end, ../end, start/..", "in": "query", "name": "datetime", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "OGC datetime interval: instant, start/end, ../end, start/..", "title": "Datetime" } }, { "in": "query", "name": "f", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "F" } }, { "description": "Include geometry in response. Set to false for attribute-only queries.", "in": "query", "name": "include_geometry", "required": false, "schema": { "default": true, "description": "Include geometry in response. Set to false for attribute-only queries.", "title": "Include Geometry", "type": "boolean" } }, { "description": "CQL2 filter expression evaluated server-side against this collection's OGC Features Part 3 queryables document. Combines with bbox and property filters by AND.", "in": "query", "name": "filter", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "CQL2 filter expression evaluated server-side against this collection's OGC Features Part 3 queryables document. Combines with bbox and property filters by AND.", "title": "Filter" } }, { "description": "Filter language: cql2-text (default) or cql2-json.", "in": "query", "name": "filter-lang", "required": false, "schema": { "default": "cql2-text", "description": "Filter language: cql2-text (default) or cql2-json.", "title": "Filter-Lang", "type": "string" } }, { "description": "CRS of filter geometries. Only CRS84 (http://www.opengis.net/def/crs/OGC/1.3/CRS84) is supported.", "in": "query", "name": "filter-crs", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "CRS of filter geometries. Only CRS84 (http://www.opengis.net/def/crs/OGC/1.3/CRS84) is supported.", "title": "Filter-Crs" } } ], "responses": { "200": { "content": { "application/geo+json": { "schema": { "description": "FeatureCollection response as defined by OGC API - Features.", "properties": { "type": { "const": "FeatureCollection", "default": "FeatureCollection", "description": "GeoJSON object type.", "title": "Type", "type": "string" }, "timeStamp": { "description": "ISO 8601 timestamp the response was generated.", "title": "Timestamp", "type": "string" }, "numberMatched": { "description": "Total number of features matching the query (across all pages).", "title": "Numbermatched", "type": "integer" }, "numberReturned": { "description": "Number of features in this response page.", "title": "Numberreturned", "type": "integer" }, "features": { "description": "GeoJSON features returned by the query.", "items": { "additionalProperties": true, "type": "object" }, "title": "Features", "type": "array" }, "links": { "description": "Pagination and self-reference links.", "items": { "properties": { "href": { "description": "Target URL of the link.", "title": "Href", "type": "string" }, "rel": { "description": "Link relation type per RFC 8288 (e.g. 'self', 'next', 'prev', 'data', 'collection').", "title": "Rel", "type": "string" }, "type": { "description": "Media type of the linked resource (e.g. 'application/json', 'application/geo+json').", "title": "Type", "type": "string" }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Optional human-readable label for the link.", "title": "Title" } }, "required": [ "href", "rel", "type" ], "title": "OGCLink", "type": "object" }, "title": "Links", "type": "array" } }, "required": [ "numberMatched", "numberReturned", "features", "links" ], "title": "OGCFeatureItemsResponse", "type": "object" } }, "application/json": { "schema": {} } }, "description": "Successful Response" }, "202": { "content": { "application/json": { "schema": { "properties": { "status": { "type": "string" }, "job_id": { "type": "string" } }, "type": "object" } } }, "description": "Dataset table is cold and being rehydrated (multi-tenant); poll the job and retry." }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request. Either a query parameter is invalid, or the `filter` was refused. A CQL2 filter is refused when it names a queryable this collection does not publish, or uses an operator this server does not implement; when it is longer than 10,000 characters; when it nests deeper than the parser will walk; or when it expands to more than 1,000 bound parameters. The last two are resource bounds rather than syntax errors, so the filter can be valid CQL2 and still be declined: an `IN` list reaches the parameter ceiling well before the character limit, since `render_postcompile` expands it to one parameter per member. Both are answered deterministically, so a client that splits the filter and pages the results gets the same rows." }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Collection Items", "tags": [ "OGC Features" ] } }, "/collections/{dataset_id}/items/{feature_id}": { "get": { "description": "OGC API Features single feature endpoint -- returns a GeoJSON Feature.", "operationId": "get_collection_item_feature_collections__dataset_id__items__feature_id__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "path", "name": "feature_id", "required": true, "schema": { "title": "Feature Id", "type": "integer" } }, { "in": "query", "name": "f", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "F" } } ], "responses": { "200": { "content": { "application/geo+json": { "schema": { "description": "Single GeoJSON Feature response.", "properties": { "type": { "const": "Feature", "default": "Feature", "description": "GeoJSON object type.", "title": "Type", "type": "string" }, "id": { "description": "Feature identifier within the collection.", "title": "Id", "type": "integer" }, "geometry": { "anyOf": [ { "description": "A GeoJSON geometry object (RFC 7946).", "properties": { "type": { "enum": [ "Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon" ], "title": "Type", "type": "string" }, "coordinates": { "items": {}, "title": "Coordinates", "type": "array" } }, "required": [ "type", "coordinates" ], "title": "GeoJSONGeometry", "type": "object" }, { "type": "null" } ], "description": "GeoJSON geometry of the feature, or null for geometry-less features." }, "properties": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Feature attributes as a JSON object.", "title": "Properties" }, "links": { "default": [], "description": "Self-reference and related-resource links.", "items": { "properties": { "href": { "description": "Target URL of the link.", "title": "Href", "type": "string" }, "rel": { "description": "Link relation type per RFC 8288 (e.g. 'self', 'next', 'prev', 'data', 'collection').", "title": "Rel", "type": "string" }, "type": { "description": "Media type of the linked resource (e.g. 'application/json', 'application/geo+json').", "title": "Type", "type": "string" }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Optional human-readable label for the link.", "title": "Title" } }, "required": [ "href", "rel", "type" ], "title": "OGCLink", "type": "object" }, "title": "Links", "type": "array" } }, "required": [ "id", "geometry", "properties" ], "title": "OGCSingleFeatureResponse", "type": "object" } }, "application/json": { "schema": {} } }, "description": "Successful Response" }, "202": { "content": { "application/json": { "schema": { "properties": { "status": { "type": "string" }, "job_id": { "type": "string" } }, "type": "object" } } }, "description": "Dataset table is cold and being rehydrated (multi-tenant); poll the job and retry." }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Collection Item Feature", "tags": [ "OGC Features" ] } }, "/collections/{dataset_id}/queryables": { "get": { "description": "Queryable properties for one feature collection (OGC Features Part 3).\n\nDerived from the live table schema rather than the stored column_info\nsnapshot, so the advertised set always matches what `filter=`\non /items validates against. `additionalProperties: false` is what makes\nrejecting filters on unlisted properties spec-conformant.", "operationId": "get_collection_queryables_collections__dataset_id__queryables_get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "query", "name": "f", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "F" } } ], "responses": { "200": { "content": { "application/json": { "schema": {} } }, "description": "Successful Response" }, "202": { "content": { "application/json": { "schema": { "properties": { "status": { "type": "string" }, "job_id": { "type": "string" } }, "type": "object" } } }, "description": "Dataset table is cold and being rehydrated (multi-tenant); poll the job and retry." }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Collection Queryables", "tags": [ "OGC Features" ] } }, "/config-ops/dry-run/": { "post": { "description": "Preview what an import would change without applying any modifications.", "operationId": "dry_run_configuration_config_ops_dry_run__post", "parameters": [ { "in": "query", "name": "mode", "required": false, "schema": { "default": "merge", "enum": [ "merge", "overwrite" ], "title": "Mode", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ConfigImportRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DryRunResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Dry Run Configuration", "tags": [ "Config Ops" ] } }, "/config-ops/export/": { "get": { "description": "Export full configuration as JSON (settings + OAuth providers, secrets redacted).\n\nReturns a downloadable JSON payload with Content-Disposition header. This is a\nfile-download endpoint \u2014 the previous ``response_model=ConfigExportResponse``\nwas silently ignored because the handler returns a raw JSONResponse with custom\nheaders. Using ``response_class=JSONResponse`` is the correct way to\ndocument a download endpoint in OpenAPI.", "operationId": "export_configuration_config_ops_export__get", "responses": { "200": { "content": { "application/json": { "schema": {} } }, "description": "Downloadable configuration JSON with Content-Disposition attachment header." }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Export Configuration", "tags": [ "Config Ops" ] } }, "/config-ops/import/": { "post": { "description": "Import configuration in merge or overwrite mode.\n\nMerge mode: updates existing settings and OAuth providers, adds new ones.\nOverwrite mode: replaces all settings and OAuth providers.", "operationId": "import_configuration_config_ops_import__post", "parameters": [ { "in": "query", "name": "mode", "required": false, "schema": { "default": "merge", "enum": [ "merge", "overwrite" ], "title": "Mode", "type": "string" } }, { "description": "Signed token returned by the matching dry-run. Required for overwrite mode and for a merge that would delete the stored embeddings.", "in": "header", "name": "X-Config-Preview-Token", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Signed token returned by the matching dry-run. Required for overwrite mode and for a merge that would delete the stored embeddings.", "title": "X-Config-Preview-Token" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ConfigImportRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ImportResult" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the configuration could not be applied" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Import Configuration", "tags": [ "Config Ops" ] } }, "/config-ops/validate/": { "post": { "description": "Validate storage, cache, credential handoff, and enabled OIDC providers.\n\nReturns pass/fail with latency and error details for each service.", "operationId": "validate_configuration_config_ops_validate__post", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ConnectivityResult" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Validate Configuration", "tags": [ "Config Ops" ] } }, "/conformance": { "get": { "description": "OGC conformance declaration -- lists supported specification classes.", "operationId": "conformance_conformance_get", "parameters": [ { "in": "query", "name": "f", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "F" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ConformanceResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" } }, "summary": "Conformance", "tags": [ "OGC Features" ] } }, "/datasets/": { "get": { "description": "List datasets with visibility filtering and pagination.", "operationId": "list_all_datasets_datasets__get", "parameters": [ { "in": "query", "name": "skip", "required": false, "schema": { "default": 0, "minimum": 0, "title": "Skip", "type": "integer" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DatasetListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List All Datasets", "tags": [ "Datasets" ] } }, "/datasets/bulk-delete/": { "post": { "description": "Delete multiple datasets in one request. Returns per-item results.", "operationId": "bulk_delete_datasets_endpoint_datasets_bulk_delete__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BulkDeleteRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BulkDeleteResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Bulk Delete Datasets Endpoint", "tags": [ "Datasets" ] } }, "/datasets/create/": { "post": { "description": "Create an empty dataset with user-defined columns.\n\nCreates a PostGIS table in the data schema and a catalog record.", "operationId": "create_empty_dataset_endpoint_datasets_create__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateEmptyDatasetRequest" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DatasetResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Create Empty Dataset Endpoint", "tags": [ "Datasets" ] } }, "/datasets/dcat-us/3.0/": { "get": { "description": "DCAT-US Schema v3.0 catalog feed. Respects dataset visibility.", "operationId": "get_dcat_us3_catalog_datasets_dcat_us_3_0__get", "parameters": [ { "description": "Max datasets in this page (default = max).", "in": "query", "name": "limit", "required": false, "schema": { "default": 10000, "description": "Max datasets in this page (default = max).", "maximum": 10000, "minimum": 1, "title": "Limit", "type": "integer" } }, { "description": "Datasets to skip \u2014 page a catalog larger than one page.", "in": "query", "name": "offset", "required": false, "schema": { "default": 0, "description": "Datasets to skip \u2014 page a catalog larger than one page.", "minimum": 0, "title": "Offset", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": {} } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 required publication metadata is missing" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Dcat Us3 Catalog", "tags": [ "Datasets - Export" ] } }, "/datasets/dcat-us/3.0/validation/": { "get": { "description": "Validate the visible DCAT-US Schema v3.0 catalog feed.", "operationId": "validate_dcat_us3_catalog_datasets_dcat_us_3_0_validation__get", "responses": { "200": { "content": { "application/json": { "schema": {} } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Validate Dcat Us3 Catalog", "tags": [ "Datasets - Export" ] } }, "/datasets/dcat/": { "get": { "description": "DCAT 3 JSON-LD catalog feed. Respects dataset visibility.", "operationId": "get_dcat_catalog_datasets_dcat__get", "parameters": [ { "description": "Max datasets in this page (default = max).", "in": "query", "name": "limit", "required": false, "schema": { "default": 10000, "description": "Max datasets in this page (default = max).", "maximum": 10000, "minimum": 1, "title": "Limit", "type": "integer" } }, { "description": "Datasets to skip \u2014 page a catalog larger than one page.", "in": "query", "name": "offset", "required": false, "schema": { "default": 0, "description": "Datasets to skip \u2014 page a catalog larger than one page.", "minimum": 0, "title": "Offset", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": {} } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Dcat Catalog", "tags": [ "Datasets - Export" ] } }, "/datasets/dcat/validation/": { "get": { "description": "Validate the visible W3C DCAT 3 catalog feed.", "operationId": "validate_dcat3_catalog_datasets_dcat_validation__get", "responses": { "200": { "content": { "application/json": { "schema": {} } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Validate Dcat3 Catalog", "tags": [ "Datasets - Export" ] } }, "/datasets/geodcat-ap/": { "get": { "description": "GeoDCAT-AP 2.0.0 catalog feed. Respects dataset visibility.", "operationId": "get_geodcat_ap_catalog_datasets_geodcat_ap__get", "parameters": [ { "description": "Max datasets in this page (default = max).", "in": "query", "name": "limit", "required": false, "schema": { "default": 10000, "description": "Max datasets in this page (default = max).", "maximum": 10000, "minimum": 1, "title": "Limit", "type": "integer" } }, { "description": "Datasets to skip \u2014 page a catalog larger than one page.", "in": "query", "name": "offset", "required": false, "schema": { "default": 0, "description": "Datasets to skip \u2014 page a catalog larger than one page.", "minimum": 0, "title": "Offset", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": {} } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Geodcat Ap Catalog", "tags": [ "Datasets - Export" ] } }, "/datasets/geodcat-ap/validation/": { "get": { "description": "Validate the visible GeoDCAT-AP 2.0.0 catalog feed.", "operationId": "validate_geodcat_ap_catalog_datasets_geodcat_ap_validation__get", "responses": { "200": { "content": { "application/json": { "schema": {} } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Validate Geodcat Ap Catalog", "tags": [ "Datasets - Export" ] } }, "/datasets/relationships/{relationship_id}/": { "delete": { "description": "Delete a FK relationship. Editor+ required.", "operationId": "delete_dataset_relationship_datasets_relationships__relationship_id___delete", "parameters": [ { "in": "path", "name": "relationship_id", "required": true, "schema": { "format": "uuid", "title": "Relationship Id", "type": "string" } } ], "responses": { "204": { "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Delete Dataset Relationship", "tags": [ "Datasets - Metadata" ] } }, "/datasets/{dataset_id}": { "delete": { "description": "Delete a dataset with cascade cleanup. Owner or admin only, requires confirm_title.", "operationId": "delete_dataset_endpoint_datasets__dataset_id__delete", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DatasetDeleteRequest" } } }, "required": true }, "responses": { "204": { "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Delete Dataset Endpoint", "tags": [ "Datasets" ] }, "get": { "description": "Get a single dataset by ID with visibility check.", "operationId": "get_single_dataset_datasets__dataset_id__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DatasetResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Single Dataset", "tags": [ "Datasets" ] }, "patch": { "description": "Update user-editable dataset metadata.", "operationId": "update_dataset_metadata_datasets__dataset_id__patch", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DatasetMeta" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DatasetResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Update Dataset Metadata", "tags": [ "Datasets" ] } }, "/datasets/{dataset_id}/analysis/materialize/": { "post": { "description": "Materialize an analysis result as a new private dataset (async job).\n\nRequires the ``upload`` and ``export`` permissions (this endpoint\ncreates a dataset that carries the source's attributes) and read\nvisibility on the source dataset; the new dataset is owned by the\ncaller and counted against their dataset quota (the atomic slot\nreservation runs at registration inside the worker). Poll\n``GET /jobs/{job_id}`` for progress.", "operationId": "analysis_materialize_endpoint_datasets__dataset_id__analysis_materialize__post", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AnalysisMaterializeRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AnalysisMaterializeResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Analysis Materialize Endpoint", "tags": [ "Datasets - Analysis" ] } }, "/datasets/{dataset_id}/analysis/preview/": { "post": { "description": "Run a parameterized PostGIS operation and return a GeoJSON preview.\n\nSynchronous, read-only, and capped: results are for on-map preview, not\npersistence \u2014 use the materialize endpoint to save output as a dataset.", "operationId": "analysis_preview_endpoint_datasets__dataset_id__analysis_preview__post", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AnalysisPreviewRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AnalysisPreviewResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Analysis Preview Endpoint", "tags": [ "Datasets - Analysis" ] } }, "/datasets/{dataset_id}/attributes/": { "get": { "description": "List all attribute metadata for a dataset.", "operationId": "list_attributes_endpoint_datasets__dataset_id__attributes__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "query", "name": "include_removed", "required": false, "schema": { "default": false, "title": "Include Removed", "type": "boolean" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AttributeMetadataListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List Attributes Endpoint", "tags": [ "Datasets - Metadata" ] } }, "/datasets/{dataset_id}/attributes/{attribute_id}/": { "get": { "description": "Get a single attribute metadata entry.", "operationId": "get_attribute_endpoint_datasets__dataset_id__attributes__attribute_id___get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "path", "name": "attribute_id", "required": true, "schema": { "format": "uuid", "title": "Attribute Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AttributeMetadataResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Attribute Endpoint", "tags": [ "Datasets - Metadata" ] }, "patch": { "description": "Update user-editable attribute metadata fields.", "operationId": "update_attribute_endpoint_datasets__dataset_id__attributes__attribute_id___patch", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "path", "name": "attribute_id", "required": true, "schema": { "format": "uuid", "title": "Attribute Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AttributeMetadataUpdate" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AttributeMetadataResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Update Attribute Endpoint", "tags": [ "Datasets - Metadata" ] } }, "/datasets/{dataset_id}/attributes/{attribute_id}/reset/": { "post": { "description": "Reset attribute metadata to auto-populated values, clearing user_modified_fields.", "operationId": "reset_attribute_endpoint_datasets__dataset_id__attributes__attribute_id__reset__post", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "path", "name": "attribute_id", "required": true, "schema": { "format": "uuid", "title": "Attribute Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AttributeMetadataResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Reset Attribute Endpoint", "tags": [ "Datasets - Metadata" ] } }, "/datasets/{dataset_id}/columns/{column_name}/stats/": { "get": { "description": "Get statistics for a numeric dataset column (for graduated styling).", "operationId": "get_column_stats_endpoint_datasets__dataset_id__columns__column_name__stats__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "path", "name": "column_name", "required": true, "schema": { "title": "Column Name", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ColumnStatsResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Column Stats Endpoint", "tags": [ "Datasets - Metadata" ] } }, "/datasets/{dataset_id}/columns/{column_name}/values/": { "get": { "description": "Get distinct values for a dataset column (for categorical styling).", "operationId": "get_column_values_datasets__dataset_id__columns__column_name__values__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "path", "name": "column_name", "required": true, "schema": { "title": "Column Name", "type": "string" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 100, "maximum": 500, "minimum": 1, "title": "Limit", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ColumnValuesResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Column Values", "tags": [ "Datasets - Metadata" ] } }, "/datasets/{dataset_id}/copc/{attempt_id}/{name}.copc.laz": { "get": { "description": "Serve a published COPC point cloud's file, whole or by HTTP byte range.\n\nPoint a client at the dataset's ``pointcloud.url``. The path names the\nupload attempt, so a replaced file gets a new URL and the old one answers\n404. Header credentials (``X-Api-Key`` or ``Authorization``) or the\n``api_key`` query parameter authenticate the read, and any caller who can\nview the dataset can read the file. The response carries a strong ETag and\nhonours ``Range``, ``If-Range``, ``If-Match`` and ``If-None-Match``; a\nmalformed byte range, or one naming no byte of the file, answers 416.\nEach client may make 1200 reads a minute. A read of one byte range of up\nto 16 MiB also draws its size on a budget of 1 GiB a minute, in 64 KiB\nunits; any other read of the file, such as one without ``Range``, counts\nagainst a limit of 10 a minute instead. Past any of these the read answers\n429.\nA page on any origin can read a public file without credentials. Through\nthe bundled web server it can also send header credentials; the API alone\naccepts those only from the origins in ``CORS_ALLOWED_ORIGINS``. A\nprivate, missing or replaced point cloud answers 404, and a storage\nfailure answers 502.", "operationId": "get_pointcloud_file_datasets__dataset_id__copc__attempt_id___name__copc_laz_get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "path", "name": "attempt_id", "required": true, "schema": { "format": "uuid", "title": "Attempt Id", "type": "string" } }, { "in": "path", "name": "name", "required": true, "schema": { "title": "Name", "type": "string" } } ], "responses": { "200": { "content": { "application/vnd.laszip+copc": { "schema": { "format": "binary", "type": "string" } } }, "description": "The whole COPC file" }, "206": { "content": { "application/vnd.laszip+copc": { "schema": { "format": "binary", "type": "string" } } }, "description": "One byte range of the COPC file" }, "304": { "description": "The caller already holds this version of the file" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "A credential was supplied and could not be resolved (expired, revoked or malformed); a read with none is anonymous" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "412": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Precondition failed \u2014 the caller's If-Match no longer matches the current representation" }, "416": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "The Range names no byte of the file, or is malformed" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "502": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad gateway \u2014 an upstream provider failed" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Pointcloud File", "tags": [ "Datasets" ] } }, "/datasets/{dataset_id}/dcat-us/3.0/": { "get": { "description": "DCAT-US Schema v3.0 JSON-LD for a single dataset.", "operationId": "get_dcat_us3_record_datasets__dataset_id__dcat_us_3_0__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": {} } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 required publication metadata is missing" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Dcat Us3 Record", "tags": [ "Datasets - Export" ] } }, "/datasets/{dataset_id}/dcat-us/3.0/validation/": { "get": { "description": "Validate a single dataset as DCAT-US Schema v3.0.", "operationId": "validate_dcat_us3_record_datasets__dataset_id__dcat_us_3_0_validation__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": {} } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Validate Dcat Us3 Record", "tags": [ "Datasets - Export" ] } }, "/datasets/{dataset_id}/dcat/": { "get": { "description": "DCAT 3 JSON-LD for a single dataset.", "operationId": "get_dcat_record_datasets__dataset_id__dcat__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": {} } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Dcat Record", "tags": [ "Datasets - Export" ] } }, "/datasets/{dataset_id}/dcat/validation/": { "get": { "description": "Validate a single dataset as W3C DCAT 3.", "operationId": "validate_dcat3_record_datasets__dataset_id__dcat_validation__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": {} } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Validate Dcat3 Record", "tags": [ "Datasets - Export" ] } }, "/datasets/{dataset_id}/download/cog": { "get": { "description": "Download the Cloud-Optimized GeoTIFF for a raster dataset.\n\nOn S3 storage with presigned downloads enabled, answers 302 to a\nshort-lived presigned URL (at most 5 minutes, and never past the expiry of\na ``?token=`` download token); otherwise streams the object with\nContent-Type image/tiff. Even then, a GET carrying If-Match, or a resume\nwhose If-Range no longer matches, is streamed. A COG imported by reference\nredirects to its origin.\nAccepts standard auth or ?token= JWT query parameter for browser downloads.\n\n``user`` may be None when a no-sub anonymous\ndownload token (issued by POST /auth/download-token/{id} for a public\ndataset) is presented on ``?token=``. The function branches on\nuser-None to enforce public visibility and emit the audit row with\nuser_id=NULL.", "operationId": "download_cog_datasets__dataset_id__download_cog_get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "responses": { "200": { "content": { "image/tiff": { "schema": { "format": "binary", "type": "string" } } }, "description": "The whole COG file" }, "206": { "content": { "image/tiff": { "schema": { "format": "binary", "type": "string" } } }, "description": "One byte range of the COG file" }, "302": { "description": "Redirect to the COG's object-storage or remote URL" }, "304": { "description": "The caller already holds this version of the file" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "412": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Precondition failed \u2014 the caller's If-Match no longer matches the current representation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Download Cog", "tags": [ "Datasets - Export" ] } }, "/datasets/{dataset_id}/export": { "get": { "description": "Export a dataset as a downloadable file.\n\nSupports GeoPackage, GeoJSON, Shapefile (zipped), CSV, GeoParquet,\nFlatGeobuf, and PMTiles formats. Optional CRS reprojection, spatial\nfiltering, and attribute filtering. GeoParquet is always emitted in\nEPSG:4326 (OGC:CRS84). PMTiles renders zooms 0..N where N is extent-budgeted (ceiling 14).", "operationId": "export_dataset_endpoint_datasets__dataset_id__export_get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "description": "Export format", "in": "query", "name": "format", "required": false, "schema": { "$ref": "#/components/schemas/ExportFormat", "default": "gpkg", "description": "Export format" } }, { "description": "Target CRS, e.g. EPSG:3857", "in": "query", "name": "target_crs", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Target CRS, e.g. EPSG:3857", "title": "Target Crs" } }, { "description": "Bounding box: minx,miny,maxx,maxy (WGS84)", "in": "query", "name": "bbox", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Bounding box: minx,miny,maxx,maxy (WGS84)", "title": "Bbox" } }, { "description": "Attribute filter expression, e.g. pop > 1000", "in": "query", "name": "where", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Attribute filter expression, e.g. pop > 1000", "title": "Where" } } ], "responses": { "200": { "content": { "application/geopackage+sqlite3": { "schema": { "format": "binary", "type": "string" } }, "application/vnd.apache.parquet": { "schema": { "format": "binary", "type": "string" } }, "application/vnd.flatgeobuf": { "schema": { "format": "binary", "type": "string" } }, "application/vnd.pmtiles": { "schema": { "format": "binary", "type": "string" } }, "application/zip": { "schema": { "format": "binary", "type": "string" } }, "text/csv": { "schema": { "format": "binary", "type": "string" } } }, "description": "The exported file" }, "206": { "content": { "application/geopackage+sqlite3": { "schema": { "format": "binary", "type": "string" } }, "application/vnd.apache.parquet": { "schema": { "format": "binary", "type": "string" } }, "application/vnd.flatgeobuf": { "schema": { "format": "binary", "type": "string" } }, "application/vnd.pmtiles": { "schema": { "format": "binary", "type": "string" } }, "application/zip": { "schema": { "format": "binary", "type": "string" } }, "text/csv": { "schema": { "format": "binary", "type": "string" } } }, "description": "One byte range of the exported file" }, "304": { "description": "The caller already holds this version of the file" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "412": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Precondition failed \u2014 the caller's If-Match no longer matches the current representation" }, "413": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Payload too large" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Export Dataset Endpoint", "tags": [ "Datasets" ] } }, "/datasets/{dataset_id}/features.geojson": { "get": { "description": "Return up to 5,000 features as RFC 7946 GeoJSON with Z coordinates.\n\n``X-Embed-Token`` authorizes private datasets in the token's scope through\nthe same capability check used for tile requests.\n\nAnonymous callers can read public, published datasets. Private or\nrestricted datasets return 404 unless user or embed credentials authorize\naccess.\n\nSupplied credentials that are expired or revoked receive 401 so clients can\nrefresh them. Requests without credentials use the anonymous access path.", "operationId": "get_features_geojson_z_endpoint_datasets__dataset_id__features_geojson_get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "description": "Optional embed token. Datasets in the token's scope are authorized even without user credentials (embed viewers).", "in": "header", "name": "X-Embed-Token", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Optional embed token. Datasets in the token's scope are authorized even without user credentials (embed viewers).", "title": "X-Embed-Token" } } ], "responses": { "200": { "content": { "application/geo+json": { "schema": { "properties": { "type": { "enum": [ "FeatureCollection" ], "type": "string" }, "features": { "items": { "properties": { "type": { "enum": [ "Feature" ], "type": "string" }, "id": { "type": "integer" }, "geometry": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ] }, "properties": { "type": "object", "additionalProperties": true } }, "required": [ "type", "id", "geometry", "properties" ], "type": "object" }, "type": "array" }, "truncated": { "type": "boolean" }, "total_count": { "type": "integer" } }, "required": [ "type", "features", "truncated", "total_count" ], "type": "object" } }, "application/json": { "schema": {} } }, "description": "A GeoJSON FeatureCollection with Z coordinates preserved." }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset. Neither is sending an unresolvable credential alongside a valid X-Embed-Token that authorizes the request on its own. That request is served and the unrelated credential is ignored." }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Features Geojson Z Endpoint", "tags": [ "Features" ] } }, "/datasets/{dataset_id}/features/": { "get": { "description": "Get paginated GeoJSON features for a dataset.\n\nOffset pagination can skip or duplicate rows during concurrent writes,\nthough feature ids remain stable because rows are ordered by the primary\nkey. Clients that need stable\ncursoring should use the OGC API Features endpoint, which supports keyset\npagination via ``after_gid``.", "operationId": "list_features_datasets__dataset_id__features__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 10, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer" } }, { "description": "Legacy offset-based pagination. The companion limit is capped at 200 per page, and a high offset is costly to serve.", "in": "query", "name": "offset", "required": false, "schema": { "default": 0, "description": "Legacy offset-based pagination. The companion limit is capped at 200 per page, and a high offset is costly to serve.", "minimum": 0, "title": "Offset", "type": "integer" } }, { "description": "Bounding box: minx,miny,maxx,maxy", "in": "query", "name": "bbox", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Bounding box: minx,miny,maxx,maxy", "title": "Bbox" } }, { "description": "Include geometry in response", "in": "query", "name": "include_geometry", "required": false, "schema": { "default": true, "description": "Include geometry in response", "title": "Include Geometry", "type": "boolean" } } ], "responses": { "200": { "content": { "application/geo+json": { "schema": { "description": "A GeoJSON FeatureCollection with OGC API Features pagination fields.", "properties": { "type": { "const": "FeatureCollection", "default": "FeatureCollection", "title": "Type", "type": "string" }, "numberMatched": { "title": "Numbermatched", "type": "integer" }, "numberReturned": { "title": "Numberreturned", "type": "integer" }, "features": { "items": { "description": "A single GeoJSON Feature.", "properties": { "type": { "const": "Feature", "default": "Feature", "title": "Type", "type": "string" }, "id": { "title": "Id", "type": "integer" }, "geometry": { "anyOf": [ { "description": "A GeoJSON GeometryCollection (RFC 7946 \u00a73.1.8).\n\nGeometry collections carry ``geometries`` instead of ``coordinates``.\nOnly generic-geometry datasets accept them on write.\n\nNested collections are rejected because PostGIS cannot round-trip them\nthrough the GeoJSON boundary.", "properties": { "type": { "const": "GeometryCollection", "title": "Type", "type": "string" }, "geometries": { "items": { "description": "A GeoJSON geometry object (RFC 7946).", "properties": { "type": { "enum": [ "Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon" ], "title": "Type", "type": "string" }, "coordinates": { "items": {}, "title": "Coordinates", "type": "array" } }, "required": [ "type", "coordinates" ], "title": "GeoJSONGeometry", "type": "object" }, "title": "Geometries", "type": "array" } }, "required": [ "type", "geometries" ], "title": "GeoJSONGeometryCollection", "type": "object" }, { "description": "A GeoJSON geometry object (RFC 7946).", "properties": { "type": { "enum": [ "Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon" ], "title": "Type", "type": "string" }, "coordinates": { "items": {}, "title": "Coordinates", "type": "array" } }, "required": [ "type", "coordinates" ], "title": "GeoJSONGeometry", "type": "object" }, { "type": "null" } ], "title": "Geometry" }, "properties": { "type": "object", "additionalProperties": true, "title": "Properties" } }, "required": [ "id", "properties" ], "title": "GeoJSONFeature", "type": "object" }, "title": "Features", "type": "array" }, "links": { "items": { "properties": { "rel": { "title": "Rel", "type": "string" }, "href": { "title": "Href", "type": "string" }, "type": { "title": "Type", "type": "string" } }, "required": [ "rel", "href", "type" ], "title": "Link", "type": "object" }, "title": "Links", "type": "array" } }, "required": [ "numberMatched", "numberReturned", "features", "links" ], "title": "GeoJSONFeatureCollection", "type": "object" } }, "application/json": { "schema": {} } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List Features", "tags": [ "Features" ] }, "post": { "description": "Insert a new GeoJSON feature into a dataset.\n\nSend the same `Idempotency-Key` on every attempt to create one feature, and\n`Idempotency-Attempt` numbering the attempts 1, 2, 3 and so on. A repeat\nfrom the same user on the same dataset never inserts a second feature. It\nanswers with the feature as stored, with the same 201 status and body\nshape. If its attempt number is higher than any applied so far, it first\napplies its geometry and the properties it names to that feature, with the\nvalidation a create gets, unless anyone else has written the feature since\nthe last attempt was applied: then it is refused with 409, the stored\nfeature in `detail.feature`, and nothing is overwritten. If it is equal or\nlower, the stored feature comes back unchanged, so a request that arrives\nlate cannot undo a later one. Two requests with one key never both insert. A key is honored for 24 hours. If\nthe feature it created has been deleted since, or the dataset's data has\nbeen replaced by a reupload or an overwrite, the repeat is refused with 409\nrather than creating another. Without the key every request inserts, and\nan attempt number sent without one is ignored.", "operationId": "create_feature_datasets__dataset_id__features__post", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "description": "Optional key that makes a retried create safe. Letters, digits and `._:-`, up to 128 characters.", "in": "header", "name": "Idempotency-Key", "required": false, "schema": { "description": "Optional key that makes a retried create safe. Letters, digits and `._:-`, up to 128 characters.", "maxLength": 128, "minLength": 1, "pattern": "^[A-Za-z0-9._:-]+$", "title": "Idempotency-Key", "type": "string" } }, { "description": "Attempt number sent with `Idempotency-Key`, counting up by one each time the body is sent again. Counts as 1 when omitted.", "in": "header", "name": "Idempotency-Attempt", "required": false, "schema": { "description": "Attempt number sent with `Idempotency-Key`, counting up by one each time the body is sent again. Counts as 1 when omitted.", "maximum": 2147483647, "minimum": 1, "title": "Idempotency-Attempt", "type": "integer" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FeatureCreate" } } }, "required": true }, "responses": { "201": { "content": { "application/geo+json": { "schema": { "description": "A written GeoJSON Feature, plus the dataset's committed tile version.", "properties": { "type": { "const": "Feature", "default": "Feature", "title": "Type", "type": "string" }, "id": { "title": "Id", "type": "integer" }, "geometry": { "anyOf": [ { "description": "A GeoJSON GeometryCollection (RFC 7946 \u00a73.1.8).\n\nGeometry collections carry ``geometries`` instead of ``coordinates``.\nOnly generic-geometry datasets accept them on write.\n\nNested collections are rejected because PostGIS cannot round-trip them\nthrough the GeoJSON boundary.", "properties": { "type": { "const": "GeometryCollection", "title": "Type", "type": "string" }, "geometries": { "items": { "description": "A GeoJSON geometry object (RFC 7946).", "properties": { "type": { "enum": [ "Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon" ], "title": "Type", "type": "string" }, "coordinates": { "items": {}, "title": "Coordinates", "type": "array" } }, "required": [ "type", "coordinates" ], "title": "GeoJSONGeometry", "type": "object" }, "title": "Geometries", "type": "array" } }, "required": [ "type", "geometries" ], "title": "GeoJSONGeometryCollection", "type": "object" }, { "description": "A GeoJSON geometry object (RFC 7946).", "properties": { "type": { "enum": [ "Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon" ], "title": "Type", "type": "string" }, "coordinates": { "items": {}, "title": "Coordinates", "type": "array" } }, "required": [ "type", "coordinates" ], "title": "GeoJSONGeometry", "type": "object" }, { "type": "null" } ], "title": "Geometry" }, "properties": { "type": "object", "additionalProperties": true, "title": "Properties" }, "table_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Opaque id of the data table this feature was read from or written to. A reupload or an overwrite of the dataset's data replaces the table, and the replacement can reuse feature ids. Send it back as the `table_id` query parameter of a PUT, PATCH or DELETE of this feature to have the write refused if the table was replaced since.", "title": "Table Id" }, "tile_cache_version": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "The dataset's tile_cache_version after this write committed. Send it as the tile routes' `_v` query parameter when reloading tiles, so a request that reaches a different API worker is forced to re-read the dataset instead of serving that worker's own cached snapshot.", "title": "Tile Cache Version" } }, "required": [ "id", "properties" ], "title": "GeoJSONFeature", "type": "object" } }, "application/json": { "schema": {} } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Create Feature", "tags": [ "Features" ] } }, "/datasets/{dataset_id}/features/{gid}": { "delete": { "description": "Delete a feature by gid (hard delete).\n\nThe X-GeoLens-Tile-Cache-Version response header carries the dataset's\ntile_cache_version after the delete committed; a 204 response has no\nbody to carry it in, unlike the create, replace and patch endpoints,\nwhich return it as a field of the written feature.", "operationId": "delete_single_feature_datasets__dataset_id__features__gid__delete", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "path", "name": "gid", "required": true, "schema": { "title": "Gid", "type": "integer" } }, { "description": "The `table_id` the feature was read with. If the dataset's data has been replaced since, the request is refused with 409 and code `dataset_replaced`, and nothing is written.", "in": "query", "name": "table_id", "required": false, "schema": { "description": "The `table_id` the feature was read with. If the dataset's data has been replaced since, the request is refused with 409 and code `dataset_replaced`, and nothing is written.", "maxLength": 20, "minLength": 1, "title": "Table Id", "type": "string" } } ], "responses": { "204": { "description": "Feature deleted.", "headers": { "X-GeoLens-Tile-Cache-Version": { "description": "The dataset's tile_cache_version after this write committed. Send it as the tile routes' `_v` query parameter when reloading tiles, so a request that reaches a different API worker is forced to re-read the dataset instead of serving that worker's own cached snapshot.", "schema": { "type": "integer" } } } }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Delete Single Feature", "tags": [ "Features" ] }, "get": { "description": "Get a single GeoJSON feature by gid.\n\n`table_id` identifies the data table the feature was read from. Send it\nwith a later PUT, PATCH or DELETE of the feature so that write is refused\nif the dataset's data has been replaced in between.", "operationId": "get_single_feature_datasets__dataset_id__features__gid__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "path", "name": "gid", "required": true, "schema": { "title": "Gid", "type": "integer" } } ], "responses": { "200": { "content": { "application/geo+json": { "schema": { "description": "A GeoJSON Feature, plus the id of the table it was read from.", "properties": { "type": { "const": "Feature", "default": "Feature", "title": "Type", "type": "string" }, "id": { "title": "Id", "type": "integer" }, "geometry": { "anyOf": [ { "description": "A GeoJSON GeometryCollection (RFC 7946 \u00a73.1.8).\n\nGeometry collections carry ``geometries`` instead of ``coordinates``.\nOnly generic-geometry datasets accept them on write.\n\nNested collections are rejected because PostGIS cannot round-trip them\nthrough the GeoJSON boundary.", "properties": { "type": { "const": "GeometryCollection", "title": "Type", "type": "string" }, "geometries": { "items": { "description": "A GeoJSON geometry object (RFC 7946).", "properties": { "type": { "enum": [ "Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon" ], "title": "Type", "type": "string" }, "coordinates": { "items": {}, "title": "Coordinates", "type": "array" } }, "required": [ "type", "coordinates" ], "title": "GeoJSONGeometry", "type": "object" }, "title": "Geometries", "type": "array" } }, "required": [ "type", "geometries" ], "title": "GeoJSONGeometryCollection", "type": "object" }, { "description": "A GeoJSON geometry object (RFC 7946).", "properties": { "type": { "enum": [ "Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon" ], "title": "Type", "type": "string" }, "coordinates": { "items": {}, "title": "Coordinates", "type": "array" } }, "required": [ "type", "coordinates" ], "title": "GeoJSONGeometry", "type": "object" }, { "type": "null" } ], "title": "Geometry" }, "properties": { "type": "object", "additionalProperties": true, "title": "Properties" }, "table_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Opaque id of the data table this feature was read from or written to. A reupload or an overwrite of the dataset's data replaces the table, and the replacement can reuse feature ids. Send it back as the `table_id` query parameter of a PUT, PATCH or DELETE of this feature to have the write refused if the table was replaced since.", "title": "Table Id" } }, "required": [ "id", "properties" ], "title": "GeoJSONFeature", "type": "object" } }, "application/json": { "schema": {} } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Single Feature", "tags": [ "Features" ] }, "patch": { "description": "Partial update of a feature (PATCH semantics).", "operationId": "patch_single_feature_datasets__dataset_id__features__gid__patch", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "path", "name": "gid", "required": true, "schema": { "title": "Gid", "type": "integer" } }, { "description": "The `table_id` the feature was read with. If the dataset's data has been replaced since, the request is refused with 409 and code `dataset_replaced`, and nothing is written.", "in": "query", "name": "table_id", "required": false, "schema": { "description": "The `table_id` the feature was read with. If the dataset's data has been replaced since, the request is refused with 409 and code `dataset_replaced`, and nothing is written.", "maxLength": 20, "minLength": 1, "title": "Table Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FeatureUpdate" } } }, "required": true }, "responses": { "200": { "content": { "application/geo+json": { "schema": { "description": "A written GeoJSON Feature, plus the dataset's committed tile version.", "properties": { "type": { "const": "Feature", "default": "Feature", "title": "Type", "type": "string" }, "id": { "title": "Id", "type": "integer" }, "geometry": { "anyOf": [ { "description": "A GeoJSON GeometryCollection (RFC 7946 \u00a73.1.8).\n\nGeometry collections carry ``geometries`` instead of ``coordinates``.\nOnly generic-geometry datasets accept them on write.\n\nNested collections are rejected because PostGIS cannot round-trip them\nthrough the GeoJSON boundary.", "properties": { "type": { "const": "GeometryCollection", "title": "Type", "type": "string" }, "geometries": { "items": { "description": "A GeoJSON geometry object (RFC 7946).", "properties": { "type": { "enum": [ "Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon" ], "title": "Type", "type": "string" }, "coordinates": { "items": {}, "title": "Coordinates", "type": "array" } }, "required": [ "type", "coordinates" ], "title": "GeoJSONGeometry", "type": "object" }, "title": "Geometries", "type": "array" } }, "required": [ "type", "geometries" ], "title": "GeoJSONGeometryCollection", "type": "object" }, { "description": "A GeoJSON geometry object (RFC 7946).", "properties": { "type": { "enum": [ "Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon" ], "title": "Type", "type": "string" }, "coordinates": { "items": {}, "title": "Coordinates", "type": "array" } }, "required": [ "type", "coordinates" ], "title": "GeoJSONGeometry", "type": "object" }, { "type": "null" } ], "title": "Geometry" }, "properties": { "type": "object", "additionalProperties": true, "title": "Properties" }, "table_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Opaque id of the data table this feature was read from or written to. A reupload or an overwrite of the dataset's data replaces the table, and the replacement can reuse feature ids. Send it back as the `table_id` query parameter of a PUT, PATCH or DELETE of this feature to have the write refused if the table was replaced since.", "title": "Table Id" }, "tile_cache_version": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "The dataset's tile_cache_version after this write committed. Send it as the tile routes' `_v` query parameter when reloading tiles, so a request that reaches a different API worker is forced to re-read the dataset instead of serving that worker's own cached snapshot.", "title": "Tile Cache Version" } }, "required": [ "id", "properties" ], "title": "GeoJSONFeature", "type": "object" } }, "application/json": { "schema": {} } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Patch Single Feature", "tags": [ "Features" ] }, "put": { "description": "Full replacement of a feature (PUT semantics).", "operationId": "replace_single_feature_datasets__dataset_id__features__gid__put", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "path", "name": "gid", "required": true, "schema": { "title": "Gid", "type": "integer" } }, { "description": "The `table_id` the feature was read with. If the dataset's data has been replaced since, the request is refused with 409 and code `dataset_replaced`, and nothing is written.", "in": "query", "name": "table_id", "required": false, "schema": { "description": "The `table_id` the feature was read with. If the dataset's data has been replaced since, the request is refused with 409 and code `dataset_replaced`, and nothing is written.", "maxLength": 20, "minLength": 1, "title": "Table Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FeatureReplace" } } }, "required": true }, "responses": { "200": { "content": { "application/geo+json": { "schema": { "description": "A written GeoJSON Feature, plus the dataset's committed tile version.", "properties": { "type": { "const": "Feature", "default": "Feature", "title": "Type", "type": "string" }, "id": { "title": "Id", "type": "integer" }, "geometry": { "anyOf": [ { "description": "A GeoJSON GeometryCollection (RFC 7946 \u00a73.1.8).\n\nGeometry collections carry ``geometries`` instead of ``coordinates``.\nOnly generic-geometry datasets accept them on write.\n\nNested collections are rejected because PostGIS cannot round-trip them\nthrough the GeoJSON boundary.", "properties": { "type": { "const": "GeometryCollection", "title": "Type", "type": "string" }, "geometries": { "items": { "description": "A GeoJSON geometry object (RFC 7946).", "properties": { "type": { "enum": [ "Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon" ], "title": "Type", "type": "string" }, "coordinates": { "items": {}, "title": "Coordinates", "type": "array" } }, "required": [ "type", "coordinates" ], "title": "GeoJSONGeometry", "type": "object" }, "title": "Geometries", "type": "array" } }, "required": [ "type", "geometries" ], "title": "GeoJSONGeometryCollection", "type": "object" }, { "description": "A GeoJSON geometry object (RFC 7946).", "properties": { "type": { "enum": [ "Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon" ], "title": "Type", "type": "string" }, "coordinates": { "items": {}, "title": "Coordinates", "type": "array" } }, "required": [ "type", "coordinates" ], "title": "GeoJSONGeometry", "type": "object" }, { "type": "null" } ], "title": "Geometry" }, "properties": { "type": "object", "additionalProperties": true, "title": "Properties" }, "table_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Opaque id of the data table this feature was read from or written to. A reupload or an overwrite of the dataset's data replaces the table, and the replacement can reuse feature ids. Send it back as the `table_id` query parameter of a PUT, PATCH or DELETE of this feature to have the write refused if the table was replaced since.", "title": "Table Id" }, "tile_cache_version": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "The dataset's tile_cache_version after this write committed. Send it as the tile routes' `_v` query parameter when reloading tiles, so a request that reaches a different API worker is forced to re-read the dataset instead of serving that worker's own cached snapshot.", "title": "Tile Cache Version" } }, "required": [ "id", "properties" ], "title": "GeoJSONFeature", "type": "object" } }, "application/json": { "schema": {} } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Replace Single Feature", "tags": [ "Features" ] } }, "/datasets/{dataset_id}/features/{gid}/related/{relationship_id}/": { "get": { "description": "Get related records for a feature via FK relationship.", "operationId": "get_feature_related_records_datasets__dataset_id__features__gid__related__relationship_id___get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "path", "name": "gid", "required": true, "schema": { "title": "Gid", "type": "integer" } }, { "in": "path", "name": "relationship_id", "required": true, "schema": { "format": "uuid", "title": "Relationship Id", "type": "string" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 50, "maximum": 500, "minimum": 1, "title": "Limit", "type": "integer" } }, { "in": "query", "name": "after", "required": false, "schema": { "default": 0, "minimum": 0, "title": "After", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DatasetRowsResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Feature Related Records", "tags": [ "Datasets - Metadata" ] } }, "/datasets/{dataset_id}/geodcat-ap/": { "get": { "description": "GeoDCAT-AP 2.0.0 JSON-LD for a single dataset.", "operationId": "get_geodcat_ap_record_datasets__dataset_id__geodcat_ap__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": {} } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Geodcat Ap Record", "tags": [ "Datasets - Export" ] } }, "/datasets/{dataset_id}/geodcat-ap/validation/": { "get": { "description": "Validate a single dataset as GeoDCAT-AP 2.0.0.", "operationId": "validate_geodcat_ap_record_datasets__dataset_id__geodcat_ap_validation__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": {} } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Validate Geodcat Ap Record", "tags": [ "Datasets - Export" ] } }, "/datasets/{dataset_id}/history": { "get": { "description": "Get audit log history for a specific dataset.", "operationId": "get_dataset_history_datasets__dataset_id__history_get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "query", "name": "skip", "required": false, "schema": { "default": 0, "minimum": 0, "title": "Skip", "type": "integer" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AuditLogListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Dataset History", "tags": [ "Datasets" ] } }, "/datasets/{dataset_id}/maps/": { "get": { "description": "Return maps that contain this dataset, filtered by caller's RBAC visibility.", "operationId": "dataset_maps_datasets__dataset_id__maps__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "query", "name": "skip", "required": false, "schema": { "default": 0, "minimum": 0, "title": "Skip", "type": "integer" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MapListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Dataset Maps", "tags": [ "Datasets - Data" ] } }, "/datasets/{dataset_id}/previous-version": { "delete": { "description": "Delete the dataset's previous version, so it can no longer be restored.\n\nRefuses with 404 ``no_previous_version`` when there is none, 409\n``previous_version_changed`` when it is not ``expected_version_number``,\n409 ``previous_version_in_use`` while a view or foreign key elsewhere\nreads its table, and 409 ``dataset_busy`` while a refresh, replacement or\nrestore is active.", "operationId": "delete_previous_version_datasets__dataset_id__previous_version_delete", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "description": "The previous version the caller confirmed deleting", "in": "query", "name": "expected_version_number", "required": true, "schema": { "description": "The previous version the caller confirmed deleting", "title": "Expected Version Number", "type": "integer" } } ], "responses": { "204": { "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Delete Previous Version", "tags": [ "Datasets - Refresh" ] } }, "/datasets/{dataset_id}/previous-version/restore": { "post": { "description": "Publish the dataset's previous version as its live data again.\n\nThe previous version is the data the last replacement or restore\nreplaced. The restore runs as a job and a refresh run with origin kind\n``restore``, and publishes a new version that names the restored one in\n``restored_from_version``. The data it replaces, including any feature\nedits made since, becomes the previous version in turn. Scheduled\nrefreshes of the dataset are held afterwards.\n\nRefuses with 422 ``restore_not_applicable`` for a dataset without a\nfeature table, 404 ``no_previous_version`` when there is none, 409\n``previous_version_changed`` when it is not ``expected_version_number``,\nand 409 ``dataset_busy`` while another refresh, replacement or restore is\nactive.", "operationId": "restore_previous_version_datasets__dataset_id__previous_version_restore_post", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RestorePreviousVersionRequest" } } }, "required": true }, "responses": { "202": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RestorePreviousVersionResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Restore Previous Version", "tags": [ "Datasets - Refresh" ] } }, "/datasets/{dataset_id}/quicklook": { "get": { "description": "Serve a quicklook PNG image for a dataset.", "operationId": "get_quicklook_datasets__dataset_id__quicklook_get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "description": "Quicklook size in pixels (256 or 512)", "in": "query", "name": "size", "required": false, "schema": { "default": 256, "description": "Quicklook size in pixels (256 or 512)", "maximum": 512, "minimum": 1, "title": "Size", "type": "integer" } }, { "description": "The record's `quicklook_version`; it only keys caches and does not change the response.", "in": "query", "name": "v", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The record's `quicklook_version`; it only keys caches and does not change the response.", "title": "V" } } ], "responses": { "200": { "content": { "image/png": { "schema": { "format": "binary", "type": "string" } } }, "description": "The quicklook image" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Quicklook", "tags": [ "Datasets" ] } }, "/datasets/{dataset_id}/refresh": { "post": { "description": "Re-pull this dataset's data from the origin it was imported from.\n\nOne request, no source pointer, no layer selection. The dataset keeps\nserving its current data throughout: the worker loads into an\nattempt-scoped staging table and swaps only once the new data is\ncomplete, so a refresh that fails leaves the live table and its freshness\nexactly as they were.\n\nDifferent origin kinds use different execution strategies. A dataset\nregistered from an existing PostGIS table serves directly from its origin,\nso refresh re-measures the\nlive relation \u2014 recounting features, recomputing the extent, rebuilding\nthe column schema snapshot and statistics. A dataset imported from a STAC\nitem points to an external COG, so its\nrefresh re-reads the item document and follows the asset if the publisher\nmoved it. Admission, the run row and the history they write are identical\nacross all three.\n\nRefuses with 409 ``dataset_busy`` while another refresh or re-upload is\nactive for this dataset. A partial unique index prevents simultaneous\nrequests from both being admitted.\n\n``accept_blocked_run_id`` accepts a blocked run once. A blocked service\nrefresh is fetched again and publishes only if the result matches the run\nit accepts. A blocked service re-upload is fetched again from the dataset's\nsource and publishes only if its review reasons and changes match; it\nanswers 409 ``origin_changed`` once that source is not the one the\nre-upload fetched. A blocked file replacement (an ``upload`` run) is replaced\nagain from the upload that run kept, and publishes only if its review\nreasons and changes match. That answers 422 ``upload_unavailable`` once\nthe upload is gone, and 409 ``review_superseded`` once newer data has\nreplaced what the run was compared with. A review fingerprint is an acknowledgement, not a\nsecret: it keeps a replacement nobody reviewed from publishing, and any\ncaller with write access can still publish deliberately.", "operationId": "refresh_dataset_datasets__dataset_id__refresh_post", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "anyOf": [ { "$ref": "#/components/schemas/DatasetRefreshRequest" }, { "type": "null" } ], "title": "Request" } } } }, "responses": { "202": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DatasetRefreshResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Refresh Dataset", "tags": [ "Datasets - Refresh" ] } }, "/datasets/{dataset_id}/refresh-runs": { "get": { "description": "Return durable refresh history for a dataset.\n\nReaders can see the timeline and outcomes. Only the dataset owner and\nadmins can see actors, failure details, schema changes, and verification\nsource data.", "operationId": "list_dataset_refresh_runs_datasets__dataset_id__refresh_runs_get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "query", "name": "skip", "required": false, "schema": { "default": 0, "minimum": 0, "title": "Skip", "type": "integer" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DatasetRefreshRunListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List Dataset Refresh Runs", "tags": [ "Datasets" ] } }, "/datasets/{dataset_id}/related/": { "get": { "description": "Return top-5 datasets similar to this one by embedding cosine similarity.", "operationId": "list_related_datasets_datasets__dataset_id__related__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RelatedDatasetsResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List Related Datasets", "tags": [ "Datasets - Data" ] } }, "/datasets/{dataset_id}/relationships/": { "get": { "description": "List FK relationships for a dataset.\n\nPaginated via ``skip`` and ``limit`` to bound response size for datasets\nwith large numbers of auto-detected relationships. Returns the standard\nlist envelope (``relationships`` + ``total``) so callers can detect whether\nmore pages exist; ``total`` counts the visible relationships before\npagination.", "operationId": "list_dataset_relationships_datasets__dataset_id__relationships__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "description": "Number of relationships to skip.", "in": "query", "name": "skip", "required": false, "schema": { "default": 0, "description": "Number of relationships to skip.", "minimum": 0, "title": "Skip", "type": "integer" } }, { "description": "Maximum number of relationships to return. Capped at 1000.", "in": "query", "name": "limit", "required": false, "schema": { "default": 100, "description": "Maximum number of relationships to return. Capped at 1000.", "maximum": 1000, "minimum": 1, "title": "Limit", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DatasetRelationshipListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List Dataset Relationships", "tags": [ "Datasets - Metadata" ] }, "post": { "description": "Create a new FK relationship. Editor+ required.", "operationId": "create_dataset_relationship_datasets__dataset_id__relationships__post", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DatasetRelationshipCreate" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DatasetRelationshipResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Create Dataset Relationship", "tags": [ "Datasets - Metadata" ] } }, "/datasets/{dataset_id}/reupload": { "post": { "description": "Upload a new file to replace the data in an existing dataset.", "operationId": "reupload_dataset_datasets__dataset_id__reupload_post", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "requestBody": { "content": { "multipart/form-data": { "schema": { "$ref": "#/components/schemas/Body_reupload_dataset_datasets__dataset_id__reupload_post" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReuploadResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "413": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Payload too large" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Reupload Dataset", "tags": [ "Datasets - Reupload" ] } }, "/datasets/{dataset_id}/reupload/presigned": { "post": { "description": "Request presigned URL(s) for direct-to-S3 reupload.", "operationId": "request_presigned_reupload_datasets__dataset_id__reupload_presigned_post", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PresignedUploadRequest" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PresignedUploadResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "413": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Payload too large" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "502": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad gateway \u2014 an upstream provider failed" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Request Presigned Reupload", "tags": [ "Datasets - Reupload" ] } }, "/datasets/{dataset_id}/reupload/presigned/{job_id}/complete": { "post": { "description": "Notify that direct-to-S3 reupload is complete.", "operationId": "complete_presigned_reupload_datasets__dataset_id__reupload_presigned__job_id__complete_post", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "path", "name": "job_id", "required": true, "schema": { "format": "uuid", "title": "Job Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PresignedCompleteRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UploadResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "413": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Payload too large" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "502": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad gateway \u2014 an upstream provider failed" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Complete Presigned Reupload", "tags": [ "Datasets - Reupload" ] } }, "/datasets/{dataset_id}/reupload/service/preview": { "post": { "description": "Preview a remote service layer for dataset re-upload.", "operationId": "reupload_service_preview_datasets__dataset_id__reupload_service_preview_post", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReuploadServicePreviewRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReuploadPreviewResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "502": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad gateway \u2014 an upstream provider failed" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Reupload Service Preview", "tags": [ "Datasets - Reupload" ] } }, "/datasets/{dataset_id}/reupload/{job_id}/commit": { "post": { "description": "Commit a re-upload, queuing the background swap task.", "operationId": "reupload_commit_datasets__dataset_id__reupload__job_id__commit_post", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "path", "name": "job_id", "required": true, "schema": { "format": "uuid", "title": "Job Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReuploadCommitRequest" } } }, "required": true }, "responses": { "202": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReuploadCommitResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Reupload Commit", "tags": [ "Datasets - Reupload" ] } }, "/datasets/{dataset_id}/reupload/{job_id}/preview": { "post": { "description": "Preview the schema diff between old dataset and new upload.\n\nWhen the uploaded file contains multiple layers, the response includes\n``all_layers`` (for frontend layer-select UI) and ``previous_source_layer``\n(pre-selection hint from the most-recent completed IngestJob for this\ndataset). Pass ``layer_name`` in the request body to target a specific\nlayer; omit it to get the default first-layer metadata.", "operationId": "reupload_preview_datasets__dataset_id__reupload__job_id__preview_post", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "path", "name": "job_id", "required": true, "schema": { "format": "uuid", "title": "Job Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "anyOf": [ { "$ref": "#/components/schemas/ReuploadPreviewRequest" }, { "type": "null" } ], "title": "Request" } } } }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReuploadPreviewResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Reupload Preview", "tags": [ "Datasets - Reupload" ] } }, "/datasets/{dataset_id}/rows/": { "get": { "description": "Get keyset-paginated rows from a dataset's data table.\n\nUses cursor-based pagination: pass ``after`` (gid) to fetch the next page.\nSupports column filtering via query params: ``filter[column_name]=value``.", "operationId": "get_dataset_rows_endpoint_datasets__dataset_id__rows__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 50, "maximum": 500, "minimum": 1, "title": "Limit", "type": "integer" } }, { "in": "query", "name": "after", "required": false, "schema": { "default": 0, "minimum": 0, "title": "After", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DatasetRowsResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Dataset Rows Endpoint", "tags": [ "Datasets - Data" ] } }, "/datasets/{dataset_id}/source-health/": { "post": { "description": "Contact this dataset's origin and record what came back.\n\nOwner-or-admin: this makes GeoLens issue an outbound request on the\ncaller's behalf and writes to the dataset row. Readers get the stored\nresult from ``GET /datasets/{id}`` instead.", "operationId": "check_source_health_datasets__dataset_id__source_health__post", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SourceHealthResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Check Source Health", "tags": [ "Datasets - Source Health" ] } }, "/datasets/{dataset_id}/status/": { "patch": { "description": "Transition a dataset's publication status following allowed paths.\n\nThe allowed set comes from the workflow extension's\nallowed_transitions(), so an overlay may define its own. The community\ndefault is draft -> ready -> internal -> published (and back one step).", "operationId": "update_publication_status_datasets__dataset_id__status__patch", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StatusUpdate" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StatusUpdateResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Update Publication Status", "tags": [ "Datasets - Data" ] } }, "/datasets/{dataset_id}/target-status/": { "patch": { "description": "Walk the publication chain from current status to target in one request.\n\nExecutes each intermediate transition so the full chain completes\nserver-side. The order comes from the workflow extension's\nstatus_order(), so an overlay may define its own; the community default\nis draft -> ready -> internal -> published.", "operationId": "set_target_status_datasets__dataset_id__target_status__patch", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StatusUpdate" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StatusUpdateResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Set Target Status", "tags": [ "Datasets - Data" ] } }, "/datasets/{dataset_id}/tiles3d/{path}": { "get": { "description": "Serve one file of a published 3D Tiles tileset.\n\nPoint a client at the dataset's ``tileset.url``, this route's\n``tileset.json``; the relative URIs inside the tileset resolve to this\nsame route. Header credentials (``X-Api-Key`` or ``Authorization``)\nauthenticate every file of a private tileset. A query-string ``api_key``\nauthenticates only the request it is on, so the tileset's relative URIs\nlose it unless the client carries it over, as CesiumJS does through\n``Resource`` query parameters. A browser page on any origin can read a\npublic tileset without credentials; one that sends credentials needs its\norigin on the deployment's CORS allowlist (``CORS_ALLOWED_ORIGINS``).\nEvery file carries the published tileset's\nETag and asks the client to revalidate before each reuse. Once the caller\nhas access and the file exists, an ``If-None-Match`` naming the current\nversion answers 304 and an ``If-Match`` naming another answers 412. A\nprivate or missing tileset and a missing file all answer 404, conditional\nrequests included, and a storage failure answers 502.", "operationId": "get_tileset_file_datasets__dataset_id__tiles3d__path__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "path", "name": "path", "required": true, "schema": { "title": "Path", "type": "string" } } ], "responses": { "200": { "content": { "application/octet-stream": { "schema": { "format": "binary", "type": "string" } }, "image/jpeg": { "schema": { "format": "binary", "type": "string" } }, "image/ktx2": { "schema": { "format": "binary", "type": "string" } }, "image/png": { "schema": { "format": "binary", "type": "string" } }, "image/webp": { "schema": { "format": "binary", "type": "string" } }, "model/gltf+json": { "schema": { "format": "binary", "type": "string" } }, "model/gltf-binary": { "schema": { "format": "binary", "type": "string" } } }, "description": "The requested tileset file" }, "304": { "description": "The caller already holds this version of the file" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "412": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Precondition failed \u2014 the caller's If-Match no longer matches the current representation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "502": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad gateway \u2014 an upstream provider failed" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Tileset File", "tags": [ "Datasets" ] } }, "/datasets/{dataset_id}/validate/": { "get": { "description": "Get validation status for a dataset. Shows hard errors and soft warnings.\n\nBy default returns the quality score persisted at ingest time. Pass\n``?refresh=true`` to recompute and persist a fresh score (expensive on\nlarge tables \u2014 issues a full scan per non-geometry column coalesced into\na single query).", "operationId": "validate_dataset_datasets__dataset_id__validate__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "description": "Recompute the quality score instead of returning the cached value.", "in": "query", "name": "refresh", "required": false, "schema": { "default": false, "description": "Recompute the quality score instead of returning the cached value.", "title": "Refresh", "type": "boolean" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ValidationResultResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Validate Dataset", "tags": [ "Datasets - Data" ] } }, "/datasets/{dataset_id}/versions/": { "get": { "description": "Get paginated version history for a dataset.\n\nA caller who is neither the owner nor an administrator gets the version\ntimeline (filenames, formats, feature counts) but not ``file_hash`` or\n``uploaded_by``. This prevents public version history from identifying\neditors.", "operationId": "get_dataset_versions_endpoint_datasets__dataset_id__versions__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "query", "name": "skip", "required": false, "schema": { "default": 0, "minimum": 0, "title": "Skip", "type": "integer" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DatasetVersionListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Dataset Versions Endpoint", "tags": [ "Datasets - Metadata" ] } }, "/datasets/{dataset_id}/vrt-sources/": { "get": { "description": "Return ordered list of COG sources for a VRT dataset.", "operationId": "list_vrt_sources_datasets__dataset_id__vrt_sources__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VrtSourceListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List Vrt Sources", "tags": [ "Datasets - VRT" ] } }, "/datasets/{dataset_id}/vrt/generations/": { "get": { "description": "Return paginated generation history for a VRT dataset.\n\nNot every caller gets every field. Seeing the dataset decides whether there\nis a history at all; the provenance predicate decides whether its rows carry\ntheir failure text and the id of whoever triggered them. See\n``_vrt_generation_item``.", "operationId": "list_vrt_generations_datasets__dataset_id__vrt_generations__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 20, "maximum": 100, "minimum": 1, "title": "Limit", "type": "integer" } }, { "description": "Number of generation records to skip.", "in": "query", "name": "skip", "required": false, "schema": { "default": 0, "description": "Number of generation records to skip.", "minimum": 0, "title": "Skip", "type": "integer" } }, { "deprecated": true, "description": "Deprecated alias for skip; takes precedence when supplied.", "in": "query", "name": "offset", "required": false, "schema": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ], "deprecated": true, "description": "Deprecated alias for skip; takes precedence when supplied.", "title": "Offset" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VrtGenerationListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List Vrt Generations", "tags": [ "Datasets - VRT" ] } }, "/datasets/{dataset_id}/vrt/regenerate/": { "post": { "description": "Trigger manual VRT regeneration with advisory lock to prevent concurrent rebuilds.", "operationId": "regenerate_vrt_endpoint_datasets__dataset_id__vrt_regenerate__post", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "responses": { "202": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VrtMutationResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Regenerate Vrt Endpoint", "tags": [ "Datasets - VRT" ] } }, "/datasets/{dataset_id}/vrt/status/": { "get": { "description": "Return VRT dataset status, last generation time, source count, and per-source health.", "operationId": "get_vrt_status_datasets__dataset_id__vrt_status__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VrtStatusResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Vrt Status", "tags": [ "Datasets - VRT" ] } }, "/health": { "get": { "description": "Health check endpoint for ALB, Docker, and Nginx.", "operationId": "health_health_get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HealthResponse" } } }, "description": "Successful Response" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HealthResponse" } } }, "description": "Health probes completed but one or more providers are degraded" } }, "summary": "Health", "tags": [ "Health" ] } }, "/ingest/commit-fan-out/{job_id}": { "post": { "description": "Convert a single pending IngestJob into N independent per-layer ingest tasks.\n\nFor multi-layer sources (e.g. GeoPackage with 2+ layers), this endpoint\nfans out the original upload into one Procrastinate task per requested\nlayer, each becoming a separate dataset. The original job is marked\n'fanned_out' (a terminal state).\n\nRequired: original job must be in status='pending'. Each layer_name in\nthe request body must appear in job.user_metadata['all_layers']. Unknown\nlayer names return HTTP 422 with the list of unrecognized names.\n\nReturns HTTP 202 with per-layer outcomes. Partial success is possible:\neach layer result carries status='queued' or status='failed' with a\nuser-safe error message.\n\nPermission: same as POST /ingest/commit/{job_id} \u2014 'upload' capability.", "operationId": "commit_fan_out_ingest_commit_fan_out__job_id__post", "parameters": [ { "in": "path", "name": "job_id", "required": true, "schema": { "format": "uuid", "title": "Job Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FanOutCommitRequest" } } }, "required": true }, "responses": { "202": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FanOutCommitResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Commit Fan Out", "tags": [ "Datasets" ] } }, "/ingest/commit/{job_id}": { "post": { "description": "Commit a staged file for ingestion with user-supplied metadata.\n\nStores user metadata on the job and queues the ingest task.\nOnly callable on jobs with status 'pending'. A 3D Tiles tileset's unpacked\nsize and a point cloud's size are checked against the storage quota again\nhere.", "operationId": "commit_import_ingest_commit__job_id__post", "parameters": [ { "in": "path", "name": "job_id", "required": true, "schema": { "format": "uuid", "title": "Job Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CommitRequest" } } }, "required": true }, "responses": { "202": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CommitResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "413": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Payload too large" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Commit Import", "tags": [ "Datasets" ] } }, "/ingest/discover/": { "get": { "description": "Discover unregistered tables in the data schema.\n\nReturns tables not yet in the catalog, excluding staging, old, and\nsystem tables. Includes geometry type, SRID, and estimated row count.\nBounded by ``limit`` (default 1000, max 5000) so instances with\nthousands of orphan tables don't blow up the response payload.\nAdministrators only.", "operationId": "discover_tables_ingest_discover__get", "parameters": [ { "description": "Maximum number of tables to return. Capped at 5000.", "in": "query", "name": "limit", "required": false, "schema": { "default": 1000, "description": "Maximum number of tables to return. Capped at 5000.", "maximum": 5000, "minimum": 1, "title": "Limit", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DiscoverResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Discover Tables", "tags": [ "Datasets" ] } }, "/ingest/manifest/apply": { "post": { "description": "Apply a versioned manifest through the ingest service layer.", "operationId": "apply_manifest_endpoint_ingest_manifest_apply_post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ManifestApplyRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ManifestApplyResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Apply Manifest Endpoint", "tags": [ "Datasets" ] } }, "/ingest/preview/{job_id}": { "post": { "description": "Run preview on a staged file and return preview data.\n\nFor vector files: returns columns, CRS, geometry type, feature count, sample rows.\nFor raster files: returns band count, CRS, resolution, compliance status.\nFor a 3D Tiles tileset: returns its version, root geometric error, bounding\nvolume kind, extent and unpacked size, read from the archive's directory\nand tileset.json without unpacking it.\nFor a COPC point cloud: returns its point count and format, CRS, extent,\nelevation range and size, read from its header and hierarchy.\nOnly callable on jobs with status 'pending'.", "operationId": "preview_file_ingest_preview__job_id__post", "parameters": [ { "in": "path", "name": "job_id", "required": true, "schema": { "format": "uuid", "title": "Job Id", "type": "string" } }, { "description": "Sheet/layer name for multi-layer files", "in": "query", "name": "layer_name", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Sheet/layer name for multi-layer files", "title": "Layer Name" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "anyOf": [ { "$ref": "#/components/schemas/PreviewResponse" }, { "$ref": "#/components/schemas/RasterPreviewResponse" }, { "$ref": "#/components/schemas/TilesetPreviewResponse" }, { "$ref": "#/components/schemas/PointCloudPreviewResponse" } ], "title": "Response Preview File Ingest Preview Job Id Post" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Preview File", "tags": [ "Datasets" ] } }, "/ingest/register/": { "post": { "description": "Register an existing PostGIS table as a dataset.\n\nVerifies the table exists, extracts metadata, and creates a\ncatalog entry. Administrators only.", "operationId": "register_table_ingest_register__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RegisterRequest" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TableRegisterResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Register Table", "tags": [ "Datasets" ] } }, "/ingest/register/bulk/": { "post": { "description": "Bulk-register multiple existing PostGIS tables as datasets.\n\nAdministrators only. Each table is registered independently -- one\nfailure does not block others. Each table gets its own session, and at most\n``_BULK_REGISTER_CONCURRENCY`` run at once so one batch cannot drain the\nshared connection pool.", "operationId": "bulk_register_tables_ingest_register_bulk__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BulkRegisterRequest" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BulkRegisterResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Bulk Register Tables", "tags": [ "Datasets" ] } }, "/ingest/upload": { "post": { "description": "Upload a geospatial file for staging.\n\nValidates the file extension, creates an ingest job, and saves the file\nto staging. Does NOT auto-queue ingestion -- use preview then commit.", "operationId": "upload_file_ingest_upload_post", "requestBody": { "content": { "multipart/form-data": { "schema": { "$ref": "#/components/schemas/Body_upload_file_ingest_upload_post" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UploadResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "413": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Payload too large" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Upload File", "tags": [ "Datasets" ] } }, "/ingest/upload/config": { "get": { "description": "Return upload configuration including presigned upload availability.", "operationId": "get_upload_config_ingest_upload_config_get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UploadConfigResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Upload Config", "tags": [ "Datasets" ] } }, "/ingest/upload/presigned": { "post": { "description": "Request presigned URL(s) for direct-to-S3 file upload.", "operationId": "request_presigned_upload_ingest_upload_presigned_post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PresignedUploadRequest" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PresignedUploadResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "413": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Payload too large" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "502": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad gateway \u2014 an upstream provider failed" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Request Presigned Upload", "tags": [ "Datasets" ] } }, "/ingest/upload/presigned/{job_id}/complete": { "post": { "description": "Notify that direct-to-S3 upload is complete.", "operationId": "complete_presigned_upload_ingest_upload_presigned__job_id__complete_post", "parameters": [ { "in": "path", "name": "job_id", "required": true, "schema": { "format": "uuid", "title": "Job Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PresignedCompleteRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UploadResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "413": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Payload too large" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "502": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad gateway \u2014 an upstream provider failed" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Complete Presigned Upload", "tags": [ "Datasets" ] } }, "/ingest/upload/url": { "post": { "description": "Start importing a geospatial file from an HTTP(S) URL.\n\nThe server fetches the file and sends the staged bytes through the same\npreview and commit pipeline as a direct upload. With ``kind`` set to\n``tiles3d`` the URL names a 3D Tiles tileset archive, which the worker\nchecks as the upload door does before the job becomes previewable.\n\nThe download runs as a background job. This call validates the URL and\nreturns a job id immediately; poll ``GET /jobs/{job_id}`` and\npreview once the job reaches ``pending``. While the file is downloading\nthe job reports status ``running`` with step ``downloading``.\n\nURL validation, connection-time IP pinning, and per-hop redirect checks\nprotect the download from SSRF. The worker enforces the size cap while\nstreaming, validates the staged file like a direct upload, and gives GDAL\nonly the local staged file.", "operationId": "upload_from_url_ingest_upload_url_post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UrlUploadRequest" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UploadResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "413": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Payload too large" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "502": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad gateway \u2014 an upstream provider failed" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Upload From Url", "tags": [ "Datasets" ] } }, "/ingest/vrt/create": { "post": { "description": "Create a VRT dataset by combining existing raster datasets.\n\nValidates sources synchronously, then defers VRT assembly to an async task.\nReturns a job_id for polling. Validation + queuing logic lives in\n``ingest.service.create_vrt_job`` (K5 extraction).", "operationId": "create_vrt_ingest_vrt_create_post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VrtCreateRequest" } } }, "required": true }, "responses": { "202": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VrtCreateResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Create Vrt", "tags": [ "Datasets" ] } }, "/ingest/vrt/{dataset_id}/sources/": { "post": { "description": "Add a COG source to an existing VRT and trigger async regeneration.\n\nValidates the new source against existing sources synchronously.\nReturns 202 Accepted with a job_id for polling.\nReturns 409 if the VRT is currently regenerating or the source is already linked.\nReturns 422 if the source is incompatible with existing sources.", "operationId": "add_vrt_source_ingest_vrt__dataset_id__sources__post", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VrtAddSourceRequest" } } }, "required": true }, "responses": { "202": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VrtMutationResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Add Vrt Source", "tags": [ "Datasets" ] } }, "/ingest/vrt/{dataset_id}/sources/{source_dataset_id}/": { "delete": { "description": "Remove a COG source from an existing VRT and trigger async regeneration.\n\nReturns 202 Accepted with a job_id for polling.\nReturns 409 if the VRT is currently regenerating.\nReturns 422 if removing would leave fewer than 2 sources.\nReturns 404 if the source is not linked to the VRT.", "operationId": "remove_vrt_source_ingest_vrt__dataset_id__sources__source_dataset_id___delete", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "path", "name": "source_dataset_id", "required": true, "schema": { "format": "uuid", "title": "Source Dataset Id", "type": "string" } } ], "responses": { "202": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VrtMutationResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Remove Vrt Source", "tags": [ "Datasets" ] } }, "/jobs/by-dataset/{dataset_id}": { "get": { "description": "Look up the most recent ingest job for a dataset.\n\nUsed by the dataset detail page to surface ingest warnings permanently\n(S3 completion) \u2014 the job is the source of truth for\n``reserved_rename`` / ``dbf_truncation_collision`` / ``mercator_clip`` /\n``archive_failed`` / ``temporal_parse_errors`` metadata.\n\nReturns the most recently created completed job for the dataset. When the\ndataset is visible but has no ingest job (e.g. registered from an existing\ntable, or a remote/STAC dataset), returns ``200`` with a ``null`` body\ninstead of 404 \u2014 a \"no job\" outcome is normal for these datasets and a\n404 would needlessly pollute the browser console on the dataset detail\npage. A genuine 404 is still raised when the dataset is not visible to the\nuser, to avoid leaking job existence (see visibility check below).\n\nNot every caller gets every field. Seeing the dataset decides whether there\nis an answer at all; who ran the job decides how much of the answer is\nfilled in. The dataset's owner, an admin, and the job's own creator get the\nfull payload. Any other reader of a visible dataset gets the job id, its\nstatus and its timestamps, with the run's own detail nulled: no\n``error_message``, ``source_filename``, warnings, step, row counts or\nretry hint. That is the redaction ``GET /datasets/{dataset_id}/refresh-runs``\nalready applies to the same failure text, and ``_redacted_job_status``\ndocuments the decision field by field.", "operationId": "get_job_status_by_dataset_jobs_by_dataset__dataset_id__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "anyOf": [ { "$ref": "#/components/schemas/JobStatusResponse" }, { "type": "null" } ], "title": "Response Get Job Status By Dataset Jobs By Dataset Dataset Id Get" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Job Status By Dataset", "tags": [ "Admin" ] } }, "/jobs/cleanup/stale/": { "post": { "description": "Fail all stale jobs: pending >1h or running >1h.\n\n**Ops-only.** Not used by the GeoLens UI \u2014 invoke from `curl`/`gh api`/cron\nwhen you need to force-clean orphaned jobs after a worker outage.\nEquivalent logic runs automatically every 5 minutes via the lifespan\nsweeper, so this endpoint is only needed if you need cleanup faster than\nthat interval.", "operationId": "cleanup_stale_jobs_jobs_cleanup_stale__post", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StaleCleanupResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Cleanup Stale Jobs", "tags": [ "Admin" ] } }, "/jobs/{job_id}": { "get": { "description": "Get the status of an ingestion job.\n\nOnly the job creator or an admin can view job status.", "operationId": "get_job_status_jobs__job_id__get", "parameters": [ { "in": "path", "name": "job_id", "required": true, "schema": { "format": "uuid", "title": "Job Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/JobStatusResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Job Status", "tags": [ "Admin" ] } }, "/jobs/{job_id}/cancel": { "post": { "description": "Cancel a pending or running ingest job.\n\nThe database marks the job and any bound refresh run as cancelled before\nrequesting a queue abort. Transaction fencing prevents a worker from\ninstalling data after cancellation even if it misses the abort request.\n\nThe job creator, a user with cross-user job permission, or anyone with\nwrite access to the job's dataset may cancel it.", "operationId": "cancel_job_jobs__job_id__cancel_post", "parameters": [ { "in": "path", "name": "job_id", "required": true, "schema": { "format": "uuid", "title": "Job Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/JobCancelResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Cancel Job", "tags": [ "Admin" ] } }, "/jobs/{job_id}/retry": { "post": { "description": "Retry a failed ingestion job by re-queuing.\n\nOnly callable on jobs with status 'failed'. The staging file must\nstill exist (preserved on failure for retry).", "operationId": "retry_job_jobs__job_id__retry_post", "parameters": [ { "in": "path", "name": "job_id", "required": true, "schema": { "format": "uuid", "title": "Job Id", "type": "string" } } ], "responses": { "202": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UploadResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Retry Job", "tags": [ "Admin" ] } }, "/layers/": { "post": { "description": "Create a new empty spatial layer.\n\nCreates a PostGIS table with a typed geometry column, runs the full\npost-processing pipeline (geom_4326, spatial index, reader grants),\nand registers the layer as a catalog dataset.\n\nRequires editor or admin role.", "operationId": "create_layer_endpoint_layers__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateLayerRequest" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateLayerResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Create Layer Endpoint", "tags": [ "Maps" ] } }, "/layers/{dataset_id}/columns/": { "post": { "description": "Add a column to an existing layer.", "operationId": "add_column_endpoint_layers__dataset_id__columns__post", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AddColumnRequest" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ColumnListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Add Column Endpoint", "tags": [ "Maps" ] } }, "/layers/{dataset_id}/columns/{column_name}": { "delete": { "description": "Remove a column from an existing layer.", "operationId": "drop_column_endpoint_layers__dataset_id__columns__column_name__delete", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "path", "name": "column_name", "required": true, "schema": { "title": "Column Name", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ColumnListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Drop Column Endpoint", "tags": [ "Maps" ] } }, "/layers/{dataset_id}/columns/{column_name}/name": { "patch": { "description": "Rename a column on an existing layer.", "operationId": "rename_column_endpoint_layers__dataset_id__columns__column_name__name_patch", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "path", "name": "column_name", "required": true, "schema": { "title": "Column Name", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RenameColumnRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ColumnListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Rename Column Endpoint", "tags": [ "Maps" ] } }, "/layers/{dataset_id}/columns/{column_name}/references": { "get": { "description": "Count saved maps whose layer config references a column.\n\nThe schema editor uses this count before a rename or drop. Map titles are\nomitted because they may belong to other users.", "operationId": "column_references_endpoint_layers__dataset_id__columns__column_name__references_get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "path", "name": "column_name", "required": true, "schema": { "title": "Column Name", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ColumnReferencesResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Column References Endpoint", "tags": [ "Maps" ] } }, "/layers/{dataset_id}/columns/{column_name}/type": { "patch": { "description": "Change a column's type on an existing layer.\n\nPostgres performs an implicit ``column::TYPE`` cast; values that cannot be\ncast cause the request to fail and roll back.", "operationId": "alter_column_type_endpoint_layers__dataset_id__columns__column_name__type_patch", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "path", "name": "column_name", "required": true, "schema": { "title": "Column Name", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AlterColumnTypeRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ColumnListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Alter Column Type Endpoint", "tags": [ "Maps" ] } }, "/maps/": { "get": { "description": "List maps. Admins see all; authenticated users see own + internal + public; anonymous see public only.\n\nSupports search (ILIKE on name+description), sort_by (name/created_at/updated_at),\nsort_dir (asc/desc), and visibility filter (private/internal/public).\nowned_only restricts results to the caller's maps; anonymous callers get no maps.", "operationId": "list_maps_endpoint_maps__get", "parameters": [ { "in": "query", "name": "skip", "required": false, "schema": { "default": 0, "minimum": 0, "title": "Skip", "type": "integer" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer" } }, { "in": "query", "name": "search", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Search" } }, { "in": "query", "name": "sort_by", "required": false, "schema": { "default": "updated_at", "enum": [ "name", "created_at", "updated_at" ], "title": "Sort By", "type": "string" } }, { "in": "query", "name": "sort_dir", "required": false, "schema": { "default": "desc", "enum": [ "asc", "desc" ], "title": "Sort Dir", "type": "string" } }, { "in": "query", "name": "visibility", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Visibility" } }, { "in": "query", "name": "owned_only", "required": false, "schema": { "default": false, "title": "Owned Only", "type": "boolean" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MapListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List Maps Endpoint", "tags": [ "Maps" ] }, "post": { "description": "Create a new map.", "operationId": "create_map_endpoint_maps__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MapCreate" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MapResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Create Map Endpoint", "tags": [ "Maps" ] } }, "/maps/icons": { "get": { "description": "List reusable default and uploaded map icons.", "operationId": "list_map_icons_endpoint_maps_icons_get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MapIconListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List Map Icons Endpoint", "tags": [ "Maps" ] }, "post": { "description": "Upload a reusable SVG or PNG icon for symbol layers.", "operationId": "upload_map_icon_endpoint_maps_icons_post", "requestBody": { "content": { "multipart/form-data": { "schema": { "$ref": "#/components/schemas/Body_upload_map_icon_endpoint_maps_icons_post" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MapIconResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Upload Map Icon Endpoint", "tags": [ "Maps" ] } }, "/maps/icons/{icon_id}/asset": { "get": { "description": "Serve an uploaded or bundled icon asset by stable icon ID.\n\nSVG responses carry Content-Security-Policy\n``default-src 'none'; sandbox`` so an uploaded SVG cannot fetch other\norigins, run scripts, or read auth cookies even if validation is bypassed\nin the future. Browsers (Chromium, Firefox) honor the sandbox directive on\nimage/svg+xml responses. PNG responses use the global SecurityHeadersMiddleware\ndefault ``frame-ancestors 'self'``.", "operationId": "get_map_icon_asset_endpoint_maps_icons__icon_id__asset_get", "parameters": [ { "in": "path", "name": "icon_id", "required": true, "schema": { "title": "Icon Id", "type": "string" } } ], "responses": { "200": { "content": { "image/png": { "schema": { "format": "binary", "type": "string" } }, "image/svg+xml": { "schema": { "format": "binary", "type": "string" } } }, "description": "The icon image" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Get Map Icon Asset Endpoint", "tags": [ "Maps" ] } }, "/maps/import": { "post": { "description": "Import a MapLibre style JSON document into a new GeoLens map.\n\nThe request body is a typed Pydantic model rather than a bare ``dict``. ``MapStyleImportRequest`` mirrors the MapLibre style\nspec top-level keys with ``extra=\"allow\"``, so existing payloads keep\nworking byte-identically while the OpenAPI schema gains a named class\nand the auto-generated SDKs stop emitting an opaque ``Mapping[str, Any]``\nrequest type.", "operationId": "import_map_style_endpoint_maps_import_post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MapStyleImportRequest" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MapStyleImportResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Import Map Style Endpoint", "tags": [ "Maps" ] } }, "/maps/shared/{token}": { "get": { "description": "Get a shared map by token. Optionally authenticated for non-public layers.\n\nEmits ``Content-Security-Policy: frame-ancestors\n'self' [...]`` on the response, derived from the active\nEmbedToken for this map. When no EmbedToken exists or allowed_origins is\nempty, defaults to ``frame-ancestors 'self'``. The SecurityHeadersMiddleware\nrespects this route-level CSP and skips emitting X-Frame-Options: DENY.\n\n``X-Embed-Token`` grants access to layers in the token's scope.", "operationId": "get_shared_map_endpoint_maps_shared__token__get", "parameters": [ { "in": "path", "name": "token", "required": true, "schema": { "title": "Token", "type": "string" } }, { "description": "Optional embed token \u2014 includes its scoped dataset layers when valid for this map.", "in": "header", "name": "X-Embed-Token", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Optional embed token \u2014 includes its scoped dataset layers when valid for this map.", "title": "X-Embed-Token" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SharedMapResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset. Neither is sending an unresolvable credential alongside a valid X-Embed-Token that authorizes the request on its own. That request is served and the unrelated credential is ignored." }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "410": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Gone \u2014 the resource existed but is no longer available" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Shared Map Endpoint", "tags": [ "Maps" ] } }, "/maps/sprites/geolens.json": { "get": { "description": "Serve the stable GeoLens sprite JSON index.", "operationId": "get_geolens_sprite_index_endpoint_maps_sprites_geolens_json_get", "responses": { "200": { "content": { "application/json": { "schema": { "additionalProperties": { "additionalProperties": { "anyOf": [ { "type": "integer" }, { "type": "number" }, { "type": "boolean" } ] }, "type": "object" }, "title": "Response Get Geolens Sprite Index Endpoint Maps Sprites Geolens Json Get", "type": "object" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Get Geolens Sprite Index Endpoint", "tags": [ "Maps" ] } }, "/maps/sprites/geolens.png": { "get": { "description": "Serve the generated GeoLens sprite sheet for stable icon IDs.", "operationId": "get_geolens_sprite_png_endpoint_maps_sprites_geolens_png_get", "responses": { "200": { "content": { "image/png": { "schema": { "format": "binary", "type": "string" } } }, "description": "The sprite sheet" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Get Geolens Sprite Png Endpoint", "tags": [ "Maps" ] } }, "/maps/{map_id}": { "delete": { "description": "Delete a map. Only the owner or an admin can delete.", "operationId": "delete_map_endpoint_maps__map_id__delete", "parameters": [ { "in": "path", "name": "map_id", "required": true, "schema": { "format": "uuid", "title": "Map Id", "type": "string" } } ], "responses": { "204": { "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Delete Map Endpoint", "tags": [ "Maps" ] }, "get": { "description": "Get a single map with its layers.", "operationId": "get_map_endpoint_maps__map_id__get", "parameters": [ { "in": "path", "name": "map_id", "required": true, "schema": { "format": "uuid", "title": "Map Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MapResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Map Endpoint", "tags": [ "Maps" ] }, "patch": { "description": "Transfer a map to another owner. Admin only.", "operationId": "patch_map_endpoint_maps__map_id__patch", "parameters": [ { "in": "path", "name": "map_id", "required": true, "schema": { "format": "uuid", "title": "Map Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MapPatch" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MapResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Patch Map Endpoint", "tags": [ "Maps" ] }, "put": { "description": "Update a map's metadata and/or replace its layers.", "operationId": "update_map_endpoint_maps__map_id__put", "parameters": [ { "in": "path", "name": "map_id", "required": true, "schema": { "format": "uuid", "title": "Map Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MapUpdate" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MapResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Update Map Endpoint", "tags": [ "Maps" ] } }, "/maps/{map_id}/access/": { "get": { "description": "Return server-confirmed route access for the map viewer gate.", "operationId": "get_map_access_endpoint_maps__map_id__access__get", "parameters": [ { "in": "path", "name": "map_id", "required": true, "schema": { "format": "uuid", "title": "Map Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MapAccessResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Map Access Endpoint", "tags": [ "Maps" ] } }, "/maps/{map_id}/duplicate/": { "post": { "description": "Fork a map with RBAC-filtered layers. Any authenticated user can fork.", "operationId": "duplicate_map_endpoint_maps__map_id__duplicate__post", "parameters": [ { "in": "path", "name": "map_id", "required": true, "schema": { "format": "uuid", "title": "Map Id", "type": "string" } } ], "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DuplicateMapResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Duplicate Map Endpoint", "tags": [ "Maps" ] } }, "/maps/{map_id}/embed-tokens/": { "get": { "description": "List all embed tokens for a map.", "operationId": "list_embed_tokens_endpoint_maps__map_id__embed_tokens__get", "parameters": [ { "in": "path", "name": "map_id", "required": true, "schema": { "format": "uuid", "title": "Map Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EmbedTokenListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List Embed Tokens Endpoint", "tags": [ "Embed Tokens" ] }, "post": { "description": "Create an embed token scoped to a map's current layers.\n\nThe default 30-day unrestricted token is always available. Custom lifetimes\nand non-empty origin restrictions require advanced sharing controls.", "operationId": "create_embed_token_endpoint_maps__map_id__embed_tokens__post", "parameters": [ { "in": "path", "name": "map_id", "required": true, "schema": { "format": "uuid", "title": "Map Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EmbedTokenCreate" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EmbedTokenCreatedResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Create Embed Token Endpoint", "tags": [ "Embed Tokens" ] } }, "/maps/{map_id}/embed-tokens/{token_id}/": { "delete": { "description": "Revoke an embed token.", "operationId": "revoke_embed_token_endpoint_maps__map_id__embed_tokens__token_id___delete", "parameters": [ { "in": "path", "name": "map_id", "required": true, "schema": { "format": "uuid", "title": "Map Id", "type": "string" } }, { "in": "path", "name": "token_id", "required": true, "schema": { "format": "uuid", "title": "Token Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EmbedTokenResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Revoke Embed Token Endpoint", "tags": [ "Embed Tokens" ] }, "patch": { "description": "Update embed token allowed_origins.\n\nNull clears restrictions. Non-empty origin restrictions require advanced sharing controls.", "operationId": "update_embed_token_endpoint_maps__map_id__embed_tokens__token_id___patch", "parameters": [ { "in": "path", "name": "map_id", "required": true, "schema": { "format": "uuid", "title": "Map Id", "type": "string" } }, { "in": "path", "name": "token_id", "required": true, "schema": { "format": "uuid", "title": "Token Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EmbedTokenUpdate" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EmbedTokenResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Update Embed Token Endpoint", "tags": [ "Embed Tokens" ] } }, "/maps/{map_id}/history": { "get": { "description": "Return recent builder edit history for a map.", "operationId": "get_map_history_endpoint_maps__map_id__history_get", "parameters": [ { "in": "path", "name": "map_id", "required": true, "schema": { "format": "uuid", "title": "Map Id", "type": "string" } }, { "in": "query", "name": "skip", "required": false, "schema": { "default": 0, "minimum": 0, "title": "Skip", "type": "integer" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 50, "maximum": 100, "minimum": 1, "title": "Limit", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MapHistoryListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Map History Endpoint", "tags": [ "Maps" ] } }, "/maps/{map_id}/layers": { "patch": { "description": "Apply incremental layer additions, patches, removals, and ordering.\n\nDeclared on both slash variants directly, mirroring the POST route\nbelow. FastAPI's default redirect_slashes builds a relative Location\nheader that resolves against the request's Host header, which would\nleak the in-container ``api:8000`` hostname through Vite's dev proxy\non a 307 redirect. The canonical (OpenAPI-published) form is the\nno-slash sub-collection convention documented in the GeoLens API guide\n(https://docs.getgeolens.com/guides/api/); the trailing-slash form is\na hidden alias.", "operationId": "patch_map_layers_endpoint_maps__map_id__layers_patch", "parameters": [ { "in": "path", "name": "map_id", "required": true, "schema": { "format": "uuid", "title": "Map Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MapLayerDiffRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MapResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Patch Map Layers Endpoint", "tags": [ "Maps" ] }, "post": { "description": "Add a layer to a map.\n\nDeclared on both slash variants directly so neither emits a 307.\nFastAPI's default redirect_slashes builds a relative Location header\nthat resolves against the request's Host header, leaking the\nin-container ``api:8000`` hostname through Vite's dev proxy. The\ncanonical (OpenAPI-published) form is the no-slash sub-collection\nconvention documented in the GeoLens API guide\n(https://docs.getgeolens.com/guides/api/); the trailing-slash form is a\nhidden alias for callers that send the slash.", "operationId": "add_layer_endpoint_maps__map_id__layers_post", "parameters": [ { "in": "path", "name": "map_id", "required": true, "schema": { "format": "uuid", "title": "Map Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MapLayerInput" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MapLayerResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Add Layer Endpoint", "tags": [ "Maps" ] } }, "/maps/{map_id}/layers/bulk-delete": { "post": { "description": "Batch-delete multiple layers from a map in a single request.\n\nOne additive endpoint that reduces N sequential DELETEs to a single\nbatched call for bulk-delete UX.\n\nReturns 200 with deleted/failed arrays in all cases (partial failures\nsurface inline, not as HTTP errors). Full rollback is the caller's\nresponsibility if all ids fail.", "operationId": "bulk_delete_layers_endpoint_maps__map_id__layers_bulk_delete_post", "parameters": [ { "in": "path", "name": "map_id", "required": true, "schema": { "format": "uuid", "title": "Map Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BulkDeleteLayersRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BulkDeleteLayersResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Bulk Delete Layers Endpoint", "tags": [ "Maps" ] } }, "/maps/{map_id}/layers/{layer_id}": { "delete": { "description": "Remove a layer from a map.", "operationId": "remove_layer_endpoint_maps__map_id__layers__layer_id__delete", "parameters": [ { "in": "path", "name": "map_id", "required": true, "schema": { "format": "uuid", "title": "Map Id", "type": "string" } }, { "in": "path", "name": "layer_id", "required": true, "schema": { "format": "uuid", "title": "Layer Id", "type": "string" } } ], "responses": { "204": { "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Remove Layer Endpoint", "tags": [ "Maps" ] } }, "/maps/{map_id}/og-image/": { "get": { "description": "Serve the OG social-card image from storage (visibility-checked).\n\nUses ``public, max-age=86400`` for public maps \u2014 OG images change\nless often than thumbnails (which use 3600s). Mirrors get_thumbnail\nbut reads ``og_image_uri`` and uses the ``maps/og-images/`` key space.", "operationId": "get_og_image_maps__map_id__og_image__get", "parameters": [ { "in": "path", "name": "map_id", "required": true, "schema": { "format": "uuid", "title": "Map Id", "type": "string" } } ], "responses": { "200": { "content": { "image/jpeg": { "schema": { "format": "binary", "type": "string" } }, "image/png": { "schema": { "format": "binary", "type": "string" } } }, "description": "The social preview image" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Og Image", "tags": [ "Maps" ] }, "put": { "description": "Upload a base64 OG social-card image (up to 750KB) for a map.\n\nAccepts a data:image/ URI, decodes the base64 payload, validates the\nbytes are a real image (PIL verify), writes to storage under\n``maps/og-images/{map_id}.{ext}``, and persists the storage key to\n``catalog.maps.og_image_uri``.\n\nIntended for 1200x630 JPEG captures. The payload cap\n(750KB) is larger than the thumbnail cap (100KB) to accommodate the\nlarger canvas export \u2014 they are separate schemas (OgImageUploadRequest\nvs ThumbnailUploadRequest) to avoid relaxing the locked thumbnail\ncontract. Auth and PIL-verify rules are identical to upload_thumbnail.", "operationId": "upload_og_image_maps__map_id__og_image__put", "parameters": [ { "in": "path", "name": "map_id", "required": true, "schema": { "format": "uuid", "title": "Map Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OgImageUploadRequest" } } }, "required": true }, "responses": { "204": { "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "502": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad gateway \u2014 an upstream provider failed" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Upload Og Image", "tags": [ "Maps" ] } }, "/maps/{map_id}/share/": { "delete": { "description": "Revoke share token(s) for a map. Owner or admin only.", "operationId": "revoke_map_share_endpoint_maps__map_id__share__delete", "parameters": [ { "in": "path", "name": "map_id", "required": true, "schema": { "format": "uuid", "title": "Map Id", "type": "string" } } ], "responses": { "204": { "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Revoke Map Share Endpoint", "tags": [ "Maps" ] }, "get": { "description": "Return the active share token for a map, or null if none exists.", "operationId": "get_map_share_token_endpoint_maps__map_id__share__get", "parameters": [ { "in": "path", "name": "map_id", "required": true, "schema": { "format": "uuid", "title": "Map Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "anyOf": [ { "$ref": "#/components/schemas/ShareTokenResponse" }, { "type": "null" } ], "title": "Response Get Map Share Token Endpoint Maps Map Id Share Get" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Map Share Token Endpoint", "tags": [ "Maps" ] }, "patch": { "description": "Update expiration on an existing share token. Owner or admin only.\n\nA fixed-day preset is always available. Null clears expiration.", "operationId": "update_map_share_token_endpoint_maps__map_id__share__patch", "parameters": [ { "in": "path", "name": "map_id", "required": true, "schema": { "format": "uuid", "title": "Map Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ShareTokenRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ShareTokenResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Update Map Share Token Endpoint", "tags": [ "Maps" ] }, "post": { "description": "Create or retrieve a share token for a public map.", "operationId": "share_map_endpoint_maps__map_id__share__post", "parameters": [ { "in": "path", "name": "map_id", "required": true, "schema": { "format": "uuid", "title": "Map Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "anyOf": [ { "$ref": "#/components/schemas/ShareTokenRequest" }, { "type": "null" } ], "title": "Body" } } } }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ShareTokenResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Share Map Endpoint", "tags": [ "Maps" ] } }, "/maps/{map_id}/style.json": { "get": { "description": "Export a saved map as a complete MapLibre style JSON document.", "operationId": "export_map_style_endpoint_maps__map_id__style_json_get", "parameters": [ { "in": "path", "name": "map_id", "required": true, "schema": { "format": "uuid", "title": "Map Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "additionalProperties": true, "description": "MapLibre style document (https://maplibre.org/maplibre-style-spec/)", "type": "object" } } }, "description": "A complete MapLibre style document for the saved map. Its shape is governed by the MapLibre Style Specification (https://maplibre.org/maplibre-style-spec/) and is not mirrored field-by-field in this contract. One guarantee beyond the spec: `sprite` is always emitted in the array form `[{id, url}]`, which POST /maps/import also accepts, so exported documents round-trip." }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Export Map Style Endpoint", "tags": [ "Maps" ] } }, "/maps/{map_id}/thumbnail/": { "get": { "description": "Serve map thumbnail image from storage (visibility-checked).", "operationId": "get_thumbnail_maps__map_id__thumbnail__get", "parameters": [ { "in": "path", "name": "map_id", "required": true, "schema": { "format": "uuid", "title": "Map Id", "type": "string" } } ], "responses": { "200": { "content": { "image/jpeg": { "schema": { "format": "binary", "type": "string" } }, "image/png": { "schema": { "format": "binary", "type": "string" } } }, "description": "The thumbnail image" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Thumbnail", "tags": [ "Maps" ] }, "put": { "description": "Upload a base64 thumbnail for a map.\n\nAccepts a data:image/ URI, decodes the base64 payload, writes the image\nbytes to the configured storage provider, and stores the storage key.", "operationId": "upload_thumbnail_maps__map_id__thumbnail__put", "parameters": [ { "in": "path", "name": "map_id", "required": true, "schema": { "format": "uuid", "title": "Map Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ThumbnailUploadRequest" } } }, "required": true }, "responses": { "204": { "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "502": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad gateway \u2014 an upstream provider failed" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Upload Thumbnail", "tags": [ "Maps" ] } }, "/maps/{map_id}/visibility-check/": { "get": { "description": "Check if a map has non-public datasets. Informational only.\n\nOwner-or-admin like the other sharing mutations: the response names\nnon-public dataset titles, which read access alone must not reveal.\nRead access is checked first so unreadable maps keep answering 404\n(existence-hiding); readable non-owners get 403.", "operationId": "visibility_check_endpoint_maps__map_id__visibility_check__get", "parameters": [ { "in": "path", "name": "map_id", "required": true, "schema": { "format": "uuid", "title": "Map Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VisibilityCheckResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Visibility Check Endpoint", "tags": [ "Maps" ] } }, "/query/": { "post": { "description": "Execute one SELECT through the read-only SQL sandbox.\n\nThe statement must be a single SELECT over `data.*` tables you can\naccess, name every table in `restrict_tables`, and fit the sandbox's\nfunction allowlist and cost bounds. Rows are capped by `row_limit`,\nexecution by a server-side statement timeout, and the result's size before\nit leaves the database: `truncated` is true when either cap cut rows. A\nresult whose first row alone exceeds the size cap, or whose response would\nexceed 8 MiB, is refused with 422.", "operationId": "sandbox_query_endpoint_query__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SandboxQueryRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SandboxResult" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0.0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Run a read-only SQL query", "tags": [ "Query" ] } }, "/records/{record_id}/contacts/": { "get": { "description": "List all contacts for a record.", "operationId": "list_contacts_endpoint_records__record_id__contacts__get", "parameters": [ { "in": "path", "name": "record_id", "required": true, "schema": { "format": "uuid", "title": "Record Id", "type": "string" } }, { "in": "query", "name": "skip", "required": false, "schema": { "default": 0, "minimum": 0, "title": "Skip", "type": "integer" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 100, "maximum": 500, "minimum": 1, "title": "Limit", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ContactListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List Contacts Endpoint", "tags": [ "Records" ] }, "post": { "description": "Create a new contact for a record.", "operationId": "create_contact_endpoint_records__record_id__contacts__post", "parameters": [ { "in": "path", "name": "record_id", "required": true, "schema": { "format": "uuid", "title": "Record Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ContactCreate" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ContactResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Create Contact Endpoint", "tags": [ "Records" ] } }, "/records/{record_id}/contacts/{contact_id}/": { "delete": { "description": "Delete a contact.", "operationId": "delete_contact_endpoint_records__record_id__contacts__contact_id___delete", "parameters": [ { "in": "path", "name": "record_id", "required": true, "schema": { "format": "uuid", "title": "Record Id", "type": "string" } }, { "in": "path", "name": "contact_id", "required": true, "schema": { "format": "uuid", "title": "Contact Id", "type": "string" } } ], "responses": { "204": { "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Delete Contact Endpoint", "tags": [ "Records" ] }, "patch": { "description": "Update a contact.", "operationId": "update_contact_endpoint_records__record_id__contacts__contact_id___patch", "parameters": [ { "in": "path", "name": "record_id", "required": true, "schema": { "format": "uuid", "title": "Record Id", "type": "string" } }, { "in": "path", "name": "contact_id", "required": true, "schema": { "format": "uuid", "title": "Contact Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ContactUpdate" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ContactResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Update Contact Endpoint", "tags": [ "Records" ] } }, "/records/{record_id}/distributions/": { "get": { "description": "List all distributions for a record.", "operationId": "list_distributions_endpoint_records__record_id__distributions__get", "parameters": [ { "in": "path", "name": "record_id", "required": true, "schema": { "format": "uuid", "title": "Record Id", "type": "string" } }, { "in": "query", "name": "skip", "required": false, "schema": { "default": 0, "minimum": 0, "title": "Skip", "type": "integer" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 100, "maximum": 500, "minimum": 1, "title": "Limit", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DistributionListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List Distributions Endpoint", "tags": [ "Records" ] }, "post": { "description": "Create a manual distribution for a record.", "operationId": "create_distribution_endpoint_records__record_id__distributions__post", "parameters": [ { "in": "path", "name": "record_id", "required": true, "schema": { "format": "uuid", "title": "Record Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DistributionCreate" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DistributionResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Create Distribution Endpoint", "tags": [ "Records" ] } }, "/records/{record_id}/distributions/{distribution_id}/": { "delete": { "description": "Delete a distribution (manual only; auto-generated distributions are immutable).", "operationId": "delete_distribution_endpoint_records__record_id__distributions__distribution_id___delete", "parameters": [ { "in": "path", "name": "record_id", "required": true, "schema": { "format": "uuid", "title": "Record Id", "type": "string" } }, { "in": "path", "name": "distribution_id", "required": true, "schema": { "format": "uuid", "title": "Distribution Id", "type": "string" } } ], "responses": { "204": { "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Delete Distribution Endpoint", "tags": [ "Records" ] }, "patch": { "description": "Update a distribution (manual only; auto-generated distributions are immutable).", "operationId": "update_distribution_endpoint_records__record_id__distributions__distribution_id___patch", "parameters": [ { "in": "path", "name": "record_id", "required": true, "schema": { "format": "uuid", "title": "Record Id", "type": "string" } }, { "in": "path", "name": "distribution_id", "required": true, "schema": { "format": "uuid", "title": "Distribution Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DistributionUpdate" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DistributionResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Update Distribution Endpoint", "tags": [ "Records" ] } }, "/records/{record_id}/keywords/": { "get": { "description": "List all keywords for a record, marking analysis-inherited ones.", "operationId": "list_keywords_endpoint_records__record_id__keywords__get", "parameters": [ { "in": "path", "name": "record_id", "required": true, "schema": { "format": "uuid", "title": "Record Id", "type": "string" } }, { "in": "query", "name": "skip", "required": false, "schema": { "default": 0, "minimum": 0, "title": "Skip", "type": "integer" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 100, "maximum": 500, "minimum": 1, "title": "Limit", "type": "integer" } }, { "description": "Compute inherited_audience_gap as if the record had this visibility. Honored only for the record's owner and admins; ignored for everyone else, who get the gap at the record's stored state. Keywords themselves are unaffected.", "in": "query", "name": "audience_visibility", "required": false, "schema": { "anyOf": [ { "pattern": "^(private|restricted|internal|public)$", "type": "string" }, { "type": "null" } ], "description": "Compute inherited_audience_gap as if the record had this visibility. Honored only for the record's owner and admins; ignored for everyone else, who get the gap at the record's stored state. Keywords themselves are unaffected.", "title": "Audience Visibility" } }, { "description": "Compute inherited_audience_gap as if the record had this status \u2014 the counterfactual an owner asks before publishing. Honored only for the record's owner and admins; ignored for everyone else, who get the gap at the record's stored state. Deliberately not pinned to an enum: the lifecycle statuses come from the workflow extension's status_order(), so an overlay may define its own. An unrecognized status is treated conservatively (it reaches only the owner, which errs toward warning) rather than rejected.", "in": "query", "name": "audience_record_status", "required": false, "schema": { "anyOf": [ { "maxLength": 30, "type": "string" }, { "type": "null" } ], "description": "Compute inherited_audience_gap as if the record had this status \u2014 the counterfactual an owner asks before publishing. Honored only for the record's owner and admins; ignored for everyone else, who get the gap at the record's stored state. Deliberately not pinned to an enum: the lifecycle statuses come from the workflow extension's status_order(), so an overlay may define its own. An unrecognized status is treated conservatively (it reaches only the owner, which errs toward warning) rather than rejected.", "title": "Audience Record Status" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/KeywordListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List Keywords Endpoint", "tags": [ "Records" ] }, "post": { "description": "Create a new keyword for a record.", "operationId": "create_keyword_endpoint_records__record_id__keywords__post", "parameters": [ { "in": "path", "name": "record_id", "required": true, "schema": { "format": "uuid", "title": "Record Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/KeywordCreate" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/KeywordResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Create Keyword Endpoint", "tags": [ "Records" ] } }, "/records/{record_id}/keywords/{keyword_id}/": { "delete": { "description": "Delete a keyword.", "operationId": "delete_keyword_endpoint_records__record_id__keywords__keyword_id___delete", "parameters": [ { "in": "path", "name": "record_id", "required": true, "schema": { "format": "uuid", "title": "Record Id", "type": "string" } }, { "in": "path", "name": "keyword_id", "required": true, "schema": { "format": "uuid", "title": "Keyword Id", "type": "string" } } ], "responses": { "204": { "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Delete Keyword Endpoint", "tags": [ "Records" ] } }, "/records/{record_id}/translations/": { "get": { "description": "List localized title/summary variants visible with the parent record.", "operationId": "list_translations_endpoint_records__record_id__translations__get", "parameters": [ { "in": "path", "name": "record_id", "required": true, "schema": { "format": "uuid", "title": "Record Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TranslationListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List Translations Endpoint", "tags": [ "Records" ] } }, "/records/{record_id}/translations/{language}/": { "delete": { "description": "Delete one localized title/summary variant.", "operationId": "delete_translation_endpoint_records__record_id__translations__language___delete", "parameters": [ { "in": "path", "name": "record_id", "required": true, "schema": { "format": "uuid", "title": "Record Id", "type": "string" } }, { "description": "BCP 47 language tag, for example fr or pt-BR", "in": "path", "name": "language", "required": true, "schema": { "description": "BCP 47 language tag, for example fr or pt-BR", "maxLength": 35, "minLength": 2, "pattern": "^[A-Za-z]{2,3}(?:[-_][A-Za-z0-9]{2,8})*$", "title": "Language", "type": "string" } } ], "responses": { "204": { "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Delete Translation Endpoint", "tags": [ "Records" ] }, "put": { "description": "Create or replace one localized title/summary variant.", "operationId": "upsert_translation_endpoint_records__record_id__translations__language___put", "parameters": [ { "in": "path", "name": "record_id", "required": true, "schema": { "format": "uuid", "title": "Record Id", "type": "string" } }, { "description": "BCP 47 language tag, for example fr or pt-BR", "in": "path", "name": "language", "required": true, "schema": { "description": "BCP 47 language tag, for example fr or pt-BR", "maxLength": 35, "minLength": 2, "pattern": "^[A-Za-z]{2,3}(?:[-_][A-Za-z0-9]{2,8})*$", "title": "Language", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TranslationUpsert" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TranslationResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Upsert Translation Endpoint", "tags": [ "Records" ] } }, "/search/datasets/": { "get": { "description": "Search datasets with text, spatial, and faceted filters.", "operationId": "search_datasets_endpoint_search_datasets__get", "parameters": [ { "description": "Full-text search query", "in": "query", "name": "q", "required": false, "schema": { "anyOf": [ { "maxLength": 1000, "type": "string" }, { "type": "null" } ], "description": "Full-text search query", "title": "Q" } }, { "description": "Bounding box: minx,miny,maxx,maxy", "in": "query", "name": "bbox", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Bounding box: minx,miny,maxx,maxy", "title": "Bbox" } }, { "description": "Filter by keywords", "in": "query", "name": "keywords", "required": false, "schema": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "description": "Filter by keywords", "title": "Keywords" } }, { "description": "Filter by geometry type", "in": "query", "name": "geometry_type", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Filter by geometry type", "title": "Geometry Type" } }, { "description": "Filter by SRID", "in": "query", "name": "srid", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Filter by SRID", "title": "Srid" } }, { "description": "Filter by source organization", "in": "query", "name": "source_organization", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Filter by source organization", "title": "Source Organization" } }, { "description": "Filter by record type (vector_dataset, raster_dataset)", "in": "query", "name": "record_type", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Filter by record type (vector_dataset, raster_dataset)", "title": "Record Type" } }, { "description": "Filter created_at >=", "in": "query", "name": "date_from", "required": false, "schema": { "anyOf": [ { "format": "date", "type": "string" }, { "type": "null" } ], "description": "Filter created_at >=", "title": "Date From" } }, { "description": "Filter created_at <=", "in": "query", "name": "date_to", "required": false, "schema": { "anyOf": [ { "format": "date", "type": "string" }, { "type": "null" } ], "description": "Filter created_at <=", "title": "Date To" } }, { "description": "Filter data_vintage_start >=", "in": "query", "name": "vintage_start", "required": false, "schema": { "anyOf": [ { "format": "date", "type": "string" }, { "type": "null" } ], "description": "Filter data_vintage_start >=", "title": "Vintage Start" } }, { "description": "Filter data_vintage_end <=", "in": "query", "name": "vintage_end", "required": false, "schema": { "anyOf": [ { "format": "date", "type": "string" }, { "type": "null" } ], "description": "Filter data_vintage_end <=", "title": "Vintage End" } }, { "description": "Sort: relevance, date_added, name, last_updated", "in": "query", "name": "sort_by", "required": false, "schema": { "default": "relevance", "description": "Sort: relevance, date_added, name, last_updated", "title": "Sort By", "type": "string" } }, { "description": "Sort direction override", "in": "query", "name": "sort_desc", "required": false, "schema": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "description": "Sort direction override", "title": "Sort Desc" } }, { "description": "Pagination offset", "in": "query", "name": "offset", "required": false, "schema": { "default": 0, "description": "Pagination offset", "minimum": 0, "title": "Offset", "type": "integer" } }, { "description": "Page size. Values above the maximum (200) are clamped to it rather than rejected, per OGC API Features Core /req/core/fc-limit-response-1(C).", "in": "query", "name": "limit", "required": false, "schema": { "default": 10, "description": "Page size. Values above the maximum (200) are clamped to it rather than rejected, per OGC API Features Core /req/core/fc-limit-response-1(C).", "minimum": 1, "title": "Limit", "type": "integer" } }, { "description": "CQL2 filter expression", "in": "query", "name": "filter", "required": false, "schema": { "anyOf": [ { "maxLength": 10000, "type": "string" }, { "type": "null" } ], "description": "CQL2 filter expression", "title": "Filter" } }, { "description": "Filter language: cql2-text or cql2-json", "in": "query", "name": "filter-lang", "required": false, "schema": { "default": "cql2-text", "description": "Filter language: cql2-text or cql2-json", "title": "Filter-Lang", "type": "string" } }, { "description": "OGC datetime interval: instant, start/end, ../end, start/..", "in": "query", "name": "datetime", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "OGC datetime interval: instant, start/end, ../end, start/..", "title": "Datetime" } }, { "description": "Exclude synthetic/test datasets", "in": "query", "name": "exclude_synthetic", "required": false, "schema": { "default": true, "description": "Exclude synthetic/test datasets", "title": "Exclude Synthetic", "type": "boolean" } }, { "description": "Spatial predicate: intersects or within", "in": "query", "name": "spatial_predicate", "required": false, "schema": { "default": "intersects", "description": "Spatial predicate: intersects or within", "enum": [ "intersects", "within" ], "title": "Spatial Predicate", "type": "string" } }, { "description": "GeoJSON geometry for spatial filter", "in": "query", "name": "geometry", "required": false, "schema": { "anyOf": [ { "maxLength": 50000, "type": "string" }, { "type": "null" } ], "description": "GeoJSON geometry for spatial filter", "title": "Geometry" } }, { "description": "Filter by collection membership", "in": "query", "name": "collection_id", "required": false, "schema": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "description": "Filter by collection membership", "title": "Collection Id" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OGCFeatureCollectionResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Search Datasets Endpoint", "tags": [ "Search" ] } }, "/search/facets/": { "get": { "description": "Return record_type facet counts for the given filters.", "operationId": "search_facets_endpoint_search_facets__get", "parameters": [ { "description": "Full-text search query", "in": "query", "name": "q", "required": false, "schema": { "anyOf": [ { "maxLength": 1000, "type": "string" }, { "type": "null" } ], "description": "Full-text search query", "title": "Q" } }, { "description": "Bounding box: minx,miny,maxx,maxy", "in": "query", "name": "bbox", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Bounding box: minx,miny,maxx,maxy", "title": "Bbox" } }, { "description": "Filter by keywords", "in": "query", "name": "keywords", "required": false, "schema": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "description": "Filter by keywords", "title": "Keywords" } }, { "description": "Filter by geometry type", "in": "query", "name": "geometry_type", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Filter by geometry type", "title": "Geometry Type" } }, { "description": "Filter by SRID", "in": "query", "name": "srid", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Filter by SRID", "title": "Srid" } }, { "description": "Filter by source organization", "in": "query", "name": "source_organization", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Filter by source organization", "title": "Source Organization" } }, { "description": "OGC datetime interval", "in": "query", "name": "datetime", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "OGC datetime interval", "title": "Datetime" } }, { "description": "Exclude synthetic/test datasets", "in": "query", "name": "exclude_synthetic", "required": false, "schema": { "default": true, "description": "Exclude synthetic/test datasets", "title": "Exclude Synthetic", "type": "boolean" } }, { "description": "Spatial predicate: intersects or within", "in": "query", "name": "spatial_predicate", "required": false, "schema": { "default": "intersects", "description": "Spatial predicate: intersects or within", "enum": [ "intersects", "within" ], "title": "Spatial Predicate", "type": "string" } }, { "description": "GeoJSON geometry for spatial filter", "in": "query", "name": "geometry", "required": false, "schema": { "anyOf": [ { "maxLength": 10000, "type": "string" }, { "type": "null" } ], "description": "GeoJSON geometry for spatial filter", "title": "Geometry" } }, { "description": "Filter by collection membership", "in": "query", "name": "collection_id", "required": false, "schema": { "anyOf": [ { "format": "uuid", "type": "string" }, { "type": "null" } ], "description": "Filter by collection membership", "title": "Collection Id" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FacetCountResponse" } } }, "description": "Successful Response" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Search Facets Endpoint", "tags": [ "Search" ] } }, "/search/saved/": { "get": { "description": "List saved searches for the authenticated user.", "operationId": "list_saved_searches_endpoint_search_saved__get", "parameters": [ { "in": "query", "name": "skip", "required": false, "schema": { "default": 0, "minimum": 0, "title": "Skip", "type": "integer" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SavedSearchListResponse" } } }, "description": "Successful Response" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List Saved Searches Endpoint", "tags": [ "Search" ] }, "post": { "description": "Save a search query with a name for later reuse.", "operationId": "create_saved_search_endpoint_search_saved__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SavedSearchCreate" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SavedSearchResponse" } } }, "description": "Successful Response" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Create Saved Search Endpoint", "tags": [ "Search" ] } }, "/search/saved/{search_id}": { "delete": { "description": "Delete a saved search.", "operationId": "delete_saved_search_endpoint_search_saved__search_id__delete", "parameters": [ { "in": "path", "name": "search_id", "required": true, "schema": { "format": "uuid", "title": "Search Id", "type": "string" } } ], "responses": { "204": { "description": "Successful Response" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Delete Saved Search Endpoint", "tags": [ "Search" ] }, "get": { "description": "Get a single saved search by ID.", "operationId": "get_saved_search_endpoint_search_saved__search_id__get", "parameters": [ { "in": "path", "name": "search_id", "required": true, "schema": { "format": "uuid", "title": "Search Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SavedSearchResponse" } } }, "description": "Successful Response" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Saved Search Endpoint", "tags": [ "Search" ] } }, "/services/arcgis/signin/": { "post": { "description": "Sign in to an ArcGIS portal and return a short-lived token.\n\nAsks the portal's own token service for a token valid for 60 minutes and\nreturns it. Put that token in the `token` field on probe, preview, commit\nand refresh; an import that runs longer than the token lives fails with a\ncredential error and has to start over.\n\nAn account that signs in through an identity provider, or that has\nmultifactor authentication turned on, cannot use this. Paste a token or\nan API key instead. A portal on a private network is unreachable either\nway.", "operationId": "arcgis_signin_services_arcgis_signin__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ArcGISSignInRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ArcGISSignInResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0.0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "502": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad gateway \u2014 the ArcGIS portal could not be reached or did not answer with a sign-in response" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" }, "504": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Gateway timeout \u2014 the ArcGIS portal did not respond in time" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Arcgis Signin", "tags": [ "Datasets" ] } }, "/services/connectors/": { "get": { "description": "List persistent connectors supplied by an installed overlay.\n\nCommunity's no-op extension returns an empty list; one-shot WFS, OGC API,\nArcGIS, and STAC imports remain on their existing free endpoints.", "operationId": "list_connectors_endpoint_services_connectors__get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ConnectorListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List Connectors Endpoint", "tags": [ "Datasets" ] } }, "/services/connectors/{connector_name}/discover/": { "post": { "description": "Validate connector config and discover non-secret source resources.", "operationId": "discover_connector_resources_endpoint_services_connectors__connector_name__discover__post", "parameters": [ { "in": "path", "name": "connector_name", "required": true, "schema": { "title": "Connector Name", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ConnectorDiscoverRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ConnectorDiscoverResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "502": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad gateway \u2014 connector provider failed" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" }, "504": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Gateway timeout \u2014 connector provider timed out" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Discover Connector Resources Endpoint", "tags": [ "Datasets" ] } }, "/services/connectors/{connector_name}/ingest/": { "post": { "description": "Dispatch an overlay-owned ingest and return its opaque job id.", "operationId": "dispatch_connector_ingest_endpoint_services_connectors__connector_name__ingest__post", "parameters": [ { "in": "path", "name": "connector_name", "required": true, "schema": { "title": "Connector Name", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ConnectorIngestRequest" } } }, "required": true }, "responses": { "202": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ConnectorIngestResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "502": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad gateway \u2014 connector provider failed" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" }, "504": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Gateway timeout \u2014 connector provider timed out" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Dispatch Connector Ingest Endpoint", "tags": [ "Datasets" ] } }, "/services/preview/": { "post": { "description": "Preview a selected remote layer via ogrinfo and create a pending IngestJob.\n\nValidates the URL against SSRF, builds the GDAL driver source string,\nruns ogrinfo to extract metadata and sample rows, then creates an IngestJob\nready for the existing commit flow.", "operationId": "preview_service_layer_services_preview__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ServicePreviewRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ServicePreviewResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Preview Service Layer", "tags": [ "Datasets" ] } }, "/services/probe/": { "post": { "description": "Probe a remote service URL to detect its type and list available layers.\n\nValidates the URL against SSRF, detects whether it is a WFS or ArcGIS\nservice, and returns a unified layer list. All attempts are audit-logged.", "operationId": "probe_service_url_services_probe__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProbeRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProbeResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Probe Service Url", "tags": [ "Datasets" ] } }, "/services/stac/asset-sizes": { "post": { "description": "Look up the size of data assets whose item publishes no ``file:size``.\n\nAsks each asset's server for its length (HEAD, then a one-byte range\nrequest). A size the server does not report comes back as null.", "operationId": "stac_asset_sizes_services_stac_asset_sizes_post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StacAssetSizesRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StacAssetSizesResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" }, "504": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Gateway timeout \u2014 an upstream address check ran out of time" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Stac Asset Sizes", "tags": [ "STAC Import" ] } }, "/services/stac/collections": { "post": { "description": "List collections from a connected STAC API.\n\nAccepts a credential for a protected catalog, applied to this call.", "operationId": "stac_collections_services_stac_collections_post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StacConnectRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StacCollectionsResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "502": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad gateway \u2014 an upstream provider failed" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Stac Collections", "tags": [ "STAC Import" ] } }, "/services/stac/connect": { "post": { "description": "Connect to a STAC API and validate the endpoint.\n\nAccepts a credential for a protected catalog, applied to this call.", "operationId": "stac_connect_services_stac_connect_post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StacConnectRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StacConnectResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Stac Connect", "tags": [ "STAC Import" ] } }, "/services/stac/import": { "post": { "description": "Import selected STAC items as raster datasets.\n\nEach item is registered as a raster_dataset record referencing the\nremote COG asset URL. Titiler serves the tiles directly from the\nremote source \u2014 no file download required.", "operationId": "stac_import_services_stac_import_post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StacImportRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StacImportResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Stac Import", "tags": [ "STAC Import" ] } }, "/services/stac/search": { "post": { "description": "Search items in a STAC API with spatial/temporal filters.\n\nAccepts a credential for a protected catalog, applied to this call.", "operationId": "stac_search_services_stac_search_post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StacSearchRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StacSearchResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks write access" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "502": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad gateway \u2014 an upstream provider failed" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Stac Search", "tags": [ "STAC Import" ] } }, "/settings/": { "put": { "description": "Update one or more settings (admin only). Returns updated settings.", "operationId": "update_settings_settings__put", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SettingsUpdateRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SettingsAllResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 another embedding change holds the lock" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the embedding vector column could not be rebuilt" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Update Settings", "tags": [ "Admin" ] } }, "/settings/all/": { "get": { "description": "Return all settings grouped by tab with source indicators (admin only).", "operationId": "get_all_settings_settings_all__get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SettingsAllResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get All Settings", "tags": [ "Admin" ] } }, "/settings/api-key-status/": { "get": { "description": "Return which LLM API keys are configured (without exposing values).", "operationId": "get_api_key_status_settings_api_key_status__get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiKeyStatusResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Api Key Status", "tags": [ "Admin" ] } }, "/settings/basemaps/": { "get": { "description": "Return the configured basemap list (public, no auth required).\n\nBasemaps with ``{api_key}`` in the URL are filtered out when no key is\nconfigured. When a key IS set the placeholder is resolved server-side.\nThe response uses ``BasemapPublicResponse`` which excludes ``api_key``.\n\nThe resolved ``url`` field intentionally\nincludes the substituted ``api_key`` value when configured. Client-side\ntile-provider keys (Mapbox, Stadia, MapTiler) are designed for browser\nexposure and the frontend MUST receive them to load tiles. Do NOT put a\nbackend-only provider key in this field. Rotate the key in the\nprovider dashboard if it is misused. Rate-limited via\n``_basemap_proxy_rate_limit`` to cap replay-cost from anonymous clients.", "operationId": "get_basemaps_settings_basemaps__get", "responses": { "200": { "content": { "application/json": { "schema": { "items": { "$ref": "#/components/schemas/BasemapPublicResponse" }, "title": "Response Get Basemaps Settings Basemaps Get", "type": "array" } } }, "description": "Successful Response" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Get Basemaps", "tags": [ "Admin" ] } }, "/settings/branding/": { "get": { "description": "Return branding configuration (public, no auth required).\n\nThe active ``BrandingExtension`` provides initial defaults for branding\nkeys. PersistentConfig overrides take precedence when set. Community\nadvertises read-only ``show_badge`` only; badge-removal writes and\nadditional branding keys are restricted controls.", "operationId": "get_branding_settings_branding__get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BrandingResponse" } } }, "description": "Successful Response" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Get Branding", "tags": [ "Admin" ] } }, "/settings/config-mode/": { "get": { "description": "Return whether the app is in env-only config mode (public, no auth).", "operationId": "get_config_mode_settings_config_mode__get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ConfigModeResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" } }, "summary": "Get Config Mode", "tags": [ "Admin" ] } }, "/settings/detect-embedding-dims/": { "post": { "description": "Probe the configured embedding model and return its output dimensions.", "operationId": "detect_embedding_dims_settings_detect_embedding_dims__post", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DetectEmbeddingDimsResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "502": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad gateway \u2014 an upstream provider failed" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Detect Embedding Dims", "tags": [ "Admin" ] } }, "/settings/edition/": { "get": { "description": "Return runtime capability metadata. Public, no auth required.", "operationId": "edition_info_settings_edition__get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EditionInfoResponse" } } }, "description": "Successful Response" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" } }, "summary": "Get runtime capabilities", "tags": [ "Admin" ] } }, "/settings/enabled-plugins/": { "get": { "description": "Return enabled plugin IDs. null = no restriction (all shown), [] = none, [...ids] = only those.", "operationId": "get_enabled_plugins_settings_enabled_plugins__get", "responses": { "200": { "content": { "application/json": { "schema": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Response Get Enabled Plugins Settings Enabled Plugins Get" } } }, "description": "Successful Response" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Get Enabled Plugins", "tags": [ "Admin" ] } }, "/settings/enterprise-tabs/": { "get": { "description": "Return the canonical list of restricted Settings tab keys.\n\nThe frontend AdminSidebar uses this to avoid rendering tabs that the\ncurrent runtime does not expose. The backend write gate uses the same set\nto reject writes to restricted settings, keeping UI and API behavior\naligned.", "operationId": "get_enterprise_only_tabs_settings_enterprise_tabs__get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EnterpriseTabsResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List restricted settings tabs", "tags": [ "Admin" ] } }, "/settings/feature-flags/": { "get": { "description": "Return public feature flags (no auth required).", "operationId": "get_feature_flags_settings_feature_flags__get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FeatureFlagsResponse" } } }, "description": "Successful Response" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Get Feature Flags", "tags": [ "Admin" ] } }, "/settings/map-defaults/": { "get": { "description": "Return the default map center and zoom (public, no auth required).", "operationId": "get_map_defaults_settings_map_defaults__get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MapDefaultsResponse" } } }, "description": "Successful Response" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Get Map Defaults", "tags": [ "Admin" ] } }, "/settings/notifications/status/": { "get": { "description": "Return which notification channels are configured (booleans only \u2014 no secrets).\n\nMirrors get_api_key_status: returns presence flags derived from env/settings\nwithout ever echoing the SMTP password, webhook URL, or webhook secret\nwithout secrets.", "operationId": "get_notification_status_settings_notifications_status__get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationStatusResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Notification Status", "tags": [ "Admin" ] } }, "/settings/notifications/test/": { "post": { "description": "Send a canned test notification through each configured channel (admin only).\n\nMirrors detect_embedding_dims: admin-gated probe that reports per-channel\nreachable/error in a 200 body without leaking secrets or raising 5xx on a\nbad channel.\n\nPer-channel approach (not EnvConfiguredNotificationSink.deliver) is used so\neach channel's success/failure is captured in its own\nNotificationTestChannelResult for display in the admin UI.", "operationId": "send_test_notification_settings_notifications_test__post", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationTestResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Send Test Notification", "tags": [ "Admin" ] } }, "/settings/oauth-providers/": { "get": { "description": "List all OAuth providers (admin only).", "operationId": "list_oauth_providers_settings_oauth_providers__get", "responses": { "200": { "content": { "application/json": { "schema": { "items": { "$ref": "#/components/schemas/OAuthProviderResponse" }, "title": "Response List Oauth Providers Settings Oauth Providers Get", "type": "array" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "List Oauth Providers", "tags": [ "Admin" ] }, "post": { "description": "Create a new OAuth or SAML provider (admin only).\n\nAudit-log payload includes the full ``created`` snapshot with non-secret\nfields verbatim and ```` markers for secrets that were submitted\nin the request body.", "operationId": "create_oauth_provider_settings_oauth_providers__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OAuthProviderCreate" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OAuthProviderResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Create Oauth Provider", "tags": [ "Admin" ] } }, "/settings/oauth-providers/{provider_id}": { "delete": { "description": "Delete an OAuth or SAML provider (admin only).\n\nAudit-log payload contains a ``deleted`` snapshot with the pre-delete\nstate \u2014 non-secret fields verbatim, secret fields marked ````\nif they were previously set; the same redaction applies to delete events.", "operationId": "delete_oauth_provider_settings_oauth_providers__provider_id__delete", "parameters": [ { "in": "path", "name": "provider_id", "required": true, "schema": { "format": "uuid", "title": "Provider Id", "type": "string" } } ], "responses": { "204": { "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Delete Oauth Provider", "tags": [ "Admin" ] }, "put": { "description": "Update an existing OAuth or SAML provider (admin only).\n\nAudit-log payload contains ``details.changes`` with per-field\n``{\"old\": ..., \"new\": ...}`` diffs. Secret fields (idp_certificate,\nclient_secret_encrypted, client_secret) are redacted as\n``{\"old\": \"\", \"new\": \"\"}``.", "operationId": "update_oauth_provider_settings_oauth_providers__provider_id__put", "parameters": [ { "in": "path", "name": "provider_id", "required": true, "schema": { "format": "uuid", "title": "Provider Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OAuthProviderUpdate" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OAuthProviderResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 resource state prevents the operation" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Update Oauth Provider", "tags": [ "Admin" ] } }, "/settings/reset/": { "post": { "description": "Reset one or more settings to their defaults (admin only). Returns updated settings.", "operationId": "reset_settings_settings_reset__post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SettingsResetRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SettingsAllResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthorized \u2014 missing or invalid credentials" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Forbidden \u2014 caller lacks access to this resource" }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "409": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Conflict \u2014 another embedding change holds the lock" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the embedding vector column could not be rebuilt" } }, "security": [ { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Reset Settings", "tags": [ "Admin" ] } }, "/settings/tile-config/": { "get": { "description": "Return tile delivery configuration (public, no auth required).", "operationId": "get_tile_config_settings_tile_config__get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TileConfigResponse" } } }, "description": "Successful Response" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Get Tile Config", "tags": [ "Admin" ] } }, "/stac/": { "get": { "description": "STAC Catalog landing page.", "operationId": "landing_page_stac__get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StacCatalog" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid standards parameters" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Landing Page", "tags": [ "STAC" ] } }, "/stac/collections": { "get": { "description": "List all STAC Collections.", "operationId": "get_collections_stac_collections_get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StacCollectionListResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid standards parameters" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Get Collections", "tags": [ "STAC" ] } }, "/stac/collections/{collection_id}": { "get": { "description": "Get a single STAC Collection.", "operationId": "get_collection_stac_collections__collection_id__get", "parameters": [ { "in": "path", "name": "collection_id", "required": true, "schema": { "title": "Collection Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StacCollection" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid standards parameters" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "summary": "Get Collection", "tags": [ "STAC" ] } }, "/stac/collections/{collection_id}/items": { "get": { "description": "List STAC Items within a collection.", "operationId": "get_collection_items_stac_collections__collection_id__items_get", "parameters": [ { "in": "path", "name": "collection_id", "required": true, "schema": { "title": "Collection Id", "type": "string" } }, { "description": "Bounding box: west,south,east,north", "in": "query", "name": "bbox", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Bounding box: west,south,east,north", "title": "Bbox" } }, { "description": "OGC datetime interval", "in": "query", "name": "datetime", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "OGC datetime interval", "title": "Datetime" } }, { "description": "Maximum number of items returned. Values above 200 are clamped to 200, per the STAC Item Search spec's clamp-don't-reject recommendation.", "in": "query", "name": "limit", "required": false, "schema": { "default": 10, "description": "Maximum number of items returned. Values above 200 are clamped to 200, per the STAC Item Search spec's clamp-don't-reject recommendation.", "minimum": 1, "title": "Limit", "type": "integer" } }, { "description": "Legacy offset-based pagination. The page size is capped at 200; the rel=next link advances one page at a time, and a high offset is costly to serve.", "in": "query", "name": "offset", "required": false, "schema": { "default": 0, "description": "Legacy offset-based pagination. The page size is capped at 200; the rel=next link advances one page at a time, and a high offset is costly to serve.", "minimum": 0, "title": "Offset", "type": "integer" } } ], "responses": { "200": { "content": { "application/geo+json": { "schema": { "$ref": "#/components/schemas/StacItemCollectionResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Collection Items", "tags": [ "STAC" ] } }, "/stac/collections/{collection_id}/items/{item_id}": { "get": { "description": "Get a single STAC Item within a collection.", "operationId": "get_collection_item_stac_collections__collection_id__items__item_id__get", "parameters": [ { "in": "path", "name": "collection_id", "required": true, "schema": { "title": "Collection Id", "type": "string" } }, { "in": "path", "name": "item_id", "required": true, "schema": { "format": "uuid", "title": "Item Id", "type": "string" } } ], "responses": { "200": { "content": { "application/geo+json": { "schema": { "$ref": "#/components/schemas/StacItemResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid standards parameters" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Collection Item", "tags": [ "STAC" ] } }, "/stac/conformance": { "get": { "description": "STAC API conformance classes.", "operationId": "conformance_stac_conformance_get", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StacConformance" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid standards parameters" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" } }, "summary": "Conformance", "tags": [ "STAC" ] } }, "/stac/items/{item_id}": { "get": { "description": "Get a single STAC Item by dataset ID.", "operationId": "get_item_stac_items__item_id__get", "parameters": [ { "in": "path", "name": "item_id", "required": true, "schema": { "format": "uuid", "title": "Item Id", "type": "string" } } ], "responses": { "200": { "content": { "application/geo+json": { "schema": { "$ref": "#/components/schemas/StacItemResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid standards parameters" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Item", "tags": [ "STAC" ] } }, "/stac/search": { "get": { "description": "STAC Item Search (GET).", "operationId": "search_get_stac_search_get", "parameters": [ { "description": "Bounding box: west,south,east,north", "in": "query", "name": "bbox", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Bounding box: west,south,east,north", "title": "Bbox" } }, { "description": "OGC datetime interval", "in": "query", "name": "datetime", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "OGC datetime interval", "title": "Datetime" } }, { "description": "Comma-separated collection IDs", "in": "query", "name": "collections", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Comma-separated collection IDs", "title": "Collections" } }, { "description": "Comma-separated item IDs", "in": "query", "name": "ids", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Comma-separated item IDs", "title": "Ids" } }, { "description": "GeoJSON geometry for spatial intersection. At most 10000 characters, which fits a polygon of several hundred vertices at 2-decimal-place lat/lon coordinates.", "in": "query", "name": "intersects", "required": false, "schema": { "anyOf": [ { "maxLength": 10000, "type": "string" }, { "type": "null" } ], "description": "GeoJSON geometry for spatial intersection. At most 10000 characters, which fits a polygon of several hundred vertices at 2-decimal-place lat/lon coordinates.", "title": "Intersects" } }, { "description": "Maximum number of items returned. Values above 200 are clamped to 200, per the STAC Item Search spec's clamp-don't-reject recommendation.", "in": "query", "name": "limit", "required": false, "schema": { "default": 10, "description": "Maximum number of items returned. Values above 200 are clamped to 200, per the STAC Item Search spec's clamp-don't-reject recommendation.", "minimum": 1, "title": "Limit", "type": "integer" } }, { "description": "Legacy offset-based pagination. The page size is capped at 200; a high offset is costly to serve.", "in": "query", "name": "offset", "required": false, "schema": { "default": 0, "description": "Legacy offset-based pagination. The page size is capped at 200; a high offset is costly to serve.", "minimum": 0, "title": "Offset", "type": "integer" } } ], "responses": { "200": { "content": { "application/geo+json": { "schema": { "$ref": "#/components/schemas/StacItemCollectionResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Search Get", "tags": [ "STAC" ] }, "post": { "description": "STAC Item Search (POST with JSON body).", "operationId": "search_post_stac_search_post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StacSearchBody" } } }, "required": true }, "responses": { "200": { "content": { "application/geo+json": { "schema": { "$ref": "#/components/schemas/StacItemCollectionResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Search Post", "tags": [ "STAC" ] } }, "/tiles/clusters/{table_path}/{z}/{x}/{y}.pbf": { "get": { "description": "Serve a server-side clustered vector tile for a point dataset.\n\nURL pattern: ``/tiles/clusters/data.{table_name}/{z}/{x}/{y}.pbf``\n\nAuthorization matches the plain vector tile route, in three cases. A\npublic, published dataset is readable without credentials. A non-public\ndataset needs valid signature parameters (``sig``, ``exp``, ``scope``), an\nembed token scoped to it, or an API key (``X-Api-Key`` header or\n``api_key`` query parameter) or bearer token for a caller with access to\nit. It answers 403 to a request carrying none of these and 404 to a caller\nwithout access. A public dataset that is not yet published is readable by\nits owner, by an admin, with an embed token, or with valid signature\nparameters, and answers 404 to other callers, so a refusal keeps its\nexistence undisclosed. An unknown table is 404 too.\n\nA request that no capability authorized and that carried a credential which\ndid not resolve is refused with 401 rather than served as an anonymous\nread, so an expired token is rejected instead of being silently downgraded.\nA request sending no credential is served normally.\n\n``cluster_radius`` is a screen-pixel distance, the same units MapLibre's\n``clusterRadius`` uses, and ``cluster_max_zoom`` is the last zoom at which\nfeatures are grouped. ``cols`` works as it does on the vector route, and\nthe named columns are projected onto the unclustered features, so\ndata-driven styling and popups keep working here too.\n\nRequires a vector point dataset; another record type responds 400, as does\na malformed table path or an out-of-range tile coordinate.\n\nA tile holding no features answers 204, and a repeat request whose\n``If-None-Match`` matches answers 304. Where a deployment runs cold storage,\na dataset still being restored answers 202 with a job id to poll. Requests\nanswer 429 with ``Retry-After`` when the per-process capacity for uncached\nrenders is full, tile-pool acquisition times out, a tile query exceeds the\npool's per-command timeout, or the configured per-tenant concurrency limit\nis exceeded. Any other failure serving the tile answers 503.", "operationId": "cluster_tile_endpoint_tiles_clusters__table_path___z___x___y__pbf_get", "parameters": [ { "in": "path", "name": "table_path", "required": true, "schema": { "title": "Table Path", "type": "string" } }, { "in": "path", "name": "z", "required": true, "schema": { "title": "Z", "type": "integer" } }, { "in": "path", "name": "x", "required": true, "schema": { "title": "X", "type": "integer" } }, { "in": "path", "name": "y", "required": true, "schema": { "title": "Y", "type": "integer" } }, { "in": "query", "name": "sig", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Sig" } }, { "in": "query", "name": "exp", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Exp" } }, { "in": "query", "name": "scope", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Scope" } }, { "in": "query", "name": "cols", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Cols" } }, { "in": "query", "name": "cluster_radius", "required": false, "schema": { "default": 48, "maximum": 256, "minimum": 1, "title": "Cluster Radius", "type": "integer" } }, { "in": "query", "name": "cluster_max_zoom", "required": false, "schema": { "default": 14, "maximum": 22, "minimum": 0, "title": "Cluster Max Zoom", "type": "integer" } } ], "responses": { "200": { "content": { "application/vnd.mapbox-vector-tile": { "schema": { "format": "binary", "type": "string" } } }, "description": "The vector tile" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset. Neither is sending an unresolvable credential alongside a capability that authorizes the request on its own \u2014 a valid X-Embed-Token or a valid signed tile template (sig, exp, scope). Those are served and the unrelated credential is ignored." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Cluster Tile Endpoint", "tags": [ "Tiles" ] } }, "/tiles/raster-proxy/{dataset_id}/{z}/{x}/{y}.{fmt}": { "get": { "description": "Render one raster tile and return the image.\n\nReturns the image itself rather than a redirect: the dataset is\nauthorized, then the rendered tile comes back in the response body. Used by\nthe development proxy and by deployments that run without nginx in front.\n\n``colormap_name`` applies a colormap to a single-band raster. Passing\n``gray`` leaves the rendering unchanged, and a digital elevation model\nignores the parameter, because its terrain encoding cannot be recoloured.\n\n``stretch`` chooses how pixel values map to the output range. ``minmax``\nkeeps the range the dataset already implies: the recorded per-band minimum\nand maximum for a raster imported from a remote source that published\nstatistics, the data range read from band statistics for floating-point\ndata, a range derived from the data type for other integer data, and no\nrescale parameter for 8-bit data, which needs none. ``percentile`` and\n``stddev`` instead derive a range from band statistics read at request\ntime, for up to three bands. A digital elevation model ignores the\nparameter, and so does a request whose band statistics cannot be read,\nwhich falls back to ``minmax`` rather than failing.\n\n``pmin`` and ``pmax`` (2 and 98 by default) are read when ``stretch`` is\n``percentile``, and ``sigma`` (2.0 by default) when it is ``stddev``. A\nparameter that does not apply to the selected stretch is ignored, and its\ndefault is used in place of the value sent.\n\nResponds 204 when the tile falls outside the raster, 400 for an\nunsupported format, 401 when authentication is required, or when a request\nthat no capability authorized carried a credential which did not resolve,\n403 when the embed token is invalid or expired\nor a multi-tenant request arrives with no tenant context, 422 for an\nout-of-range stretch parameter, and 503 when the renderer cannot be\nreached. A different failure from the renderer is passed through with its\nown status.\n\n404 covers more than a missing dataset. A dataset that is unknown, is not a\nraster or has no image answers 404. Where no capability authorized the\nrequest, so does a dataset the caller may not read: an authorization denial\non a non-public raster, and an unpublished raster asked for by a caller who\nis neither its owner nor an admin. That is deliberate, so a refusal keeps a\ndataset's existence undisclosed.", "operationId": "raster_tile_proxy_tiles_raster_proxy__dataset_id___z___x___y___fmt__get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } }, { "in": "path", "name": "z", "required": true, "schema": { "title": "Z", "type": "integer" } }, { "in": "path", "name": "x", "required": true, "schema": { "title": "X", "type": "integer" } }, { "in": "path", "name": "y", "required": true, "schema": { "title": "Y", "type": "integer" } }, { "in": "path", "name": "fmt", "required": true, "schema": { "title": "Fmt", "type": "string" } }, { "description": "Titiler colormap for single-band display", "in": "query", "name": "colormap_name", "required": false, "schema": { "anyOf": [ { "enum": [ "gray", "viridis", "inferno", "plasma", "magma", "ylorrd", "bugn", "terrain" ], "type": "string" }, { "type": "null" } ], "description": "Titiler colormap for single-band display", "title": "Colormap Name" } }, { "description": "Stretch strategy: minmax (default), percentile, stddev", "in": "query", "name": "stretch", "required": false, "schema": { "anyOf": [ { "enum": [ "minmax", "percentile", "stddev" ], "type": "string" }, { "type": "null" } ], "description": "Stretch strategy: minmax (default), percentile, stddev", "title": "Stretch" } }, { "description": "Lower percentile clip for stretch=percentile (0\u2013100, default 2). Absent = current p2 behavior. Must be less than pmax. Ignored, and not validated, when stretch is not percentile.", "in": "query", "name": "pmin", "required": false, "schema": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Lower percentile clip for stretch=percentile (0\u2013100, default 2). Absent = current p2 behavior. Must be less than pmax. Ignored, and not validated, when stretch is not percentile.", "title": "Pmin" } }, { "description": "Upper percentile clip for stretch=percentile (0\u2013100, default 98). Absent = current p98 behavior. Must be greater than pmin. Ignored, and not validated, when stretch is not percentile.", "in": "query", "name": "pmax", "required": false, "schema": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Upper percentile clip for stretch=percentile (0\u2013100, default 98). Absent = current p98 behavior. Must be greater than pmin. Ignored, and not validated, when stretch is not percentile.", "title": "Pmax" } }, { "description": "Standard-deviation multiplier for stretch=stddev (default 2.0). Absent = current 2.0\u03c3 behavior. Must be > 0. Ignored, and not validated, when stretch is not stddev.", "in": "query", "name": "sigma", "required": false, "schema": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Standard-deviation multiplier for stretch=stddev (default 2.0). Absent = current 2.0\u03c3 behavior. Must be > 0. Ignored, and not validated, when stretch is not stddev.", "title": "Sigma" } } ], "responses": { "200": { "content": { "image/jpeg": { "schema": { "format": "binary", "type": "string" } }, "image/png": { "schema": { "format": "binary", "type": "string" } }, "image/tiff": { "schema": { "format": "binary", "type": "string" } }, "image/webp": { "schema": { "format": "binary", "type": "string" } } }, "description": "The raster tile image" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset. Neither is sending an unresolvable credential alongside a capability that authorizes the request on its own \u2014 a valid X-Embed-Token or a valid signed tile template (sig, exp, scope). Those are served and the unrelated credential is ignored." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Raster Tile Proxy", "tags": [ "Tiles" ] } }, "/tiles/token/{dataset_id}/": { "get": { "description": "Generate a tile token for a dataset.\n\nFor vector datasets: returns HMAC-signed token (sig, exp, scope, expires_in).\nFor raster datasets: returns tile URL template and metadata.\n\nBoth responses include a discriminated ``kind`` field.\n\nPublic datasets can be accessed without authentication.\nPrivate/restricted datasets require authentication and RBAC checks.", "operationId": "get_tile_token_tiles_token__dataset_id___get", "parameters": [ { "in": "path", "name": "dataset_id", "required": true, "schema": { "format": "uuid", "title": "Dataset Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "anyOf": [ { "$ref": "#/components/schemas/VectorTileToken" }, { "$ref": "#/components/schemas/RasterTileToken" } ], "title": "Response Get Tile Token Tiles Token Dataset Id Get" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Tile Token", "tags": [ "Tiles" ] } }, "/tiles/tokens/": { "post": { "description": "Generate tile tokens for up to 50 datasets in one request.\n\nThe list must hold between 1 and 50 ids, and a request outside that is 422.\n\nOne round trip in place of one request per dataset, which is what a map\nwith many layers would otherwise need.\n\nA dataset that cannot be found or cannot be authorized does not fail the\nbatch: that id maps to ``{\"error\": \"...\"}`` in the response instead, so\ncheck each entry for an ``error`` key before using it. Duplicate ids are\ncollapsed.\n\nThe request as a whole still fails 401 in one case: a request that carried\na credential which did not resolve and that no capability authorized\nanswers 401 rather than a body of per-dataset errors. A request carrying no\ncredential is served normally.\n\n``X-Embed-Token`` is accepted as a fallback authorization for the datasets\ninside that token's scope, so an embedded map can build a terrain source\nfrom real bounds and zoom limits.", "operationId": "get_tile_tokens_batch_tiles_tokens__post", "parameters": [ { "in": "header", "name": "X-Embed-Token", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "X-Embed-Token" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TileTokenBatchRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TileTokenBatchResponse" } } }, "description": "Successful Response" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset. Neither is sending an unresolvable credential alongside a valid X-Embed-Token that authorizes the request on its own. That request is served and the unrelated credential is ignored." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Get Tile Tokens Batch", "tags": [ "Tiles" ] } }, "/tiles/{table_path}/{z}/{x}/{y}.pbf": { "get": { "description": "Serve a vector tile as gzipped MVT binary.\n\nURL pattern: ``/tiles/data.{table_name}/{z}/{x}/{y}.pbf``\n\nA public, published dataset is readable without credentials. A non-public\ndataset needs valid signature parameters (``sig``, ``exp``, ``scope``), an\nembed token scoped to it, or an API key (``X-Api-Key`` header or\n``api_key`` query parameter) or bearer token for a caller with access to\nit. It answers 403 to a request carrying none of these and 404 to a caller\nwithout access. A tile served on the caller's credentials is marked\nprivate, so no shared cache stores it, and a tile requested with\n``api_key`` in the query is never marked public. A public dataset that is\nnot yet published is readable by its owner, by an admin, with an embed\ntoken, or with valid signature parameters, and answers 404 to other\ncallers, so a refusal keeps its existence undisclosed. An unknown table is\n404 too, and so is a dataset without vector tiles, such as a raster, once\nthe caller is authorized to see it.\n\nA request that no capability authorized and that carried a credential which\ndid not resolve is refused with 401 rather than served as an anonymous\nread. A request sending no credential is served normally.\n\n`cols` is a runtime opt-in for additional attribute columns the client\nneeds at all zooms (e.g. data-driven styling columns referenced by\nMapLibre paint expressions). Format: comma-separated column names.\nEach name is validated against the dataset column list before it\nflows into the MVT projection; invalid names are silently dropped.\nDoes not need to be signed \u2014 `sig` already authorizes dataset\naccess and `cols` can only project columns the caller already has\nREST access to.\n\nA malformed table path or an out-of-range tile coordinate answers 400. A\ntile holding no features answers 204, and a repeat request whose\n``If-None-Match`` matches answers 304. Where a deployment runs cold storage,\na dataset still being restored answers 202 with a job id to poll. Requests\nanswer 429 with ``Retry-After`` when the per-process capacity for uncached\nrenders is full, tile-pool acquisition times out, a tile query exceeds the\npool's per-command timeout, or the configured per-tenant concurrency limit\nis exceeded. Any other failure serving the tile answers 503.", "operationId": "tile_endpoint_tiles__table_path___z___x___y__pbf_get", "parameters": [ { "in": "path", "name": "table_path", "required": true, "schema": { "title": "Table Path", "type": "string" } }, { "in": "path", "name": "z", "required": true, "schema": { "title": "Z", "type": "integer" } }, { "in": "path", "name": "x", "required": true, "schema": { "title": "X", "type": "integer" } }, { "in": "path", "name": "y", "required": true, "schema": { "title": "Y", "type": "integer" } }, { "in": "query", "name": "sig", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Sig" } }, { "in": "query", "name": "exp", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Exp" } }, { "in": "query", "name": "scope", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Scope" } }, { "in": "query", "name": "cols", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Cols" } } ], "responses": { "200": { "content": { "application/vnd.mapbox-vector-tile": { "schema": { "format": "binary", "type": "string" } } }, "description": "The vector tile" }, "400": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Bad request \u2014 invalid query parameters or payload" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Unauthenticated \u2014 a credential was supplied and could not be resolved (expired, revoked, or malformed). Sending no credential at all is not an error on these operations; they answer anonymously with the public subset. Neither is sending an unresolvable credential alongside a capability that authorizes the request on its own \u2014 a valid X-Embed-Token or a valid signed tile template (sig, exp, scope). Those are served and the unrelated credential is ignored." }, "404": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Not found" }, "422": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Validation error" }, "429": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Too many requests \u2014 retry after the advertised interval", "headers": { "Retry-After": { "description": "Seconds until the request may be retried", "schema": { "minimum": 0, "type": "integer" } } } }, "500": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Internal server error" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetail" } } }, "description": "Service unavailable \u2014 the database could not serve the request" } }, "security": [ {}, { "OAuth2PasswordBearer": [] }, { "ApiKeyHeader": [] }, { "ApiKeyQuery": [] } ], "summary": "Tile Endpoint", "tags": [ "Tiles" ] } } }, "tags": [ { "description": "OGC API Features endpoints: landing page, conformance, collections, and items. Compatible with QGIS, GDAL/ogr2ogr, and other OGC clients.", "name": "OGC Features" }, { "description": "Dataset management: upload, ingestion, CRUD, re-upload, versioning, export, and row/column access.", "name": "Datasets" }, { "description": "Per-dataset GeoJSON feature access and editing (CRUD).", "name": "Features" }, { "description": "Full-text, spatial, and faceted dataset search with CQL2 filtering.", "name": "Search" }, { "description": "Authentication: login, registration, API keys, and user profile.", "name": "Auth" }, { "description": "Administration: user management, catalog stats, site settings, jobs, and audit logs.", "name": "Admin" }, { "description": "Record sub-resources: contacts, keywords, and distributions.", "name": "Records" }, { "description": "Saved map configurations, layers, AI styling, and sharing.", "name": "Maps" }, { "description": "Configuration export, import, dry-run, and connectivity validation.", "name": "Config Ops" }, { "description": "Admin management of embed tokens across all maps.", "name": "Admin Embed Tokens" }, { "description": "Per-map embed token CRUD for iframe tile access.", "name": "Embed Tokens" }, { "description": "Vector and raster tile serving with HMAC-signed access tokens.", "name": "Tiles" }, { "description": "SpatioTemporal Asset Catalog API for published raster datasets.", "name": "STAC" }, { "description": "DCAT JSON-LD catalog export and COG download.", "name": "Datasets - Export" }, { "description": "Row access, validation, related datasets, and publication status.", "name": "Datasets - Data" }, { "description": "Attribute metadata, column stats, and FK relationships.", "name": "Datasets - Metadata" }, { "description": "Dataset re-upload with schema diff and atomic swap.", "name": "Datasets - Reupload" }, { "description": "VRT raster mosaic creation and management.", "name": "Datasets - VRT" } ], "x-geolens-standards-errors": "400-problem-details" }