{"openapi":"3.1.0","info":{"title":"Sentinel OS","description":"Unified physical-security backend for multi-tenant environments","version":"0.1.0"},"paths":{"/api/v1/screening/check":{"post":{"tags":["screening"],"summary":"Check","description":"Screen a single subject and return signal + risk score + flags.","operationId":"check_api_v1_screening_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScreeningRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScreeningResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/screening/batch":{"post":{"tags":["screening"],"summary":"Batch","description":"Screen a batch of subjects (e.g. a crew/passenger manifest).","operationId":"batch_api_v1_screening_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchScreeningRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchScreeningResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/screening/history":{"get":{"tags":["screening"],"summary":"History","description":"List recent PII-free screening results for the tenant.","operationId":"history_api_v1_screening_history_get","parameters":[{"name":"signal","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(green|yellow|red)$"},{"type":"null"}],"title":"Signal"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response History Api V1 Screening History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/screening/{check_id}":{"get":{"tags":["screening"],"summary":"Get Result","description":"Fetch a single stored (PII-free) screening result by id.","operationId":"get_result_api_v1_screening__check_id__get","parameters":[{"name":"check_id","in":"path","required":true,"schema":{"type":"string","title":"Check Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Result Api V1 Screening  Check Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/screening/seed-watchlist":{"post":{"tags":["screening"],"summary":"Seed Watchlist","description":"Seed the gate_watchlist_entities table with a curated demo watchlist.","operationId":"seed_watchlist_api_v1_screening_seed_watchlist_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Seed Watchlist Api V1 Screening Seed Watchlist Post"}}}}}}},"/api/v1/event-safety":{"get":{"tags":["event-safety"],"summary":"Event safety dashboard data","description":"Return the event-safety operations dashboard payload.\n\nThe dataset is identical across tenants (demo data); ``tenant_id`` is\naccepted for API compatibility with the original endpoint.","operationId":"event_safety_data_api_v1_event_safety_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Tenant identifier","default":"cable-protect","title":"Tenant Id"},"description":"Tenant identifier"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Event Safety Data Api V1 Event Safety Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/screening/adapters/booking":{"post":{"tags":["screening-adapters"],"summary":"Ingest Booking","description":"Accept a generic booking webhook, normalize it and trigger screening.\n\nIdempotent per ``(tenant_id, booking_reference)``: a duplicate delivery for\nthe same tenant/booking returns the original ``check_id`` without\nre-invoking screening.\n\nReturns ``202 Accepted`` with the resulting ``check_id``, resolved\n``vertical`` and a ``duplicate`` flag.","operationId":"ingest_booking_api_v1_screening_adapters_booking_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Ingest Booking Api V1 Screening Adapters Booking Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/screening/adapters/payment/{provider}":{"post":{"tags":["screening-adapters"],"summary":"Receive Payment Webhook","description":"Receive a provider payment webhook, hash it, and screen for fraud rings.","operationId":"receive_payment_webhook_api_v1_screening_adapters_payment__provider__post","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Raw"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Receive Payment Webhook Api V1 Screening Adapters Payment  Provider  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/screening/adapters/manifest":{"post":{"tags":["screening-adapters"],"summary":"Screen Manifest Endpoint","description":"Screen an IMO FAL crew/passenger manifest and return a vessel signal.","operationId":"screen_manifest_endpoint_api_v1_screening_adapters_manifest_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManifestScreenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VesselManifestResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tenants/available":{"get":{"tags":["tenants"],"summary":"List Available Tenants","description":"Return the available demo tenant IDs and names.\n\nNo authentication required. Used by the frontend tenant switcher.","operationId":"list_available_tenants_api_v1_tenants_available_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Available Tenants Api V1 Tenants Available Get"}}}}}}},"/api/v1/tenants":{"get":{"tags":["tenants"],"summary":"List Tenants","description":"List all tenants. Requires SUPER_ADMIN role.","operationId":"list_tenants_api_v1_tenants_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TenantResponse"},"type":"array","title":"Response List Tenants Api V1 Tenants Get"}}}}}},"post":{"tags":["tenants"],"summary":"Create Tenant","description":"Create a new tenant organisation. Requires SUPER_ADMIN role.","operationId":"create_tenant_api_v1_tenants_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tenants/{tenant_id}":{"get":{"tags":["tenants"],"summary":"Get Tenant","description":"Get a single tenant by ID. Requires SUPER_ADMIN role.","operationId":"get_tenant_api_v1_tenants__tenant_id__get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["tenants"],"summary":"Update Tenant","description":"Update an existing tenant (partial update). Requires SUPER_ADMIN role.","operationId":"update_tenant_api_v1_tenants__tenant_id__patch","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users":{"post":{"tags":["users"],"summary":"Create User","description":"Create a new user within a tenant.","operationId":"create_user_api_v1_users_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["users"],"summary":"List Users","description":"List users with optional tenant filter and pagination.","operationId":"list_users_api_v1_users_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tenant","title":"Tenant Id"},"description":"Filter by tenant"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserResponse"},"title":"Response List Users Api V1 Users Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}":{"get":{"tags":["users"],"summary":"Get User","description":"Retrieve a single user by ID.","operationId":"get_user_api_v1_users__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["users"],"summary":"Update User","description":"Partially update an existing user.","operationId":"update_user_api_v1_users__user_id__patch","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["users"],"summary":"Delete User","description":"Delete a user by ID.","operationId":"delete_user_api_v1_users__user_id__delete","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/environments":{"post":{"tags":["environments"],"summary":"Create Environment","description":"Create a new environment within a tenant.","operationId":"create_environment_api_v1_environments_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvironmentCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvironmentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["environments"],"summary":"List Environments","description":"List environments with optional tenant, type, and status filters.","operationId":"list_environments_api_v1_environments_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tenant (returns all when omitted)","title":"Tenant Id"},"description":"Filter by tenant (returns all when omitted)"},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by environment type","title":"Type"},"description":"Filter by environment type"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EnvironmentResponse"},"title":"Response List Environments Api V1 Environments Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/environments/{environment_id}":{"get":{"tags":["environments"],"summary":"Get Environment","description":"Retrieve a single environment by ID.","operationId":"get_environment_api_v1_environments__environment_id__get","parameters":[{"name":"environment_id","in":"path","required":true,"schema":{"type":"string","title":"Environment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvironmentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["environments"],"summary":"Update Environment","description":"Partially update an existing environment.","operationId":"update_environment_api_v1_environments__environment_id__patch","parameters":[{"name":"environment_id","in":"path","required":true,"schema":{"type":"string","title":"Environment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvironmentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvironmentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["environments"],"summary":"Delete Environment","description":"Delete an environment by ID.","operationId":"delete_environment_api_v1_environments__environment_id__delete","parameters":[{"name":"environment_id","in":"path","required":true,"schema":{"type":"string","title":"Environment Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/zones":{"post":{"tags":["zones"],"summary":"Create Zone","description":"Create a new operational zone within an environment.","operationId":"create_zone_api_v1_zones_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZoneCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZoneResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["zones"],"summary":"List Zones","description":"List zones for a given environment, scoped to tenant.","operationId":"list_zones_api_v1_zones_get","parameters":[{"name":"environment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Environment to list zones for","title":"Environment Id"},"description":"Environment to list zones for"},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant scope","title":"Tenant Id"},"description":"Tenant scope"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ZoneResponse"},"title":"Response List Zones Api V1 Zones Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/zones/{zone_id}":{"get":{"tags":["zones"],"summary":"Get Zone","description":"Retrieve a single zone by ID.","operationId":"get_zone_api_v1_zones__zone_id__get","parameters":[{"name":"zone_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Zone Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant scope","title":"Tenant Id"},"description":"Tenant scope"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZoneResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["zones"],"summary":"Update Zone","description":"Partially update an existing zone.","operationId":"update_zone_api_v1_zones__zone_id__patch","parameters":[{"name":"zone_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Zone Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant scope","title":"Tenant Id"},"description":"Tenant scope"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZoneUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZoneResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["zones"],"summary":"Delete Zone","description":"Delete a zone by ID.","operationId":"delete_zone_api_v1_zones__zone_id__delete","parameters":[{"name":"zone_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Zone Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant scope","title":"Tenant Id"},"description":"Tenant scope"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sensors":{"post":{"tags":["sensors"],"summary":"Create Sensor","description":"Create a new sensor within an environment.","operationId":"create_sensor_api_v1_sensors_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SensorCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SensorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["sensors"],"summary":"List Sensors","description":"List sensors, optionally filtered by environment and/or tenant.","operationId":"list_sensors_api_v1_sensors_get","parameters":[{"name":"environment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by environment","title":"Environment Id"},"description":"Filter by environment"},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tenant","title":"Tenant Id"},"description":"Filter by tenant"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SensorResponse"},"title":"Response List Sensors Api V1 Sensors Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sensors/{sensor_id}":{"get":{"tags":["sensors"],"summary":"Get Sensor","description":"Retrieve a single sensor by ID.","operationId":"get_sensor_api_v1_sensors__sensor_id__get","parameters":[{"name":"sensor_id","in":"path","required":true,"schema":{"type":"string","title":"Sensor Id"}},{"name":"environment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Scope to environment","title":"Environment Id"},"description":"Scope to environment"},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Scope to tenant","title":"Tenant Id"},"description":"Scope to tenant"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SensorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["sensors"],"summary":"Update Sensor","description":"Partially update an existing sensor.","operationId":"update_sensor_api_v1_sensors__sensor_id__patch","parameters":[{"name":"sensor_id","in":"path","required":true,"schema":{"type":"string","title":"Sensor Id"}},{"name":"environment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Scope to environment","title":"Environment Id"},"description":"Scope to environment"},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Scope to tenant","title":"Tenant Id"},"description":"Scope to tenant"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SensorUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SensorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sensors"],"summary":"Delete Sensor","description":"Delete a sensor by ID.","operationId":"delete_sensor_api_v1_sensors__sensor_id__delete","parameters":[{"name":"sensor_id","in":"path","required":true,"schema":{"type":"string","title":"Sensor Id"}},{"name":"environment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Scope to environment","title":"Environment Id"},"description":"Scope to environment"},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Scope to tenant","title":"Tenant Id"},"description":"Scope to tenant"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/events/stream":{"get":{"tags":["events"],"summary":"Stream Events","description":"Server-Sent Events endpoint for real-time event streaming.\n\nConnect with ``EventSource`` or ``curl -N`` to receive events as they\nare emitted. Events are polled from ZeroDB every 2 seconds.\n\nExample::\n\n    const es = new EventSource(\"/events/stream?event_type=sensor.reading\");\n    es.addEventListener(\"sensor.reading\", (e) => console.log(JSON.parse(e.data)));","operationId":"stream_events_api_v1_events_stream_get","parameters":[{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to a specific event type (e.g. sensor.reading)","title":"Event Type"},"description":"Filter to a specific event type (e.g. sensor.reading)"},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to a specific tenant","title":"Tenant Id"},"description":"Filter to a specific tenant"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/events":{"post":{"tags":["events"],"summary":"Create Event","description":"Ingest a single event from a sensor, API, or human reporter.","operationId":"create_event_api_v1_events_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["events"],"summary":"List Events","description":"List events with optional filters and pagination.","operationId":"list_events_api_v1_events_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tenant","title":"Tenant Id"},"description":"Filter by tenant"},{"name":"environment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by environment","title":"Environment Id"},"description":"Filter by environment"},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/EventType"},{"type":"null"}],"description":"Filter by event type","title":"Type"},"description":"Filter by event type"},{"name":"processed","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by processed flag","title":"Processed"},"description":"Filter by processed flag"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO datetime lower bound","title":"Start Date"},"description":"ISO datetime lower bound"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO datetime upper bound","title":"End Date"},"description":"ISO datetime upper bound"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EventResponse"},"title":"Response List Events Api V1 Events Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/events/batch":{"post":{"tags":["events"],"summary":"Create Events Batch","description":"Ingest up to 100 events in a single request.","operationId":"create_events_batch_api_v1_events_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventBatchCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/EventResponse"},"type":"array","title":"Response Create Events Batch Api V1 Events Batch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/events/{event_id}":{"get":{"tags":["events"],"summary":"Get Event","description":"Retrieve a single event by ID.","operationId":"get_event_api_v1_events__event_id__get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/events/{event_id}/processed":{"patch":{"tags":["events"],"summary":"Mark Event Processed","description":"Update the processed flag and optionally set threat_score / incident_id.","operationId":"mark_event_processed_api_v1_events__event_id__processed_patch","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventProcessedUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/incidents/voice":{"post":{"tags":["incidents"],"summary":"Create Voice Incident","description":"Accept audio, transcribe (placeholder), AI-extract fields, create draft incident.","operationId":"create_voice_incident_api_v1_incidents_voice_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceIncidentCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/incidents/{incident_id}/complete":{"patch":{"tags":["incidents"],"summary":"Complete Incident","description":"Fill missing fields with follow-up answers.","operationId":"complete_incident_api_v1_incidents__incident_id__complete_patch","parameters":[{"name":"incident_id","in":"path","required":true,"schema":{"type":"string","title":"Incident Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentComplete"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/incidents/{incident_id}/finalize":{"post":{"tags":["incidents"],"summary":"Finalize Incident","description":"Generate summary, set status=confirmed, finalize the incident.","operationId":"finalize_incident_api_v1_incidents__incident_id__finalize_post","parameters":[{"name":"incident_id","in":"path","required":true,"schema":{"type":"string","title":"Incident Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentFinalize"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/incidents/public":{"post":{"tags":["incidents"],"summary":"Create Public Incident","description":"Create an incident without authentication (anonymous/public reporting).\n\nRate limited to 10 requests per minute per IP.","operationId":"create_public_incident_api_v1_incidents_public_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicIncidentCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/incidents":{"get":{"tags":["incidents"],"summary":"List Incidents","description":"List incidents for the authenticated user's tenant with pagination and sorting.","operationId":"list_incidents_api_v1_incidents_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","description":"Field to sort by","default":"created_at","title":"Sort By"},"description":"Field to sort by"},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","default":"desc","title":"Sort Order"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by severity","title":"Severity"},"description":"Filter by severity"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/incidents/{incident_id}":{"get":{"tags":["incidents"],"summary":"Get Incident","description":"Fetch a single incident by ID with full detail.","operationId":"get_incident_api_v1_incidents__incident_id__get","parameters":[{"name":"incident_id","in":"path","required":true,"schema":{"type":"string","title":"Incident Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feed":{"get":{"tags":["incidents"],"summary":"Get Team Feed","description":"Recent activity feed for the authenticated user's tenant.","operationId":"get_team_feed_api_v1_feed_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FeedEntry"},"title":"Response Get Team Feed Api V1 Feed Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/incidents/{incident_id}/respond":{"patch":{"tags":["incidents"],"summary":"Respond To Incident","description":"Update response status, assign to user, add resolution notes.","operationId":"respond_to_incident_api_v1_incidents__incident_id__respond_patch","parameters":[{"name":"incident_id","in":"path","required":true,"schema":{"type":"string","title":"Incident Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentRespond"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/incidents/{incident_id}/acknowledge":{"post":{"tags":["incidents"],"summary":"Acknowledge Incident","description":"Validate acknowledgement token and mark incident as acknowledged.\n\nUses token-based auth (email link click) — no JWT required.","operationId":"acknowledge_incident_api_v1_incidents__incident_id__acknowledge_post","parameters":[{"name":"incident_id","in":"path","required":true,"schema":{"type":"string","title":"Incident Id"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","description":"Acknowledgement token from notification","title":"Token"},"description":"Acknowledgement token from notification"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/incidents/{incident_id}/escalate":{"patch":{"tags":["incidents"],"summary":"Escalate Incident","description":"Increment escalation level on an incident.","operationId":"escalate_incident_api_v1_incidents__incident_id__escalate_patch","parameters":[{"name":"incident_id","in":"path","required":true,"schema":{"type":"string","title":"Incident Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentEscalate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/audit-logs/{tenant_id}":{"get":{"tags":["audit-logs"],"summary":"List Audit Logs","description":"List audit logs for a tenant with optional filters and pagination.","operationId":"list_audit_logs_api_v1_audit_logs__tenant_id__get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by action, e.g. incident.created","title":"Action"},"description":"Filter by action, e.g. incident.created"},{"name":"resource_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by resource type, e.g. incident","title":"Resource Type"},"description":"Filter by resource type, e.g. incident"},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by user UUID","title":"User Id"},"description":"Filter by user UUID"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO datetime lower bound (inclusive)","title":"Start Date"},"description":"ISO datetime lower bound (inclusive)"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO datetime upper bound (inclusive)","title":"End Date"},"description":"ISO datetime upper bound (inclusive)"},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of records to skip","default":0,"title":"Skip"},"description":"Number of records to skip"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Max records to return","default":50,"title":"Limit"},"description":"Max records to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditLogListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/audit-logs/{tenant_id}/{log_id}":{"get":{"tags":["audit-logs"],"summary":"Get Audit Log","description":"Get a single audit log entry by ID, scoped to a tenant.","operationId":"get_audit_log_api_v1_audit_logs__tenant_id___log_id__get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"log_id","in":"path","required":true,"schema":{"type":"string","title":"Log Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditLogResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/environments/{environment_id}/infrastructure/upload":{"post":{"tags":["infrastructure"],"summary":"Upload Infrastructure File","description":"Upload an infrastructure data file (KML, KMZ, GeoJSON, shapefile).\n\nThe file is stored in ZeroDB Files and its geometries are extracted\nfor map overlay rendering.","operationId":"upload_infrastructure_file_api_v1_environments__environment_id__infrastructure_upload_post","parameters":[{"name":"environment_id","in":"path","required":true,"schema":{"type":"string","title":"Environment Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_infrastructure_file_api_v1_environments__environment_id__infrastructure_upload_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InfrastructureFileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/environments/{environment_id}/infrastructure":{"get":{"tags":["infrastructure"],"summary":"List Infrastructure Files","description":"List all uploaded infrastructure files for an environment.","operationId":"list_infrastructure_files_api_v1_environments__environment_id__infrastructure_get","parameters":[{"name":"environment_id","in":"path","required":true,"schema":{"type":"string","title":"Environment Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InfrastructureListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/environments/{environment_id}/infrastructure/{file_id}":{"delete":{"tags":["infrastructure"],"summary":"Delete Infrastructure File","description":"Remove an uploaded infrastructure file.","operationId":"delete_infrastructure_file_api_v1_environments__environment_id__infrastructure__file_id__delete","parameters":[{"name":"environment_id","in":"path","required":true,"schema":{"type":"string","title":"Environment Id"}},{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InfrastructureDeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tenants/{tenant_id}/config":{"get":{"tags":["Tenant Config"],"summary":"Get Tenant Config","description":"Return the current configuration for a tenant. Requires SUPER_ADMIN role.","operationId":"get_tenant_config_api_v1_tenants__tenant_id__config_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantConfig"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Tenant Config"],"summary":"Patch Tenant Config","description":"Update one or more config fields for a tenant. Requires SUPER_ADMIN role.\n\nOnly the fields included in the request body are changed;\nomitted fields keep their current values.","operationId":"patch_tenant_config_api_v1_tenants__tenant_id__config_patch","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantConfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantConfig"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reports/manual":{"post":{"tags":["reports"],"summary":"Submit Manual Report","description":"Accept a manual human report and pipe it through the event pipeline.\n\nThe report is converted to a standard event with type=manual_report and\nsource=human, then processed for geofence matching and threat scoring.","operationId":"submit_manual_report_api_v1_reports_manual_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManualReportCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManualReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/threats":{"get":{"tags":["analytics"],"summary":"Threat Timeseries","description":"Return threat score time-series aggregated by hour/day/week.","operationId":"threat_timeseries_api_v1_analytics_threats_get","parameters":[{"name":"zone_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by zone","title":"Zone Id"},"description":"Filter by zone"},{"name":"threat_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by event type","title":"Threat Type"},"description":"Filter by event type"},{"name":"environment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by environment","title":"Environment Id"},"description":"Filter by environment"},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tenant","title":"Tenant Id"},"description":"Filter by tenant"},{"name":"from_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO start date (default: 30 days ago)","title":"From Date"},"description":"ISO start date (default: 30 days ago)"},{"name":"to_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO end date (default: now)","title":"To Date"},"description":"ISO end date (default: now)"},{"name":"aggregation","in":"query","required":false,"schema":{"$ref":"#/components/schemas/Aggregation","description":"Time bucket size: hour, day, or week","default":"day"},"description":"Time bucket size: hour, day, or week"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreatTimeSeriesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/summary":{"get":{"tags":["analytics"],"summary":"Analytics Summary","description":"Return tenant-level analytics summary: incidents, response time, SLA compliance, threats by type.","operationId":"analytics_summary_api_v1_analytics_summary_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant ID (optional filter)","title":"Tenant Id"},"description":"Tenant ID (optional filter)"},{"name":"from_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO start date (default: 30 days ago)","title":"From Date"},"description":"ISO start date (default: 30 days ago)"},{"name":"to_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO end date (default: now)","title":"To Date"},"description":"ISO end date (default: now)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyticsSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/threat-libraries":{"post":{"tags":["threat-libraries"],"summary":"Create Threat Library","description":"Create a new threat library entry.","operationId":"create_threat_library_api_v1_threat_libraries_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreatLibraryCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreatLibraryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["threat-libraries"],"summary":"List Threat Libraries","description":"List threat library entries, optionally filtered by tenant and/or vertical.","operationId":"list_threat_libraries_api_v1_threat_libraries_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tenant (returns all when omitted)","title":"Tenant Id"},"description":"Filter by tenant (returns all when omitted)"},{"name":"vertical","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by vertical (maritime, security, infrastructure, defense)","title":"Vertical"},"description":"Filter by vertical (maritime, security, infrastructure, defense)"},{"name":"active_only","in":"query","required":false,"schema":{"type":"boolean","description":"Only return active entries","default":false,"title":"Active Only"},"description":"Only return active entries"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ThreatLibraryResponse"},"title":"Response List Threat Libraries Api V1 Threat Libraries Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/threat-libraries/{library_id}":{"get":{"tags":["threat-libraries"],"summary":"Get Threat Library","description":"Retrieve a single threat library entry by ID.","operationId":"get_threat_library_api_v1_threat_libraries__library_id__get","parameters":[{"name":"library_id","in":"path","required":true,"schema":{"type":"string","title":"Library Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Scope to tenant","title":"Tenant Id"},"description":"Scope to tenant"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreatLibraryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["threat-libraries"],"summary":"Update Threat Library","description":"Partially update an existing threat library entry.","operationId":"update_threat_library_api_v1_threat_libraries__library_id__patch","parameters":[{"name":"library_id","in":"path","required":true,"schema":{"type":"string","title":"Library Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Scope to tenant","title":"Tenant Id"},"description":"Scope to tenant"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreatLibraryUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreatLibraryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["threat-libraries"],"summary":"Delete Threat Library","description":"Delete a threat library entry by ID.","operationId":"delete_threat_library_api_v1_threat_libraries__library_id__delete","parameters":[{"name":"library_id","in":"path","required":true,"schema":{"type":"string","title":"Library Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Scope to tenant","title":"Tenant Id"},"description":"Scope to tenant"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/threat-libraries/seed":{"post":{"tags":["threat-libraries","admin"],"summary":"Seed Libraries","description":"Seed 4 threat libraries with 12 pre-defined threat definitions.\n\nIdempotent: skips any definition that already exists.\nAdmin-only endpoint for bootstrapping threat data.","operationId":"seed_libraries_api_v1_threat_libraries_seed_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Seed Libraries Api V1 Threat Libraries Seed Post"}}}}}}},"/api/v1/integrations":{"post":{"tags":["integrations"],"summary":"Create Integration","description":"Create a new third-party integration for a tenant.","operationId":"create_integration_api_v1_integrations_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["integrations"],"summary":"List Integrations","description":"List integrations for a given tenant.","operationId":"list_integrations_api_v1_integrations_get","parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Filter by tenant","title":"Tenant Id"},"description":"Filter by tenant"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/IntegrationResponse"},"title":"Response List Integrations Api V1 Integrations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/integrations/{integration_id}":{"get":{"tags":["integrations"],"summary":"Get Integration","description":"Retrieve a single integration by ID.","operationId":"get_integration_api_v1_integrations__integration_id__get","parameters":[{"name":"integration_id","in":"path","required":true,"schema":{"type":"string","title":"Integration Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Scope to tenant","title":"Tenant Id"},"description":"Scope to tenant"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["integrations"],"summary":"Update Integration","description":"Partially update an existing integration.","operationId":"update_integration_api_v1_integrations__integration_id__patch","parameters":[{"name":"integration_id","in":"path","required":true,"schema":{"type":"string","title":"Integration Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Scope to tenant","title":"Tenant Id"},"description":"Scope to tenant"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["integrations"],"summary":"Delete Integration","description":"Delete an integration by ID.","operationId":"delete_integration_api_v1_integrations__integration_id__delete","parameters":[{"name":"integration_id","in":"path","required":true,"schema":{"type":"string","title":"Integration Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Scope to tenant","title":"Tenant Id"},"description":"Scope to tenant"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/integrations/{integration_id}/test":{"post":{"tags":["integrations"],"summary":"Test Integration Connection","description":"Test connectivity for an integration by probing its configured endpoint.","operationId":"test_integration_connection_api_v1_integrations__integration_id__test_post","parameters":[{"name":"integration_id","in":"path","required":true,"schema":{"type":"string","title":"Integration Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Scope to tenant","title":"Tenant Id"},"description":"Scope to tenant"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestConnectionResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/events":{"get":{"tags":["webhooks"],"summary":"List Subscribable Events","description":"Return the list of event types available for webhook subscriptions.","operationId":"list_subscribable_events_api_v1_webhooks_events_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array","title":"Response List Subscribable Events Api V1 Webhooks Events Get"}}}}}}},"/api/v1/webhooks":{"post":{"tags":["webhooks"],"summary":"Create Webhook","description":"Create a new webhook subscription for the authenticated tenant.","operationId":"create_webhook_api_v1_webhooks_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscriptionCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["webhooks"],"summary":"List Webhooks","description":"List webhook subscriptions for the authenticated tenant.","operationId":"list_webhooks_api_v1_webhooks_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscriptionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/{webhook_id}":{"get":{"tags":["webhooks"],"summary":"Get Webhook","description":"Get a single webhook subscription by ID.","operationId":"get_webhook_api_v1_webhooks__webhook_id__get","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Webhook Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["webhooks"],"summary":"Update Webhook","description":"Update a webhook subscription.","operationId":"update_webhook_api_v1_webhooks__webhook_id__patch","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Webhook Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscriptionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["webhooks"],"summary":"Delete Webhook","description":"Delete a webhook subscription.","operationId":"delete_webhook_api_v1_webhooks__webhook_id__delete","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Webhook Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/{webhook_id}/deliveries":{"get":{"tags":["webhooks"],"summary":"List Webhook Deliveries","description":"List delivery attempts for a webhook subscription.","operationId":"list_webhook_deliveries_api_v1_webhooks__webhook_id__deliveries_get","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Webhook Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDeliveryListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/verkada":{"post":{"tags":["webhooks"],"summary":"Receive Verkada Webhook","description":"Receive a Verkada camera event webhook.\n\nVerkada sends POST requests with a JSON body containing camera\nevents (motion, person detection, offline/online, tamper, etc.).\n\nHeaders:\n    X-Verkada-Signature: HMAC-SHA256 signature of the body\n    X-Tenant-Id: Sentinel OS tenant to attribute the event to\n\nThe event is normalized, ingested through the event pipeline,\nand the camera status is updated in the sensors table.","operationId":"receive_verkada_webhook_api_v1_webhooks_verkada_post","parameters":[{"name":"x-verkada-signature","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Verkada-Signature"}},{"name":"x-tenant-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/assets/{asset_id}/position":{"patch":{"tags":["asset-tracking"],"summary":"Update Position","description":"Update an asset's current position (called by asset telemetry).","operationId":"update_position_api_v1_assets__asset_id__position_patch","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PositionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetPosition"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/assets/positions":{"get":{"tags":["asset-tracking"],"summary":"List Positions","description":"Return all assets with current positions for map rendering.","operationId":"list_positions_api_v1_assets_positions_get","parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Tenant ID","title":"Tenant Id"},"description":"Tenant ID"},{"name":"environment_id","in":"query","required":true,"schema":{"type":"string","description":"Environment ID","title":"Environment Id"},"description":"Environment ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssetPosition"},"title":"Response List Positions Api V1 Assets Positions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/assets/{asset_id}/track":{"get":{"tags":["asset-tracking"],"summary":"Get Track","description":"Return position history for track visualization.","operationId":"get_track_api_v1_assets__asset_id__track_get","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":720,"minimum":1,"description":"Lookback window in hours","default":24,"title":"Hours"},"description":"Lookback window in hours"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TrackPoint"},"title":"Response Get Track Api V1 Assets  Asset Id  Track Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/graphrag/search":{"post":{"tags":["graphrag"],"summary":"Graphrag Search","description":"Raw hybrid search combining vector similarity and graph traversal.\n\nReturns ranked results from both vector similarity and knowledge graph\ntraversal in a unified format.","operationId":"graphrag_search_api_v1_graphrag_search_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRAGSearchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRAGSearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/graphrag/query":{"post":{"tags":["graphrag"],"summary":"Graphrag Query","description":"Operator-friendly query with synthesized answer and source attribution.\n\nUse this for natural-language questions like:\n\"What do we know about this vessel and its network?\"\n\nReturns a structured answer with attribution indicating how many\nsimilar incidents and network analysis results contributed.","operationId":"graphrag_query_api_v1_graphrag_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRAGQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRAGQueryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/threat-network/stats":{"get":{"tags":["threat-network"],"summary":"Threat Network Stats","description":"Return graph-wide statistics: node/edge counts, type distribution.","operationId":"threat_network_stats_api_v1_threat_network_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Threat Network Stats Api V1 Threat Network Stats Get"}}}}}}},"/api/v1/threat-network/{mmsi}":{"get":{"tags":["threat-network"],"summary":"Get Threat Network","description":"Retrieve the full threat network for a vessel by MMSI.\n\nTraverses ownership chains, linked incidents, and visited zones\nup to the specified depth.","operationId":"get_threat_network_api_v1_threat_network__mmsi__get","parameters":[{"name":"mmsi","in":"path","required":true,"schema":{"type":"string","title":"Mmsi"}},{"name":"depth","in":"query","required":false,"schema":{"type":"integer","maximum":5,"minimum":1,"description":"Traversal depth (1-5)","default":2,"title":"Depth"},"description":"Traversal depth (1-5)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Threat Network Api V1 Threat Network  Mmsi  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reports/generate/{incident_id}":{"post":{"tags":["reports"],"summary":"Generate Incident Report","description":"Generate a comprehensive incident report from incident data.","operationId":"generate_incident_report_api_v1_reports_generate__incident_id__post","parameters":[{"name":"incident_id","in":"path","required":true,"schema":{"type":"string","title":"Incident Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportGenerateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/src__backend__models__report__ReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reports":{"post":{"tags":["reports"],"summary":"Create Report","description":"Create a report directly (manual or scheduled).","operationId":"create_report_api_v1_reports_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/src__backend__models__report__ReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["reports"],"summary":"List Reports","description":"List reports for the authenticated user's tenant.","operationId":"list_reports_api_v1_reports_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by report type","title":"Type"},"description":"Filter by report type"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reports/{report_id}":{"get":{"tags":["reports"],"summary":"Get Report","description":"Fetch a single report by ID.","operationId":"get_report_api_v1_reports__report_id__get","parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"string","title":"Report Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/src__backend__models__report__ReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reports/{report_id}/download":{"get":{"tags":["reports"],"summary":"Download Report","description":"Download a report as a PDF file.","operationId":"download_report_api_v1_reports__report_id__download_get","parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"string","title":"Report Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/zones/{zone_id}/risk-profile":{"get":{"tags":["zone-risk"],"summary":"Get Zone Risk Profile","description":"Get a detailed risk profile for a specific zone.\n\nReturns incident statistics, severity distribution, peak threat times,\nseasonal patterns, and common threat types.","operationId":"get_zone_risk_profile_api_v1_zones__zone_id__risk_profile_get","parameters":[{"name":"zone_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Zone Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant scope","title":"Tenant Id"},"description":"Tenant scope"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Zone Risk Profile Api V1 Zones  Zone Id  Risk Profile Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/zones/heatmap":{"get":{"tags":["zone-risk"],"summary":"Get Zone Heatmap","description":"Get all zones with risk scores for map overlay.\n\nReturns a list of zones with their computed risk scores, geometry,\nand top threats — suitable for rendering a risk heatmap.","operationId":"get_zone_heatmap_api_v1_zones_heatmap_get","parameters":[{"name":"environment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Environment to get heatmap for","title":"Environment Id"},"description":"Environment to get heatmap for"},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant scope","title":"Tenant Id"},"description":"Tenant scope"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Zone Heatmap Api V1 Zones Heatmap Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/vessels/{mmsi}/profile":{"get":{"tags":["vessels"],"summary":"Get Vessel Profile","description":"Return the accumulated behavioral profile for a vessel.\n\nThe profile aggregates all episodic observations stored in ZeroMemory\nincluding visit count, zones entered, speed patterns, and time-of-day\npatterns.","operationId":"get_vessel_profile_api_v1_vessels__mmsi__profile_get","parameters":[{"name":"mmsi","in":"path","required":true,"schema":{"type":"string","title":"Mmsi"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Vessel Profile Api V1 Vessels  Mmsi  Profile Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/vessels/{mmsi}/observations":{"get":{"tags":["vessels"],"summary":"Get Vessel Observations","description":"Return recent observations for a vessel.\n\nObservations are episodic memories recalled from ZeroMemory,\nordered by relevance/recency.","operationId":"get_vessel_observations_api_v1_vessels__mmsi__observations_get","parameters":[{"name":"mmsi","in":"path","required":true,"schema":{"type":"string","title":"Mmsi"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max observations","default":20,"title":"Limit"},"description":"Max observations"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Vessel Observations Api V1 Vessels  Mmsi  Observations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/vessels/{mmsi}/suspicious-patterns":{"get":{"tags":["vessels"],"summary":"Detect Suspicious Patterns","description":"Analyze a vessel for reconnaissance patterns.\n\nReturns a reconnaissance_score (0-1) and detailed pattern\ndescriptions indicating potential threats to subsea infrastructure.","operationId":"detect_suspicious_patterns_api_v1_vessels__mmsi__suspicious_patterns_get","parameters":[{"name":"mmsi","in":"path","required":true,"schema":{"type":"string","title":"Mmsi"}},{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Tenant ID for context","title":"Tenant Id"},"description":"Tenant ID for context"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Detect Suspicious Patterns Api V1 Vessels  Mmsi  Suspicious Patterns Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows":{"post":{"tags":["workflows"],"summary":"Create Workflow","description":"Create a new workflow for the authenticated tenant.","operationId":"create_workflow_api_v1_workflows_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["workflows"],"summary":"List Workflows","description":"List workflows for the authenticated user's tenant.","operationId":"list_workflows_api_v1_workflows_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/{workflow_id}":{"get":{"tags":["workflows"],"summary":"Get Workflow","description":"Fetch a single workflow by ID.","operationId":"get_workflow_api_v1_workflows__workflow_id__get","parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workflow Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["workflows"],"summary":"Update Workflow","description":"Update a workflow (partial update).","operationId":"update_workflow_api_v1_workflows__workflow_id__patch","parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workflow Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["workflows"],"summary":"Delete Workflow","description":"Delete a workflow by ID.","operationId":"delete_workflow_api_v1_workflows__workflow_id__delete","parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workflow Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/{workflow_id}/executions":{"get":{"tags":["workflows"],"summary":"List Workflow Executions","description":"List executions for a specific workflow.","operationId":"list_workflow_executions_api_v1_workflows__workflow_id__executions_get","parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workflow Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workflows/{workflow_id}/test":{"post":{"tags":["workflows"],"summary":"Test Fire Workflow","description":"Test-fire a workflow with a simulated event.\n\nEvaluates the trigger conditions against the provided event and,\nif matched, executes all workflow actions. Returns the execution record.","operationId":"test_fire_workflow_api_v1_workflows__workflow_id__test_post","parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workflow Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowTestFire"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chat":{"post":{"tags":["chat"],"summary":"Operator Chat","description":"Query the operator assistant with full memory recall and context grounding.\n\nIf the request includes `Accept: text/event-stream`, the response is\nstreamed as Server-Sent Events. Otherwise a complete JSON response\nis returned.","operationId":"operator_chat_api_v1_chat_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compliance-reports/compliance":{"post":{"tags":["compliance-reports"],"summary":"Generate a full compliance report","description":"Generate a compliance report for the tenant covering the given date range.\n\nIncludes: Executive Summary, Incident Log, Response Actions, Audit Trail, SLA Performance.","operationId":"create_compliance_report_api_v1_compliance_reports_compliance_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComplianceReportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/src__backend__models__compliance_report__ReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compliance-reports/insurance/{incident_id}":{"post":{"tags":["compliance-reports"],"summary":"Generate an insurance report for a single incident","description":"Generate an insurance report for one incident with full timeline,\nevidence inventory, response actions, resolution, and financial impact.","operationId":"create_insurance_report_api_v1_compliance_reports_insurance__incident_id__post","parameters":[{"name":"incident_id","in":"path","required":true,"schema":{"type":"string","title":"Incident Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsuranceReportRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/src__backend__models__compliance_report__ReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compliance-reports/sla":{"post":{"tags":["compliance-reports"],"summary":"Generate an SLA performance report","description":"Generate an SLA performance report with response time metrics,\nbreach analysis, and compliance percentage.","operationId":"create_sla_report_api_v1_compliance_reports_sla_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SLAReportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/src__backend__models__compliance_report__ReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agents":{"get":{"tags":["agents"],"summary":"List Agents","description":"List all registered agents with status, heartbeat, and task count.","operationId":"list_agents_api_v1_agents_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Agents Api V1 Agents Get"}}}}}}},"/api/v1/agents/{name}/status":{"get":{"tags":["agents"],"summary":"Get Agent Status","description":"Get status of a single agent.","operationId":"get_agent_status_api_v1_agents__name__status_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Agent Status Api V1 Agents  Name  Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agents/{name}/start":{"post":{"tags":["agents"],"summary":"Start Agent","description":"Start an agent for a specific tenant.","operationId":"start_agent_api_v1_agents__name__start_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentStartRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Start Agent Api V1 Agents  Name  Start Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agents/{name}/stop":{"post":{"tags":["agents"],"summary":"Stop Agent","description":"Gracefully stop a running agent.","operationId":"stop_agent_api_v1_agents__name__stop_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Stop Agent Api V1 Agents  Name  Stop Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agents/start-all":{"post":{"tags":["agents"],"summary":"Start All Agents","description":"Start all 4 agents (monitor, escalator, reporter, analyst) at once.","operationId":"start_all_agents_api_v1_agents_start_all_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentStartRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Start All Agents Api V1 Agents Start All Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agents/stop-all":{"post":{"tags":["agents"],"summary":"Stop All Agents","description":"Gracefully stop all running agents.","operationId":"stop_all_agents_api_v1_agents_stop_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Stop All Agents Api V1 Agents Stop All Post"}}}}}}},"/api/v1/missions":{"post":{"tags":["missions"],"summary":"Create Mission","description":"Create a new mission (dispatches assets to an objective).","operationId":"create_mission_api_v1_missions_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissionCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["missions"],"summary":"List Missions","description":"List missions for a given tenant with optional filters.","operationId":"list_missions_api_v1_missions_get","parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Filter by tenant","title":"Tenant Id"},"description":"Filter by tenant"},{"name":"incident_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by incident","title":"Incident Id"},"description":"Filter by incident"},{"name":"asset_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by asset","title":"Asset Id"},"description":"Filter by asset"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MissionResponse"},"title":"Response List Missions Api V1 Missions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/missions/{mission_id}":{"get":{"tags":["missions"],"summary":"Get Mission","description":"Retrieve a single mission by ID.","operationId":"get_mission_api_v1_missions__mission_id__get","parameters":[{"name":"mission_id","in":"path","required":true,"schema":{"type":"string","title":"Mission Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Scope to tenant","title":"Tenant Id"},"description":"Scope to tenant"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/missions/{mission_id}/status":{"patch":{"tags":["missions"],"summary":"Update Mission Status","description":"Transition a mission to a new status.","operationId":"update_mission_status_api_v1_missions__mission_id__status_patch","parameters":[{"name":"mission_id","in":"path","required":true,"schema":{"type":"string","title":"Mission Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Scope to tenant","title":"Tenant Id"},"description":"Scope to tenant"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissionStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/missions/{mission_id}/complete":{"post":{"tags":["missions"],"summary":"Complete Mission","description":"Complete a mission with an after-action report.","operationId":"complete_mission_api_v1_missions__mission_id__complete_post","parameters":[{"name":"mission_id","in":"path","required":true,"schema":{"type":"string","title":"Mission Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Scope to tenant","title":"Tenant Id"},"description":"Scope to tenant"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissionComplete"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/assets":{"post":{"tags":["assets"],"summary":"Create Asset","description":"Create a new asset within an environment.","operationId":"create_asset_api_v1_assets_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["assets"],"summary":"List Assets","description":"List assets with optional tenant/environment/status/type filters.","operationId":"list_assets_api_v1_assets_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tenant","title":"Tenant Id"},"description":"Filter by tenant"},{"name":"environment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by environment","title":"Environment Id"},"description":"Filter by environment"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by asset type","title":"Type"},"description":"Filter by asset type"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssetResponse"},"title":"Response List Assets Api V1 Assets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/assets/available":{"get":{"tags":["assets"],"summary":"List Available Assets","description":"List assets that are currently available for deployment.\n\nE10 Issue #66 — convenience endpoint for mission planning.","operationId":"list_available_assets_api_v1_assets_available_get","parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Filter by tenant","title":"Tenant Id"},"description":"Filter by tenant"},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by asset type","title":"Type"},"description":"Filter by asset type"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssetResponse"},"title":"Response List Available Assets Api V1 Assets Available Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/assets/nearest":{"get":{"tags":["assets"],"summary":"Find Nearest Available","description":"Find the nearest available assets of a given type to a location.","operationId":"find_nearest_available_api_v1_assets_nearest_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","description":"Latitude","title":"Lat"},"description":"Latitude"},{"name":"lon","in":"query","required":true,"schema":{"type":"number","description":"Longitude","title":"Lon"},"description":"Longitude"},{"name":"type","in":"query","required":true,"schema":{"type":"string","description":"Asset type to search for","title":"Type"},"description":"Asset type to search for"},{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Tenant scope","title":"Tenant Id"},"description":"Tenant scope"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":5,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Find Nearest Available Api V1 Assets Nearest Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/assets/{asset_id}":{"get":{"tags":["assets"],"summary":"Get Asset","description":"Retrieve a single asset by ID.","operationId":"get_asset_api_v1_assets__asset_id__get","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Scope to tenant","title":"Tenant Id"},"description":"Scope to tenant"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["assets"],"summary":"Update Asset","description":"Partially update an existing asset.","operationId":"update_asset_api_v1_assets__asset_id__patch","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Scope to tenant","title":"Tenant Id"},"description":"Scope to tenant"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["assets"],"summary":"Delete Asset","description":"Delete an asset by ID.","operationId":"delete_asset_api_v1_assets__asset_id__delete","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Scope to tenant","title":"Tenant Id"},"description":"Scope to tenant"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/assets/{asset_id}/location":{"patch":{"tags":["assets"],"summary":"Update Asset Location","description":"Update just the location of an asset (real-time telemetry tracking).\n\nE10 Issue #66 — dedicated endpoint for high-frequency location updates.","operationId":"update_asset_location_api_v1_assets__asset_id__location_patch","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Scope to tenant","title":"Tenant Id"},"description":"Scope to tenant"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/edge-devices":{"post":{"tags":["edge-devices"],"summary":"Register Device","description":"Register a new edge device.","operationId":"register_device_api_v1_edge_devices_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EdgeDeviceRegister"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EdgeDeviceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["edge-devices"],"summary":"List Devices","description":"List all edge devices for a tenant.","operationId":"list_devices_api_v1_edge_devices_get","parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Filter by tenant","title":"Tenant Id"},"description":"Filter by tenant"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EdgeDeviceResponse"},"title":"Response List Devices Api V1 Edge Devices Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/edge-devices/stale":{"get":{"tags":["edge-devices"],"summary":"Get Stale Devices","description":"Return devices that have not synced within the given threshold.","operationId":"get_stale_devices_api_v1_edge_devices_stale_get","parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Filter by tenant","title":"Tenant Id"},"description":"Filter by tenant"},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Stale threshold in hours","default":24,"title":"Hours"},"description":"Stale threshold in hours"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EdgeDeviceResponse"},"title":"Response Get Stale Devices Api V1 Edge Devices Stale Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/edge-devices/{device_id}":{"get":{"tags":["edge-devices"],"summary":"Get Device","description":"Retrieve a single edge device by ID.","operationId":"get_device_api_v1_edge_devices__device_id__get","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Scope to tenant","title":"Tenant Id"},"description":"Scope to tenant"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EdgeDeviceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/edge-devices/{device_id}/config":{"patch":{"tags":["edge-devices"],"summary":"Configure Sync","description":"Configure which threat libraries and zones an edge device syncs.","operationId":"configure_sync_api_v1_edge_devices__device_id__config_patch","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Scope to tenant","title":"Tenant Id"},"description":"Scope to tenant"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EdgeDeviceConfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EdgeDeviceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/edge-devices/{device_id}/sync-package":{"post":{"tags":["edge-devices"],"summary":"Generate Sync Package","description":"Generate a sync package with threat signatures and zone configs for the device.","operationId":"generate_sync_package_api_v1_edge_devices__device_id__sync_package_post","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Scope to tenant","title":"Tenant Id"},"description":"Scope to tenant"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncPackageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/edge-devices/{device_id}/sync":{"post":{"tags":["edge-devices"],"summary":"Record Sync","description":"Record that an edge device has completed a sync.","operationId":"record_sync_api_v1_edge_devices__device_id__sync_post","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Scope to tenant","title":"Tenant Id"},"description":"Scope to tenant"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EdgeDeviceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intelligence/threats":{"get":{"tags":["threat-intelligence"],"summary":"Query Threats","description":"Query threat data with optional filters.\n\nReturns scored threat events sorted by timestamp descending.\nEach result includes threat_type, threat_score, classification,\nlocation, vessel_mmsi, timestamp, severity, and confidence.","operationId":"query_threats_api_v1_intelligence_threats_get","parameters":[{"name":"zone_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by zone ID","title":"Zone Id"},"description":"Filter by zone ID"},{"name":"environment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by environment ID","title":"Environment Id"},"description":"Filter by environment ID"},{"name":"threat_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by threat type (e.g. vessel_anomaly, acoustic_intrusion)","title":"Threat Type"},"description":"Filter by threat type (e.g. vessel_anomaly, acoustic_intrusion)"},{"name":"from_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Start date (ISO 8601)","title":"From Date"},"description":"Start date (ISO 8601)"},{"name":"to_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End date (ISO 8601)","title":"To Date"},"description":"End date (ISO 8601)"},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by severity: critical, high, medium, low","title":"Severity"},"description":"Filter by severity: critical, high, medium, low"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Max results to return","default":50,"title":"Limit"},"description":"Max results to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Query Threats Api V1 Intelligence Threats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intelligence/risk-assessment":{"get":{"tags":["threat-intelligence"],"summary":"Get Risk Assessment","description":"Get a risk summary for a zone or environment.\n\nReturns risk_score (0-100), threat_count, top_threats, trend\n(worsening/stable/improving), and last_incident details.\n\nAt least one of zone_id or environment_id is required.","operationId":"get_risk_assessment_api_v1_intelligence_risk_assessment_get","parameters":[{"name":"zone_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Zone to assess","title":"Zone Id"},"description":"Zone to assess"},{"name":"environment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Environment to assess","title":"Environment Id"},"description":"Environment to assess"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Risk Assessment Api V1 Intelligence Risk Assessment Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intelligence/vessel-activity":{"get":{"tags":["threat-intelligence"],"summary":"Get Vessel Activity","description":"Get vessel activity near infrastructure.\n\nReturns a list of vessels aggregated by MMSI with activity_count,\nmax_threat_score, vessel_name, flag, and zones_entered.\nSorted by max_threat_score descending.","operationId":"get_vessel_activity_api_v1_intelligence_vessel_activity_get","parameters":[{"name":"environment_id","in":"query","required":true,"schema":{"type":"string","description":"Environment to query","title":"Environment Id"},"description":"Environment to query"},{"name":"from_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Start date (ISO 8601)","title":"From Date"},"description":"Start date (ISO 8601)"},{"name":"to_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End date (ISO 8601)","title":"To Date"},"description":"End date (ISO 8601)"},{"name":"min_threat_score","in":"query","required":false,"schema":{"type":"number","maximum":100,"minimum":0,"description":"Minimum threat score filter","default":0,"title":"Min Threat Score"},"description":"Minimum threat score filter"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Vessel Activity Api V1 Intelligence Vessel Activity Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intelligence/cable-risk":{"get":{"tags":["Partnership Intelligence"],"summary":"Cable Proximity Risk","description":"Return subsea cables near a point, sorted by proximity risk score.\n\nRisk score = 100 - (distance_nm / radius_nm * 100), clamped 0-100.\nCables beyond *radius_nm* are excluded.","operationId":"cable_proximity_risk_api_v1_intelligence_cable_risk_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"description":"Latitude of point of interest","title":"Lat"},"description":"Latitude of point of interest"},{"name":"lon","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"description":"Longitude of point of interest","title":"Lon"},"description":"Longitude of point of interest"},{"name":"radius_nm","in":"query","required":false,"schema":{"type":"number","exclusiveMinimum":0,"description":"Search radius in nautical miles","default":50,"title":"Radius Nm"},"description":"Search radius in nautical miles"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CableRiskItem"},"title":"Response Cable Proximity Risk Api V1 Intelligence Cable Risk Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intelligence/threat-score":{"post":{"tags":["Partnership Intelligence"],"summary":"Infrastructure Threat Score","description":"Compute a composite threat score for a vessel at a given position.\n\nUses the same 7-weight formula as the real-time scoring pipeline but\nexposed as a synchronous request/response endpoint for partners.","operationId":"infrastructure_threat_score_api_v1_intelligence_threat_score_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreatScoreRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreatScoreResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intelligence/correlation":{"get":{"tags":["Partnership Intelligence"],"summary":"Cross Domain Correlation","description":"Correlate events across physical, cyber, space, and environmental\ndomains within a time window.\n\nIf lat/lon are provided, spatial filtering narrows the results.","operationId":"cross_domain_correlation_api_v1_intelligence_correlation_get","parameters":[{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":90,"minimum":-90},{"type":"null"}],"description":"Latitude filter","title":"Lat"},"description":"Latitude filter"},{"name":"lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":180,"minimum":-180},{"type":"null"}],"description":"Longitude filter","title":"Lon"},"description":"Longitude filter"},{"name":"time_window_min","in":"query","required":false,"schema":{"type":"integer","maximum":1440,"minimum":1,"description":"Look-back window in minutes","default":60,"title":"Time Window Min"},"description":"Look-back window in minutes"},{"name":"event_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Correlate around a specific event","title":"Event Id"},"description":"Correlate around a specific event"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CorrelationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intelligence/geopolitical-risk":{"get":{"tags":["Partnership Intelligence"],"summary":"Geopolitical Risk","description":"Aggregate geopolitical risk from multiple open-source intelligence\nfeeds.  Filters by country code or bounding box.\n\nReturns an overall risk level and per-category breakdowns.","operationId":"geopolitical_risk_api_v1_intelligence_geopolitical_risk_get","parameters":[{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO-3166 country code filter","title":"Country"},"description":"ISO-3166 country code filter"},{"name":"bbox","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bounding box as 'min_lat,min_lon,max_lat,max_lon'","title":"Bbox"},"description":"Bounding box as 'min_lat,min_lon,max_lat,max_lon'"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeopoliticalRiskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/usage/summary":{"get":{"tags":["usage-billing"],"summary":"Usage Summary","description":"Return aggregated usage stats for an API key.\n\nIncludes total calls, total credits consumed, average response time,\nand breakdowns by endpoint and status code.","operationId":"usage_summary_api_v1_usage_summary_get","parameters":[{"name":"api_key_id","in":"query","required":true,"schema":{"type":"string","description":"API key ID to get usage for","title":"Api Key Id"},"description":"API key ID to get usage for"},{"name":"from_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO start date (inclusive)","title":"From Date"},"description":"ISO start date (inclusive)"},{"name":"to_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO end date (inclusive)","title":"To Date"},"description":"ISO end date (inclusive)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Usage Summary Api V1 Usage Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/usage/revenue":{"get":{"tags":["usage-billing"],"summary":"Usage Revenue","description":"Return revenue breakdown for a developer's API key.\n\nCalculates base cost, developer markup, platform fee (5%),\nand net developer payout.","operationId":"usage_revenue_api_v1_usage_revenue_get","parameters":[{"name":"api_key_id","in":"query","required":true,"schema":{"type":"string","description":"API key ID to calculate revenue for","title":"Api Key Id"},"description":"API key ID to calculate revenue for"},{"name":"markup_rate","in":"query","required":false,"schema":{"type":"number","maximum":0.4,"minimum":0,"description":"Developer markup rate (0.0-0.40, default 0.20)","default":0.2,"title":"Markup Rate"},"description":"Developer markup rate (0.0-0.40, default 0.20)"},{"name":"from_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO start date (inclusive)","title":"From Date"},"description":"ISO start date (inclusive)"},{"name":"to_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO end date (inclusive)","title":"To Date"},"description":"ISO end date (inclusive)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Usage Revenue Api V1 Usage Revenue Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/api-keys":{"post":{"tags":["api-keys"],"summary":"Create Api Key","description":"Generate a new API key for the authenticated tenant.\n\nThe full key is returned ONLY in this response. Store it securely —\nit cannot be retrieved again.","operationId":"create_api_key_api_v1_api_keys_post","parameters":[{"name":"x-tenant-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/src__backend__models__api_key__APIKeyCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyCreatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["api-keys"],"summary":"List Api Keys","description":"List all API keys for the authenticated tenant.\n\nFull key values are never returned — only the first 8 characters\nfor identification purposes.","operationId":"list_api_keys_api_v1_api_keys_get","parameters":[{"name":"x-tenant-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/api-keys/{key_id}":{"delete":{"tags":["api-keys"],"summary":"Revoke Api Key","description":"Revoke an API key. The key immediately becomes unusable.","operationId":"revoke_api_key_api_v1_api_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"x-tenant-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/src__backend__models__api_key__APIKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/sso/{provider}":{"get":{"tags":["auth"],"summary":"Sso Initiate","description":"Initiate an SSO login flow for the given provider.\n\nReturns the OAuth2 authorization URL that the client should\nredirect the user to.","operationId":"sso_initiate_api_v1_auth_sso__provider__get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"CSRF state parameter","title":"State"},"description":"CSRF state parameter"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SSOInitiateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/sso/{provider}/callback":{"get":{"tags":["auth"],"summary":"Sso Callback","description":"Handle the OAuth2 callback from the identity provider.\n\nExchanges the authorization code for tokens, fetches user info,\nand creates or updates the user via JIT provisioning.","operationId":"sso_callback_api_v1_auth_sso__provider__callback_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"code","in":"query","required":true,"schema":{"type":"string","description":"Authorization code from IdP","title":"Code"},"description":"Authorization code from IdP"},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"CSRF state parameter","title":"State"},"description":"CSRF state parameter"},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default tenant for JIT provisioning","title":"Tenant Id"},"description":"Default tenant for JIT provisioning"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SSOCallbackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/mfa/setup":{"post":{"tags":["auth"],"summary":"Mfa Setup","description":"Generate a TOTP secret and return the provisioning URI.\n\nThe client should render the URI as a QR code for the user to scan\nwith their authenticator app.","operationId":"mfa_setup_api_v1_auth_mfa_setup_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MFASetupResponse"}}}}}}},"/api/v1/auth/mfa/verify":{"post":{"tags":["auth"],"summary":"Mfa Verify","description":"Verify a TOTP code from the user's authenticator app.","operationId":"mfa_verify_api_v1_auth_mfa_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MFAVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MFAVerifyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/mfa/enable":{"post":{"tags":["auth"],"summary":"Mfa Enable","description":"Enable MFA enforcement for the authenticated user.\n\nRequires that ``/mfa/setup`` has been called and a code\nhas been verified first.","operationId":"mfa_enable_api_v1_auth_mfa_enable_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MFAStatusResponse"}}}}}}},"/api/v1/auth/mfa/disable":{"post":{"tags":["auth"],"summary":"Mfa Disable","description":"Disable MFA for the authenticated user.\n\nClears the TOTP secret and sets mfa_enabled=false.","operationId":"mfa_disable_api_v1_auth_mfa_disable_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MFAStatusResponse"}}}}}}},"/api/v1/portal/register":{"post":{"tags":["developer-portal"],"summary":"Register Consumer","description":"Register as an API consumer for threat intelligence access.","operationId":"register_consumer_api_v1_portal_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsumerRegister"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsumerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/portal/login":{"post":{"tags":["developer-portal"],"summary":"Login Consumer","description":"Authenticate a consumer by email and optional password.\n\nIf the account has a password set, the password field is required.\nAccounts without a password can still log in with email only (backward compat).\n\nReturns the consumer profile together with a signed JWT ``token`` that\nthe frontend can use for Bearer authentication on subsequent requests.","operationId":"login_consumer_api_v1_portal_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsumerLogin"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Login Consumer Api V1 Portal Login Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/portal/api-keys":{"post":{"tags":["developer-portal"],"summary":"Generate Api Key","description":"Generate a scoped API key for threat intelligence endpoints.\n\nThe raw key is returned only once in this response.\nStore it securely — it cannot be retrieved again.","operationId":"generate_api_key_api_v1_portal_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/src__backend__models__developer_portal__APIKeyCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/src__backend__models__developer_portal__APIKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/portal/usage":{"get":{"tags":["developer-portal"],"summary":"Get Usage","description":"Retrieve usage dashboard data for an API consumer.\n\nShows today's call counts, limits, and estimated cost.","operationId":"get_usage_api_v1_portal_usage_get","parameters":[{"name":"consumer_id","in":"query","required":true,"schema":{"type":"string","title":"Consumer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/portal/docs":{"get":{"tags":["developer-portal"],"summary":"Portal Docs","description":"Redirect to the API documentation.","operationId":"portal_docs_api_v1_portal_docs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/portal/consumers":{"get":{"tags":["developer-portal"],"summary":"List Consumers","description":"List all registered API consumers (admin use).","operationId":"list_consumers_api_v1_portal_consumers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ConsumerResponse"},"type":"array","title":"Response List Consumers Api V1 Portal Consumers Get"}}}}}}},"/api/v1/portal/plans":{"get":{"tags":["developer-portal"],"summary":"List Plans","description":"List available API plans with rate limits and pricing.","operationId":"list_plans_api_v1_portal_plans_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PlanInfo"},"type":"array","title":"Response List Plans Api V1 Portal Plans Get"}}}}}}},"/api/v1/memory/reflect":{"post":{"tags":["memory"],"summary":"Trigger Reflection","description":"Trigger operational knowledge reflection for a tenant.\n\nAnalyzes resolved incidents within the time window, extracts patterns\nby zone, vessel type, time-of-day, and threat type, then stores the\nconsolidated reflection as operational knowledge in ZeroMemory.","operationId":"trigger_reflection_api_v1_memory_reflect_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReflectRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReflectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/memory/vessel-profile/{mmsi}":{"get":{"tags":["memory"],"summary":"Get Vessel Profile","description":"Retrieve the stored behavioral profile for a vessel.\n\nReturns behavioral features including visit frequency, speed patterns,\ntime-of-day patterns, zone dwell times, and anomaly score.","operationId":"get_vessel_profile_api_v1_memory_vessel_profile__mmsi__get","parameters":[{"name":"mmsi","in":"path","required":true,"schema":{"type":"string","title":"Mmsi"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Vessel Profile Api V1 Memory Vessel Profile  Mmsi  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/memory/vessel-profile/{mmsi}/build":{"post":{"tags":["memory"],"summary":"Build Vessel Profile","description":"Build or refresh a vessel's behavioral profile.\n\nAggregates all AIS events for the vessel, computes behavioral features,\nand stores the profile as a vector embedding in the vessel_profiles\nnamespace for semantic similarity search.","operationId":"build_vessel_profile_api_v1_memory_vessel_profile__mmsi__build_post","parameters":[{"name":"mmsi","in":"path","required":true,"schema":{"type":"string","title":"Mmsi"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildProfileRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Build Vessel Profile Api V1 Memory Vessel Profile  Mmsi  Build Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/memory/vessel-profile/{mmsi}/flag-change":{"post":{"tags":["memory"],"summary":"Flag Behavioral Change","description":"Compare a vessel's current behavior to its stored profile.\n\nReturns behavioral deltas and a change_score (0-1) indicating how\nmuch the vessel's recent behavior deviates from its historical baseline.","operationId":"flag_behavioral_change_api_v1_memory_vessel_profile__mmsi__flag_change_post","parameters":[{"name":"mmsi","in":"path","required":true,"schema":{"type":"string","title":"Mmsi"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildProfileRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Flag Behavioral Change Api V1 Memory Vessel Profile  Mmsi  Flag Change Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/memory/search":{"post":{"tags":["memory"],"summary":"Hybrid Search","description":"Execute a GraphRAG hybrid search combining:\n\n- Vector similarity search (semantic embedding match)\n- Graph traversal (knowledge graph entity/relationship discovery)\n- Memory recall (episodic and semantic memory from ZeroMemory)\n- Keyword filtering (structured table queries)\n\nResults are merged and re-ranked by combined relevance score.","operationId":"hybrid_search_api_v1_memory_search_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HybridSearchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HybridSearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/memory/search/context":{"post":{"tags":["memory"],"summary":"Search With Context","description":"Search anchored to a specific entity with full context assembly.\n\nReturns hybrid search results plus the entity's graph neighborhood,\nrecent events, and a pre-formatted context window suitable for LLM\nconsumption. Requires entity_id in the request.","operationId":"search_with_context_api_v1_memory_search_context_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HybridSearchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Search With Context Api V1 Memory Search Context Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/memory/similar-vessels/{mmsi}":{"get":{"tags":["memory"],"summary":"Get Similar Vessels","description":"Find vessels with similar behavioral patterns.\n\nUses vector similarity search in the vessel_profiles namespace to\nfind vessels whose behavioral embeddings are closest to the target\nvessel. The target vessel must have a built profile.","operationId":"get_similar_vessels_api_v1_memory_similar_vessels__mmsi__get","parameters":[{"name":"mmsi","in":"path","required":true,"schema":{"type":"string","title":"Mmsi"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Max similar vessels","default":10,"title":"Limit"},"description":"Max similar vessels"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimilarVesselsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intelligence/space-weather/impact":{"get":{"tags":["Environmental Intelligence"],"summary":"Space weather impact on cable infrastructure","description":"Assess the impact of current space weather conditions on submarine\ncable infrastructure, including geomagnetically induced current (GIC)\nrisk and satellite degradation.","operationId":"space_weather_impact_api_v1_intelligence_space_weather_impact_get","parameters":[{"name":"cable_system","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by cable system name","title":"Cable System"},"description":"Filter by cable system name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpaceWeatherImpactResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intelligence/internet-health":{"get":{"tags":["Environmental Intelligence"],"summary":"Internet health and cyber-physical correlation","description":"Compute an Internet health score by correlating BGP routing,\nRPKI validation, outage data, traffic anomalies, and AS topology.","operationId":"internet_health_api_v1_intelligence_internet_health_get","parameters":[{"name":"asn","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by Autonomous System Number","title":"Asn"},"description":"Filter by Autonomous System Number"},{"name":"region","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by geographic region","title":"Region"},"description":"Filter by geographic region"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternetHealthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intelligence/environmental-risk":{"get":{"tags":["Environmental Intelligence"],"summary":"Environmental risk assessment for a geographic area","description":"Assess environmental risks around a geographic point by querying\nseismic, tsunami, ocean buoy, weather, fire detection, radiation,\nwater level, and tide level data from the data lake.","operationId":"environmental_risk_api_v1_intelligence_environmental_risk_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","description":"Latitude of center point","title":"Lat"},"description":"Latitude of center point"},{"name":"lon","in":"query","required":true,"schema":{"type":"number","description":"Longitude of center point","title":"Lon"},"description":"Longitude of center point"},{"name":"radius_km","in":"query","required":false,"schema":{"type":"number","maximum":5000,"minimum":1,"description":"Search radius in km","default":100,"title":"Radius Km"},"description":"Search radius in km"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvironmentalRiskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intelligence/threat-feed":{"get":{"tags":["Environmental Intelligence"],"summary":"Enhanced threat intelligence feed","description":"Aggregate threat intelligence from all data lake sensor types and\nZeroDB threat events into a single chronological feed.","operationId":"threat_intelligence_feed_api_v1_intelligence_threat_feed_get","parameters":[{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO timestamp — return events after this time","title":"Since"},"description":"ISO timestamp — return events after this time"},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: low, medium, high, critical","title":"Severity"},"description":"Filter: low, medium, high, critical"},{"name":"categories","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated category filter","title":"Categories"},"description":"Comma-separated category filter"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Max items to return","default":100,"title":"Limit"},"description":"Max items to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreatFeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/drones/dispatch":{"post":{"tags":["drones"],"summary":"Dispatch Drone","description":"Dispatch the nearest available drone to an incident location.\n\nFinds the closest drone asset, builds a MAVLink incident-response\nmission (takeoff -> waypoint -> loiter -> RTL), creates a mission\nrecord, and returns the dispatch result with ETA.","operationId":"dispatch_drone_api_v1_drones_dispatch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DroneDispatchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DroneDispatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/drones/{drone_id}/status":{"get":{"tags":["drones"],"summary":"Get Drone Status","description":"Get current drone status, location, telemetry, and active mission.","operationId":"get_drone_status_api_v1_drones__drone_id__status_get","parameters":[{"name":"drone_id","in":"path","required":true,"schema":{"type":"string","title":"Drone Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Drone Status Api V1 Drones  Drone Id  Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/drones/{drone_id}/abort":{"post":{"tags":["drones"],"summary":"Abort Drone Mission","description":"Abort the active mission for a drone.\n\nSends a Return-to-Launch command and updates mission/asset records.","operationId":"abort_drone_mission_api_v1_drones__drone_id__abort_post","parameters":[{"name":"drone_id","in":"path","required":true,"schema":{"type":"string","title":"Drone Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AbortResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/drones/{drone_id}/video":{"get":{"tags":["drones"],"summary":"Get Drone Video","description":"Get the live video stream URL for a drone.\n\nLooks up the latest telemetry or asset metadata for the video URL.","operationId":"get_drone_video_api_v1_drones__drone_id__video_get","parameters":[{"name":"drone_id","in":"path","required":true,"schema":{"type":"string","title":"Drone Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoStreamResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/drones/telemetry":{"post":{"tags":["drones"],"summary":"Receive Telemetry","description":"Webhook endpoint for drone telemetry ingest.\n\nGCS systems POST telemetry here. The data is stored in ZeroDB\nand also fed into the ingest pipeline as Envelope objects.","operationId":"receive_telemetry_api_v1_drones_telemetry_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TelemetryPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Receive Telemetry Api V1 Drones Telemetry Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/drones":{"get":{"tags":["drones"],"summary":"List Drones","description":"List all drone assets with their current status and location.","operationId":"list_drones_api_v1_drones_get","parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Filter by tenant","title":"Tenant Id"},"description":"Filter by tenant"},{"name":"environment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by environment","title":"Environment Id"},"description":"Filter by environment"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Drones Api V1 Drones Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/legal/terms":{"get":{"tags":["Legal"],"summary":"Get Terms Of Service","description":"Return the Sentinel OS API Terms of Service.\n\nCovers data usage rights, rate limits, acceptable use, liability,\ntermination, and GDPR compliance.","operationId":"get_terms_of_service_api_v1_legal_terms_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Terms Of Service Api V1 Legal Terms Get"}}}}}}},"/api/v1/legal/privacy":{"get":{"tags":["Legal"],"summary":"Get Privacy Policy","description":"Return the Sentinel OS API Privacy Policy.\n\nDescribes how we collect, use, and protect data from API consumers.","operationId":"get_privacy_policy_api_v1_legal_privacy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Privacy Policy Api V1 Legal Privacy Get"}}}}}}},"/api/v1/legal/sla":{"get":{"tags":["Legal"],"summary":"Get Sla","description":"Return SLA terms by tier.\n\nIncludes uptime guarantees, support response times, credit policies,\nand maintenance window commitments for each plan tier.","operationId":"get_sla_api_v1_legal_sla_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Sla Api V1 Legal Sla Get"}}}}}}},"/api/v1/persons/track":{"post":{"tags":["Person Tracking"],"summary":"Track Person","description":"Store a person embedding and search for re-identification matches.\n\nUpserts the embedding into ZeroDB vectors (namespace: person_embeddings),\nsearches for similarity matches above 0.85 threshold, and records the\nsighting. Returns the assigned track_id and any matches found.","operationId":"track_person_api_v1_persons_track_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonTrackRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonTrackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/persons/{track_id}/trajectory":{"get":{"tags":["Person Tracking"],"summary":"Get Trajectory","description":"Query all sightings for a given track_id ordered by timestamp.\n\nReturns the full movement trajectory across cameras and zones.","operationId":"get_trajectory_api_v1_persons__track_id__trajectory_get","parameters":[{"name":"track_id","in":"path","required":true,"schema":{"type":"string","title":"Track Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrajectoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/persons/active":{"get":{"tags":["Person Tracking"],"summary":"Get Active Tracks","description":"Return all active person tracks seen within the last N minutes (default 30).","operationId":"get_active_tracks_api_v1_persons_active_get","parameters":[{"name":"minutes","in":"query","required":false,"schema":{"type":"integer","maximum":1440,"minimum":1,"description":"Lookback window in minutes","default":30,"title":"Minutes"},"description":"Lookback window in minutes"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ActiveTrack"},"title":"Response Get Active Tracks Api V1 Persons Active Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/shifts":{"post":{"tags":["Shift Management"],"summary":"Create Shift Endpoint","description":"Create a new shift schedule entry.\n\nAssigns a guard to one or more zones for a time period.","operationId":"create_shift_endpoint_api_v1_shifts_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShiftCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShiftScheduleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Shift Management"],"summary":"List Shifts Endpoint","description":"List shift schedules with optional filters.\n\nSupports filtering by date, zone_id, and guard_id.","operationId":"list_shifts_endpoint_api_v1_shifts_get","parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Filter by tenant","title":"Tenant Id"},"description":"Filter by tenant"},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by date (YYYY-MM-DD)","title":"Date"},"description":"Filter by date (YYYY-MM-DD)"},{"name":"zone_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by zone ID","title":"Zone Id"},"description":"Filter by zone ID"},{"name":"guard_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by guard ID","title":"Guard Id"},"description":"Filter by guard ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ShiftScheduleResponse"},"title":"Response List Shifts Endpoint Api V1 Shifts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/shifts/on-duty":{"get":{"tags":["Shift Management"],"summary":"Get On Duty Guards Endpoint","description":"List all guards currently on duty or on call.\n\nReturns shift details including zone assignments for each active guard.","operationId":"get_on_duty_guards_endpoint_api_v1_shifts_on_duty_get","parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Tenant scope","title":"Tenant Id"},"description":"Tenant scope"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OnDutyGuard"},"title":"Response Get On Duty Guards Endpoint Api V1 Shifts On Duty Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/shifts/{shift_id}":{"get":{"tags":["Shift Management"],"summary":"Get Shift Endpoint","description":"Get details for a specific shift.","operationId":"get_shift_endpoint_api_v1_shifts__shift_id__get","parameters":[{"name":"shift_id","in":"path","required":true,"schema":{"type":"string","title":"Shift Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShiftScheduleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Shift Management"],"summary":"Update Shift Endpoint","description":"Update an existing shift (time, status, or zone assignments).","operationId":"update_shift_endpoint_api_v1_shifts__shift_id__patch","parameters":[{"name":"shift_id","in":"path","required":true,"schema":{"type":"string","title":"Shift Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShiftUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShiftScheduleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Shift Management"],"summary":"Cancel Shift Endpoint","description":"Cancel (soft-delete) a shift by setting status to off_duty.\n\nThe shift record is preserved for audit purposes.","operationId":"cancel_shift_endpoint_api_v1_shifts__shift_id__delete","parameters":[{"name":"shift_id","in":"path","required":true,"schema":{"type":"string","title":"Shift Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/guards/ping":{"post":{"tags":["Guard Mobile"],"summary":"Guard Ping","description":"Receive a GPS heartbeat from a guard's mobile device.\n\nUpdates the guard asset's location and battery status in ZeroDB.","operationId":"guard_ping_api_v1_guards_ping_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PingRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/guards/{guard_id}/accept-incident":{"post":{"tags":["Guard Mobile"],"summary":"Accept Incident","description":"Acknowledge a dispatch assignment.\n\nUpdates the incident assignment status and marks the mission as accepted.","operationId":"accept_incident_api_v1_guards__guard_id__accept_incident_post","parameters":[{"name":"guard_id","in":"path","required":true,"schema":{"type":"string","title":"Guard Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptIncidentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptIncidentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/guards/{guard_id}/sos":{"post":{"tags":["Guard Mobile"],"summary":"Guard Sos","description":"Emergency alert — creates a critical incident and notifies all operators.\n\nThis is a panic-button endpoint for guards in distress. It creates a\nhigh-priority incident that triggers immediate operator notification.","operationId":"guard_sos_api_v1_guards__guard_id__sos_post","parameters":[{"name":"guard_id","in":"path","required":true,"schema":{"type":"string","title":"Guard Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SOSRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SOSResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/guards/{guard_id}/assignments":{"get":{"tags":["Guard Mobile"],"summary":"Get Guard Assignments","description":"Get all active missions/assignments for a specific guard.\n\nReturns missions with status dispatched, accepted, or en_route.","operationId":"get_guard_assignments_api_v1_guards__guard_id__assignments_get","parameters":[{"name":"guard_id","in":"path","required":true,"schema":{"type":"string","title":"Guard Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GuardAssignment"},"title":"Response Get Guard Assignments Api V1 Guards  Guard Id  Assignments Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/live-status":{"get":{"tags":["live"],"summary":"Get Live Status","description":"Public system status snapshot for the live intelligence dashboard.\n\nReturns agent statuses with real task descriptions, system vitals,\nrecent events, and uptime. No auth required.","operationId":"get_live_status_api_v1_live_status_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Live Status Api V1 Live Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/alerting/config":{"get":{"tags":["alerting"],"summary":"Alerting Config","description":"Return which alerting channels are configured (no secrets exposed).","operationId":"alerting_config_api_v1_alerting_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Alerting Config Api V1 Alerting Config Get"}}}}}}},"/api/v1/alerting/test":{"post":{"tags":["alerting"],"summary":"Send Test Alert","description":"Send a test alert to all configured channels.","operationId":"send_test_alert_api_v1_alerting_test_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Send Test Alert Api V1 Alerting Test Post"}}}}}}},"/api/v1/alerting/history":{"get":{"tags":["alerting"],"summary":"Alert History","description":"Return the last 50 alerts sent (stored in-memory).","operationId":"alert_history_api_v1_alerting_history_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Alert History Api V1 Alerting History Get"}}}}}}},"/api/v1/vessel-master":{"post":{"tags":["vessel-master"],"summary":"Create Or Update Vessel","description":"Create or update a vessel master record.\n\nUses upsert semantics: if a record with the same mmsi + tenant_id\nalready exists, the existing record is updated with the supplied\nfields. Otherwise a new record is created.","operationId":"create_or_update_vessel_api_v1_vessel_master_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VesselMasterCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VesselMasterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["vessel-master"],"summary":"List Vessels","description":"Return a paginated list of vessel master records for a tenant.","operationId":"list_vessels_api_v1_vessel_master_get","parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Tenant ID","title":"Tenant Id"},"description":"Tenant ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VesselMasterResponse"},"title":"Response List Vessels Api V1 Vessel Master Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/vessel-master/search":{"get":{"tags":["vessel-master"],"summary":"Search Vessels","description":"Search vessel master records with optional filters.","operationId":"search_vessels_api_v1_vessel_master_search_get","parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Tenant ID","title":"Tenant Id"},"description":"Tenant ID"},{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"Free-text search (name, MMSI, IMO)","title":"Q"},"description":"Free-text search (name, MMSI, IMO)"},{"name":"vessel_type","in":"query","required":false,"schema":{"type":"string","description":"Filter by vessel_type_level1","title":"Vessel Type"},"description":"Filter by vessel_type_level1"},{"name":"flag","in":"query","required":false,"schema":{"type":"string","description":"Filter by flag state","title":"Flag"},"description":"Filter by flag state"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VesselMasterResponse"},"title":"Response Search Vessels Api V1 Vessel Master Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/vessel-master/imo/{imo}":{"get":{"tags":["vessel-master"],"summary":"Get Vessel By Imo","description":"Fetch a single vessel master record by IMO number.","operationId":"get_vessel_by_imo_api_v1_vessel_master_imo__imo__get","parameters":[{"name":"imo","in":"path","required":true,"schema":{"type":"string","title":"Imo"}},{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Tenant ID","title":"Tenant Id"},"description":"Tenant ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VesselMasterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/vessel-master/{mmsi}":{"get":{"tags":["vessel-master"],"summary":"Get Vessel","description":"Fetch a single vessel master record by MMSI.","operationId":"get_vessel_api_v1_vessel_master__mmsi__get","parameters":[{"name":"mmsi","in":"path","required":true,"schema":{"type":"string","title":"Mmsi"}},{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Tenant ID","title":"Tenant Id"},"description":"Tenant ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VesselMasterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/vessel-ownership":{"post":{"tags":["vessel-ownership"],"summary":"Link Entity","description":"Link an entity (owner, manager, etc.) to a vessel.\n\nIf an entity of the same type is already marked as current for\nthis vessel, it will be transitioned to historical automatically.","operationId":"link_entity_api_v1_vessel_ownership_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VesselOwnershipCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Link Entity Api V1 Vessel Ownership Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/vessel-ownership/{mmsi}":{"get":{"tags":["vessel-ownership"],"summary":"Get Ownership Chain","description":"Get the full ownership chain for a vessel.","operationId":"get_ownership_chain_api_v1_vessel_ownership__mmsi__get","parameters":[{"name":"mmsi","in":"path","required":true,"schema":{"type":"string","title":"Mmsi"}},{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Tenant ID","title":"Tenant Id"},"description":"Tenant ID"},{"name":"current_only","in":"query","required":false,"schema":{"type":"boolean","description":"Only current entities","default":true,"title":"Current Only"},"description":"Only current entities"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ownership Chain Api V1 Vessel Ownership  Mmsi  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/vessel-ownership/{mmsi}/history":{"get":{"tags":["vessel-ownership"],"summary":"Get Ownership History","description":"Detect historical ownership changes for a vessel.\n\nReturns a summary of entity transitions per entity type,\nincluding how many times each role has changed hands.","operationId":"get_ownership_history_api_v1_vessel_ownership__mmsi__history_get","parameters":[{"name":"mmsi","in":"path","required":true,"schema":{"type":"string","title":"Mmsi"}},{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Tenant ID","title":"Tenant Id"},"description":"Tenant ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ownership History Api V1 Vessel Ownership  Mmsi  History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/vessel-risk/{mmsi}":{"get":{"tags":["vessel-risk"],"summary":"Get Risk Assessment","description":"Get the latest risk assessment for a vessel.","operationId":"get_risk_assessment_api_v1_vessel_risk__mmsi__get","parameters":[{"name":"mmsi","in":"path","required":true,"schema":{"type":"string","title":"Mmsi"}},{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Tenant ID","title":"Tenant Id"},"description":"Tenant ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Risk Assessment Api V1 Vessel Risk  Mmsi  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/vessel-risk/{mmsi}/assess":{"post":{"tags":["vessel-risk"],"summary":"Assess Vessel","description":"Trigger a new risk assessment for a vessel.\n\nSupply known risk indicators in the request body. The service\nwill compute sub-scores for sanctions, behavioral, flag, and PSC\ncategories, then derive a composite 0-100 risk score.","operationId":"assess_vessel_api_v1_vessel_risk__mmsi__assess_post","parameters":[{"name":"mmsi","in":"path","required":true,"schema":{"type":"string","title":"Mmsi"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssessVesselRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Assess Vessel Api V1 Vessel Risk  Mmsi  Assess Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/vessel-risk/high-risk":{"get":{"tags":["vessel-risk"],"summary":"Get High Risk Vessels","description":"List all high-risk vessels above a given score threshold.","operationId":"get_high_risk_vessels_api_v1_vessel_risk_high_risk_get","parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Tenant ID","title":"Tenant Id"},"description":"Tenant ID"},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","maximum":100,"minimum":0,"description":"Minimum risk score","default":50,"title":"Min Score"},"description":"Minimum risk score"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get High Risk Vessels Api V1 Vessel Risk High Risk Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/vessel-routes/{mmsi}":{"get":{"tags":["vessel-routes"],"summary":"Get Current Route","description":"Get the most recent (current) route for a vessel.","operationId":"get_current_route_api_v1_vessel_routes__mmsi__get","parameters":[{"name":"mmsi","in":"path","required":true,"schema":{"type":"string","title":"Mmsi"}},{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Tenant ID","title":"Tenant Id"},"description":"Tenant ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Current Route Api V1 Vessel Routes  Mmsi  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/vessel-routes/estimate":{"post":{"tags":["vessel-routes"],"summary":"Estimate Route","description":"Estimate a new route between two ports.\n\nComputes Haversine distance, estimated duration, ECA zone\ncrossings, canal transits, and stores the result.","operationId":"estimate_route_api_v1_vessel_routes_estimate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EstimateRouteRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Estimate Route Api V1 Vessel Routes Estimate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/vessel-routes/{mmsi}/history":{"get":{"tags":["vessel-routes"],"summary":"Get Route History","description":"Get historical routes for a vessel, most recent first.","operationId":"get_route_history_api_v1_vessel_routes__mmsi__history_get","parameters":[{"name":"mmsi","in":"path","required":true,"schema":{"type":"string","title":"Mmsi"}},{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Tenant ID","title":"Tenant Id"},"description":"Tenant ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Route History Api V1 Vessel Routes  Mmsi  History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/replay/{incident_id}":{"get":{"tags":["replay"],"summary":"Get Replay Timeline","description":"Return the full replay timeline for an incident.\n\nAggregates events, sensor state changes, threat score changes,\noperator actions, asset movements, and weather conditions into\na single chronologically ordered timeline.","operationId":"get_replay_timeline_api_v1_replay__incident_id__get","parameters":[{"name":"incident_id","in":"path","required":true,"schema":{"type":"string","title":"Incident Id"}},{"name":"start_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO timestamp — filter from this time","title":"Start Time"},"description":"ISO timestamp — filter from this time"},{"name":"end_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO timestamp — filter to this time","title":"End Time"},"description":"ISO timestamp — filter to this time"},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated list: events,sensors,threats,actions,assets,weather","title":"Include"},"description":"Comma-separated list: events,sensors,threats,actions,assets,weather"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Replay Timeline Api V1 Replay  Incident Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/replay/{incident_id}/snapshot":{"get":{"tags":["replay"],"summary":"Get Replay Snapshot","description":"Return the state of all systems at a specific point in time.\n\nReturns sensor states, threat levels, asset positions, and weather\nconditions as they were at the given timestamp.","operationId":"get_replay_snapshot_api_v1_replay__incident_id__snapshot_get","parameters":[{"name":"incident_id","in":"path","required":true,"schema":{"type":"string","title":"Incident Id"}},{"name":"at","in":"query","required":true,"schema":{"type":"string","description":"ISO timestamp — the moment to snapshot","title":"At"},"description":"ISO timestamp — the moment to snapshot"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Replay Snapshot Api V1 Replay  Incident Id  Snapshot Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dealroom/summary":{"get":{"tags":["deal-room"],"summary":"Dealroom Summary","description":"Public company and raise summary. No authentication required.","operationId":"dealroom_summary_api_v1_dealroom_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Dealroom Summary Api V1 Dealroom Summary Get"}}}}}}},"/api/v1/dealroom/details":{"get":{"tags":["deal-room"],"summary":"Dealroom Details","description":"Detailed raise information. Requires investor authentication.","operationId":"dealroom_details_api_v1_dealroom_details_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Dealroom Details Api V1 Dealroom Details Get"}}}}}}},"/api/v1/dealroom/confidential":{"get":{"tags":["deal-room"],"summary":"Dealroom Confidential","description":"NDA-gated content. Always returns 403 until NDA workflow is built.","operationId":"dealroom_confidential_api_v1_dealroom_confidential_get","responses":{"403":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Dealroom Confidential Api V1 Dealroom Confidential Get"}}}}}}},"/api/v1/dealroom/agent-manifest":{"get":{"tags":["deal-room"],"summary":"Dealroom Agent Manifest","description":"Machine-readable deal room manifest for AI agents.","operationId":"dealroom_agent_manifest_api_v1_dealroom_agent_manifest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Dealroom Agent Manifest Api V1 Dealroom Agent Manifest Get"}}}}}}},"/api/v1/analytics/trends":{"get":{"tags":["analytics-trends"],"summary":"Trends","description":"Return trend analysis data for events in the specified look-back window.\n\nIncludes zone trends, event type trends, hourly/weekly distributions,\nand peak activity hours.","operationId":"trends_api_v1_analytics_trends_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant ID (optional filter)","title":"Tenant Id"},"description":"Tenant ID (optional filter)"},{"name":"days_back","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Look-back window in days","default":30,"title":"Days Back"},"description":"Look-back window in days"},{"name":"zone_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by zone ID","title":"Zone Id"},"description":"Filter by zone ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trends Api V1 Analytics Trends Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/predictions":{"get":{"tags":["analytics-trends"],"summary":"Predictions","description":"Return current predictive alerts based on trend analysis.\n\nEach alert includes a zone, prediction description, confidence score,\nrecommended action, and time horizon.","operationId":"predictions_api_v1_analytics_predictions_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant ID (optional filter)","title":"Tenant Id"},"description":"Tenant ID (optional filter)"},{"name":"days_back","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Look-back window in days","default":30,"title":"Days Back"},"description":"Look-back window in days"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Predictions Api V1 Analytics Predictions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/proactive-notifications":{"get":{"tags":["analytics-trends"],"summary":"Proactive Notifications","description":"Return proactive outreach recommendations for port authorities\nand operations centers.\n\nEach notification includes recipient type, message, urgency level,\nand data source.","operationId":"proactive_notifications_api_v1_analytics_proactive_notifications_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant ID (optional filter)","title":"Tenant Id"},"description":"Tenant ID (optional filter)"},{"name":"days_back","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Look-back window in days","default":30,"title":"Days Back"},"description":"Look-back window in days"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Proactive Notifications Api V1 Analytics Proactive Notifications Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/environments/seed/port-oakland":{"post":{"tags":["environments","seeds"],"summary":"Run Port Oakland Seed","description":"Run the Port of Oakland seed script.\n\nIdempotent: if the environment already exists, all records are\nreported as skipped and no duplicates are created.","operationId":"run_port_oakland_seed_api_v1_environments_seed_port_oakland_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Run Port Oakland Seed Api V1 Environments Seed Port Oakland Post"}}}}}}},"/api/v1/environments/port-oakland/status":{"get":{"tags":["environments","seeds"],"summary":"Port Oakland Status","description":"Return live counts of zones, sensors, and assets for Port of Oakland.","operationId":"port_oakland_status_api_v1_environments_port_oakland_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Port Oakland Status Api V1 Environments Port Oakland Status Get"}}}}}}},"/api/v1/environments/seed/reseed-observations":{"post":{"tags":["environments","seeds"],"summary":"Reseed Observations","description":"Delete and re-insert observation data with tenant_id field.\n\nCreates tables if they don't exist, removes existing rows,\nthen re-inserts from the updated seed definitions that include tenant_id.","operationId":"reseed_observations_api_v1_environments_seed_reseed_observations_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Reseed Observations Api V1 Environments Seed Reseed Observations Post"}}}}}}},"/api/v1/oakland/vessels":{"get":{"tags":["oakland-live"],"summary":"Oakland Vessels","description":"Real AIS vessel positions filtered by bounding box.\n\nAccepts explicit lat/lon bounding-box query params.  When all four\nare supplied they override the *area* preset.  Otherwise defaults\nto Oakland harbor ('harbor') or broader SF Bay ('bay').\n\nUses ZeroDB server-side bbox filtering via the /query POST endpoint\nso we only retrieve vessels within the target area instead of pulling\nall 12k+ global AIS rows.","operationId":"oakland_vessels_api_v1_oakland_vessels_get","parameters":[{"name":"area","in":"query","required":false,"schema":{"type":"string","description":"'harbor' or 'bay'","default":"harbor","title":"Area"},"description":"'harbor' or 'bay'"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":500,"title":"Limit"}},{"name":"lat_min","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Southern latitude bound","title":"Lat Min"},"description":"Southern latitude bound"},{"name":"lat_max","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Northern latitude bound","title":"Lat Max"},"description":"Northern latitude bound"},{"name":"lon_min","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Western longitude bound","title":"Lon Min"},"description":"Western longitude bound"},{"name":"lon_max","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Eastern longitude bound","title":"Lon Max"},"description":"Eastern longitude bound"},{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Port tenant identifier","default":"port-oakland","title":"Tenant Id"},"description":"Port tenant identifier"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oakland Vessels Api V1 Oakland Vessels Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oakland/vessels/count":{"get":{"tags":["oakland-live"],"summary":"Oakland Vessels Count","description":"Fast vessel count for the dashboard header.\n\nReturns only the deduplicated vessel count within the bounding box\n(defaults to Oakland harbor when no explicit bbox is provided).","operationId":"oakland_vessels_count_api_v1_oakland_vessels_count_get","parameters":[{"name":"lat_min","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Southern latitude bound","title":"Lat Min"},"description":"Southern latitude bound"},{"name":"lat_max","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Northern latitude bound","title":"Lat Max"},"description":"Northern latitude bound"},{"name":"lon_min","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Western longitude bound","title":"Lon Min"},"description":"Western longitude bound"},{"name":"lon_max","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Eastern longitude bound","title":"Lon Max"},"description":"Eastern longitude bound"},{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Port tenant identifier","default":"port-oakland","title":"Tenant Id"},"description":"Port tenant identifier"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oakland Vessels Count Api V1 Oakland Vessels Count Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oakland/weather":{"get":{"tags":["oakland-live"],"summary":"Oakland Weather","description":"Latest weather observations for the Oakland/SF Bay area.","operationId":"oakland_weather_api_v1_oakland_weather_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Port tenant identifier","default":"port-oakland","title":"Tenant Id"},"description":"Port tenant identifier"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oakland Weather Api V1 Oakland Weather Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oakland/tides":{"get":{"tags":["oakland-live"],"summary":"Oakland Tides","description":"Tide level readings for SF Bay stations.","operationId":"oakland_tides_api_v1_oakland_tides_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Port tenant identifier","default":"port-oakland","title":"Tenant Id"},"description":"Port tenant identifier"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oakland Tides Api V1 Oakland Tides Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oakland/environment":{"get":{"tags":["oakland-live"],"summary":"Oakland Environment","description":"Combined environmental data for Oakland harbor operations.","operationId":"oakland_environment_api_v1_oakland_environment_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Port tenant identifier","default":"port-oakland","title":"Tenant Id"},"description":"Port tenant identifier"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oakland Environment Api V1 Oakland Environment Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oakland/crime":{"get":{"tags":["oakland-live"],"summary":"Oakland Crime","description":"Recent crime incidents near the Port of Oakland.","operationId":"oakland_crime_api_v1_oakland_crime_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":500,"title":"Limit"}},{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Port tenant identifier","default":"port-oakland","title":"Tenant Id"},"description":"Port tenant identifier"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oakland Crime Api V1 Oakland Crime Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oakland/transit":{"get":{"tags":["oakland-live"],"summary":"Oakland Transit","description":"Real-time transit data combining BART and AC Transit feeds.","operationId":"oakland_transit_api_v1_oakland_transit_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":500,"title":"Limit"}},{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Port tenant identifier","default":"port-oakland","title":"Tenant Id"},"description":"Port tenant identifier"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oakland Transit Api V1 Oakland Transit Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oakland/traffic":{"get":{"tags":["oakland-live"],"summary":"Oakland Traffic","description":"Traffic conditions and lane closures near the Port of Oakland.","operationId":"oakland_traffic_api_v1_oakland_traffic_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":500,"title":"Limit"}},{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Port tenant identifier","default":"port-oakland","title":"Tenant Id"},"description":"Port tenant identifier"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oakland Traffic Api V1 Oakland Traffic Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oakland/incidents":{"get":{"tags":["oakland-live"],"summary":"Oakland Incidents","description":"Highway incidents from California Highway Patrol near Oakland.","operationId":"oakland_incidents_api_v1_oakland_incidents_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":500,"title":"Limit"}},{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Port tenant identifier","default":"port-oakland","title":"Tenant Id"},"description":"Port tenant identifier"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oakland Incidents Api V1 Oakland Incidents Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oakland/ferry":{"get":{"tags":["oakland-live"],"summary":"Oakland Ferry","description":"SF Bay ferry positions and schedules.","operationId":"oakland_ferry_api_v1_oakland_ferry_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":500,"title":"Limit"}},{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Port tenant identifier","default":"port-oakland","title":"Tenant Id"},"description":"Port tenant identifier"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oakland Ferry Api V1 Oakland Ferry Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oakland/port-ops":{"get":{"tags":["oakland-live"],"summary":"Oakland Port Ops","description":"Port of Oakland operational metrics (berth utilization, crane activity, gate throughput).","operationId":"oakland_port_ops_api_v1_oakland_port_ops_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":500,"title":"Limit"}},{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Port tenant identifier","default":"port-oakland","title":"Tenant Id"},"description":"Port tenant identifier"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oakland Port Ops Api V1 Oakland Port Ops Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oakland/regional":{"get":{"tags":["oakland-live"],"summary":"Oakland Regional","description":"Comprehensive regional picture combining all Oakland/SF Bay data sources in parallel.","operationId":"oakland_regional_api_v1_oakland_regional_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":500,"title":"Limit"}},{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Port tenant identifier","default":"port-oakland","title":"Tenant Id"},"description":"Port tenant identifier"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oakland Regional Api V1 Oakland Regional Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oakland/crime-report":{"get":{"tags":["oakland-crime-intel"],"summary":"Crime Report","description":"Generate a structured crime intelligence report for the port area.\n\nQueries the full OPD historical dataset from the lakehouse (967K+ records)\nwith fallback to ZeroDB real-time table.","operationId":"crime_report_api_v1_oakland_crime_report_get","parameters":[{"name":"radius_miles","in":"query","required":false,"schema":{"type":"number","maximum":25,"minimum":0.5,"description":"Search radius from port center in miles","default":3,"title":"Radius Miles"},"description":"Search radius from port center in miles"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Lookback window in days","default":30,"title":"Days"},"description":"Lookback window in days"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50000,"minimum":100,"description":"Max records to analyze","default":5000,"title":"Limit"},"description":"Max records to analyze"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Crime Report Api V1 Oakland Crime Report Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oakland/crime-heatmap":{"get":{"tags":["oakland-crime-intel"],"summary":"Crime Heatmap","description":"Return a crime density grid for map overlay rendering.\n\nDivides the area into a grid and returns the crime count per cell,\nsuitable for rendering as a heatmap overlay.","operationId":"crime_heatmap_api_v1_oakland_crime_heatmap_get","parameters":[{"name":"radius_miles","in":"query","required":false,"schema":{"type":"number","maximum":25,"minimum":0.5,"default":3,"title":"Radius Miles"}},{"name":"grid_size","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":5,"description":"Grid cells per axis","default":20,"title":"Grid Size"},"description":"Grid cells per axis"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50000,"minimum":100,"default":5000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Crime Heatmap Api V1 Oakland Crime Heatmap Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oakland/crime-summary":{"get":{"tags":["oakland-crime-intel"],"summary":"Crime Summary","description":"Quick crime stats for the dashboard header — lightweight endpoint.","operationId":"crime_summary_api_v1_oakland_crime_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Crime Summary Api V1 Oakland Crime Summary Get"}}}}}}},"/api/v1/oakland/crime-report/generate":{"post":{"tags":["oakland-crime-intel"],"summary":"Generate Crime Report","description":"Generate and store a crime intelligence report in ZeroDB.\n\nCreates a JSON report document with full analytics and stores it\nin the ``crime_reports`` table for later retrieval. Returns the\nstored report ID and a summary.","operationId":"generate_crime_report_api_v1_oakland_crime_report_generate_post","parameters":[{"name":"radius_miles","in":"query","required":false,"schema":{"type":"number","maximum":25,"minimum":0.5,"default":3,"title":"Radius Miles"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Generate Crime Report Api V1 Oakland Crime Report Generate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cable-config/{tenant_id}":{"get":{"tags":["cable-config"],"summary":"Get cable config by tenant","description":"Get cable configuration by tenant identifier.\n\nReturns the full cable configuration for the given tenant, including\nroute waypoints, monitoring zones, sensor segments, vessel templates,\nand threat definitions. Checks the in-memory cache first (60s TTL),\nthen queries the database. Falls back to the built-in default config\nwhen the tenant is ``cable-protect`` and no stored row exists.","operationId":"get_cable_config_api_v1_cable_config__tenant_id__get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Full cable configuration object for the requested tenant","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Cable Config Api V1 Cable Config  Tenant Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cable-config":{"get":{"tags":["cable-config"],"summary":"List all cable configs","description":"List all cable configurations.\n\nReturns every cable configuration stored in the database. Intended\nfor administrative use. Falls back to the built-in default config\nwhen no stored configurations exist.","operationId":"list_cable_configs_api_v1_cable_config_get","responses":{"200":{"description":"Array of all cable configurations with total count","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Cable Configs Api V1 Cable Config Get"}}}}}},"post":{"tags":["cable-config"],"summary":"Create or update cable config","description":"Create or update a cable configuration.\n\nAccepts the full config JSON in the request body. The ``tenant_id``\nfield is required and used as the logical key. Overwrites any\nexisting configuration for the same tenant and refreshes the\nin-memory cache.","operationId":"upsert_cable_config_api_v1_cable_config_post","responses":{"200":{"description":"Confirmation with tenant_id of the saved configuration","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Upsert Cable Config Api V1 Cable Config Post"}}}}}}},"/api/v1/admin/create-cable-tenant":{"post":{"tags":["cable-config"],"summary":"Provision cable operator tenant","description":"Provision a new cable operator tenant with config and seed data.\n\nAccepts a cable config JSON (same schema as POST /cable-config).\nSaves the configuration, then seeds the incidents table with five\nrepresentative incidents so the dashboard has data on first load.\n\nIdempotent: if a configuration already exists for the given\n``tenant_id`` the endpoint returns early with ``\"already_exists\": true``.","operationId":"create_cable_tenant_api_v1_admin_create_cable_tenant_post","responses":{"200":{"description":"Provisioning result with config and seed incident counts","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Cable Tenant Api V1 Admin Create Cable Tenant Post"}}}}}}},"/api/v1/port-config/{tenant_id}":{"get":{"tags":["port-config"],"summary":"Get port config by tenant","description":"Get port configuration by tenant identifier.\n\nReturns the full port configuration for the given tenant, including\nterminal zones, data feeds, weather stations, tide stations, and\nbuoy stations. Checks the in-memory cache first (60s TTL), then\nqueries the database. Falls back to the built-in default config\nwhen the tenant is ``port-oakland`` and no stored row exists.","operationId":"get_port_config_api_v1_port_config__tenant_id__get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Full port configuration object for the requested tenant","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Port Config Api V1 Port Config  Tenant Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/port-config":{"get":{"tags":["port-config"],"summary":"List all port configs","description":"List all port configurations.\n\nReturns every port configuration stored in the database. Intended\nfor administrative use. Falls back to the built-in default config\nwhen no stored configurations exist.","operationId":"list_port_configs_api_v1_port_config_get","responses":{"200":{"description":"Array of all port configurations with total count","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Port Configs Api V1 Port Config Get"}}}}}},"post":{"tags":["port-config"],"summary":"Create or update port config","description":"Create or update a port configuration.\n\nAccepts the full config JSON in the request body. The ``tenant_id``\nfield is required and used as the logical key. Overwrites any\nexisting configuration for the same tenant and refreshes the\nin-memory cache.","operationId":"upsert_port_config_api_v1_port_config_post","responses":{"200":{"description":"Confirmation with tenant_id of the saved configuration","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Upsert Port Config Api V1 Port Config Post"}}}}}}},"/api/v1/admin/create-port-tenant":{"post":{"tags":["port-config"],"summary":"Provision port authority tenant","description":"Provision a new port authority tenant with config and seed data.\n\nAccepts a port config JSON (same schema as POST /port-config).\nSaves the configuration, then seeds the incidents table with five\nrepresentative incidents so the dashboard has data on first load.\n\nIdempotent: if a configuration already exists for the given\n``tenant_id`` the endpoint returns early with ``\"already_exists\": true``.","operationId":"create_port_tenant_api_v1_admin_create_port_tenant_post","responses":{"200":{"description":"Provisioning result with config and seed incident counts","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Port Tenant Api V1 Admin Create Port Tenant Post"}}}}}}},"/api/v1/admin/create-tenant":{"post":{"tags":["admin-configurator"],"summary":"Provision a new tenant","description":"Provision a new tenant for any vertical.\n\nAccepts vertical type (\"cable_infrastructure\" or \"port_security\"),\ntenant_id, name, location, bounding_box, and optional config overrides.\nDelegates to the appropriate vertical-specific provisioning logic.","operationId":"create_tenant_api_v1_admin_create_tenant_post","responses":{"200":{"description":"Tenant provisioning result","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Tenant Api V1 Admin Create Tenant Post"}}}}}}},"/api/v1/admin/discover-feeds":{"post":{"tags":["admin-configurator"],"summary":"Auto-discover available data feeds","description":"Discover which data feeds have data available near a given location.\n\nProbes the lakehouse to determine regional data availability.\nGlobal feeds (AIS, weather, seismic, etc.) are always available.\nRegional feeds (crime, transit, traffic) depend on location.","operationId":"discover_feeds_endpoint_api_v1_admin_discover_feeds_post","responses":{"200":{"description":"Feed availability manifest for the given location","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Discover Feeds Endpoint Api V1 Admin Discover Feeds Post"}}}}}}},"/api/v1/admin/verticals":{"get":{"tags":["admin-configurator"],"summary":"List available verticals","description":"List available vertical types for tenant provisioning.","operationId":"list_verticals_api_v1_admin_verticals_get","responses":{"200":{"description":"Available vertical types for tenant provisioning","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Verticals Api V1 Admin Verticals Get"}}}}}}},"/api/v1/cable-protect/route":{"get":{"tags":["cable-protect"],"summary":"Cable route geometry","description":"Get the cable route GeoJSON geometry.\n\nReturns the full cable route as a GeoJSON LineString feature with\norigin and terminus landing station coordinates, total waypoint count,\nand cable identifier. Falls back to reference waypoints when the\nstored asset is unavailable.","operationId":"cable_route_api_v1_cable_protect_route_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Tenant identifier","default":"cable-protect","title":"Tenant Id"},"description":"Tenant identifier"}],"responses":{"200":{"description":"Cable route GeoJSON with origin and terminus coordinates","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cable Route Api V1 Cable Protect Route Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cable-protect/incidents":{"get":{"tags":["cable-protect"],"summary":"Cable corridor incidents","description":"List cable corridor protection incidents.\n\nReturns incidents affecting the cable protection zone, including\nanchor drag events, dark vessel detections, bottom trawling alerts,\nand acoustic anomalies. Supports filtering by status and severity.","operationId":"cable_incidents_api_v1_cable_protect_incidents_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Maximum number of incidents to return","default":100,"title":"Limit"},"description":"Maximum number of incidents to return"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status: open, investigating, resolved","title":"Status"},"description":"Filter by status: open, investigating, resolved"},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by severity: critical, high, medium, low","title":"Severity"},"description":"Filter by severity: critical, high, medium, low"},{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Tenant identifier","default":"cable-protect","title":"Tenant Id"},"description":"Tenant identifier"}],"responses":{"200":{"description":"List of cable protection incidents with severity and status","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cable Incidents Api V1 Cable Protect Incidents Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cable-protect/vessels":{"get":{"tags":["cable-protect"],"summary":"Vessel traffic in protection zone","description":"Get vessel traffic in the cable protection zone.\n\nReturns all vessels currently operating near the cable route,\nincluding position, speed, heading, and AIS transponder status.\nDark vessels (no active AIS signal) are flagged separately.","operationId":"cable_vessels_api_v1_cable_protect_vessels_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Tenant identifier","default":"cable-protect","title":"Tenant Id"},"description":"Tenant identifier"}],"responses":{"200":{"description":"Vessels currently operating near the cable route with positions and AIS status","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cable Vessels Api V1 Cable Protect Vessels Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cable-protect/sensors":{"get":{"tags":["cable-protect"],"summary":"DAS sensor array status","description":"Get DAS sensor array status along the cable.\n\nReturns the status of each Distributed Acoustic Sensing (DAS) segment\nalong the cable route, including online/offline state, signal strength,\nand event counts for the last hour.  Data sourced from the AINative\nLakehouse — returns empty when the platform is unreachable.","operationId":"cable_sensors_api_v1_cable_protect_sensors_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Tenant identifier","default":"cable-protect","title":"Tenant Id"},"description":"Tenant identifier"}],"responses":{"200":{"description":"Per-segment DAS sensor status with signal strength and event counts","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cable Sensors Api V1 Cable Protect Sensors Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cable-protect/weather":{"get":{"tags":["cable-protect"],"summary":"Landing station weather","description":"Get weather conditions at cable route monitoring stations.\n\nReturns current weather conditions at landing stations and key\nwaypoints along the cable route, including wind speed, wave height,\nvisibility, and temperature.  Data sourced from AINative Lakehouse.","operationId":"cable_weather_api_v1_cable_protect_weather_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Tenant identifier","default":"cable-protect","title":"Tenant Id"},"description":"Tenant identifier"}],"responses":{"200":{"description":"Weather conditions at monitoring stations along the cable route","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cable Weather Api V1 Cable Protect Weather Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cable-protect/stats":{"get":{"tags":["cable-protect"],"summary":"Dashboard statistics","description":"Get dashboard statistics for the command center.\n\nReturns aggregate statistics including total and active incidents,\nseverity and type breakdowns, DAS segment online counts, vessel\nzone counts, and cable length. Computed from live incident data\ncombined with sensor and vessel status.","operationId":"cable_stats_api_v1_cable_protect_stats_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Tenant identifier","default":"cable-protect","title":"Tenant Id"},"description":"Tenant identifier"}],"responses":{"200":{"description":"Aggregate statistics for the cable protection command center","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cable Stats Api V1 Cable Protect Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cable-protect/ocean-sensors":{"get":{"tags":["cable-protect"],"summary":"Ocean buoy readings","description":"Get ocean monitoring buoy readings near the cable route.\n\nReturns observation data from ocean monitoring buoys along the cable\ncorridor, including wave height, wave period, water temperature,\nand wind speed/direction.  Lakehouse-only — no fallback.","operationId":"cable_ocean_sensors_api_v1_cable_protect_ocean_sensors_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Tenant identifier","default":"cable-protect","title":"Tenant Id"},"description":"Tenant identifier"}],"responses":{"200":{"description":"Ocean monitoring buoy observations along the cable corridor","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cable Ocean Sensors Api V1 Cable Protect Ocean Sensors Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cable-protect/seismic":{"get":{"tags":["cable-protect"],"summary":"Seismic activity monitoring","description":"Get seismic activity near the cable route.\n\nReturns recent earthquake events in subduction zones and fault\nsystems near the cable corridor, with magnitude, depth, distance\nto cable, and an overall seismic risk level (low/moderate/elevated/high).\nLakehouse-only — no fallback.","operationId":"cable_seismic_api_v1_cable_protect_seismic_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Tenant identifier","default":"cable-protect","title":"Tenant Id"},"description":"Tenant identifier"}],"responses":{"200":{"description":"Recent seismic events near the cable corridor with risk assessment","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cable Seismic Api V1 Cable Protect Seismic Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cable-protect/tsunami":{"get":{"tags":["cable-protect"],"summary":"Tsunami buoy monitoring","description":"Get tsunami monitoring status for the cable route.\n\nReturns deep-ocean assessment buoy status and any active tsunami\nalerts in the cable protection zone, including sea level anomaly\nreadings and alert classifications.  Lakehouse-only — no fallback.","operationId":"cable_tsunami_api_v1_cable_protect_tsunami_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Tenant identifier","default":"cable-protect","title":"Tenant Id"},"description":"Tenant identifier"}],"responses":{"200":{"description":"DART buoy status and active tsunami alerts in the cable zone","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cable Tsunami Api V1 Cable Protect Tsunami Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cable-protect/bgp-status":{"get":{"tags":["cable-protect"],"summary":"BGP network health","description":"Get BGP network health for the cable corridor.\n\nMonitors autonomous systems that route traffic through the cable\ncorridor for BGP anomalies. Cable cuts cause detectable route\nchanges; this endpoint reports per-ASN prefix counts, status,\nand an overall health assessment (healthy/anomaly_detected/degraded/critical).\nLakehouse-only — no fallback.","operationId":"cable_bgp_status_api_v1_cable_protect_bgp_status_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Tenant identifier","default":"cable-protect","title":"Tenant Id"},"description":"Tenant identifier"}],"responses":{"200":{"description":"BGP routing health for autonomous systems traversing the cable","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cable Bgp Status Api V1 Cable Protect Bgp Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cable-protect/fishing-activity":{"get":{"tags":["cable-protect"],"summary":"Fishing vessel proximity","description":"Get fishing vessel activity near the cable route.\n\nTracks commercial fishing vessels operating in the cable protection\nzone with risk assessment based on proximity and gear type.\nBottom-trawling vessels pose the greatest threat to cable integrity.\nEach vessel is classified as danger, caution, or safe.\nLakehouse-only — no fallback.","operationId":"cable_fishing_activity_api_v1_cable_protect_fishing_activity_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Tenant identifier","default":"cable-protect","title":"Tenant Id"},"description":"Tenant identifier"}],"responses":{"200":{"description":"Fishing vessels near the cable route with gear type and risk level","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cable Fishing Activity Api V1 Cable Protect Fishing Activity Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cable-protect/threat-score":{"get":{"tags":["cable-protect"],"summary":"Composite threat score","description":"Get the composite threat score for the cable route.\n\nComputes a weighted threat score across six categories (anchor drag,\nbottom trawling, dark vessel, vessel loitering, acoustic anomaly,\ndiver/ROV) using live incident data. Returns per-category scores,\nweights, and an overall threat level (low/moderate/high/critical).","operationId":"cable_threat_score_api_v1_cable_protect_threat_score_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Tenant identifier","default":"cable-protect","title":"Tenant Id"},"description":"Tenant identifier"}],"responses":{"200":{"description":"Weighted composite threat score with per-category breakdown","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cable Threat Score Api V1 Cable Protect Threat Score Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cable-protect/route-risk":{"get":{"tags":["cable-protect"],"summary":"Route segment risk scoring","description":"Get per-segment risk scoring along the cable route.\n\nSplits the cable route into named segments and computes a risk score\nfor each based on incident severity within that segment's latitude\nrange. Returns risk level (low/moderate/high/critical), color code,\nand incident count per segment.","operationId":"cable_route_risk_api_v1_cable_protect_route_risk_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Tenant identifier","default":"cable-protect","title":"Tenant Id"},"description":"Tenant identifier"}],"responses":{"200":{"description":"Per-segment risk scores and color codes along the cable route","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cable Route Risk Api V1 Cable Protect Route Risk Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cable-protect/geofence-status":{"get":{"tags":["cable-protect"],"summary":"Geofence zone status","description":"Get geofence zone status for the cable protection corridor.\n\nEvaluates vessel positions against three concentric geofence buffer\nzones (DANGER 500m, CAUTION 1000m, WATCH 5000m) around the cable\nroute. Returns per-zone vessel counts, vessel details, and any\ntriggered alerts.","operationId":"cable_geofence_status_api_v1_cable_protect_geofence_status_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Tenant identifier","default":"cable-protect","title":"Tenant Id"},"description":"Tenant identifier"}],"responses":{"200":{"description":"Vessel intrusions per geofence buffer zone with triggered alerts","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cable Geofence Status Api V1 Cable Protect Geofence Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oakland/satellite-vessels":{"get":{"tags":["oakland-satellite"],"summary":"Get Satellite Vessels","description":"Satellite-detected vessels in Oakland port area.\n\nReturns vessel detections from satellite imagery, independent of\nAIS transponder data.  Returns an empty list when no detections\nare available (e.g. analytics subscription not configured).","operationId":"get_satellite_vessels_api_v1_oakland_satellite_vessels_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Satellite Vessels Api V1 Oakland Satellite Vessels Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oakland/dark-vessels":{"get":{"tags":["oakland-satellite"],"summary":"Get Dark Vessels","description":"Identify dark vessels -- detected by satellite but missing from AIS.\n\nCross-references satellite detections against live AIS data.\nVessels seen from space but broadcasting no AIS = dark vessel alert.","operationId":"get_dark_vessels_api_v1_oakland_dark_vessels_get","parameters":[{"name":"match_radius_m","in":"query","required":false,"schema":{"type":"number","maximum":5000,"minimum":100,"default":500,"title":"Match Radius M"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Dark Vessels Api V1 Oakland Dark Vessels Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cable-protect/satellite-vessels":{"get":{"tags":["cable-protect-vessels"],"summary":"Satellite vessel detections","description":"Get satellite-detected vessels in the cable corridor.\n\nReturns vessel detections from multi-satellite constellation imagery,\nindependent of AIS transponder data. Returns empty when the satellite\nanalytics subscription is not configured.","operationId":"get_satellite_vessels_api_v1_cable_protect_satellite_vessels_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Maximum number of detections to return","default":100,"title":"Limit"},"description":"Maximum number of detections to return"},{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Tenant identifier","default":"cable-protect","title":"Tenant Id"},"description":"Tenant identifier"}],"responses":{"200":{"description":"Vessel detections from satellite imagery in the cable corridor","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Satellite Vessels Api V1 Cable Protect Satellite Vessels Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cable-protect/dark-vessels":{"get":{"tags":["cable-protect-vessels"],"summary":"Dark vessel identification","description":"Identify dark vessels in the cable corridor.\n\nCross-references satellite imagery detections against AIS transponder\ndata. A vessel detected by satellite but not broadcasting AIS within\nthe match radius is flagged as a dark vessel -- a potential threat to\ncable infrastructure. Returns matched and unmatched detections with\nrisk levels based on proximity to the cable.","operationId":"get_dark_vessels_api_v1_cable_protect_dark_vessels_get","parameters":[{"name":"match_radius_m","in":"query","required":false,"schema":{"type":"number","maximum":5000,"minimum":100,"description":"Maximum distance in meters to match satellite detection to AIS position","default":500,"title":"Match Radius M"},"description":"Maximum distance in meters to match satellite detection to AIS position"},{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Tenant identifier","default":"cable-protect","title":"Tenant Id"},"description":"Tenant identifier"}],"responses":{"200":{"description":"Dark vessels detected by satellite but absent from AIS data","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Dark Vessels Api V1 Cable Protect Dark Vessels Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cable-protect/vessel-risk/{mmsi}":{"get":{"tags":["cable-protect-vessels"],"summary":"Vessel risk profile","description":"Get risk profile for a vessel in the cable corridor.\n\nRetrieves the latest risk assessment for the given MMSI. If no\nprior assessment exists, triggers a new assessment using vessel\ndata from the cable protection context. Returns risk score,\nthreat classification, and contributing factors.","operationId":"get_cable_vessel_risk_api_v1_cable_protect_vessel_risk__mmsi__get","parameters":[{"name":"mmsi","in":"path","required":true,"schema":{"type":"string","description":"MMSI (Maritime Mobile Service Identity) number","title":"Mmsi"},"description":"MMSI (Maritime Mobile Service Identity) number"},{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Tenant identifier","default":"cable-protect","title":"Tenant Id"},"description":"Tenant identifier"}],"responses":{"200":{"description":"Risk assessment for a specific vessel by MMSI","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Cable Vessel Risk Api V1 Cable Protect Vessel Risk  Mmsi  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oakland/satellite-imagery":{"get":{"tags":["oakland-satellite"],"summary":"Satellite Imagery","description":"Recent PlanetScope satellite imagery over Oakland port.\n\nReturns scene metadata + proxy thumbnail URLs for display in the\nsatellite intelligence panel.","operationId":"satellite_imagery_api_v1_oakland_satellite_imagery_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"default":7,"title":"Days"}},{"name":"max_cloud","in":"query","required":false,"schema":{"type":"number","maximum":1,"minimum":0,"default":0.2,"title":"Max Cloud"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Satellite Imagery Api V1 Oakland Satellite Imagery Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oakland/satellite-imagery/stats":{"get":{"tags":["oakland-satellite"],"summary":"Satellite Imagery Stats","description":"Daily satellite pass stats for Oakland port.","operationId":"satellite_imagery_stats_api_v1_oakland_satellite_imagery_stats_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"default":7,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Satellite Imagery Stats Api V1 Oakland Satellite Imagery Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oakland/satellite-tiles/scene/{scene_id}/thumb":{"get":{"tags":["oakland-satellite"],"summary":"Proxy Scene Thumbnail","description":"Proxy a scene thumbnail from the upstream tile provider.\n\nReturns the raw image bytes with the correct content-type so the\nfrontend can use this URL directly in an <img> tag or Leaflet popup.","operationId":"proxy_scene_thumbnail_api_v1_oakland_satellite_tiles_scene__scene_id__thumb_get","parameters":[{"name":"scene_id","in":"path","required":true,"schema":{"type":"string","description":"PlanetScope scene ID","title":"Scene Id"},"description":"PlanetScope scene ID"},{"name":"width","in":"query","required":false,"schema":{"type":"integer","maximum":1024,"minimum":64,"default":256,"title":"Width"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oakland/satellite-tiles/basemap/{z}/{x}/{y}.png":{"get":{"tags":["oakland-satellite"],"summary":"Proxy Basemap Tile","description":"Proxy a basemap tile from the upstream satellite tile provider.\n\nThe frontend can use this as a Leaflet / Mapbox tile layer URL:\n  /api/v1/oakland/satellite-tiles/basemap/{z}/{x}/{y}.png?mosaic=global_monthly\n\nNo API key is exposed to the client.","operationId":"proxy_basemap_tile_api_v1_oakland_satellite_tiles_basemap__z___x___y__png_get","parameters":[{"name":"z","in":"path","required":true,"schema":{"type":"integer","maximum":22,"minimum":0,"title":"Z"}},{"name":"x","in":"path","required":true,"schema":{"type":"integer","minimum":0,"title":"X"}},{"name":"y","in":"path","required":true,"schema":{"type":"integer","minimum":0,"title":"Y"}},{"name":"mosaic","in":"query","required":false,"schema":{"type":"string","description":"Basemap mosaic name","default":"global_monthly","title":"Mosaic"},"description":"Basemap mosaic name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oakland/satellite-tiles/available":{"get":{"tags":["oakland-satellite"],"summary":"List Available Tile Services","description":"Describe the satellite tile proxy endpoints available.\n\nHelps the frontend discover how to request tiles without knowing\nanything about the upstream provider.","operationId":"list_available_tile_services_api_v1_oakland_satellite_tiles_available_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Available Tile Services Api V1 Oakland Satellite Tiles Available Get"}}}}}}},"/api/v1/cable-protect/satellite-imagery":{"get":{"tags":["cable-protect-imagery"],"summary":"Satellite scene search","description":"Search recent satellite imagery over a cable corridor monitoring zone.\n\nReturns scene metadata from the multi-satellite constellation for the\nselected monitoring zone (florence, homer, or alaska), filtered by\ndate range and cloud cover. Includes proxy thumbnail URLs so the\nfrontend can display imagery without upstream API credentials.","operationId":"cable_satellite_imagery_api_v1_cable_protect_satellite_imagery_get","parameters":[{"name":"zone","in":"query","required":false,"schema":{"type":"string","description":"Monitoring zone: florence, homer, alaska","default":"florence","title":"Zone"},"description":"Monitoring zone: florence, homer, alaska"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"description":"Number of days to look back for imagery","default":7,"title":"Days"},"description":"Number of days to look back for imagery"},{"name":"max_cloud","in":"query","required":false,"schema":{"type":"number","maximum":1,"minimum":0,"description":"Maximum cloud cover fraction (0-1)","default":0.2,"title":"Max Cloud"},"description":"Maximum cloud cover fraction (0-1)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Maximum number of scenes to return","default":10,"title":"Limit"},"description":"Maximum number of scenes to return"},{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Tenant identifier for config lookup","default":"cable-protect","title":"Tenant Id"},"description":"Tenant identifier for config lookup"}],"responses":{"200":{"description":"Satellite scene metadata with proxy thumbnail URLs for the selected monitoring zone","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cable Satellite Imagery Api V1 Cable Protect Satellite Imagery Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cable-protect/satellite-imagery/stats":{"get":{"tags":["cable-protect-imagery"],"summary":"Imagery coverage statistics","description":"Get satellite imagery coverage statistics for a monitoring zone.\n\nReturns daily scene counts for the selected cable corridor monitoring\nzone over the requested time period. Useful for assessing imagery\ncoverage frequency and identifying gaps in satellite revisit cadence.","operationId":"cable_satellite_imagery_stats_api_v1_cable_protect_satellite_imagery_stats_get","parameters":[{"name":"zone","in":"query","required":false,"schema":{"type":"string","description":"Monitoring zone: florence, homer, alaska","default":"florence","title":"Zone"},"description":"Monitoring zone: florence, homer, alaska"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"description":"Number of days to aggregate","default":7,"title":"Days"},"description":"Number of days to aggregate"},{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Tenant identifier for config lookup","default":"cable-protect","title":"Tenant Id"},"description":"Tenant identifier for config lookup"}],"responses":{"200":{"description":"Daily scene counts for the monitoring zone over the requested period","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cable Satellite Imagery Stats Api V1 Cable Protect Satellite Imagery Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cable-protect/satellite-tiles/scene/{scene_id}/thumb":{"get":{"tags":["cable-protect-imagery"],"summary":"Scene thumbnail proxy","description":"Proxy a satellite scene thumbnail image.\n\nReturns the raw image bytes with the correct content-type so the\nfrontend can use this URL directly in an ``<img>`` tag or map popup\nwithout needing upstream API credentials. Responses are cached for\n24 hours.","operationId":"proxy_cable_scene_thumbnail_api_v1_cable_protect_satellite_tiles_scene__scene_id__thumb_get","parameters":[{"name":"scene_id","in":"path","required":true,"schema":{"type":"string","description":"Satellite scene identifier","title":"Scene Id"},"description":"Satellite scene identifier"},{"name":"width","in":"query","required":false,"schema":{"type":"integer","maximum":1024,"minimum":64,"description":"Thumbnail width in pixels","default":256,"title":"Width"},"description":"Thumbnail width in pixels"},{"name":"lat","in":"query","required":false,"schema":{"type":"number","description":"Scene center latitude (used for fallback tile)","default":44.05,"title":"Lat"},"description":"Scene center latitude (used for fallback tile)"},{"name":"lon","in":"query","required":false,"schema":{"type":"number","description":"Scene center longitude (used for fallback tile)","default":-124.15,"title":"Lon"},"description":"Scene center longitude (used for fallback tile)"}],"responses":{"200":{"description":"Raw image bytes for the requested satellite scene thumbnail","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cable-protect/satellite-tiles/basemap/{z}/{x}/{y}.png":{"get":{"tags":["cable-protect-imagery"],"summary":"Basemap tile proxy","description":"Proxy a satellite basemap tile.\n\nServes XYZ satellite basemap tiles for use as a Leaflet or Mapbox\ntile layer. The frontend can reference this URL pattern directly\nwithout any upstream API credentials. Responses are cached for 1 hour.\n\nURL pattern::\n\n    /api/v1/cable-protect/satellite-tiles/basemap/{z}/{x}/{y}.png?mosaic=global_monthly","operationId":"proxy_cable_basemap_tile_api_v1_cable_protect_satellite_tiles_basemap__z___x___y__png_get","parameters":[{"name":"z","in":"path","required":true,"schema":{"type":"integer","maximum":22,"minimum":0,"description":"Tile zoom level","title":"Z"},"description":"Tile zoom level"},{"name":"x","in":"path","required":true,"schema":{"type":"integer","minimum":0,"description":"Tile x coordinate","title":"X"},"description":"Tile x coordinate"},{"name":"y","in":"path","required":true,"schema":{"type":"integer","minimum":0,"description":"Tile y coordinate","title":"Y"},"description":"Tile y coordinate"},{"name":"mosaic","in":"query","required":false,"schema":{"type":"string","description":"Basemap mosaic name","default":"global_monthly","title":"Mosaic"},"description":"Basemap mosaic name"}],"responses":{"200":{"description":"Raw PNG tile for the requested zoom/x/y coordinate","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cable-protect/satellite-tiles/available":{"get":{"tags":["cable-protect-imagery"],"summary":"Available satellite data","description":"List available satellite tile proxy endpoints for cable monitoring.\n\nReturns service descriptions, URL patterns, and supported parameters\nfor all satellite tile proxy endpoints. Helps the frontend discover\nhow to request scene thumbnails and basemap tiles without needing\nupstream provider credentials.","operationId":"list_cable_tile_services_api_v1_cable_protect_satellite_tiles_available_get","responses":{"200":{"description":"Satellite tile service descriptions and URL patterns for the cable corridor","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Cable Tile Services Api V1 Cable Protect Satellite Tiles Available Get"}}}}}}},"/api/v1/sensor-feeds/ocean":{"get":{"tags":["sensor-feeds"],"summary":"Sensor Feeds Ocean","description":"Aggregated ocean sensor readings from ZeroDB observation tables.","operationId":"sensor_feeds_ocean_api_v1_sensor_feeds_ocean_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/sensor-feeds/internet":{"get":{"tags":["sensor-feeds"],"summary":"Sensor Feeds Internet","description":"Aggregated internet/cyber sensor readings from ZeroDB observation tables.","operationId":"sensor_feeds_internet_api_v1_sensor_feeds_internet_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/sensor-feeds/space":{"get":{"tags":["sensor-feeds"],"summary":"Sensor Feeds Space","description":"Aggregated space sensor readings from ZeroDB observation tables.","operationId":"sensor_feeds_space_api_v1_sensor_feeds_space_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/satellite-scheduler/status":{"get":{"tags":["satellite-scheduler"],"summary":"Scheduler Status","description":"Current state of the satellite scanning scheduler.","operationId":"scheduler_status_api_v1_satellite_scheduler_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Scheduler Status Api V1 Satellite Scheduler Status Get"}}}}}}},"/api/v1/satellite-scheduler/trigger":{"post":{"tags":["satellite-scheduler"],"summary":"Trigger Scan","description":"Trigger an immediate satellite scan cycle (bypasses the 15-minute interval).","operationId":"trigger_scan_api_v1_satellite_scheduler_trigger_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Trigger Scan Api V1 Satellite Scheduler Trigger Post"}}}}}}},"/api/v1/cameras/batch":{"post":{"tags":["Camera Zone Mapping"],"summary":"Register Cameras Batch","description":"Bulk register cameras with zone assignments.\n\nAccepts up to 500 cameras per request and assigns each to a zone.","operationId":"register_cameras_batch_api_v1_cameras_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CameraBatchRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Register Cameras Batch Api V1 Cameras Batch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cameras/{camera_id}/zone":{"get":{"tags":["Camera Zone Mapping"],"summary":"Get Camera Zone","description":"Look up which zone a camera belongs to, including zone metadata.","operationId":"get_camera_zone_api_v1_cameras__camera_id__zone_get","parameters":[{"name":"camera_id","in":"path","required":true,"schema":{"type":"string","title":"Camera Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CameraZoneResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo":{"get":{"tags":["demo"],"summary":"Demo Page","description":"Serve the Sentinel Gate screening demo page.","operationId":"demo_page_demo_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/demo/screen":{"post":{"tags":["demo"],"summary":"Demo Screen","description":"Run a screening for the demo UI (same-origin, no API key required).","operationId":"demo_screen_demo_screen_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Demo Screen Demo Screen Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"tags":["system"],"summary":"Health Check","description":"Lightweight liveness probe.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Health Check Health Get"}}}}}}}},"components":{"schemas":{"APIKeyCreatedResponse":{"properties":{"id":{"type":"string","title":"Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"name":{"type":"string","title":"Name"},"key":{"type":"string","title":"Key","description":"Full API key — shown only at creation time"},"key_preview":{"type":"string","title":"Key Preview","description":"First 8 characters for identification"},"permissions":{"items":{"type":"string"},"type":"array","title":"Permissions"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"},"is_active":{"type":"boolean","title":"Is Active","default":true},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","tenant_id","name","key","key_preview","permissions","created_at"],"title":"APIKeyCreatedResponse","description":"Returned ONCE when a key is generated — includes the full plain key."},"APIKeyListResponse":{"properties":{"keys":{"items":{"$ref":"#/components/schemas/src__backend__models__api_key__APIKeyResponse"},"type":"array","title":"Keys"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["keys","total"],"title":"APIKeyListResponse","description":"Paginated list of API keys."},"AbortResponse":{"properties":{"status":{"type":"string","title":"Status"},"drone_id":{"type":"string","title":"Drone Id"},"mission_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mission Id"},"drone_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Drone Status"},"aborted_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aborted At"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["status","drone_id"],"title":"AbortResponse","description":"Response from an abort operation."},"AcceptIncidentRequest":{"properties":{"incident_id":{"type":"string","title":"Incident Id","description":"Incident to acknowledge"},"mission_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mission Id","description":"Mission ID if known"}},"type":"object","required":["incident_id"],"title":"AcceptIncidentRequest","description":"Body for acknowledging a dispatch assignment."},"AcceptIncidentResponse":{"properties":{"status":{"type":"string","title":"Status"},"guard_id":{"type":"string","title":"Guard Id"},"incident_id":{"type":"string","title":"Incident Id"},"mission_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mission Id"},"accepted_at":{"type":"string","title":"Accepted At"}},"type":"object","required":["status","guard_id","incident_id","accepted_at"],"title":"AcceptIncidentResponse","description":"Response from accepting an incident assignment."},"ActionType":{"type":"string","enum":["notification","escalation","dispatch","report_generation"],"title":"ActionType"},"ActiveTrack":{"properties":{"track_id":{"type":"string","title":"Track Id"},"last_camera_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Camera Id"},"last_seen":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Seen"},"sighting_count":{"type":"integer","title":"Sighting Count","default":0}},"type":"object","required":["track_id"],"title":"ActiveTrack","description":"An active person track."},"AgentStartRequest":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"}},"type":"object","required":["tenant_id"],"title":"AgentStartRequest","description":"Body for starting an agent."},"Aggregation":{"type":"string","enum":["hour","day","week"],"title":"Aggregation"},"AnalyticsSummaryResponse":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"total_incidents":{"type":"integer","title":"Total Incidents","description":"Total incidents in date range"},"avg_response_minutes":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Response Minutes","description":"Mean time to first response (minutes)"},"sla_compliance_pct":{"anyOf":[{"type":"number","maximum":100,"minimum":0},{"type":"null"}],"title":"Sla Compliance Pct","description":"Percentage of incidents resolved within SLA"},"sla_response_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sla Response Minutes","description":"Tenant SLA target used for compliance calc"},"threats_by_type":{"items":{"$ref":"#/components/schemas/ThreatsByType"},"type":"array","title":"Threats By Type","description":"Breakdown of threat events by type"},"from_date":{"type":"string","title":"From Date"},"to_date":{"type":"string","title":"To Date"}},"type":"object","required":["tenant_id","total_incidents","from_date","to_date"],"title":"AnalyticsSummaryResponse","description":"Tenant-level analytics summary returned by GET /analytics/summary."},"AsRank":{"properties":{"rank":{"type":"integer","title":"Rank","default":0},"cone_asns":{"type":"integer","title":"Cone Asns","default":0},"degree":{"type":"integer","title":"Degree","default":0}},"type":"object","title":"AsRank"},"AssessVesselRequest":{"properties":{"tenant_id":{"type":"string","minLength":1,"title":"Tenant Id"},"flag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flag"},"reason":{"type":"string","title":"Reason","default":"manual_assessment"},"is_sanctioned_vessel":{"type":"boolean","title":"Is Sanctioned Vessel","default":false},"is_sanctioned_company":{"type":"boolean","title":"Is Sanctioned Company","default":false},"is_sanctioned_cargo":{"type":"boolean","title":"Is Sanctioned Cargo","default":false},"is_sanctioned_flag":{"type":"boolean","title":"Is Sanctioned Flag","default":false},"ais_gap_count":{"type":"integer","title":"Ais Gap Count","default":0},"ais_gap_total_hours":{"type":"number","title":"Ais Gap Total Hours","default":0},"ais_spoofing_detected":{"type":"boolean","title":"Ais Spoofing Detected","default":false},"sts_transfer_count":{"type":"integer","title":"Sts Transfer Count","default":0},"dark_sts_count":{"type":"integer","title":"Dark Sts Count","default":0},"high_risk_port_calls":{"type":"integer","title":"High Risk Port Calls","default":0},"psc_deficiencies_count":{"type":"integer","title":"Psc Deficiencies Count","default":0},"psc_detentions_count":{"type":"integer","title":"Psc Detentions Count","default":0},"last_inspection_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Inspection Date"},"flag_hopping_detected":{"type":"boolean","title":"Flag Hopping Detected","default":false},"previous_flags":{"items":{"type":"string"},"type":"array","title":"Previous Flags"},"vessel_imo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vessel Imo"}},"type":"object","required":["tenant_id"],"title":"AssessVesselRequest","description":"Body for POST /vessel-risk/{mmsi}/assess."},"AssetCreate":{"properties":{"tenant_id":{"type":"string","minLength":1,"title":"Tenant Id"},"environment_id":{"type":"string","minLength":1,"title":"Environment Id"},"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"type":{"$ref":"#/components/schemas/AssetType"},"status":{"type":"string","title":"Status","default":"available"},"location":{"anyOf":[{"$ref":"#/components/schemas/AssetLocation"},{"type":"null"}]},"health":{"anyOf":[{"$ref":"#/components/schemas/AssetHealth"},{"type":"null"}]},"capabilities":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Capabilities"},"assigned_incident_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assigned Incident Id"},"assigned_mission_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assigned Mission Id"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","required":["tenant_id","environment_id","name","type"],"title":"AssetCreate","description":"Payload for creating a new asset."},"AssetHealth":{"properties":{"battery":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Battery"},"fuel":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fuel"},"comms":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comms"},"last_heartbeat":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Heartbeat"}},"type":"object","title":"AssetHealth","description":"Runtime health indicators for an asset."},"AssetLocation":{"properties":{"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon"},"heading":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Heading"},"speed":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Speed"},"altitude_or_depth":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Altitude Or Depth"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","title":"AssetLocation","description":"Real-time position of an asset."},"AssetPosition":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name","default":""},"type":{"type":"string","title":"Type","default":""},"tenant_id":{"type":"string","title":"Tenant Id","default":""},"environment_id":{"type":"string","title":"Environment Id","default":""},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon"},"heading":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Heading"},"speed":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Speed"},"altitude_or_depth":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Altitude Or Depth"},"last_updated":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Updated"}},"type":"object","required":["id"],"title":"AssetPosition","description":"Current position of an asset for map rendering."},"AssetResponse":{"properties":{"id":{"type":"string","title":"Id"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"environment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Environment Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"type":{"type":"string","title":"Type"},"status":{"type":"string","title":"Status","default":"available"},"location":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Location"},"health":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Health"},"capabilities":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Capabilities"},"assigned_incident_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assigned Incident Id"},"assigned_mission_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assigned Mission Id"},"current_mission_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Mission Id"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","type"],"title":"AssetResponse","description":"Asset as returned from the API."},"AssetType":{"type":"string","enum":["patrol_vessel","usv","drone","camera","sensor_station","patrol_boat","guard_vessel","tugboat","workboat","auv","security_guard","repair_crew","coast_guard","vehicle"],"title":"AssetType"},"AssetUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"type":{"anyOf":[{"$ref":"#/components/schemas/AssetType"},{"type":"null"}]},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"location":{"anyOf":[{"$ref":"#/components/schemas/AssetLocation"},{"type":"null"}]},"health":{"anyOf":[{"$ref":"#/components/schemas/AssetHealth"},{"type":"null"}]},"capabilities":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Capabilities"},"assigned_incident_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assigned Incident Id"},"assigned_mission_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assigned Mission Id"},"current_mission_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Mission Id"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","title":"AssetUpdate","description":"Payload for updating an existing asset. All fields optional."},"AuditLogListResponse":{"properties":{"total":{"type":"integer","title":"Total"},"skip":{"type":"integer","title":"Skip"},"limit":{"type":"integer","title":"Limit"},"data":{"items":{"$ref":"#/components/schemas/AuditLogResponse"},"type":"array","title":"Data"}},"type":"object","required":["total","skip","limit","data"],"title":"AuditLogListResponse","description":"Paginated list of audit log entries."},"AuditLogResponse":{"properties":{"id":{"type":"string","title":"Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Id"},"action":{"type":"string","title":"Action"},"resource_type":{"type":"string","title":"Resource Type"},"resource_id":{"type":"string","title":"Resource Id"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details"},"ip_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip Address"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","tenant_id","action","resource_type","resource_id","created_at"],"title":"AuditLogResponse","description":"Audit log entry as returned from the API."},"AvailabilityType":{"type":"string","enum":["always_on","business_hours","on_call"],"title":"AvailabilityType","description":"User availability schedule types."},"BatchScreeningRequest":{"properties":{"subjects":{"items":{"$ref":"#/components/schemas/ScreeningRequest"},"type":"array","maxItems":5000,"minItems":1,"title":"Subjects"},"vertical":{"anyOf":[{"$ref":"#/components/schemas/src__backend__models__screening__Vertical"},{"type":"null"}]},"arrival_location":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Arrival Location"}},"type":"object","required":["subjects"],"title":"BatchScreeningRequest","description":"A batch of screening requests (e.g. a crew/passenger manifest)."},"BatchScreeningResult":{"properties":{"batch_id":{"type":"string","maxLength":64,"minLength":1,"title":"Batch Id"},"total":{"type":"integer","minimum":0,"title":"Total"},"results":{"items":{"$ref":"#/components/schemas/ScreeningResult"},"type":"array","title":"Results"},"signal":{"$ref":"#/components/schemas/Signal","default":"green"},"completed_at":{"type":"string","format":"date-time","title":"Completed At"}},"type":"object","required":["batch_id","total"],"title":"BatchScreeningResult","description":"Aggregated result of a batch screening run."},"BgpStatus":{"properties":{"prefix_count":{"type":"integer","title":"Prefix Count","default":0},"visibility":{"type":"number","title":"Visibility","default":100}},"type":"object","title":"BgpStatus"},"Body_upload_infrastructure_file_api_v1_environments__environment_id__infrastructure_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_infrastructure_file_api_v1_environments__environment_id__infrastructure_upload_post"},"BuildProfileRequest":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id","description":"Tenant ID for scoping AIS events"}},"type":"object","required":["tenant_id"],"title":"BuildProfileRequest","description":"Request body for building a vessel profile."},"CableImpact":{"properties":{"cable_system":{"type":"string","title":"Cable System","default":""},"length_km":{"type":"number","title":"Length Km","default":0},"latitude":{"type":"number","title":"Latitude","default":0},"gic_risk":{"type":"string","title":"Gic Risk","default":"low"}},"type":"object","title":"CableImpact"},"CableRiskItem":{"properties":{"cable_name":{"type":"string","title":"Cable Name"},"distance_nm":{"type":"number","title":"Distance Nm"},"zone_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zone Type"},"zone_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zone Name"},"risk_score":{"type":"number","title":"Risk Score"}},"type":"object","required":["cable_name","distance_nm","risk_score"],"title":"CableRiskItem"},"CameraBatchItem":{"properties":{"camera_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Camera Id","description":"Camera ID (auto-generated if omitted)"},"zone_id":{"type":"string","title":"Zone Id","description":"Zone to assign this camera to"},"name":{"type":"string","title":"Name","description":"Human-readable camera name","default":""},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat","description":"Camera latitude"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon","description":"Camera longitude"},"stream_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stream Url","description":"RTSP/HTTP stream URL"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"}},"type":"object","required":["zone_id"],"title":"CameraBatchItem","description":"Single camera in a batch registration request."},"CameraBatchRequest":{"properties":{"cameras":{"items":{"$ref":"#/components/schemas/CameraBatchItem"},"type":"array","maxItems":500,"minItems":1,"title":"Cameras"}},"type":"object","required":["cameras"],"title":"CameraBatchRequest","description":"Request body for bulk camera registration."},"CameraZoneResponse":{"properties":{"camera_id":{"type":"string","title":"Camera Id"},"zone_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zone Id"},"zone_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zone Name"},"zone_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zone Type"}},"type":"object","required":["camera_id"],"title":"CameraZoneResponse","description":"Zone information for a camera."},"ChatRequest":{"properties":{"query":{"anyOf":[{"type":"string","maxLength":2000,"minLength":1},{"type":"null"}],"title":"Query","description":"Natural language query"},"message":{"anyOf":[{"type":"string","maxLength":2000,"minLength":1},{"type":"null"}],"title":"Message","description":"Alias for query"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id","description":"Tenant ID for scoping context"}},"type":"object","title":"ChatRequest","description":"Operator chat query payload."},"ChatResponse":{"properties":{"answer":{"type":"string","title":"Answer","description":"AI-generated answer grounded in operational data"},"sources":{"items":{"$ref":"#/components/schemas/ChatSource"},"type":"array","title":"Sources","description":"Evidence sources used"},"credits_used":{"type":"integer","title":"Credits Used","description":"Credits consumed for this query","default":0}},"type":"object","required":["answer"],"title":"ChatResponse","description":"Structured chat response with grounded answer and sources."},"ChatSource":{"properties":{"type":{"type":"string","title":"Type","description":"Source type (memory, graph, incident, tool:*)"},"content":{"type":"string","title":"Content","description":"Brief summary of the source content"}},"type":"object","required":["type","content"],"title":"ChatSource","description":"A source reference for the chat answer."},"ComplianceReportRequest":{"properties":{"from_date":{"type":"string","title":"From Date","description":"ISO date string, e.g. 2026-01-01"},"to_date":{"type":"string","title":"To Date","description":"ISO date string, e.g. 2026-01-31"},"format":{"$ref":"#/components/schemas/ReportFormat","default":"markdown"}},"type":"object","required":["from_date","to_date"],"title":"ComplianceReportRequest","description":"POST /reports/compliance request body."},"ConsumerLogin":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"}},"type":"object","required":["email"],"title":"ConsumerLogin","description":"Login payload for an existing API consumer."},"ConsumerRegister":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"email":{"type":"string","format":"email","title":"Email"},"company":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Company"},"use_case":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Use Case"},"plan":{"$ref":"#/components/schemas/PlanTier","default":"free"},"password":{"anyOf":[{"type":"string","maxLength":128,"minLength":8},{"type":"null"}],"title":"Password"}},"type":"object","required":["name","email"],"title":"ConsumerRegister","description":"Registration payload for a new API consumer."},"ConsumerResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"email":{"type":"string","title":"Email"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"use_case":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Use Case"},"plan":{"$ref":"#/components/schemas/PlanTier"},"status":{"$ref":"#/components/schemas/ConsumerStatus"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"tenants":{"items":{"type":"string"},"type":"array","title":"Tenants"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["id","name","email","plan","status","created_at","updated_at"],"title":"ConsumerResponse","description":"Public representation of an API consumer.\n\nNote: password_hash is intentionally excluded so it is never\nserialized in API responses."},"ConsumerStatus":{"type":"string","enum":["pending","active","suspended"],"title":"ConsumerStatus","description":"Registration status of an API consumer."},"CorrelationResponse":{"properties":{"physical":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Physical"},"cyber":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Cyber"},"space":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Space"},"environmental":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Environmental"},"correlation_summary":{"type":"string","title":"Correlation Summary"}},"type":"object","required":["physical","cyber","space","environmental","correlation_summary"],"title":"CorrelationResponse"},"DeviceType":{"type":"string","enum":["auv","station","mobile"],"title":"DeviceType"},"DroneDispatchRequest":{"properties":{"incident_id":{"type":"string","title":"Incident Id","description":"Incident ID to respond to"},"target_lat":{"type":"number","title":"Target Lat","description":"Target latitude (decimal degrees)"},"target_lon":{"type":"number","title":"Target Lon","description":"Target longitude (decimal degrees)"},"tenant_id":{"type":"string","title":"Tenant Id","description":"Tenant scope"},"environment_id":{"type":"string","title":"Environment Id","description":"Environment scope"},"altitude_m":{"type":"number","maximum":400,"minimum":10,"title":"Altitude M","description":"Cruise altitude (m AGL)","default":50},"loiter_time_s":{"type":"number","maximum":3600,"minimum":30,"title":"Loiter Time S","description":"Loiter time (seconds)","default":300},"speed_m_s":{"type":"number","maximum":50,"minimum":1,"title":"Speed M S","description":"Cruise speed (m/s)","default":15}},"type":"object","required":["incident_id","target_lat","target_lon","tenant_id","environment_id"],"title":"DroneDispatchRequest","description":"Request body for dispatching a drone to an incident."},"DroneDispatchResponse":{"properties":{"status":{"type":"string","title":"Status"},"drone_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Drone Id"},"drone_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Drone Name"},"mission_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mission Id"},"incident_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Incident Id"},"eta_minutes":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Eta Minutes"},"flight_time_s":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Flight Time S"},"distance_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance Km"},"altitude_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Altitude M"},"speed_m_s":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Speed M S"},"mission_items":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Mission Items"},"mission_item_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Mission Item Count"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["status"],"title":"DroneDispatchResponse","description":"Response from a drone dispatch operation."},"EdgeDeviceConfigUpdate":{"properties":{"threat_library_ids":{"items":{"type":"string"},"type":"array","title":"Threat Library Ids"},"zone_ids":{"items":{"type":"string"},"type":"array","title":"Zone Ids"}},"type":"object","title":"EdgeDeviceConfigUpdate","description":"Payload for configuring what an edge device syncs."},"EdgeDeviceRegister":{"properties":{"tenant_id":{"type":"string","minLength":1,"title":"Tenant Id"},"environment_id":{"type":"string","minLength":1,"title":"Environment Id"},"device_name":{"type":"string","maxLength":255,"minLength":1,"title":"Device Name"},"device_type":{"$ref":"#/components/schemas/DeviceType"}},"type":"object","required":["tenant_id","environment_id","device_name","device_type"],"title":"EdgeDeviceRegister","description":"Payload for registering a new edge device."},"EdgeDeviceResponse":{"properties":{"id":{"type":"string","title":"Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"environment_id":{"type":"string","title":"Environment Id"},"device_name":{"type":"string","title":"Device Name"},"device_type":{"type":"string","title":"Device Type"},"threat_library_ids":{"items":{"type":"string"},"type":"array","title":"Threat Library Ids"},"zone_ids":{"items":{"type":"string"},"type":"array","title":"Zone Ids"},"last_sync_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Sync At"},"sync_version":{"type":"integer","title":"Sync Version","default":0},"status":{"type":"string","title":"Status","default":"active"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["id","tenant_id","environment_id","device_name","device_type","created_at","updated_at"],"title":"EdgeDeviceResponse","description":"Edge device as returned from the API."},"EntityType":{"type":"string","enum":["beneficial_owner","registered_owner","commercial_manager","operator","technical_manager","ism_manager","ship_builder","engine_builder","classification_society","p_i_club"],"title":"EntityType"},"EnvironmentCreate":{"properties":{"tenant_id":{"type":"string","minLength":1,"title":"Tenant Id"},"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"type":{"$ref":"#/components/schemas/EnvironmentType"},"location":{"$ref":"#/components/schemas/Location"},"boundary":{"anyOf":[{"$ref":"#/components/schemas/GeoJSONPolygon"},{"type":"null"}]},"map_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Map Config"},"infrastructure":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Infrastructure"},"status":{"$ref":"#/components/schemas/EnvironmentStatus","default":"active"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"}},"type":"object","required":["tenant_id","name","type","location"],"title":"EnvironmentCreate","description":"Payload for creating a new environment."},"EnvironmentResponse":{"properties":{"id":{"type":"string","title":"Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"name":{"type":"string","title":"Name"},"type":{"type":"string","title":"Type"},"location":{"additionalProperties":true,"type":"object","title":"Location"},"boundary":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Boundary"},"map_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Map Config"},"infrastructure":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Infrastructure"},"status":{"type":"string","title":"Status","default":"active"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["id","tenant_id","name","type","location","created_at","updated_at"],"title":"EnvironmentResponse","description":"Environment as returned from the API."},"EnvironmentStatus":{"type":"string","enum":["active","maintenance","offline"],"title":"EnvironmentStatus"},"EnvironmentType":{"type":"string","enum":["cable_landing","port","estate","campus","utility","airport","military"],"title":"EnvironmentType"},"EnvironmentUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"type":{"anyOf":[{"$ref":"#/components/schemas/EnvironmentType"},{"type":"null"}]},"location":{"anyOf":[{"$ref":"#/components/schemas/Location"},{"type":"null"}]},"boundary":{"anyOf":[{"$ref":"#/components/schemas/GeoJSONPolygon"},{"type":"null"}]},"map_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Map Config"},"infrastructure":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Infrastructure"},"status":{"anyOf":[{"$ref":"#/components/schemas/EnvironmentStatus"},{"type":"null"}]},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"}},"type":"object","title":"EnvironmentUpdate","description":"Payload for partially updating an existing environment. All fields optional."},"EnvironmentalRiskResponse":{"properties":{"risk_level":{"type":"string","title":"Risk Level","default":"low"},"hazards":{"$ref":"#/components/schemas/HazardsSummary"}},"type":"object","title":"EnvironmentalRiskResponse"},"EstimateRouteRequest":{"properties":{"tenant_id":{"type":"string","minLength":1,"title":"Tenant Id"},"vessel_mmsi":{"type":"string","minLength":1,"title":"Vessel Mmsi"},"origin_port":{"type":"string","minLength":1,"title":"Origin Port"},"origin_lat":{"type":"number","title":"Origin Lat"},"origin_lon":{"type":"number","title":"Origin Lon"},"destination_port":{"type":"string","minLength":1,"title":"Destination Port"},"destination_lat":{"type":"number","title":"Destination Lat"},"destination_lon":{"type":"number","title":"Destination Lon"},"speed_knots":{"type":"number","maximum":40,"exclusiveMinimum":0,"title":"Speed Knots","default":12}},"type":"object","required":["tenant_id","vessel_mmsi","origin_port","origin_lat","origin_lon","destination_port","destination_lat","destination_lon"],"title":"EstimateRouteRequest","description":"Body for POST /vessel-routes/estimate."},"EventBatchCreate":{"properties":{"events":{"items":{"$ref":"#/components/schemas/EventCreate"},"type":"array","maxItems":100,"minItems":1,"title":"Events"}},"type":"object","required":["events"],"title":"EventBatchCreate","description":"Batch of up to 100 events accepted by POST /events/batch."},"EventBatchResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/EventResponse"},"type":"array","title":"Results"},"accepted":{"type":"integer","title":"Accepted"},"rejected":{"type":"integer","title":"Rejected"}},"type":"object","required":["results","accepted","rejected"],"title":"EventBatchResponse","description":"Acknowledgement returned for a batch of ingested events."},"EventCreate":{"properties":{"type":{"type":"string","maxLength":64,"minLength":1,"title":"Type"},"source":{"type":"string","maxLength":255,"minLength":1,"title":"Source"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"sensor_id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Sensor Id"},"location":{"anyOf":[{"$ref":"#/components/schemas/EventLocation"},{"type":"null"}]},"correlation_id":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Correlation Id"},"environment_id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Environment Id"}},"type":"object","required":["type","source","data"],"title":"EventCreate","description":"Single Sentinel Event Object accepted by POST /events."},"EventLocation":{"properties":{"lat":{"type":"number","maximum":90,"minimum":-90,"title":"Lat"},"lon":{"type":"number","maximum":180,"minimum":-180,"title":"Lon"}},"type":"object","required":["lat","lon"],"title":"EventLocation","description":"Latitude / longitude pair."},"EventProcessedUpdate":{"properties":{"processed":{"type":"boolean","title":"Processed","default":true},"threat_score":{"anyOf":[{"type":"number","maximum":100,"minimum":0},{"type":"null"}],"title":"Threat Score"},"incident_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Incident Id"}},"type":"object","title":"EventProcessedUpdate","description":"Payload for marking an event as processed."},"EventResponse":{"properties":{"event_id":{"type":"string","title":"Event Id"},"zone_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zone Id"},"processed":{"type":"boolean","title":"Processed","default":false}},"type":"object","required":["event_id"],"title":"EventResponse","description":"Acknowledgement returned for a single ingested event."},"EventType":{"type":"string","enum":["ais_position","acoustic_anomaly","camera_motion","weather_alert","access_attempt","manual_report","geofence_entry","geofence_exit","port_call","dock","undock","sts_start","sts_end","bunkering_start","bunkering_end","proximity_vessel","proximity_pilot","proximity_tug","collision_risk","ais_off","ais_on","ais_gap","ais_spoofing","anchor_drag","ship_lost","drifting","stopped","underway","manoeuvring","crossed_strait","high_wind","waiting_opl","name_changed","destination_changed","flag_changed","imo_changed","vessel_type_changed","draught_changed","eta_changed","first_daily_pos","intermediate_daily_pos"],"title":"EventType"},"EvidencePackage":{"properties":{"incident_id":{"type":"string","title":"Incident Id"},"threat_score":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Threat Score"},"timeline":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Timeline"},"video_clips":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Video Clips"},"ais_track":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Ais Track"},"das_waveform":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Das Waveform"},"weather_snapshot":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Weather Snapshot"},"operator_notes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Operator Notes"},"assets_assigned":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Assets Assigned"},"mission_history":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Mission History"},"generated_pdf":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generated Pdf"},"replay_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Replay Url"},"evidence_files":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Evidence Files"}},"type":"object","required":["incident_id"],"title":"EvidencePackage","description":"Structured evidence bundle attached to an incident (ES-01).\n\nReplaces the flat ``evidence_files: list[str]`` with a rich,\n13-component schema that captures every facet of evidentiary\ninformation the platform can provide."},"ExecutionMode":{"type":"string","enum":["manual","assisted","autonomous"],"title":"ExecutionMode"},"FALFormType":{"type":"string","enum":["form5","form6"],"title":"FALFormType","description":"Which IMO FAL form is being submitted."},"FALManifest":{"properties":{"form_type":{"$ref":"#/components/schemas/FALFormType"},"vessel_name":{"type":"string","maxLength":256,"minLength":1,"title":"Vessel Name"},"imo_number":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Imo Number"},"mmsi":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Mmsi"},"voyage":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Voyage"},"arrival_location":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Arrival Location"},"persons":{"items":{"$ref":"#/components/schemas/ManifestPerson"},"type":"array","title":"Persons"}},"type":"object","required":["form_type","vessel_name"],"title":"FALManifest","description":"A parsed IMO FAL Form 5 / Form 6 manifest."},"FeedEntry":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"incident_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Incident Id"},"action":{"type":"string","title":"Action"},"actor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Id"},"timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Timestamp"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"incident_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Incident Title"},"severity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"}},"type":"object","required":["id","action"],"title":"FeedEntry","description":"Single entry in the team activity feed."},"FireSummary":{"properties":{"nearby_count":{"type":"integer","title":"Nearby Count","default":0},"nearest_km":{"type":"number","title":"Nearest Km","default":-1}},"type":"object","title":"FireSummary"},"GeoJSONGeometry":{"properties":{"type":{"type":"string","title":"Type","description":"Polygon or Circle"},"coordinates":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Coordinates","description":"GeoJSON coordinate array (for Polygon)"},"center":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Center","description":"[lon, lat] center point (for Circle)"},"radius_m":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Radius M","description":"Radius in metres (for Circle)"}},"type":"object","required":["type"],"title":"GeoJSONGeometry","description":"GeoJSON-style geometry — polygon or circle.\n\nFor polygons: type=\"Polygon\", coordinates=[[[lon,lat], ...]]\nFor circles:  type=\"Circle\", center=[lon,lat], radius_m=<metres>"},"GeoJSONPolygon":{"properties":{"type":{"type":"string","title":"Type","default":"Polygon"},"coordinates":{"items":{"items":{"items":{"type":"number"},"type":"array"},"type":"array"},"type":"array","title":"Coordinates","description":"Array of linear rings"}},"type":"object","required":["coordinates"],"title":"GeoJSONPolygon","description":"GeoJSON polygon for environment perimeter boundary."},"GeopoliticalRiskResponse":{"properties":{"risk_level":{"type":"string","title":"Risk Level"},"categories":{"additionalProperties":true,"type":"object","title":"Categories"}},"type":"object","required":["risk_level","categories"],"title":"GeopoliticalRiskResponse"},"GraphRAGQueryRequest":{"properties":{"query":{"type":"string","maxLength":2000,"minLength":1,"title":"Query","description":"Natural-language operator question"},"tenant_id":{"type":"string","title":"Tenant Id","description":"Tenant ID for scoping results"}},"type":"object","required":["query","tenant_id"],"title":"GraphRAGQueryRequest","description":"Request body for operator-friendly query."},"GraphRAGQueryResponse":{"properties":{"answer":{"type":"string","title":"Answer"},"sources":{"items":{"$ref":"#/components/schemas/GraphRAGSource"},"type":"array","title":"Sources"},"vector_count":{"type":"integer","title":"Vector Count"},"graph_count":{"type":"integer","title":"Graph Count"}},"type":"object","required":["answer","sources","vector_count","graph_count"],"title":"GraphRAGQueryResponse","description":"Structured answer with source attribution."},"GraphRAGSearchRequest":{"properties":{"query":{"type":"string","maxLength":2000,"minLength":1,"title":"Query","description":"Search query"},"tenant_id":{"type":"string","title":"Tenant Id","description":"Tenant ID for scoping results"},"limit":{"type":"integer","maximum":50,"minimum":1,"title":"Limit","description":"Max results to return","default":10}},"type":"object","required":["query","tenant_id"],"title":"GraphRAGSearchRequest","description":"Request body for raw hybrid search."},"GraphRAGSearchResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/GraphRAGSearchResult"},"type":"array","title":"Results"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["results","total"],"title":"GraphRAGSearchResponse","description":"Response for raw hybrid search."},"GraphRAGSearchResult":{"properties":{"source":{"type":"string","title":"Source","description":"'vector' or 'graph'"},"content":{"type":"string","title":"Content"},"score":{"type":"number","title":"Score"},"entity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity"},"relationships":{"items":{},"type":"array","title":"Relationships"}},"type":"object","required":["source","content","score"],"title":"GraphRAGSearchResult","description":"Single hybrid search result."},"GraphRAGSource":{"properties":{"type":{"type":"string","title":"Type"},"content":{"type":"string","title":"Content"},"score":{"type":"number","title":"Score"},"entity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity"}},"type":"object","required":["type","content","score"],"title":"GraphRAGSource","description":"Source attribution for a query answer."},"GuardAssignment":{"properties":{"mission_id":{"type":"string","title":"Mission Id"},"incident_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Incident Id"},"status":{"type":"string","title":"Status"},"asset_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Type"},"dispatched_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dispatched At"},"distance_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance Km"}},"type":"object","required":["mission_id","status"],"title":"GuardAssignment","description":"An active mission/assignment for a guard."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HazardsSummary":{"properties":{"seismic":{"$ref":"#/components/schemas/SeismicSummary"},"tsunami":{"$ref":"#/components/schemas/TsunamiSummary"},"ocean":{"$ref":"#/components/schemas/OceanSummary"},"weather":{"$ref":"#/components/schemas/WeatherSummary"},"fire":{"$ref":"#/components/schemas/FireSummary"},"radiation":{"$ref":"#/components/schemas/RadiationSummary"}},"type":"object","title":"HazardsSummary"},"HybridSearchRequest":{"properties":{"query":{"type":"string","maxLength":2000,"minLength":1,"title":"Query","description":"Natural language search query"},"tenant_id":{"type":"string","title":"Tenant Id","description":"Tenant ID for scoping results"},"entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Id","description":"Optional entity anchor for graph traversal (e.g. vessel:123456789)"},"limit":{"type":"integer","maximum":50,"minimum":1,"title":"Limit","description":"Max results to return","default":10}},"type":"object","required":["query","tenant_id"],"title":"HybridSearchRequest","description":"Request body for GraphRAG hybrid search."},"HybridSearchResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/HybridSearchResult"},"type":"array","title":"Results"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["results","total"],"title":"HybridSearchResponse","description":"Response from hybrid search."},"HybridSearchResult":{"properties":{"content":{"type":"string","title":"Content"},"combined_score":{"type":"number","title":"Combined Score"},"raw_score":{"type":"number","title":"Raw Score","default":0},"source":{"type":"string","title":"Source"},"sources":{"items":{"type":"string"},"type":"array","title":"Sources"},"entity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity"},"entity_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Type"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"relationships":{"items":{},"type":"array","title":"Relationships"}},"type":"object","required":["content","combined_score","source"],"title":"HybridSearchResult","description":"Single result from hybrid search."},"IncidentComplete":{"properties":{"answers":{"additionalProperties":true,"type":"object","title":"Answers","description":"Answers keyed by question ID from missing_questions"}},"type":"object","required":["answers"],"title":"IncidentComplete","description":"PATCH /incidents/{id}/complete — fill missing fields."},"IncidentEscalate":{"properties":{"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","title":"IncidentEscalate","description":"PATCH /incidents/{id}/escalate — optional escalation note."},"IncidentFinalize":{"properties":{"severity":{"anyOf":[{"$ref":"#/components/schemas/IncidentSeverity"},{"type":"null"}]},"priority":{"anyOf":[{"$ref":"#/components/schemas/IncidentPriority"},{"type":"null"}]},"summary_override":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary Override"}},"type":"object","title":"IncidentFinalize","description":"POST /incidents/{id}/finalize — optional overrides when finalizing."},"IncidentPriority":{"type":"string","enum":["p1","p2","p3","p4"],"title":"IncidentPriority"},"IncidentRespond":{"properties":{"response_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Status"},"assigned_to":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Assigned To"},"resolution_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Note"}},"type":"object","title":"IncidentRespond","description":"PATCH /incidents/{id}/respond — assign and update response status."},"IncidentResponse":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"environment_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Environment Id"},"incident_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Incident Number"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"incident_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Incident Type"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"severity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"},"threat_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Threat Score"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"status":{"type":"string","title":"Status","default":"draft"},"priority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Priority"},"owner_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Owner Id"},"assigned_asset_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Assigned Asset Ids"},"related_event_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Related Event Ids"},"related_sensor_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Related Sensor Ids"},"zone_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Zone Id"},"location":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Location"},"transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript"},"fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Fields"},"missing_questions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Missing Questions"},"completion_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completion Summary"},"ai_response_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Response Plan"},"ai_post_incident_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Post Incident Note"},"escalation_level":{"type":"integer","title":"Escalation Level","default":0},"acknowledged_by":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Acknowledged By"},"acknowledged_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Acknowledged At"},"resolved_by":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Resolved By"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"},"resolution_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Note"},"evidence_files":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Evidence Files"},"evidence":{"anyOf":[{"$ref":"#/components/schemas/EvidencePackage"},{"type":"null"}]},"audio_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Path"},"pdf_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Path"},"sla_breach":{"type":"boolean","title":"Sla Breach","default":false},"timeline":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Timeline"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","title":"IncidentResponse","description":"Full incident representation returned by the API."},"IncidentSeverity":{"type":"string","enum":["critical","high","medium","low","info"],"title":"IncidentSeverity"},"Indicator":{"properties":{"sensor_type":{"type":"string","title":"Sensor Type"},"condition":{"type":"string","title":"Condition"},"threshold":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Threshold"},"weight":{"type":"number","title":"Weight","default":1}},"type":"object","required":["sensor_type","condition"],"title":"Indicator","description":"A single detection indicator within a threat library entry."},"InfrastructureDeleteResponse":{"properties":{"file_id":{"type":"string","title":"File Id"},"deleted":{"type":"boolean","title":"Deleted","default":true}},"type":"object","required":["file_id"],"title":"InfrastructureDeleteResponse","description":"Confirmation of file deletion."},"InfrastructureFileResponse":{"properties":{"file_id":{"type":"string","title":"File Id"},"filename":{"type":"string","title":"Filename"},"content_type":{"type":"string","title":"Content Type"},"size":{"type":"integer","title":"Size"},"path":{"type":"string","title":"Path"},"geometries":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Geometries"},"uploaded_at":{"type":"string","title":"Uploaded At"}},"type":"object","required":["file_id","filename","content_type","size","path","uploaded_at"],"title":"InfrastructureFileResponse","description":"Single infrastructure file as returned from the API."},"InfrastructureListResponse":{"properties":{"environment_id":{"type":"string","title":"Environment Id"},"files":{"items":{"$ref":"#/components/schemas/InfrastructureFileResponse"},"type":"array","title":"Files"}},"type":"object","required":["environment_id"],"title":"InfrastructureListResponse","description":"List of infrastructure files for an environment."},"InsuranceReportRequest":{"properties":{"format":{"$ref":"#/components/schemas/ReportFormat","default":"markdown"},"include_financial_placeholder":{"type":"boolean","title":"Include Financial Placeholder","default":true}},"type":"object","title":"InsuranceReportRequest","description":"POST /reports/insurance/{incident_id} request body (optional overrides)."},"IntegrationCreate":{"properties":{"tenant_id":{"type":"string","minLength":1,"title":"Tenant Id"},"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"type":{"$ref":"#/components/schemas/IntegrationType"},"provider":{"$ref":"#/components/schemas/IntegrationProvider"},"config":{"additionalProperties":true,"type":"object","title":"Config"},"secrets_ref":{"type":"string","minLength":1,"title":"Secrets Ref"},"status":{"type":"string","title":"Status","default":"active"},"error_log":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Error Log"}},"type":"object","required":["tenant_id","name","type","provider","secrets_ref"],"title":"IntegrationCreate","description":"Payload for creating a new integration."},"IntegrationProvider":{"type":"string","enum":["marinetraffic","spire","windward","verkada","twilio","resend","custom"],"title":"IntegrationProvider"},"IntegrationResponse":{"properties":{"id":{"type":"string","title":"Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"name":{"type":"string","title":"Name"},"type":{"type":"string","title":"Type"},"provider":{"type":"string","title":"Provider"},"config":{"additionalProperties":true,"type":"object","title":"Config"},"secrets_ref":{"type":"string","title":"Secrets Ref"},"status":{"type":"string","title":"Status","default":"active"},"last_sync_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Sync At"},"error_log":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Error Log"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["id","tenant_id","name","type","provider","secrets_ref","created_at","updated_at"],"title":"IntegrationResponse","description":"Integration as returned from the API."},"IntegrationType":{"type":"string","enum":["ais_provider","camera_system","communication","weather","acoustic","das","custom"],"title":"IntegrationType"},"IntegrationUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"type":{"anyOf":[{"$ref":"#/components/schemas/IntegrationType"},{"type":"null"}]},"provider":{"anyOf":[{"$ref":"#/components/schemas/IntegrationProvider"},{"type":"null"}]},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"},"secrets_ref":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Secrets Ref"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"error_log":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Error Log"}},"type":"object","title":"IntegrationUpdate","description":"Payload for updating an existing integration. All fields optional."},"InternetHealthResponse":{"properties":{"health_score":{"type":"number","title":"Health Score","default":100},"bgp_status":{"$ref":"#/components/schemas/BgpStatus"},"rpki":{"$ref":"#/components/schemas/RpkiStatus"},"outages":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Outages"},"traffic_anomalies":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Traffic Anomalies"},"as_rank":{"$ref":"#/components/schemas/AsRank"}},"type":"object","title":"InternetHealthResponse"},"Location":{"properties":{"lat":{"type":"number","maximum":90,"minimum":-90,"title":"Lat"},"lon":{"type":"number","maximum":180,"minimum":-180,"title":"Lon"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}},"type":"object","required":["lat","lon"],"title":"Location","description":"Geographic location of an environment."},"LocationUpdate":{"properties":{"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"heading":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Heading"},"speed":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Speed"},"altitude_or_depth":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Altitude Or Depth"}},"type":"object","required":["lat","lon"],"title":"LocationUpdate","description":"Dedicated payload for updating an asset's location."},"MFASetupResponse":{"properties":{"secret":{"type":"string","title":"Secret"},"provisioning_uri":{"type":"string","title":"Provisioning Uri"}},"type":"object","required":["secret","provisioning_uri"],"title":"MFASetupResponse","description":"Response from TOTP setup."},"MFAStatusResponse":{"properties":{"mfa_enabled":{"type":"boolean","title":"Mfa Enabled"}},"type":"object","required":["mfa_enabled"],"title":"MFAStatusResponse","description":"Response from MFA enable/disable."},"MFAVerifyRequest":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"MFAVerifyRequest","description":"Request body for TOTP verification."},"MFAVerifyResponse":{"properties":{"valid":{"type":"boolean","title":"Valid"}},"type":"object","required":["valid"],"title":"MFAVerifyResponse","description":"Response from TOTP verification."},"ManifestPerson":{"properties":{"family_name":{"type":"string","maxLength":128,"minLength":1,"title":"Family Name"},"given_name":{"type":"string","maxLength":128,"title":"Given Name","default":""},"nationality":{"anyOf":[{"type":"string","maxLength":3},{"type":"null"}],"title":"Nationality"},"date_of_birth":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Date Of Birth"},"document_number":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Document Number"},"seaman_book_number":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Seaman Book Number"},"rank":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Rank"},"role":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Role"}},"type":"object","required":["family_name"],"title":"ManifestPerson","description":"A single crew member (Form 5) or passenger (Form 6) row.\n\nField names mirror the IMO FAL person block. ``rank`` is used for crew,\n``role`` for passengers; both are optional and either may be supplied."},"ManifestScreenRequest":{"properties":{"tenant_id":{"type":"string","maxLength":64,"minLength":1,"title":"Tenant Id"},"manifest":{"$ref":"#/components/schemas/FALManifest"}},"type":"object","required":["tenant_id","manifest"],"title":"ManifestScreenRequest","description":"Body for ``POST /screening/adapters/manifest``."},"ManualReportCreate":{"properties":{"type":{"$ref":"#/components/schemas/ManualReportType"},"description":{"type":"string","maxLength":5000,"minLength":1,"title":"Description"},"location":{"anyOf":[{"$ref":"#/components/schemas/ReportLocation"},{"type":"null"}]},"severity_estimate":{"$ref":"#/components/schemas/SeverityEstimate","default":"medium"},"environment_id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Environment Id"},"attachments":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":10},{"type":"null"}],"title":"Attachments","description":"List of file references (ZeroDB file IDs or URLs)"}},"type":"object","required":["type","description"],"title":"ManualReportCreate","description":"POST /reports/manual request body."},"ManualReportResponse":{"properties":{"report_id":{"type":"string","title":"Report Id"},"event_id":{"type":"string","title":"Event Id"},"zone_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zone Id"},"message":{"type":"string","title":"Message","default":"Report received and submitted to event pipeline"}},"type":"object","required":["report_id","event_id"],"title":"ManualReportResponse","description":"Response after a manual report is accepted and piped as an event."},"ManualReportType":{"type":"string","enum":["suspicious_activity","trespassing","vandalism","safety_hazard","fire","medical","weather","equipment_failure","access_violation","other"],"title":"ManualReportType","description":"Dropdown options for report type."},"MissionComplete":{"properties":{"after_action_report":{"type":"string","minLength":1,"title":"After Action Report"}},"type":"object","required":["after_action_report"],"title":"MissionComplete","description":"Payload for completing a mission with an after-action report."},"MissionCreate":{"properties":{"tenant_id":{"type":"string","minLength":1,"title":"Tenant Id"},"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"incident_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Incident Id"},"asset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Id"},"asset_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Asset Ids"},"type":{"$ref":"#/components/schemas/MissionType"},"destination":{"anyOf":[{"$ref":"#/components/schemas/MissionDestination"},{"type":"null"}]},"waypoints":{"anyOf":[{"items":{"$ref":"#/components/schemas/Waypoint"},"type":"array"},{"type":"null"}],"title":"Waypoints"},"objective":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Objective"},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions"},"priority":{"type":"integer","maximum":5,"minimum":1,"title":"Priority","description":"1=highest, 5=lowest","default":3},"dispatched_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dispatched By"}},"type":"object","required":["tenant_id","name","type"],"title":"MissionCreate","description":"Payload for creating a new mission."},"MissionDestination":{"properties":{"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["lat","lon"],"title":"MissionDestination","description":"Where the asset should go."},"MissionResponse":{"properties":{"id":{"type":"string","title":"Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"incident_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Incident Id"},"asset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Id"},"asset_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Asset Ids"},"type":{"type":"string","title":"Type"},"status":{"type":"string","title":"Status","default":"planned"},"destination":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Destination"},"waypoints":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Waypoints"},"objective":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Objective"},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions"},"priority":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Priority"},"distance_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance Km"},"dispatched_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dispatched By"},"dispatched_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dispatched At"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"arrived_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Arrived At"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"},"after_action_report":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"After Action Report"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["id","tenant_id","type","created_at","updated_at"],"title":"MissionResponse","description":"Mission as returned from the API."},"MissionStatusUpdate":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"MissionStatusUpdate","description":"Payload for updating a mission's status."},"MissionType":{"type":"string","enum":["patrol","inspection","interdiction","repair","surveillance"],"title":"MissionType"},"OceanSummary":{"properties":{"wave_height_m":{"type":"number","title":"Wave Height M","default":0},"water_temp_c":{"type":"number","title":"Water Temp C","default":0},"wind_speed":{"type":"number","title":"Wind Speed","default":0}},"type":"object","title":"OceanSummary"},"OnDutyGuard":{"properties":{"shift_id":{"type":"string","title":"Shift Id"},"guard_id":{"type":"string","title":"Guard Id"},"status":{"type":"string","title":"Status"},"start_time":{"type":"string","title":"Start Time"},"end_time":{"type":"string","title":"End Time"},"zone_ids":{"items":{"type":"string"},"type":"array","title":"Zone Ids","default":[]}},"type":"object","required":["shift_id","guard_id","status","start_time","end_time"],"title":"OnDutyGuard","description":"A guard currently on duty."},"PersonMatch":{"properties":{"track_id":{"type":"string","title":"Track Id"},"similarity":{"type":"number","title":"Similarity"},"camera_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Camera Id"},"timestamp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timestamp"}},"type":"object","required":["track_id","similarity"],"title":"PersonMatch","description":"A matching person track."},"PersonSummary":{"properties":{"name":{"type":"string","title":"Name"},"nationality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nationality"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"check_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Check Id"},"signal":{"$ref":"#/components/schemas/Signal","default":"green"},"risk_score":{"type":"number","title":"Risk Score","default":0}},"type":"object","required":["name"],"title":"PersonSummary","description":"Per-person screening summary in the vessel-level result."},"PersonTrackRequest":{"properties":{"embedding":{"items":{"type":"number"},"type":"array","title":"Embedding","description":"Face/body embedding vector"},"camera_id":{"type":"string","title":"Camera Id","description":"Source camera ID"},"timestamp":{"type":"string","title":"Timestamp","description":"Detection timestamp (ISO 8601)"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata","description":"Extra detection metadata"}},"type":"object","required":["embedding","camera_id","timestamp"],"title":"PersonTrackRequest","description":"Request body for tracking a person via embedding."},"PersonTrackResponse":{"properties":{"track_id":{"type":"string","title":"Track Id"},"matches":{"items":{"$ref":"#/components/schemas/PersonMatch"},"type":"array","title":"Matches","default":[]}},"type":"object","required":["track_id"],"title":"PersonTrackResponse","description":"Response from a person track operation."},"PingRequest":{"properties":{"guard_id":{"type":"string","title":"Guard Id","description":"Guard asset ID"},"lat":{"type":"number","title":"Lat","description":"Latitude"},"lon":{"type":"number","title":"Lon","description":"Longitude"},"battery_pct":{"anyOf":[{"type":"number","maximum":100,"minimum":0},{"type":"null"}],"title":"Battery Pct","description":"Battery percentage"},"accuracy_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Accuracy M","description":"GPS accuracy in metres"}},"type":"object","required":["guard_id","lat","lon"],"title":"PingRequest","description":"GPS heartbeat from a guard's mobile device."},"PingResponse":{"properties":{"status":{"type":"string","title":"Status","default":"ok"},"guard_id":{"type":"string","title":"Guard Id"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["guard_id","updated_at"],"title":"PingResponse","description":"Acknowledgement of GPS heartbeat."},"PlanInfo":{"properties":{"tier":{"$ref":"#/components/schemas/PlanTier"},"name":{"type":"string","title":"Name"},"price_monthly":{"type":"number","title":"Price Monthly"},"calls_per_day":{"type":"integer","title":"Calls Per Day"},"rate_limit_rpm":{"type":"integer","title":"Rate Limit Rpm"},"features":{"items":{"type":"string"},"type":"array","title":"Features"}},"type":"object","required":["tier","name","price_monthly","calls_per_day","rate_limit_rpm","features"],"title":"PlanInfo","description":"Description of an available plan tier."},"PlanTier":{"type":"string","enum":["free","basic","pro","enterprise"],"title":"PlanTier","description":"Available plan tiers for API consumers."},"PositionUpdate":{"properties":{"lat":{"type":"number","maximum":90,"minimum":-90,"title":"Lat","description":"Latitude in decimal degrees"},"lon":{"type":"number","maximum":180,"minimum":-180,"title":"Lon","description":"Longitude in decimal degrees"},"heading":{"anyOf":[{"type":"number","maximum":360,"minimum":0},{"type":"null"}],"title":"Heading","description":"Heading in degrees (0=N)"},"speed":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Speed","description":"Speed in knots"},"altitude_or_depth":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Altitude Or Depth","description":"Altitude (positive) or depth (negative) in metres"}},"type":"object","required":["lat","lon"],"title":"PositionUpdate","description":"Payload for PATCH /assets/{id}/position."},"PublicIncidentCreate":{"properties":{"incident_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Incident Type"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"narrative":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Narrative"},"location":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Location"},"fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Fields"},"source":{"type":"string","title":"Source","default":"manual"}},"type":"object","title":"PublicIncidentCreate","description":"POST /incidents/public — anonymous incident report."},"RadiationSummary":{"properties":{"level_cpm":{"type":"number","title":"Level Cpm","default":0},"status":{"type":"string","title":"Status","default":"normal"}},"type":"object","title":"RadiationSummary"},"RecommendedAction":{"type":"string","enum":["clear","review","hold"],"title":"RecommendedAction","description":"Recommended operator action for a screening result."},"ReflectRequest":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id","description":"Tenant ID to analyze incidents for"},"time_window_hours":{"type":"integer","maximum":8760,"minimum":1,"title":"Time Window Hours","description":"How far back to look for resolved incidents (default 168 = 7 days)","default":168}},"type":"object","required":["tenant_id"],"title":"ReflectRequest","description":"Request body for triggering knowledge reflection."},"ReflectResponse":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"status":{"type":"string","title":"Status"},"reflection_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reflection Id"},"time_window_hours":{"type":"integer","title":"Time Window Hours"},"total_incidents_analyzed":{"type":"integer","title":"Total Incidents Analyzed","default":0},"patterns_found":{"type":"integer","title":"Patterns Found","default":0},"confidence":{"type":"number","title":"Confidence","default":0},"severity_distribution":{"additionalProperties":{"type":"integer"},"type":"object","title":"Severity Distribution"},"patterns":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Patterns"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["tenant_id","status","time_window_hours"],"title":"ReflectResponse","description":"Response from knowledge reflection."},"ReportCreateRequest":{"properties":{"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"type":{"$ref":"#/components/schemas/ReportType"},"title":{"type":"string","maxLength":500,"minLength":1,"title":"Title"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"incident_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Incident Id"},"generated_by":{"$ref":"#/components/schemas/ReportGeneratedBy","default":"manual"},"recipients":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Recipients"}},"type":"object","required":["type","title"],"title":"ReportCreateRequest","description":"POST /reports — create a report directly (manual or scheduled)."},"ReportFormat":{"type":"string","enum":["markdown","pdf","csv"],"title":"ReportFormat"},"ReportGenerateRequest":{"properties":{"report_type":{"$ref":"#/components/schemas/ReportType","default":"incident"},"recipients":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Recipients","description":"Email addresses to deliver the report to"}},"type":"object","title":"ReportGenerateRequest","description":"POST /reports/generate/{incident_id} — optional overrides."},"ReportGeneratedBy":{"type":"string","enum":["ai_agent","manual","scheduled"],"title":"ReportGeneratedBy"},"ReportLocation":{"properties":{"lat":{"anyOf":[{"type":"number","maximum":90,"minimum":-90},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number","maximum":180,"minimum":-180},{"type":"null"}],"title":"Lon"},"address":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Address"}},"type":"object","title":"ReportLocation","description":"Location specified as lat/lon or free-text address (or both)."},"ReportType":{"type":"string","enum":["incident","executive_summary","compliance","insurance","sla","analytics"],"title":"ReportType"},"RiskAssessment":{"type":"string","enum":["high","medium","low","none"],"title":"RiskAssessment"},"RiskComponents":{"properties":{"sanctions_score":{"type":"number","maximum":100,"minimum":0,"title":"Sanctions Score","default":0},"dark_web_score":{"type":"number","maximum":100,"minimum":0,"title":"Dark Web Score","default":0},"association_score":{"type":"number","maximum":100,"minimum":0,"title":"Association Score","default":0},"country_risk_score":{"type":"number","maximum":100,"minimum":0,"title":"Country Risk Score","default":0},"behavioral_score":{"type":"number","maximum":100,"minimum":0,"title":"Behavioral Score","default":0},"media_score":{"type":"number","maximum":100,"minimum":0,"title":"Media Score","default":0}},"type":"object","title":"RiskComponents","description":"The six weighted components that make up a composite risk score.\n\nEach component is a 0-100 sub-score. The composite is the weighted sum\nusing the fixed weights below."},"RpkiStatus":{"properties":{"valid":{"type":"integer","title":"Valid","default":0},"invalid":{"type":"integer","title":"Invalid","default":0},"unknown":{"type":"integer","title":"Unknown","default":0}},"type":"object","title":"RpkiStatus"},"SLAReportRequest":{"properties":{"from_date":{"type":"string","title":"From Date","description":"ISO date string"},"to_date":{"type":"string","title":"To Date","description":"ISO date string"},"format":{"$ref":"#/components/schemas/ReportFormat","default":"markdown"}},"type":"object","required":["from_date","to_date"],"title":"SLAReportRequest","description":"POST /reports/sla request body."},"SOSRequest":{"properties":{"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat","description":"Current latitude"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon","description":"Current longitude"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Optional distress message"}},"type":"object","title":"SOSRequest","description":"Emergency alert from a guard."},"SOSResponse":{"properties":{"status":{"type":"string","title":"Status"},"incident_id":{"type":"string","title":"Incident Id"},"guard_id":{"type":"string","title":"Guard Id"},"severity":{"type":"string","title":"Severity","default":"critical"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["status","incident_id","guard_id","created_at"],"title":"SOSResponse","description":"Response from SOS alert creation."},"SSOCallbackResponse":{"properties":{"user_id":{"type":"string","title":"User Id"},"email":{"type":"string","title":"Email"},"is_new":{"type":"boolean","title":"Is New"},"sso_provider":{"type":"string","title":"Sso Provider"}},"type":"object","required":["user_id","email","is_new","sso_provider"],"title":"SSOCallbackResponse","description":"Response from SSO callback."},"SSOInitiateResponse":{"properties":{"authorization_url":{"type":"string","title":"Authorization Url"},"provider":{"type":"string","title":"Provider"}},"type":"object","required":["authorization_url","provider"],"title":"SSOInitiateResponse","description":"Response from SSO initiation."},"SSOProvider":{"type":"string","enum":["google","microsoft","okta"],"title":"SSOProvider","description":"Supported SSO identity providers."},"SatelliteHealth":{"properties":{"tracked":{"type":"integer","title":"Tracked","default":0},"degraded":{"type":"integer","title":"Degraded","default":0}},"type":"object","title":"SatelliteHealth"},"ScoringFactors":{"properties":{"distance_weight":{"type":"number","title":"Distance Weight","default":1},"speed_weight":{"type":"number","title":"Speed Weight","default":1},"duration_weight":{"type":"number","title":"Duration Weight","default":1},"history_weight":{"type":"number","title":"History Weight","default":1},"time_of_day_weight":{"type":"number","title":"Time Of Day Weight","default":1},"sensor_confidence_weight":{"type":"number","title":"Sensor Confidence Weight","default":1}},"type":"object","title":"ScoringFactors","description":"Weights used by the threat engine to compute composite scores."},"ScreeningFlag":{"properties":{"type":{"type":"string","maxLength":64,"minLength":1,"title":"Type"},"detail":{"type":"string","maxLength":512,"minLength":1,"title":"Detail"},"severity":{"$ref":"#/components/schemas/Severity","default":"low"}},"type":"object","required":["type","detail"],"title":"ScreeningFlag","description":"A single risk finding surfaced during screening."},"ScreeningRequest":{"properties":{"subject_type":{"$ref":"#/components/schemas/SubjectType"},"name":{"type":"string","maxLength":256,"minLength":1,"title":"Name"},"aliases":{"items":{"type":"string"},"type":"array","title":"Aliases"},"date_of_birth":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Date Of Birth"},"nationality":{"anyOf":[{"type":"string","maxLength":3},{"type":"null"}],"title":"Nationality"},"document_number":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Document Number"},"document_type":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Document Type"},"email":{"anyOf":[{"type":"string","maxLength":320},{"type":"null"}],"title":"Email"},"booking_reference":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Booking Reference"},"arrival_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Arrival Date"},"arrival_location":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Arrival Location"},"vertical":{"anyOf":[{"$ref":"#/components/schemas/src__backend__models__screening__Vertical"},{"type":"null"}]}},"type":"object","required":["subject_type","name"],"title":"ScreeningRequest","description":"Inbound screening request for a single subject."},"ScreeningResult":{"properties":{"check_id":{"type":"string","maxLength":64,"minLength":1,"title":"Check Id"},"signal":{"$ref":"#/components/schemas/Signal"},"risk_score":{"type":"number","maximum":100,"minimum":0,"title":"Risk Score"},"components":{"$ref":"#/components/schemas/RiskComponents"},"recommended_action":{"$ref":"#/components/schemas/RecommendedAction"},"flags":{"items":{"$ref":"#/components/schemas/ScreeningFlag"},"type":"array","title":"Flags"},"confidence":{"type":"number","maximum":1,"minimum":0,"title":"Confidence","default":1},"screened_at":{"type":"string","format":"date-time","title":"Screened At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"graph_depth_searched":{"type":"integer","maximum":10,"minimum":0,"title":"Graph Depth Searched","default":0},"dark_web_sources_checked":{"type":"integer","minimum":0,"title":"Dark Web Sources Checked","default":0},"watchlist_entities_compared":{"type":"integer","minimum":0,"title":"Watchlist Entities Compared","default":0}},"type":"object","required":["check_id","signal","risk_score","recommended_action"],"title":"ScreeningResult","description":"The result of screening a single subject."},"SeismicSummary":{"properties":{"count":{"type":"integer","title":"Count","default":0},"max_magnitude":{"type":"number","title":"Max Magnitude","default":0},"events":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Events"}},"type":"object","title":"SeismicSummary"},"SensorCreate":{"properties":{"tenant_id":{"type":"string","minLength":1,"title":"Tenant Id"},"environment_id":{"type":"string","minLength":1,"title":"Environment Id"},"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"type":{"$ref":"#/components/schemas/SensorType"},"source":{"$ref":"#/components/schemas/SensorSource"},"location":{"anyOf":[{"$ref":"#/components/schemas/SensorLocation"},{"type":"null"}]},"status":{"type":"string","title":"Status","default":"active"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"},"last_reading_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Reading At"},"health":{"anyOf":[{"$ref":"#/components/schemas/SensorHealth"},{"type":"null"}]},"integration_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Integration Id"}},"type":"object","required":["tenant_id","environment_id","name","type","source"],"title":"SensorCreate","description":"Payload for creating a new sensor."},"SensorHealth":{"properties":{"signal_quality":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Signal Quality"},"uptime_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime Pct"},"error_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Error Rate"},"last_heartbeat":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Heartbeat"},"packet_loss":{"anyOf":[{"type":"number","maximum":1,"minimum":0},{"type":"null"}],"title":"Packet Loss"},"avg_latency_ms":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Avg Latency Ms"},"throughput_events_per_min":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Throughput Events Per Min"},"uptime_percent":{"anyOf":[{"type":"number","maximum":100,"minimum":0},{"type":"null"}],"title":"Uptime Percent"},"expected_reporting_interval_sec":{"anyOf":[{"type":"integer","exclusiveMinimum":0},{"type":"null"}],"title":"Expected Reporting Interval Sec"}},"type":"object","title":"SensorHealth","description":"Runtime health indicators for a sensor."},"SensorLocation":{"properties":{"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon"},"depth_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Depth M"},"elevation_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Elevation M"}},"type":"object","title":"SensorLocation","description":"Geographical placement of a sensor."},"SensorResponse":{"properties":{"id":{"type":"string","title":"Id"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"environment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Environment Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"type":{"type":"string","title":"Type"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"location":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Location"},"status":{"type":"string","title":"Status","default":"active"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"},"last_reading_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Reading At"},"health":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Health"},"integration_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Integration Id"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","type"],"title":"SensorResponse","description":"Sensor as returned from the API."},"SensorSource":{"type":"string","enum":["marinetraffic","spire","verkada","custom_api","manual"],"title":"SensorSource"},"SensorType":{"type":"string","enum":["ais","hydrophone","das","sonar","camera","weather","access_control","motion","thermal","radar","rf"],"title":"SensorType"},"SensorUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"type":{"anyOf":[{"$ref":"#/components/schemas/SensorType"},{"type":"null"}]},"source":{"anyOf":[{"$ref":"#/components/schemas/SensorSource"},{"type":"null"}]},"location":{"anyOf":[{"$ref":"#/components/schemas/SensorLocation"},{"type":"null"}]},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"},"last_reading_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Reading At"},"health":{"anyOf":[{"$ref":"#/components/schemas/SensorHealth"},{"type":"null"}]},"integration_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Integration Id"}},"type":"object","title":"SensorUpdate","description":"Payload for updating an existing sensor. All fields optional."},"Severity":{"type":"string","enum":["low","medium","high","critical"],"title":"Severity","description":"Severity of an individual screening flag."},"SeverityEstimate":{"type":"string","enum":["low","medium","high","critical"],"title":"SeverityEstimate","description":"Reporter's subjective severity assessment."},"ShiftCreateRequest":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id","description":"Tenant scope"},"guard_id":{"type":"string","title":"Guard Id","description":"Guard asset ID"},"start_time":{"type":"string","title":"Start Time","description":"Shift start (ISO 8601)"},"end_time":{"type":"string","title":"End Time","description":"Shift end (ISO 8601)"},"zone_ids":{"items":{"type":"string"},"type":"array","title":"Zone Ids","description":"Assigned zone IDs"},"status":{"$ref":"#/components/schemas/ShiftStatus","default":"on_duty"}},"type":"object","required":["tenant_id","guard_id","start_time","end_time"],"title":"ShiftCreateRequest","description":"Request body for creating a shift."},"ShiftScheduleResponse":{"properties":{"id":{"type":"string","title":"Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"guard_id":{"type":"string","title":"Guard Id"},"start_time":{"type":"string","title":"Start Time"},"end_time":{"type":"string","title":"End Time"},"status":{"type":"string","title":"Status","default":"on_duty"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["id","tenant_id","guard_id","start_time","end_time","created_at","updated_at"],"title":"ShiftScheduleResponse","description":"Shift schedule as returned from the API."},"ShiftStatus":{"type":"string","enum":["on_duty","off_duty","on_call"],"title":"ShiftStatus"},"ShiftUpdateRequest":{"properties":{"start_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Time"},"end_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Time"},"status":{"anyOf":[{"$ref":"#/components/schemas/ShiftStatus"},{"type":"null"}]},"zone_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Zone Ids"}},"type":"object","title":"ShiftUpdateRequest","description":"Request body for updating a shift."},"Sighting":{"properties":{"camera_id":{"type":"string","title":"Camera Id"},"zone_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zone Id"},"timestamp":{"type":"string","title":"Timestamp"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon"}},"type":"object","required":["camera_id","timestamp"],"title":"Sighting","description":"A single sighting of a tracked person."},"Signal":{"type":"string","enum":["green","yellow","red"],"title":"Signal","description":"Traffic-light screening outcome."},"SimilarVessel":{"properties":{"mmsi":{"type":"string","title":"Mmsi","default":""},"similarity":{"type":"number","title":"Similarity","default":0},"vessel_type":{"type":"string","title":"Vessel Type","default":"unknown"},"flag_state":{"type":"string","title":"Flag State","default":"unknown"},"avg_speed":{"type":"number","title":"Avg Speed","default":0},"anomaly_score":{"type":"number","title":"Anomaly Score","default":0},"time_pattern":{"type":"string","title":"Time Pattern","default":"unknown"},"event_count":{"type":"integer","title":"Event Count","default":0},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","title":"SimilarVessel","description":"A vessel similar to the queried vessel."},"SimilarVesselsResponse":{"properties":{"mmsi":{"type":"string","title":"Mmsi"},"similar_vessels":{"items":{"$ref":"#/components/schemas/SimilarVessel"},"type":"array","title":"Similar Vessels"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["mmsi","similar_vessels","count"],"title":"SimilarVesselsResponse","description":"Response for similar vessels search."},"SolarWindData":{"properties":{"speed_km_s":{"type":"number","title":"Speed Km S","default":0},"density":{"type":"number","title":"Density","default":0},"bz_nt":{"type":"number","title":"Bz Nt","default":0}},"type":"object","title":"SolarWindData"},"SpaceWeatherImpactResponse":{"properties":{"solar_wind":{"$ref":"#/components/schemas/SolarWindData"},"kp_index":{"type":"number","title":"Kp Index","default":0},"gic_risk_level":{"type":"string","title":"Gic Risk Level","default":"low"},"alert_level":{"type":"string","title":"Alert Level","default":"nominal"},"satellite_health":{"$ref":"#/components/schemas/SatelliteHealth"},"cable_impact":{"items":{"$ref":"#/components/schemas/CableImpact"},"type":"array","title":"Cable Impact"}},"type":"object","title":"SpaceWeatherImpactResponse"},"SubjectType":{"type":"string","enum":["person","vessel","organization"],"title":"SubjectType","description":"The kind of entity being screened."},"SyncPackageResponse":{"properties":{"device_id":{"type":"string","title":"Device Id"},"sync_version":{"type":"integer","title":"Sync Version"},"generated_at":{"type":"string","title":"Generated At"},"threat_signatures":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Threat Signatures"},"zone_configs":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Zone Configs"}},"type":"object","required":["device_id","sync_version","generated_at"],"title":"SyncPackageResponse","description":"Sync package containing threat signatures and zone configs."},"TelemetryPayload":{"properties":{"drone_id":{"type":"string","title":"Drone Id","description":"Drone asset ID"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat","description":"Latitude"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon","description":"Longitude"},"alt_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Alt M","description":"Altitude (metres AGL)"},"heading":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Heading","description":"Heading (degrees)"},"speed_m_s":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Speed M S","description":"Ground speed (m/s)"},"battery_pct":{"anyOf":[{"type":"number","maximum":100,"minimum":0},{"type":"null"}],"title":"Battery Pct","description":"Battery %"},"mission_seq":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Mission Seq","description":"Current mission item sequence"},"video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Url","description":"Live video stream URL"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"Drone status","default":"in_flight"},"ts":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ts","description":"Observation timestamp (ISO 8601)"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"environment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Environment Id"}},"type":"object","required":["drone_id"],"title":"TelemetryPayload","description":"Telemetry report from a drone GCS webhook."},"TenantConfig":{"properties":{"incident_threshold":{"type":"integer","maximum":100,"minimum":0,"title":"Incident Threshold","description":"Threat score (0-100) that triggers an incident","default":65},"escalation_timeout_minutes":{"type":"integer","minimum":1,"title":"Escalation Timeout Minutes","description":"Minutes before an unacknowledged incident auto-escalates","default":15},"sla_response_minutes":{"type":"integer","minimum":1,"title":"Sla Response Minutes","description":"SLA target for first response to an incident","default":30},"notification_channels":{"items":{"type":"string"},"type":"array","title":"Notification Channels","description":"Channels for incident notifications"},"require_mfa":{"type":"boolean","title":"Require Mfa","description":"Require multi-factor authentication for all tenant users","default":false}},"type":"object","title":"TenantConfig","description":"Tenant-level configuration stored in the tenants table `config` JSON field."},"TenantConfigUpdate":{"properties":{"incident_threshold":{"anyOf":[{"type":"integer","maximum":100,"minimum":0},{"type":"null"}],"title":"Incident Threshold"},"escalation_timeout_minutes":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Escalation Timeout Minutes"},"sla_response_minutes":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Sla Response Minutes"},"notification_channels":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Notification Channels"},"require_mfa":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Require Mfa"}},"type":"object","title":"TenantConfigUpdate","description":"Partial update payload — only provided fields are applied."},"TenantCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"slug":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Slug"},"tier":{"type":"string","title":"Tier","default":"trial"},"config":{"additionalProperties":true,"type":"object","title":"Config"},"environments":{"items":{"type":"string"},"type":"array","title":"Environments"},"integration_configs":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Integration Configs"},"billing_status":{"type":"string","title":"Billing Status","default":"trial"}},"type":"object","required":["name"],"title":"TenantCreate","description":"Payload for creating a new tenant."},"TenantResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"tier":{"type":"string","title":"Tier"},"config":{"additionalProperties":true,"type":"object","title":"Config"},"environments":{"items":{"type":"string"},"type":"array","title":"Environments"},"integration_configs":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Integration Configs"},"billing_status":{"type":"string","title":"Billing Status","default":"trial"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"},"tenant_id":{"type":"string","title":"Tenant Id","default":""},"vertical":{"type":"string","title":"Vertical","default":""}},"type":"object","required":["id","name","slug","tier","created_at","updated_at"],"title":"TenantResponse","description":"Tenant as returned from the API."},"TenantUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"slug":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Slug"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"},"environments":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Environments"},"integration_configs":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Integration Configs"},"billing_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Status"}},"type":"object","title":"TenantUpdate","description":"Payload for updating an existing tenant. All fields optional."},"TestConnectionResult":{"properties":{"integration_id":{"type":"string","title":"Integration Id"},"success":{"type":"boolean","title":"Success"},"latency_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latency Ms"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"tested_at":{"type":"string","title":"Tested At"}},"type":"object","required":["integration_id","success","tested_at"],"title":"TestConnectionResult","description":"Result of a connectivity test against an integration."},"ThreatFeedItem":{"properties":{"source":{"type":"string","title":"Source","default":""},"category":{"type":"string","title":"Category","default":""},"severity":{"type":"string","title":"Severity","default":"low"},"title":{"type":"string","title":"Title","default":""},"description":{"type":"string","title":"Description","default":""},"timestamp":{"type":"string","title":"Timestamp","default":""},"ioc_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ioc Type"},"ioc_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ioc Value"}},"type":"object","title":"ThreatFeedItem"},"ThreatFeedResponse":{"properties":{"total":{"type":"integer","title":"Total","default":0},"items":{"items":{"$ref":"#/components/schemas/ThreatFeedItem"},"type":"array","title":"Items"}},"type":"object","title":"ThreatFeedResponse"},"ThreatLibraryCreate":{"properties":{"tenant_id":{"type":"string","minLength":1,"title":"Tenant Id"},"vertical":{"$ref":"#/components/schemas/src__backend__models__threat_library__Vertical"},"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"description":{"type":"string","minLength":1,"title":"Description"},"indicators":{"items":{"$ref":"#/components/schemas/Indicator"},"type":"array","minItems":1,"title":"Indicators"},"default_severity":{"type":"string","title":"Default Severity"},"scoring_factors":{"$ref":"#/components/schemas/ScoringFactors"},"recommended_actions":{"items":{"type":"string"},"type":"array","title":"Recommended Actions"},"active":{"type":"boolean","title":"Active","default":true}},"type":"object","required":["tenant_id","vertical","name","description","indicators","default_severity","scoring_factors"],"title":"ThreatLibraryCreate","description":"Payload for creating a new threat library entry."},"ThreatLibraryResponse":{"properties":{"id":{"type":"string","title":"Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"vertical":{"type":"string","title":"Vertical"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"indicators":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Indicators"},"default_severity":{"type":"string","title":"Default Severity"},"scoring_factors":{"additionalProperties":true,"type":"object","title":"Scoring Factors"},"recommended_actions":{"items":{"type":"string"},"type":"array","title":"Recommended Actions"},"active":{"type":"boolean","title":"Active","default":true},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["id","tenant_id","vertical","name","description","indicators","default_severity","scoring_factors","created_at","updated_at"],"title":"ThreatLibraryResponse","description":"Threat library entry as returned from the API."},"ThreatLibraryUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Description"},"vertical":{"anyOf":[{"$ref":"#/components/schemas/src__backend__models__threat_library__Vertical"},{"type":"null"}]},"indicators":{"anyOf":[{"items":{"$ref":"#/components/schemas/Indicator"},"type":"array"},{"type":"null"}],"title":"Indicators"},"default_severity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Severity"},"scoring_factors":{"anyOf":[{"$ref":"#/components/schemas/ScoringFactors"},{"type":"null"}]},"recommended_actions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Recommended Actions"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"}},"type":"object","title":"ThreatLibraryUpdate","description":"Payload for updating an existing threat library entry. All fields optional."},"ThreatPeriod":{"properties":{"period":{"type":"string","title":"Period","description":"Start of the time bucket (ISO 8601)"},"avg_score":{"type":"number","title":"Avg Score","description":"Mean threat score in this bucket"},"max_score":{"type":"number","title":"Max Score","description":"Peak threat score in this bucket"},"event_count":{"type":"integer","title":"Event Count","description":"Total events with threat_score > 0"},"incident_count":{"type":"integer","title":"Incident Count","description":"Incidents created in this bucket"}},"type":"object","required":["period","avg_score","max_score","event_count","incident_count"],"title":"ThreatPeriod","description":"A single time-bucket in the threat time-series."},"ThreatScoreRequest":{"properties":{"mmsi":{"type":"string","title":"Mmsi","description":"Maritime Mobile Service Identity"},"lat":{"type":"number","maximum":90,"minimum":-90,"title":"Lat"},"lon":{"type":"number","maximum":180,"minimum":-180,"title":"Lon"}},"type":"object","required":["mmsi","lat","lon"],"title":"ThreatScoreRequest"},"ThreatScoreResponse":{"properties":{"score":{"type":"number","title":"Score"},"severity":{"type":"string","title":"Severity"},"factors":{"additionalProperties":{"type":"number"},"type":"object","title":"Factors"},"matched_signatures":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Matched Signatures"},"zone_info":{"additionalProperties":true,"type":"object","title":"Zone Info"},"recommended_actions":{"items":{"type":"string"},"type":"array","title":"Recommended Actions"}},"type":"object","required":["score","severity","factors","matched_signatures","zone_info","recommended_actions"],"title":"ThreatScoreResponse"},"ThreatTimeSeriesResponse":{"properties":{"aggregation":{"$ref":"#/components/schemas/Aggregation"},"from_date":{"type":"string","title":"From Date"},"to_date":{"type":"string","title":"To Date"},"periods":{"items":{"$ref":"#/components/schemas/ThreatPeriod"},"type":"array","title":"Periods"}},"type":"object","required":["aggregation","from_date","to_date","periods"],"title":"ThreatTimeSeriesResponse","description":"Full response for GET /analytics/threats."},"ThreatsByType":{"properties":{"type":{"type":"string","title":"Type"},"count":{"type":"integer","title":"Count"},"avg_score":{"type":"number","title":"Avg Score"}},"type":"object","required":["type","count","avg_score"],"title":"ThreatsByType","description":"Threat count broken down by event type."},"TrackPoint":{"properties":{"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"heading":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Heading"},"speed":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Speed"},"altitude_or_depth":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Altitude Or Depth"},"timestamp":{"type":"string","title":"Timestamp"}},"type":"object","required":["lat","lon","timestamp"],"title":"TrackPoint","description":"A single point in a historical track."},"TrajectoryResponse":{"properties":{"track_id":{"type":"string","title":"Track Id"},"sightings":{"items":{"$ref":"#/components/schemas/Sighting"},"type":"array","title":"Sightings","default":[]}},"type":"object","required":["track_id"],"title":"TrajectoryResponse","description":"Full trajectory for a tracked person."},"TsunamiSummary":{"properties":{"active_alerts":{"type":"integer","title":"Active Alerts","default":0},"events":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Events"}},"type":"object","title":"TsunamiSummary"},"UsageResponse":{"properties":{"consumer_id":{"type":"string","title":"Consumer Id"},"plan":{"$ref":"#/components/schemas/PlanTier"},"period":{"type":"string","title":"Period"},"calls_today":{"type":"integer","title":"Calls Today"},"calls_limit":{"type":"integer","title":"Calls Limit"},"credits_used":{"type":"number","title":"Credits Used"},"estimated_cost":{"type":"number","title":"Estimated Cost"},"endpoints":{"additionalProperties":{"type":"integer"},"type":"object","title":"Endpoints","description":"Per-endpoint call counts"}},"type":"object","required":["consumer_id","plan","period","calls_today","calls_limit","credits_used","estimated_cost"],"title":"UsageResponse","description":"Usage dashboard data for a consumer."},"UserCreate":{"properties":{"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"email":{"type":"string","format":"email","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"role":{"$ref":"#/components/schemas/UserRole"},"permissions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Permissions"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"business_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Role"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry"},"responsibility_area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Responsibility Area"},"availability_type":{"anyOf":[{"$ref":"#/components/schemas/AvailabilityType"},{"type":"null"}]},"mfa_enabled":{"type":"boolean","title":"Mfa Enabled","default":false},"sso_provider":{"anyOf":[{"$ref":"#/components/schemas/SSOProvider"},{"type":"null"}]},"onboarding_complete":{"type":"boolean","title":"Onboarding Complete","default":false},"notify_email":{"type":"boolean","title":"Notify Email","default":true},"notify_sms":{"type":"boolean","title":"Notify Sms","default":true}},"type":"object","required":["tenant_id","email","role"],"title":"UserCreate","description":"Payload for creating a new user."},"UserResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"role":{"$ref":"#/components/schemas/UserRole"},"permissions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Permissions"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"business_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Role"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry"},"responsibility_area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Responsibility Area"},"availability_type":{"anyOf":[{"$ref":"#/components/schemas/AvailabilityType"},{"type":"null"}]},"mfa_enabled":{"type":"boolean","title":"Mfa Enabled","default":false},"sso_provider":{"anyOf":[{"$ref":"#/components/schemas/SSOProvider"},{"type":"null"}]},"onboarding_complete":{"type":"boolean","title":"Onboarding Complete","default":false},"notify_email":{"type":"boolean","title":"Notify Email","default":true},"notify_sms":{"type":"boolean","title":"Notify Sms","default":true},"last_active_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Active At"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","tenant_id","email","role"],"title":"UserResponse","description":"Representation of a user returned by the API."},"UserRole":{"type":"string","enum":["super_admin","customer_admin","operator","analyst","executive","auditor"],"title":"UserRole","description":"Valid user roles within a Sentinel OS tenant."},"UserUpdate":{"properties":{"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"role":{"anyOf":[{"$ref":"#/components/schemas/UserRole"},{"type":"null"}]},"permissions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Permissions"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"business_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Role"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry"},"responsibility_area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Responsibility Area"},"availability_type":{"anyOf":[{"$ref":"#/components/schemas/AvailabilityType"},{"type":"null"}]},"mfa_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Mfa Enabled"},"sso_provider":{"anyOf":[{"$ref":"#/components/schemas/SSOProvider"},{"type":"null"}]},"onboarding_complete":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Onboarding Complete"},"notify_email":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify Email"},"notify_sms":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify Sms"}},"type":"object","title":"UserUpdate","description":"Payload for partially updating an existing user.\n\nAll fields are optional -- only supplied fields are patched."},"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"},"VesselManifestResult":{"properties":{"vessel_id":{"type":"string","title":"Vessel Id"},"vessel_name":{"type":"string","title":"Vessel Name"},"imo_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imo Number"},"mmsi":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mmsi"},"form_type":{"$ref":"#/components/schemas/FALFormType"},"signal":{"$ref":"#/components/schemas/Signal"},"person_batch_signal":{"$ref":"#/components/schemas/Signal"},"vessel_risk_signal":{"$ref":"#/components/schemas/Signal"},"vessel_risk_score":{"type":"number","title":"Vessel Risk Score","default":0},"crew_screened":{"type":"integer","title":"Crew Screened","default":0},"hits":{"type":"integer","title":"Hits","default":0},"persons":{"items":{"$ref":"#/components/schemas/PersonSummary"},"type":"array","title":"Persons"}},"type":"object","required":["vessel_id","vessel_name","form_type","signal","person_batch_signal","vessel_risk_signal"],"title":"VesselManifestResult","description":"Vessel-level pre-arrival screening result for a manifest."},"VesselMasterCreate":{"properties":{"mmsi":{"type":"string","maxLength":9,"minLength":9,"title":"Mmsi","description":"Maritime Mobile Service Identity (9 digits)"},"imo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imo","description":"IMO number"},"callsign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Callsign","description":"Radio call sign"},"eni":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eni","description":"European Number of Identification"},"uscg_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uscg Id","description":"US Coast Guard vessel ID"},"hin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hin","description":"Hull Identification Number"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Vessel name"},"flag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flag","description":"Flag state (ISO 3166-1 alpha-2)"},"port_of_registry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Port Of Registry"},"service_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Service Status","description":"e.g. in_service, laid_up, scrapped"},"sub_status_detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sub Status Detail"},"vessel_type_level1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vessel Type Level1","description":"Top-level type (e.g. Tanker, Bulk Carrier)"},"vessel_type_level2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vessel Type Level2","description":"Sub-type (e.g. Crude Oil Tanker)"},"vessel_type_level3":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vessel Type Level3","description":"Granular type (e.g. VLCC)"},"vessel_type_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vessel Type Code","description":"Numeric type code"},"vessel_size_segment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vessel Size Segment","description":"Size segment (e.g. Aframax, Suezmax)"},"keel_laid_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keel Laid Date"},"build_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Build Date"},"build_year":{"anyOf":[{"type":"integer","maximum":2100,"minimum":1800},{"type":"null"}],"title":"Build Year"},"country_of_build":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Of Build"},"yard_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Yard Number"},"hull_material":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hull Material"},"hull_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hull Type"},"decks":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Decks"},"length_overall":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Length Overall","description":"LOA in metres"},"lbp":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Lbp","description":"Length between perpendiculars (m)"},"breadth_extreme":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Breadth Extreme","description":"Extreme breadth (m)"},"breadth_moulded":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Breadth Moulded","description":"Moulded breadth (m)"},"max_draught":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Max Draught","description":"Maximum draught (m)"},"depth":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Depth","description":"Depth (m)"},"freeboard":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Freeboard","description":"Freeboard (m)"},"tpc":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Tpc","description":"Tonnes per centimetre immersion"},"gross_tonnage":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Gross Tonnage"},"reduced_gross_tonnage":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Reduced Gross Tonnage"},"deadweight":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Deadweight","description":"DWT in tonnes"},"net_tonnage":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Net Tonnage"},"loaded_displacement":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Loaded Displacement"},"light_displacement":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Light Displacement"},"net_tonnage_panama":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Net Tonnage Panama"},"net_tonnage_suez":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Net Tonnage Suez"},"liquid_design":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Liquid Design","description":"Liquid capacity design (m3)"},"liquid_observed":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Liquid Observed"},"gas_design":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Gas Design","description":"Gas capacity design (m3)"},"gas_observed":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Gas Observed"},"bale_capacity":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Bale Capacity","description":"Bale capacity (m3)"},"grain_capacity":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Grain Capacity","description":"Grain capacity (m3)"},"ore_capacity":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Ore Capacity","description":"Ore capacity (m3)"},"mass_capacity":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Mass Capacity","description":"Mass capacity (tonnes)"},"teu_capacity":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Teu Capacity","description":"TEU container capacity"},"ceu_capacity":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Ceu Capacity","description":"CEU car equivalent capacity"},"engine_power_kw":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Engine Power Kw"},"engine_units":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Engine Units"},"engine_cylinders":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Engine Cylinders"},"engine_bore":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Engine Bore","description":"Bore in mm"},"engine_stroke":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Engine Stroke","description":"Stroke in mm"},"engine_rpm":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Engine Rpm"},"engine_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Engine Type"},"engine_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Engine Model"},"aux_engines":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Aux Engines"},"specific_fuel_consumption":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Specific Fuel Consumption","description":"g/kWh"},"boiloff_rate":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Boiloff Rate","description":"Boiloff rate (%/day)"},"speed_service":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Speed Service","description":"Service speed (knots)"},"propeller_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Propeller Type"},"propeller_number":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Propeller Number"},"scrubber_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scrubber Type"},"scrubber_fitting_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scrubber Fitting Date"},"ice_class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ice Class"},"coating_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coating Type"},"coating_details":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coating Details"},"imo_coatings":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imo Coatings"},"gas_containment_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gas Containment Type"},"gas_containment_system":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gas Containment System"},"tank_max_pressure":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Tank Max Pressure","description":"Bar"},"tank_min_temperature":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tank Min Temperature","description":"Celsius"},"fuel_type_1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fuel Type 1"},"fuel_type_2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fuel Type 2"},"fuel_type_3":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fuel Type 3"},"fuel_tank_capacity_1":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Fuel Tank Capacity 1","description":"m3"},"fuel_tank_capacity_2":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Fuel Tank Capacity 2"},"fuel_tank_capacity_3":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Fuel Tank Capacity 3"},"ammonia_ready":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ammonia Ready","default":false},"lng_ready":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Lng Ready","default":false},"methanol_ready":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Methanol Ready","default":false},"last_dry_dock":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Dry Dock"},"last_renewal_survey":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Renewal Survey"},"crane_swl":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Crane Swl","description":"Crane safe working load (tonnes)"},"order_price":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Order Price","description":"Order price (USD millions)"},"last_position_lat":{"anyOf":[{"type":"number","maximum":90,"minimum":-90},{"type":"null"}],"title":"Last Position Lat"},"last_position_lon":{"anyOf":[{"type":"number","maximum":180,"minimum":-180},{"type":"null"}],"title":"Last Position Lon"},"last_ais_update":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Ais Update"},"current_destination":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Destination"},"current_eta":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Eta"},"tenant_id":{"type":"string","title":"Tenant Id","description":"Owning tenant"}},"type":"object","required":["mmsi","tenant_id"],"title":"VesselMasterCreate","description":"Payload for creating or upserting a vessel master record."},"VesselMasterResponse":{"properties":{"id":{"type":"string","title":"Id"},"mmsi":{"type":"string","title":"Mmsi"},"tenant_id":{"type":"string","title":"Tenant Id"},"imo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imo"},"callsign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Callsign"},"eni":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eni"},"uscg_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uscg Id"},"hin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hin"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"flag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flag"},"port_of_registry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Port Of Registry"},"service_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Service Status"},"sub_status_detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sub Status Detail"},"vessel_type_level1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vessel Type Level1"},"vessel_type_level2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vessel Type Level2"},"vessel_type_level3":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vessel Type Level3"},"vessel_type_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vessel Type Code"},"vessel_size_segment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vessel Size Segment"},"keel_laid_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keel Laid Date"},"build_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Build Date"},"build_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Build Year"},"country_of_build":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Of Build"},"yard_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Yard Number"},"hull_material":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hull Material"},"hull_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hull Type"},"decks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Decks"},"length_overall":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Length Overall"},"lbp":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lbp"},"breadth_extreme":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Breadth Extreme"},"breadth_moulded":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Breadth Moulded"},"max_draught":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Draught"},"depth":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Depth"},"freeboard":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Freeboard"},"tpc":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tpc"},"gross_tonnage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Gross Tonnage"},"reduced_gross_tonnage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Reduced Gross Tonnage"},"deadweight":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Deadweight"},"net_tonnage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Net Tonnage"},"loaded_displacement":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Loaded Displacement"},"light_displacement":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Light Displacement"},"net_tonnage_panama":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Net Tonnage Panama"},"net_tonnage_suez":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Net Tonnage Suez"},"liquid_design":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Liquid Design"},"liquid_observed":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Liquid Observed"},"gas_design":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Gas Design"},"gas_observed":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Gas Observed"},"bale_capacity":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Bale Capacity"},"grain_capacity":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Grain Capacity"},"ore_capacity":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ore Capacity"},"mass_capacity":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mass Capacity"},"teu_capacity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Teu Capacity"},"ceu_capacity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ceu Capacity"},"engine_power_kw":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Engine Power Kw"},"engine_units":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Engine Units"},"engine_cylinders":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Engine Cylinders"},"engine_bore":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Engine Bore"},"engine_stroke":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Engine Stroke"},"engine_rpm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Engine Rpm"},"engine_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Engine Type"},"engine_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Engine Model"},"aux_engines":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Aux Engines"},"specific_fuel_consumption":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Specific Fuel Consumption"},"boiloff_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Boiloff Rate"},"speed_service":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Speed Service"},"propeller_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Propeller Type"},"propeller_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Propeller Number"},"scrubber_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scrubber Type"},"scrubber_fitting_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scrubber Fitting Date"},"ice_class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ice Class"},"coating_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coating Type"},"coating_details":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coating Details"},"imo_coatings":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imo Coatings"},"gas_containment_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gas Containment Type"},"gas_containment_system":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gas Containment System"},"tank_max_pressure":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tank Max Pressure"},"tank_min_temperature":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tank Min Temperature"},"fuel_type_1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fuel Type 1"},"fuel_type_2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fuel Type 2"},"fuel_type_3":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fuel Type 3"},"fuel_tank_capacity_1":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fuel Tank Capacity 1"},"fuel_tank_capacity_2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fuel Tank Capacity 2"},"fuel_tank_capacity_3":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fuel Tank Capacity 3"},"ammonia_ready":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ammonia Ready"},"lng_ready":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Lng Ready"},"methanol_ready":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Methanol Ready"},"last_dry_dock":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Dry Dock"},"last_renewal_survey":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Renewal Survey"},"crane_swl":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Crane Swl"},"order_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Order Price"},"last_position_lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Position Lat"},"last_position_lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Position Lon"},"last_ais_update":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Ais Update"},"current_destination":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Destination"},"current_eta":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Eta"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","mmsi","tenant_id"],"title":"VesselMasterResponse","description":"Vessel master record as returned by the API."},"VesselOwnershipCreate":{"properties":{"tenant_id":{"type":"string","minLength":1,"title":"Tenant Id"},"vessel_mmsi":{"type":"string","minLength":1,"title":"Vessel Mmsi"},"vessel_imo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vessel Imo"},"entity_type":{"$ref":"#/components/schemas/EntityType"},"entity_name":{"type":"string","maxLength":500,"minLength":1,"title":"Entity Name"},"entity_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Country"},"entity_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Address"},"entity_website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Website"},"start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"},"is_current":{"type":"boolean","title":"Is Current","default":true},"risk_assessment":{"$ref":"#/components/schemas/RiskAssessment","default":"none"}},"type":"object","required":["tenant_id","vessel_mmsi","entity_type","entity_name"],"title":"VesselOwnershipCreate","description":"Payload for linking an entity to a vessel."},"VideoStreamResponse":{"properties":{"drone_id":{"type":"string","title":"Drone Id"},"video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Url"},"status":{"type":"string","title":"Status"},"stream_type":{"type":"string","title":"Stream Type","default":"rtsp"}},"type":"object","required":["drone_id","status"],"title":"VideoStreamResponse","description":"Video stream URL for a drone."},"VoiceIncidentCreate":{"properties":{"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"environment_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Environment Id"},"audio_base64":{"type":"string","title":"Audio Base64","description":"Base64-encoded audio (webm/wav/mp3)"},"audio_content_type":{"type":"string","title":"Audio Content Type","description":"MIME type of the audio","default":"audio/webm"}},"type":"object","required":["tenant_id","audio_base64"],"title":"VoiceIncidentCreate","description":"POST /incidents/voice — accept audio data for transcription."},"Waypoint":{"properties":{"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Order"}},"type":"object","required":["lat","lon"],"title":"Waypoint","description":"A single waypoint in a mission route."},"WeatherSummary":{"properties":{"conditions":{"type":"string","title":"Conditions","default":"unknown"},"alerts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Alerts"}},"type":"object","title":"WeatherSummary"},"WebhookDeliveryListResponse":{"properties":{"rows":{"items":{"$ref":"#/components/schemas/WebhookDeliveryResponse"},"type":"array","title":"Rows"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["rows","total","limit","offset"],"title":"WebhookDeliveryListResponse","description":"Paginated delivery list wrapper."},"WebhookDeliveryResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"subscription_id":{"type":"string","format":"uuid","title":"Subscription Id"},"event_type":{"type":"string","title":"Event Type"},"payload":{"additionalProperties":true,"type":"object","title":"Payload"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code"},"success":{"type":"boolean","title":"Success"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"attempt":{"type":"integer","title":"Attempt","default":1},"delivered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Delivered At"}},"type":"object","required":["id","subscription_id","event_type","payload","success"],"title":"WebhookDeliveryResponse","description":"Single delivery attempt record."},"WebhookSubscriptionCreate":{"properties":{"url":{"type":"string","title":"Url","description":"Callback URL to receive webhook POSTs"},"events":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Events","description":"List of event types to subscribe to"},"secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret","description":"HMAC signing secret. Auto-generated if not provided."}},"type":"object","required":["url","events"],"title":"WebhookSubscriptionCreate","description":"POST /webhooks — create a new webhook subscription."},"WebhookSubscriptionListResponse":{"properties":{"rows":{"items":{"$ref":"#/components/schemas/WebhookSubscriptionResponse"},"type":"array","title":"Rows"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["rows","total","limit","offset"],"title":"WebhookSubscriptionListResponse","description":"Paginated list wrapper."},"WebhookSubscriptionResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"url":{"type":"string","title":"Url"},"events":{"items":{"type":"string"},"type":"array","title":"Events"},"secret":{"type":"string","title":"Secret"},"active":{"type":"boolean","title":"Active","default":true},"last_delivery_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Delivery At"},"failure_count":{"type":"integer","title":"Failure Count","default":0},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","tenant_id","url","events","secret"],"title":"WebhookSubscriptionResponse","description":"Full webhook subscription representation."},"WebhookSubscriptionUpdate":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"events":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Events"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret"}},"type":"object","title":"WebhookSubscriptionUpdate","description":"PATCH /webhooks/{id} — update subscription."},"WorkflowAction":{"properties":{"action_type":{"$ref":"#/components/schemas/ActionType"},"config":{"additionalProperties":true,"type":"object","title":"Config","description":"Action-specific configuration"}},"type":"object","required":["action_type"],"title":"WorkflowAction","description":"Single action step in a workflow.\n\nExample::\n\n    {\n        \"action_type\": \"notification\",\n        \"config\": {\"channels\": [\"sms\", \"email\"], \"template\": \"critical_alert\"}\n    }"},"WorkflowCreate":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"trigger":{"$ref":"#/components/schemas/WorkflowTrigger"},"actions":{"items":{"$ref":"#/components/schemas/WorkflowAction"},"type":"array","minItems":1,"title":"Actions"},"enabled":{"type":"boolean","title":"Enabled","default":true},"execution_mode":{"$ref":"#/components/schemas/ExecutionMode","default":"autonomous"}},"type":"object","required":["name","trigger","actions"],"title":"WorkflowCreate","description":"POST /workflows"},"WorkflowExecutionResponse":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"workflow_id":{"type":"string","format":"uuid","title":"Workflow Id"},"trigger_event_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trigger Event Id"},"status":{"type":"string","title":"Status","default":"pending"},"actions_completed":{"type":"integer","title":"Actions Completed","default":0},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"trigger_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Trigger Data"},"actions_executed":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Actions Executed"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["workflow_id"],"title":"WorkflowExecutionResponse","description":"Full workflow execution representation."},"WorkflowResponse":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"trigger":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Trigger"},"trigger_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trigger Type"},"trigger_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Trigger Config"},"actions":{"anyOf":[{},{"type":"null"}],"title":"Actions"},"enabled":{"type":"boolean","title":"Enabled","default":true},"execution_count":{"type":"integer","title":"Execution Count","default":0},"execution_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Execution Mode","default":"autonomous"},"last_executed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Executed At"},"last_triggered":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Triggered"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"environment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Environment Id"}},"additionalProperties":true,"type":"object","title":"WorkflowResponse","description":"Full workflow representation returned by the API."},"WorkflowTestFire":{"properties":{"event":{"additionalProperties":true,"type":"object","title":"Event","description":"Simulated event payload to evaluate against the workflow trigger"}},"type":"object","required":["event"],"title":"WorkflowTestFire","description":"POST /workflows/{id}/test — simulate an event to test-fire a workflow."},"WorkflowTrigger":{"properties":{"event_type":{"type":"string","title":"Event Type","description":"Event type that activates this trigger (e.g. 'incident.created', 'sensor.alert')"},"conditions":{"additionalProperties":true,"type":"object","title":"Conditions","description":"Field-level conditions: {field: {operator: value}}. Operators: $eq, $ne, $in, $gt, $lt, $gte, $lte"}},"type":"object","required":["event_type"],"title":"WorkflowTrigger","description":"Trigger definition embedded in a workflow.\n\nExample::\n\n    {\n        \"event_type\": \"incident.created\",\n        \"conditions\": {\n            \"severity\": {\"$in\": [\"critical\", \"high\"]},\n            \"zone_type\": {\"$eq\": \"critical\"}\n        }\n    }"},"WorkflowUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"trigger":{"anyOf":[{"$ref":"#/components/schemas/WorkflowTrigger"},{"type":"null"}]},"actions":{"anyOf":[{"items":{"$ref":"#/components/schemas/WorkflowAction"},"type":"array"},{"type":"null"}],"title":"Actions"},"execution_mode":{"anyOf":[{"$ref":"#/components/schemas/ExecutionMode"},{"type":"null"}]},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},"type":"object","title":"WorkflowUpdate","description":"PATCH /workflows/{id}"},"ZoneCreate":{"properties":{"environment_id":{"type":"string","title":"Environment Id","description":"FK to environments table"},"tenant_id":{"type":"string","title":"Tenant Id","description":"FK to tenants table"},"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"type":{"$ref":"#/components/schemas/ZoneType"},"geometry":{"$ref":"#/components/schemas/GeoJSONGeometry"},"rules":{"$ref":"#/components/schemas/ZoneRules"},"active":{"type":"boolean","title":"Active","default":true}},"type":"object","required":["environment_id","tenant_id","name","type","geometry"],"title":"ZoneCreate","description":"Payload for creating a new zone."},"ZoneResponse":{"properties":{"id":{"type":"string","title":"Id"},"environment_id":{"type":"string","title":"Environment Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"name":{"type":"string","title":"Name"},"type":{"type":"string","title":"Type"},"geometry":{"additionalProperties":true,"type":"object","title":"Geometry"},"rules":{"additionalProperties":true,"type":"object","title":"Rules"},"active":{"type":"boolean","title":"Active","default":true},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["id","environment_id","tenant_id","name","type","geometry","rules","created_at","updated_at"],"title":"ZoneResponse","description":"Zone as returned from the API."},"ZoneRules":{"properties":{"alert_on_entry":{"type":"boolean","title":"Alert On Entry","default":true},"alert_on_loiter":{"type":"boolean","title":"Alert On Loiter","default":false},"loiter_threshold_minutes":{"type":"integer","minimum":0,"title":"Loiter Threshold Minutes","default":10},"speed_threshold_knots":{"type":"number","minimum":0,"title":"Speed Threshold Knots","default":0}},"type":"object","title":"ZoneRules","description":"Alert and threshold rules for a zone."},"ZoneType":{"type":"string","enum":["critical","warning","exclusion","patrol","restricted"],"title":"ZoneType"},"ZoneUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"type":{"anyOf":[{"$ref":"#/components/schemas/ZoneType"},{"type":"null"}]},"geometry":{"anyOf":[{"$ref":"#/components/schemas/GeoJSONGeometry"},{"type":"null"}]},"rules":{"anyOf":[{"$ref":"#/components/schemas/ZoneRules"},{"type":"null"}]},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"}},"type":"object","title":"ZoneUpdate","description":"Payload for partially updating an existing zone. All fields optional."},"src__backend__models__api_key__APIKeyCreate":{"properties":{"name":{"type":"string","maxLength":128,"minLength":1,"title":"Name"},"permissions":{"items":{"type":"string"},"type":"array","title":"Permissions"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At","description":"ISO 8601 expiration datetime, or null for no expiry"}},"type":"object","required":["name"],"title":"APIKeyCreate","description":"Payload for generating a new API key."},"src__backend__models__api_key__APIKeyResponse":{"properties":{"id":{"type":"string","title":"Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"name":{"type":"string","title":"Name"},"key_preview":{"type":"string","title":"Key Preview"},"permissions":{"items":{"type":"string"},"type":"array","title":"Permissions"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"},"is_active":{"type":"boolean","title":"Is Active","default":true},"usage_count":{"type":"integer","title":"Usage Count","default":0},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","tenant_id","name","key_preview","permissions","created_at"],"title":"APIKeyResponse","description":"API key as returned in list views — never includes the full key."},"src__backend__models__compliance_report__ReportResponse":{"properties":{"id":{"type":"string","title":"Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"report_type":{"type":"string","title":"Report Type"},"title":{"type":"string","title":"Title"},"from_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From Date"},"to_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To Date"},"incident_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Incident Id"},"format":{"type":"string","title":"Format","default":"markdown"},"content":{"type":"string","title":"Content","description":"Rendered report content"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","tenant_id","report_type","title","content","created_at"],"title":"ReportResponse","description":"Common response for all generated reports."},"src__backend__models__developer_portal__APIKeyCreate":{"properties":{"consumer_id":{"type":"string","title":"Consumer Id","description":"ID of the registered consumer"},"label":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Label","description":"Human-friendly key label"}},"type":"object","required":["consumer_id"],"title":"APIKeyCreate","description":"Request to generate a new API key for a consumer."},"src__backend__models__developer_portal__APIKeyResponse":{"properties":{"key_id":{"type":"string","title":"Key Id"},"consumer_id":{"type":"string","title":"Consumer Id"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"api_key":{"type":"string","title":"Api Key","description":"Full API key — shown only once"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["key_id","consumer_id","api_key","scopes","created_at"],"title":"APIKeyResponse","description":"Response after generating an API key.\n\nThe raw key is only returned once at creation time."},"src__backend__models__report__ReportResponse":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"type":{"type":"string","title":"Type"},"title":{"type":"string","title":"Title"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"incident_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Incident Id"},"generated_by":{"type":"string","title":"Generated By"},"file_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Path"},"recipients":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Recipients"},"delivered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Delivered At"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["type","title","generated_by"],"title":"ReportResponse","description":"Full report representation returned by the API."},"src__backend__models__screening__Vertical":{"type":"string","enum":["maritime","hospitality","events","aviation","cruise"],"title":"Vertical","description":"Customer vertical the screening request originates from."},"src__backend__models__threat_library__Vertical":{"type":"string","enum":["maritime","security","infrastructure","defense"],"title":"Vertical"}}}}