{"openapi":"3.1.0","info":{"title":"Hydro-GIS Agent Platform","version":"4.0.0"},"paths":{"/admin/credits/search":{"get":{"summary":"Admin Credits Search","description":"Search users by email prefix or substring for the admin lookup autocomplete.","operationId":"admin_credits_search_admin_credits_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/credits/lookup":{"get":{"summary":"Admin Credits Lookup","operationId":"admin_credits_lookup_admin_credits_lookup_get","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","title":"Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/credits/grant":{"post":{"summary":"Admin Credits Grant","operationId":"admin_credits_grant_admin_credits_grant_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/credits/refund":{"post":{"summary":"Admin Credits Refund","operationId":"admin_credits_refund_admin_credits_refund_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats":{"get":{"summary":"Admin Stats","operationId":"admin_stats_admin_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/announcements":{"get":{"summary":"Admin Announcements List","description":"Return EVERY announcement (active, draft, expired) for the admin UI.","operationId":"admin_announcements_list_admin_announcements_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Admin Announcements Create","operationId":"admin_announcements_create_admin_announcements_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/announcements/{ann_id}":{"patch":{"summary":"Admin Announcements Update","operationId":"admin_announcements_update_admin_announcements__ann_id__patch","parameters":[{"name":"ann_id","in":"path","required":true,"schema":{"type":"string","title":"Ann Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Admin Announcements Delete","operationId":"admin_announcements_delete_admin_announcements__ann_id__delete","parameters":[{"name":"ann_id","in":"path","required":true,"schema":{"type":"string","title":"Ann Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/disabled_integrations":{"get":{"summary":"Api Disabled Integrations Get","description":"Return the globally-disabled integration ID set. Auth required so the","operationId":"api_disabled_integrations_get_api_admin_disabled_integrations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"summary":"Api Disabled Integrations Put","description":"Replace the globally-disabled integration set. Body: {ids: [...]}.","operationId":"api_disabled_integrations_put_api_admin_disabled_integrations_put","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/tier_integrations":{"get":{"summary":"Api Tier Integrations Get","description":"Per-tier disabled-integration map {tier: [ids]}. Auth required.","operationId":"api_tier_integrations_get_api_admin_tier_integrations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"summary":"Api Tier Integrations Put","description":"Replace the per-tier disabled map. Body: {map: {tier: [ids]}}. Dev-only.","operationId":"api_tier_integrations_put_api_admin_tier_integrations_put","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/global_model":{"get":{"summary":"Api Global Model Get","description":"Return the admin-set default model.","operationId":"api_global_model_get_api_admin_global_model_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"summary":"Api Global Model Put","description":"Set the global default model. Body: {model: 'auto'|'haiku'|'sonnet'}.","operationId":"api_global_model_put_api_admin_global_model_put","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/storage":{"get":{"summary":"Api Admin Storage","description":"Dev-gated alias of /api/me/storage retained for the IntegrationsPanel","operationId":"api_admin_storage_api_admin_storage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/storage/purge-orphans":{"post":{"summary":"Api Admin Storage Purge Orphans","description":"Delete on-disk files that aren't referenced by ANY live session","operationId":"api_admin_storage_purge_orphans_api_admin_storage_purge_orphans_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/pricing":{"get":{"summary":"Api Pricing Get","description":"The active pricing config: one markup, plus the base rate per tier.","operationId":"api_pricing_get_api_admin_pricing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"summary":"Api Pricing Put","description":"Set the markup and/or base rates.","operationId":"api_pricing_put_api_admin_pricing_put","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/mpc_health":{"get":{"summary":"Api Admin Mpc Health","description":"Verify the Microsoft Planetary Computer STAC integration is reachable","operationId":"api_admin_mpc_health_api_admin_mpc_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/era5_health":{"get":{"summary":"Api Admin Era5 Health","description":"Verify the ERA5 / Copernicus CDS integration is configured.","operationId":"api_admin_era5_health_api_admin_era5_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/fly/machines":{"get":{"summary":"Api Admin Fly Machines","description":"List Fly machines (api + worker apps), shaped for the dashboard.","operationId":"api_admin_fly_machines_api_admin_fly_machines_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/fly/events":{"get":{"summary":"Api Admin Fly Events","description":"Cross-app feed of OOM / non-zero-exit / restart events, newest first.","operationId":"api_admin_fly_events_api_admin_fly_events_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":25,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/fly/metrics":{"get":{"summary":"Api Admin Fly Metrics","description":"Per-machine time-series via Fly Prometheus. kind ∈ {memory, cpu}.","operationId":"api_admin_fly_metrics_api_admin_fly_metrics_get","parameters":[{"name":"app","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App"}},{"name":"kind","in":"query","required":false,"schema":{"type":"string","default":"memory","title":"Kind"}},{"name":"minutes","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Minutes"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/concurrency":{"get":{"summary":"Api Admin Concurrency","description":"Live concurrency state for THIS worker (caps + active counters).","operationId":"api_admin_concurrency_api_admin_concurrency_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/process":{"get":{"summary":"Api Admin Process","description":"psutil snapshot of THIS uvicorn worker: RSS, CPU%, threads, uptime.","operationId":"api_admin_process_api_admin_process_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/cost":{"get":{"summary":"Api Admin Cost","description":"Per-day Anthropic cost aggregation, sourced from the canonical credit_ledger table.","operationId":"api_admin_cost_api_admin_cost_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":7,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/fly/sizing":{"get":{"summary":"Api Admin Fly Sizing","description":"Current machine memory, the sizes offered, and the slots each would buy.","operationId":"api_admin_fly_sizing_api_admin_fly_sizing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/fly/resize":{"post":{"summary":"Api Admin Fly Resize","description":"Resize ONE machine. Fly has no live resize, so this RESTARTS it.","operationId":"api_admin_fly_resize_api_admin_fly_resize_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/fly/logs/ticket":{"post":{"summary":"Api Admin Fly Logs Ticket","description":"Mint a one-minute credential for the log stream.\n\nAuthenticated the normal way, with the bearer token in a header where it\nbelongs; the caller then puts only the returned ticket in the EventSource\nURL.","operationId":"api_admin_fly_logs_ticket_api_admin_fly_logs_ticket_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/fly/logs/stream":{"get":{"summary":"Api Admin Fly Logs Stream","description":"SSE log stream — shells out to `flyctl logs --json` and emits one line per log event.","operationId":"api_admin_fly_logs_stream_api_admin_fly_logs_stream_get","parameters":[{"name":"app","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App"}},{"name":"machine","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Machine"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp-files/{rid}/{filename}":{"get":{"summary":"Download Mcp File","description":"Public capability-URL download for EXTERNAL MCP tool outputs.","operationId":"download_mcp_file_mcp_files__rid___filename__get","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}},{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/files/s/{session_id}/{filename}":{"get":{"summary":"Download File Session","description":"Session-scoped file serve with R2 fallback. Disk-hit is fast path; if the","operationId":"download_file_session_files_s__session_id___filename__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/s/{session_id}/{filename}":{"get":{"summary":"Preview File Session","description":"Session-scoped inline preview (no attachment header) with R2 fallback.","operationId":"preview_file_session_preview_s__session_id___filename__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/files/{filename}":{"get":{"summary":"Download File","description":"Authenticated result download with legacy URL compatibility.","operationId":"download_file_files__filename__get","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/{filename}":{"get":{"summary":"Preview File","description":"Inline (no download prompt) variant of /files, for iframe / <img>","operationId":"preview_file_preview__filename__get","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cog/info":{"get":{"summary":"Cog Info","description":"COG metadata for mounting a tile layer: true WGS84 bounds, native zoom","operationId":"cog_info_cog_info_get","parameters":[{"name":"src","in":"query","required":true,"schema":{"type":"string","title":"Src"}},{"name":"session_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Session Id"}},{"name":"exp","in":"query","required":false,"schema":{"type":"string","default":"","title":"Exp"}},{"name":"sig","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sig"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cog/categories":{"get":{"summary":"Cog Categories","description":"Class legend ([{value,color}]) render_tile draws for the given mode, so the","operationId":"cog_categories_cog_categories_get","parameters":[{"name":"src","in":"query","required":true,"schema":{"type":"string","title":"Src"}},{"name":"session_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Session Id"}},{"name":"palette","in":"query","required":false,"schema":{"type":"string","default":"","title":"Palette"}},{"name":"exp","in":"query","required":false,"schema":{"type":"string","default":"","title":"Exp"}},{"name":"sig","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sig"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/raster/point":{"get":{"summary":"Raster Point","description":"The raster's value under a click: a COG by the signed `src` its tiles carry, a\nbaked overlay by its source `file` under the caller's own session.","operationId":"raster_point_raster_point_get","parameters":[{"name":"lon","in":"query","required":true,"schema":{"type":"number","title":"Lon"}},{"name":"lat","in":"query","required":true,"schema":{"type":"number","title":"Lat"}},{"name":"src","in":"query","required":false,"schema":{"type":"string","default":"","title":"Src"}},{"name":"file","in":"query","required":false,"schema":{"type":"string","default":"","title":"File"}},{"name":"session_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Session Id"}},{"name":"exp","in":"query","required":false,"schema":{"type":"string","default":"","title":"Exp"}},{"name":"sig","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sig"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cog/tiles/{z}/{x}/{y}.png":{"get":{"summary":"Cog Tile","description":"One Web-Mercator XYZ tile rendered from the COG. 204 when the tile is","operationId":"cog_tile_cog_tiles__z___x___y__png_get","parameters":[{"name":"z","in":"path","required":true,"schema":{"type":"integer","title":"Z"}},{"name":"x","in":"path","required":true,"schema":{"type":"integer","title":"X"}},{"name":"y","in":"path","required":true,"schema":{"type":"integer","title":"Y"}},{"name":"src","in":"query","required":true,"schema":{"type":"string","title":"Src"}},{"name":"session_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Session Id"}},{"name":"exp","in":"query","required":false,"schema":{"type":"string","default":"","title":"Exp"}},{"name":"sig","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sig"}},{"name":"colormap","in":"query","required":false,"schema":{"type":"string","default":"","title":"Colormap"}},{"name":"rescale","in":"query","required":false,"schema":{"type":"string","default":"","title":"Rescale"}},{"name":"categorical","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Categorical"}},{"name":"palette","in":"query","required":false,"schema":{"type":"string","default":"","title":"Palette"}},{"name":"style","in":"query","required":false,"schema":{"type":"string","default":"","title":"Style"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/parquet/info":{"get":{"summary":"Parquet Info","description":"Cheap metadata for a (Geo)Parquet streaming layer: feature count,","operationId":"parquet_info_parquet_info_get","parameters":[{"name":"src","in":"query","required":true,"schema":{"type":"string","title":"Src"}},{"name":"session_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Session Id"}},{"name":"exp","in":"query","required":false,"schema":{"type":"string","default":"","title":"Exp"}},{"name":"sig","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sig"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/parquet/columns":{"get":{"summary":"Parquet Columns","description":"Every column of a streamed layer, read from the file's schema.\n\nThe panel and the label picker used to learn a layer's columns by sampling features —\nwhich carry at most 50 properties — so a column past that cap did not exist as far as\nthe app was concerned, however plainly it sat in the file.","operationId":"parquet_columns_parquet_columns_get","parameters":[{"name":"src","in":"query","required":true,"schema":{"type":"string","title":"Src"}},{"name":"session_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Session Id"}},{"name":"exp","in":"query","required":false,"schema":{"type":"string","default":"","title":"Exp"}},{"name":"sig","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sig"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/parquet/features":{"get":{"summary":"Parquet Features","description":"GeoJSON FeatureCollection of features in `bbox` (w,s,e,n WGS84), read","operationId":"parquet_features_parquet_features_get","parameters":[{"name":"src","in":"query","required":true,"schema":{"type":"string","title":"Src"}},{"name":"bbox","in":"query","required":true,"schema":{"type":"string","title":"Bbox"}},{"name":"session_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Session Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10000,"title":"Limit"}},{"name":"exp","in":"query","required":false,"schema":{"type":"string","default":"","title":"Exp"}},{"name":"sig","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sig"}},{"name":"simplify","in":"query","required":false,"schema":{"type":"number","default":0.0,"title":"Simplify"}},{"name":"props","in":"query","required":false,"schema":{"type":"string","default":"","title":"Props"}},{"name":"max_props","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Max Props"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cog/preview.png":{"get":{"summary":"Cog Preview","description":"One low-res full-extent PNG (Web Mercator) used as the always-present backdrop under a COG tile layer, so zoom/pan never flashes empty tiles.","operationId":"cog_preview_cog_preview_png_get","parameters":[{"name":"src","in":"query","required":true,"schema":{"type":"string","title":"Src"}},{"name":"session_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Session Id"}},{"name":"colormap","in":"query","required":false,"schema":{"type":"string","default":"","title":"Colormap"}},{"name":"rescale","in":"query","required":false,"schema":{"type":"string","default":"","title":"Rescale"}},{"name":"exp","in":"query","required":false,"schema":{"type":"string","default":"","title":"Exp"}},{"name":"sig","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sig"}},{"name":"categorical","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Categorical"}},{"name":"palette","in":"query","required":false,"schema":{"type":"string","default":"","title":"Palette"}},{"name":"style","in":"query","required":false,"schema":{"type":"string","default":"","title":"Style"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/upload":{"post":{"summary":"Upload Spatial File","description":"Accept a spatial file, process it, return a map layer spec.","operationId":"upload_spatial_file_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_spatial_file_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/recolor":{"get":{"summary":"Recolor Raster","description":"Re-render a previously uploaded raster with a different style — the flat\ncolormap / range / palette, or an expression style's `raster-color` (`style`,\nJSON), painted by the same painter the COG tiles use.","operationId":"recolor_raster_recolor_get","parameters":[{"name":"file","in":"query","required":true,"schema":{"type":"string","title":"File"}},{"name":"session_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Session Id"}},{"name":"cmap","in":"query","required":false,"schema":{"type":"string","default":"terrain","title":"Cmap"}},{"name":"vmin","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vmin"}},{"name":"vmax","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vmax"}},{"name":"palette","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Palette"}},{"name":"class_colors","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Colors"}},{"name":"style","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Style"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/credits/balance":{"get":{"summary":"Api Credits Balance","operationId":"api_credits_balance_api_credits_balance_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/credits/config":{"get":{"summary":"Api Credits Config","description":"Public-to-logged-in: the available credit packs and whether Stripe","operationId":"api_credits_config_api_credits_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/credits/checkout":{"post":{"summary":"Api Credits Checkout","description":"Create a Stripe Checkout Session for a credit pack and return its URL.","operationId":"api_credits_checkout_api_credits_checkout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/credits/subscribe":{"post":{"summary":"Api Credits Subscribe","description":"Create a Stripe Checkout Session for the Pro subscription ($22/mo,","operationId":"api_credits_subscribe_api_credits_subscribe_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/credits/subscription":{"get":{"summary":"Api Credits Subscription Status","description":"Pro subscription state for the signed-in account (drives the card UI).","operationId":"api_credits_subscription_status_api_credits_subscription_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/credits/subscription/resume":{"post":{"summary":"Api Credits Subscription Resume","description":"Undo a pending cancellation (cancel_at_period_end=False) — standard","operationId":"api_credits_subscription_resume_api_credits_subscription_resume_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/credits/subscription/cancel":{"post":{"summary":"Api Credits Subscription Cancel","description":"Cancel Pro at period end (user keeps Pro until the cycle closes, then","operationId":"api_credits_subscription_cancel_api_credits_subscription_cancel_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/stripe/webhook":{"post":{"summary":"Api Stripe Webhook","description":"Stripe -> us. Verifies the signature, then credits the ledger on a paid","operationId":"api_stripe_webhook_api_stripe_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/sessions/{session_id}/files":{"get":{"summary":"Api Session Files","description":"Return all files recorded for a session.","operationId":"api_session_files_api_sessions__session_id__files_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Api Session Files Add","description":"Register a file as permanent in the session.","operationId":"api_session_files_add_api_sessions__session_id__files_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions/{session_id}/files/{filename}/load-as-layer":{"post":{"summary":"Api Session File Load As Layer","description":"Build a map-layer spec from a file that ALREADY lives in this session.","operationId":"api_session_file_load_as_layer_api_sessions__session_id__files__filename__load_as_layer_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions/{session_id}/files/{filename}":{"delete":{"summary":"Api Session File Delete","description":"Delete a file from a session: removes the on-disk copy in","operationId":"api_session_file_delete_api_sessions__session_id__files__filename__delete","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions/{session_id}/remote-layer":{"post":{"summary":"Api Register Remote Layer","description":"Register a remote/streamed layer (COG tiles, pmtiles, vector_stream) in the","operationId":"api_register_remote_layer_api_sessions__session_id__remote_layer_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions/{session_id}/files/save-geojson":{"post":{"summary":"Api Session Save Geojson","description":"Save inline GeoJSON (drawn AOIs, points) to results/ and record in","operationId":"api_session_save_geojson_api_sessions__session_id__files_save_geojson_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions/{session_id}/files/download":{"get":{"summary":"Api Session Files Download","description":"Zip all session files and stream as a download.","operationId":"api_session_files_download_api_sessions__session_id__files_download_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"title","in":"query","required":false,"schema":{"type":"string","default":"session","title":"Title"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/session/{session_id}":{"delete":{"summary":"Delete Session","description":"Wipe the SDK session file of an ANONYMOUS chat.","operationId":"delete_session_session__session_id__delete","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions/{session_id}":{"patch":{"summary":"Api Session Patch","operationId":"api_session_patch_api_sessions__session_id__patch","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Api Session Delete","operationId":"api_session_delete_api_sessions__session_id__delete","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Api Session Get","operationId":"api_session_get_api_sessions__session_id__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions":{"delete":{"summary":"Api Sessions Delete All","description":"Delete every session (and cascaded messages/layers/artifacts) for the authenticated user.","operationId":"api_sessions_delete_all_api_sessions_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"get":{"summary":"Api Sessions List","operationId":"api_sessions_list_api_sessions_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Api Sessions Create","operationId":"api_sessions_create_api_sessions_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/sessions/{session_id}/messages":{"post":{"summary":"Api Messages Append","operationId":"api_messages_append_api_sessions__session_id__messages_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions/{session_id}/resign":{"post":{"summary":"Api Resign Paths","description":"Mint fresh signatures for this session's tile/feature paths.\n\nA signed path carries an `exp` and is stored on the layer, so a map reopened after\nTILE_URL_TTL_SECONDS (6 h) streamed 403s on every viewport fetch, for ever: the\nsignature had expired and nothing ever minted another. The capability is short-lived\non purpose; what was missing was a way to renew it. Ownership is proven here, by the\nsession auth, exactly as it is for every other route on this session.\n\nTakes {\"paths\": [\"/parquet/features?src=...\", ...]} and returns them re-signed, in\norder, dropping any that name a different session.","operationId":"api_resign_paths_api_sessions__session_id__resign_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions/{session_id}/layers":{"put":{"summary":"Api Layers Replace","operationId":"api_layers_replace_api_sessions__session_id__layers_put","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions/{session_id}/map-state-reply/{request_id}":{"post":{"summary":"Api Map State Reply","description":"The frontend's reply to a live get_map_state request.","operationId":"api_map_state_reply_api_sessions__session_id__map_state_reply__request_id__post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions/{session_id}/artifacts/presign-upload":{"post":{"summary":"Api Artifact Presign Upload","operationId":"api_artifact_presign_upload_api_sessions__session_id__artifacts_presign_upload_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions/{session_id}/artifacts/upload":{"post":{"summary":"Api Artifact Upload","description":"Upload artifact data server-side to R2 (avoids browser CORS issues with direct S3 PUTs).","operationId":"api_artifact_upload_api_sessions__session_id__artifacts_upload_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions/{session_id}/snapshot":{"put":{"summary":"Api Session Snapshot Put","description":"Store the full message history snapshot (with rich UI fields) in R2.","operationId":"api_session_snapshot_put_api_sessions__session_id__snapshot_put","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Api Session Snapshot Get","description":"Retrieve the full message history snapshot from R2 for cross-device restore.","operationId":"api_session_snapshot_get_api_sessions__session_id__snapshot_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions/{session_id}/share":{"post":{"summary":"Api Share Publish","description":"Publish the map as it is now. Creates the share the first time; every\nlater call is an \"Update\" — same link, new snapshot.","operationId":"api_share_publish_api_sessions__session_id__share_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Api Share Status","operationId":"api_share_status_api_sessions__session_id__share_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Api Share Revoke","operationId":"api_share_revoke_api_sessions__session_id__share_delete","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions/{session_id}/share-snapshot-reply/{request_id}":{"post":{"summary":"Api Share Snapshot Reply","description":"The browser's answer to a live snapshot request from the agent's\nshare_map tool. Rides the same waiter registry as get_map_state.","operationId":"api_share_snapshot_reply_api_sessions__session_id__share_snapshot_reply__request_id__post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shared/{slug}":{"get":{"summary":"Api Shared Get","operationId":"api_shared_get_api_shared__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shared/{slug}/session":{"get":{"summary":"Api Shared Session","description":"The chat a shared map came from — for its author only, so the credit on the\nshared page can open it for editing. Anyone else, signed in or not, gets the same\n404 an unknown slug gets: whether a map is theirs is not told.","operationId":"api_shared_session_api_shared__slug__session_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shared/{slug}/version":{"get":{"summary":"Api Shared Version","description":"What an open viewer polls to learn the owner clicked Update: the\npublished_at stamp alone, a few bytes, no view counted. 404 once the\nlink is turned off, which the viewer shows as such.\n\nSelects two COLUMNS, not the row: the snapshot is megabytes of JSONB and\nevery open tab asks for this every few seconds.","operationId":"api_shared_version_api_shared__slug__version_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shared/{slug}/file/{filename}":{"get":{"summary":"Api Shared File","description":"Serve one session file to a viewer — only a file the published snapshot\npoints at. The share is not a key to the session directory.","operationId":"api_shared_file_api_shared__slug__file__filename__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions/{session_id}/layout":{"get":{"summary":"Api Layout Get","operationId":"api_layout_get_api_sessions__session_id__layout_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Api Layout Put","operationId":"api_layout_put_api_sessions__session_id__layout_put","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Api Layout Delete","operationId":"api_layout_delete_api_sessions__session_id__layout_delete","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions/{session_id}/layout-export/{request_id}":{"post":{"summary":"Api Layout Export Reply","description":"The browser's answer to the agent's export: the rendered page as a file, saved\ninto the session and handed to the waiting tool by request id. Without a file the\nbody is the reason (the browser could not render).","operationId":"api_layout_export_reply_api_sessions__session_id__layout_export__request_id__post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_api_layout_export_reply_api_sessions__session_id__layout_export__request_id__post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions/{session_id}/layout-check/{request_id}":{"post":{"summary":"Api Layout Check Reply","description":"The browser's answer to the agent's layout check: every item's rendered box, the\noverlaps and what runs off the page (and, after a tidy, what moved), as JSON.","operationId":"api_layout_check_reply_api_sessions__session_id__layout_check__request_id__post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions/{session_id}/map-look/{request_id}":{"post":{"summary":"Api Map Look Reply","operationId":"api_map_look_reply_api_sessions__session_id__map_look__request_id__post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_api_map_look_reply_api_sessions__session_id__map_look__request_id__post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/keys":{"get":{"summary":"Api Key List","operationId":"api_key_list_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Api Key Create","operationId":"api_key_create_api_keys_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/keys/{key_id}":{"delete":{"summary":"Api Key Revoke","operationId":"api_key_revoke_api_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me":{"get":{"summary":"Api Me","operationId":"api_me_api_me_get","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Refresh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/storage/summary":{"get":{"summary":"Api Me Storage Summary","description":"Just the two numbers the quota BANNER needs: used and quota.","operationId":"api_me_storage_summary_api_me_storage_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/me/storage":{"get":{"summary":"Api Me Storage","description":"Per-account storage breakdown for the authenticated user. Same shape","operationId":"api_me_storage_api_me_storage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/me/storage/bulk-delete":{"post":{"summary":"Api Me Storage Bulk Delete","description":"Bulk delete FILES owned by the authenticated account.","operationId":"api_me_storage_bulk_delete_api_me_storage_bulk_delete_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/announcements":{"get":{"summary":"Api Announcements","description":"Return announcements visible to the current viewer right now.","operationId":"api_announcements_api_announcements_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/artifacts/{artifact_id}/download":{"get":{"summary":"Api Artifact Download","description":"Server-side proxy: fetches the artifact from R2 and returns content to browser.","operationId":"api_artifact_download_api_artifacts__artifact_id__download_get","parameters":[{"name":"artifact_id","in":"path","required":true,"schema":{"type":"string","title":"Artifact Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/artifacts/{artifact_id}/presign-download":{"get":{"summary":"Api Artifact Presign Download","operationId":"api_artifact_presign_download_api_artifacts__artifact_id__presign_download_get","parameters":[{"name":"artifact_id","in":"path","required":true,"schema":{"type":"string","title":"Artifact Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/ensure-user":{"post":{"summary":"Api Auth Ensure User","operationId":"api_auth_ensure_user_api_auth_ensure_user_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/chat/title":{"post":{"summary":"Generate Chat Title","description":"Generate a short descriptive title for a chat session (used after first exchange).","operationId":"generate_chat_title_chat_title_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/dev/geo-tools":{"get":{"summary":"Api Geo Tools Get","description":"Developer-only. Return the GeoServer catalog plus each tool's effective","operationId":"api_geo_tools_get_api_dev_geo_tools_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"summary":"Api Geo Tools Put","description":"Developer-only. Set one tool's gate. Body: {name, state} where state is","operationId":"api_geo_tools_put_api_dev_geo_tools_put","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/integrations/probe":{"get":{"summary":"Probe Integration","description":"Server-side probe to avoid browser CORS issues.","operationId":"probe_integration_integrations_probe_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","title":"Url"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mcp/usage":{"get":{"summary":"Api Mcp Usage","description":"MCP-only usage (credits spent + call count) for the dashboard, read off","operationId":"api_mcp_usage_api_mcp_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/mcp/catalog":{"get":{"summary":"Api Mcp Catalog","description":"Public tool catalog + per-action credit prices (for the dashboard's","operationId":"api_mcp_catalog_api_mcp_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/chat":{"post":{"summary":"Chat","operationId":"chat_chat_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/chat/stop":{"post":{"summary":"Chat Stop","description":"Cancel an in-flight chat run for a session. Used by the frontend's","operationId":"chat_stop_chat_stop_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/chat/resume":{"get":{"summary":"Chat Resume","description":"Reconnect to an in-flight (or recently completed) chat run.","operationId":"chat_resume_chat_resume_get","parameters":[{"name":"session_id","in":"query","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"from_seq","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"From Seq"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prewarm":{"post":{"summary":"Api Prewarm","operationId":"api_prewarm_api_prewarm_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","description":"Liveness.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health/ready":{"get":{"summary":"Health Ready","description":"Readiness: probes Postgres, R2 and Redis. For uptime monitoring and","operationId":"health_ready_health_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/metrics":{"get":{"summary":"Metrics Endpoint","description":"Scrapeable counters and gauges, behind the existing admin/developer auth.","operationId":"metrics_endpoint_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"Body_api_layout_export_reply_api_sessions__session_id__layout_export__request_id__post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"}},"type":"object","title":"Body_api_layout_export_reply_api_sessions__session_id__layout_export__request_id__post"},"Body_api_map_look_reply_api_sessions__session_id__map_look__request_id__post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"}},"type":"object","title":"Body_api_map_look_reply_api_sessions__session_id__map_look__request_id__post"},"Body_upload_spatial_file_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"session_id":{"type":"string","title":"Session Id","default":""}},"type":"object","required":["file"],"title":"Body_upload_spatial_file_upload_post"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}