{"openapi":"3.1.0","info":{"title":"Sentinel OS","description":"Unified physical-security backend for multi-tenant environments","version":"0.1.0"},"paths":{"/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","format":"uuid"},{"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 scoped to a tenant with optional filters.","operationId":"list_environments_api_v1_environments_get","parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","description":"Tenant ID (required — all queries are tenant-scoped)","title":"Tenant Id"},"description":"Tenant ID (required — all queries are tenant-scoped)"},{"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","format":"uuid","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","format":"uuid","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","format":"uuid","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":true,"schema":{"type":"string","format":"uuid","description":"Environment to list zones for","title":"Environment Id"},"description":"Environment to list zones for"},{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","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":true,"schema":{"type":"string","format":"uuid","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":true,"schema":{"type":"string","format":"uuid","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":true,"schema":{"type":"string","format":"uuid","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 for a given environment and tenant.","operationId":"list_sensors_api_v1_sensors_get","parameters":[{"name":"environment_id","in":"query","required":true,"schema":{"type":"string","description":"Filter by environment","title":"Environment Id"},"description":"Filter by environment"},{"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/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":true,"schema":{"type":"string","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","format":"uuid","title":"Incident Id"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","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","format":"uuid","title":"Incident Id"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","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":true,"schema":{"type":"string","description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentListResponse"}}}},"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","format":"uuid","title":"Incident Id"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","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":true,"schema":{"type":"string","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","format":"uuid","title":"Incident Id"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","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","format":"uuid","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","format":"uuid","title":"Incident Id"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","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":true,"schema":{"type":"string","description":"Tenant ID (required)","title":"Tenant Id"},"description":"Tenant ID (required)"},{"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 for a tenant, optionally filtered by vertical.","operationId":"list_threat_libraries_api_v1_threat_libraries_get","parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Filter by tenant","title":"Tenant Id"},"description":"Filter by tenant"},{"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":true,"schema":{"type":"string","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":true,"schema":{"type":"string","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":true,"schema":{"type":"string","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":true,"schema":{"type":"string","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":true,"schema":{"type":"string","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":true,"schema":{"type":"string","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/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":true,"schema":{"type":"string","format":"uuid","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":true,"schema":{"type":"string","format":"uuid","description":"Environment to get heatmap for","title":"Environment Id"},"description":"Environment to get heatmap for"},{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","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":true,"schema":{"type":"string","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":true,"schema":{"type":"string","description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowListResponse"}}}},"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":true,"schema":{"type":"string","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":true,"schema":{"type":"string","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":true,"schema":{"type":"string","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":true,"schema":{"type":"string","description":"Bearer <JWT>","title":"Authorization"},"description":"Bearer <JWT>"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionListResponse"}}}},"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":true,"schema":{"type":"string","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":true,"schema":{"type":"string","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/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/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/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 for a given tenant with optional filters.","operationId":"list_assets_api_v1_assets_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":"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.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.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/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","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Live Status Api V1 Live Status Get"}}}}}}},"/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.0,"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","format":"uuid","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":true,"schema":{"type":"string","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","format":"uuid","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":true,"schema":{"type":"string","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/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"}}}}}}},"/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.0,"minimum":0.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.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":{"type":"string","title":"Tenant Id"},"environment_id":{"type":"string","title":"Environment Id"},"name":{"type":"string","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":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["id","tenant_id","environment_id","name","type","created_at","updated_at"],"title":"AssetResponse","description":"Asset as returned from the API."},"AssetType":{"type":"string","enum":["patrol_vessel","usv","drone","camera","sensor_station","auv","patrol_boat","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."},"BgpStatus":{"properties":{"prefix_count":{"type":"integer","title":"Prefix Count","default":0},"visibility":{"type":"number","title":"Visibility","default":100.0}},"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.0},"latitude":{"type":"number","title":"Latitude","default":0.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":{"type":"string","maxLength":2000,"minLength":1,"title":"Query","description":"Natural language query"},"tenant_id":{"type":"string","title":"Tenant Id","description":"Tenant ID for scoping context"}},"type":"object","required":["query","tenant_id"],"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"},"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.0,"minimum":10.0,"title":"Altitude M","description":"Cruise altitude (m AGL)","default":50.0},"loiter_time_s":{"type":"number","maximum":3600.0,"minimum":30.0,"title":"Loiter Time S","description":"Loiter time (seconds)","default":300.0},"speed_m_s":{"type":"number","maximum":50.0,"minimum":1.0,"title":"Speed M S","description":"Cruise speed (m/s)","default":15.0}},"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.0,"exclusiveMinimum":0.0,"title":"Speed Knots","default":12.0}},"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.0,"minimum":-90.0,"title":"Lat"},"lon":{"type":"number","maximum":180.0,"minimum":-180.0,"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.0,"minimum":0.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"},"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.0}},"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.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.0,"minimum":1.0,"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.0,"minimum":1.0,"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.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."},"IncidentListResponse":{"properties":{"rows":{"items":{"$ref":"#/components/schemas/IncidentResponse"},"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":"IncidentListResponse","description":"Paginated list wrapper."},"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":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","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","required":["id","tenant_id"],"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.0}},"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.0},"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.0,"minimum":-90.0,"title":"Lat"},"lon":{"type":"number","maximum":180.0,"minimum":-180.0,"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."},"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.0,"minimum":1.0,"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.0},"water_temp_c":{"type":"number","title":"Water Temp C","default":0.0},"wind_speed":{"type":"number","title":"Wind Speed","default":0.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."},"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.0,"minimum":0.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.0,"minimum":-90.0,"title":"Lat","description":"Latitude in decimal degrees"},"lon":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Lon","description":"Longitude in decimal degrees"},"heading":{"anyOf":[{"type":"number","maximum":360.0,"minimum":0.0},{"type":"null"}],"title":"Heading","description":"Heading in degrees (0=N)"},"speed":{"anyOf":[{"type":"number","minimum":0.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.0},"status":{"type":"string","title":"Status","default":"normal"}},"type":"object","title":"RadiationSummary"},"ReflectRequest":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id","description":"Tenant ID to analyze incidents for"},"time_window_hours":{"type":"integer","maximum":8760.0,"minimum":1.0,"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.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."},"ReportFormat":{"type":"string","enum":["markdown","pdf","csv"],"title":"ReportFormat"},"ReportLocation":{"properties":{"lat":{"anyOf":[{"type":"number","maximum":90.0,"minimum":-90.0},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number","maximum":180.0,"minimum":-180.0},{"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)."},"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."},"RiskAssessment":{"type":"string","enum":["high","medium","low","none"],"title":"RiskAssessment"},"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.0},"speed_weight":{"type":"number","title":"Speed Weight","default":1.0},"duration_weight":{"type":"number","title":"Duration Weight","default":1.0},"history_weight":{"type":"number","title":"History Weight","default":1.0},"time_of_day_weight":{"type":"number","title":"Time Of Day Weight","default":1.0},"sensor_confidence_weight":{"type":"number","title":"Sensor Confidence Weight","default":1.0}},"type":"object","title":"ScoringFactors","description":"Weights used by the threat engine to compute composite scores."},"SeismicSummary":{"properties":{"count":{"type":"integer","title":"Count","default":0},"max_magnitude":{"type":"number","title":"Max Magnitude","default":0.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.0,"minimum":0.0},{"type":"null"}],"title":"Packet Loss"},"avg_latency_ms":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Avg Latency Ms"},"throughput_events_per_min":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Throughput Events Per Min"},"uptime_percent":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Uptime Percent"},"expected_reporting_interval_sec":{"anyOf":[{"type":"integer","exclusiveMinimum":0.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":{"type":"string","title":"Tenant Id"},"environment_id":{"type":"string","title":"Environment Id"},"name":{"type":"string","title":"Name"},"type":{"type":"string","title":"Type"},"source":{"type":"string","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":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["id","tenant_id","environment_id","name","type","source","created_at","updated_at"],"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."},"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."},"SimilarVessel":{"properties":{"mmsi":{"type":"string","title":"Mmsi","default":""},"similarity":{"type":"number","title":"Similarity","default":0.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.0},"anomaly_score":{"type":"number","title":"Anomaly Score","default":0.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.0},"density":{"type":"number","title":"Density","default":0.0},"bz_nt":{"type":"number","title":"Bz Nt","default":0.0}},"type":"object","title":"SolarWindData"},"SpaceWeatherImpactResponse":{"properties":{"solar_wind":{"$ref":"#/components/schemas/SolarWindData"},"kp_index":{"type":"number","title":"Kp Index","default":0.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"},"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.0,"minimum":0.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.0,"minimum":0.0,"title":"Incident Threshold","description":"Threat score (0-100) that triggers an incident","default":65},"escalation_timeout_minutes":{"type":"integer","minimum":1.0,"title":"Escalation Timeout Minutes","description":"Minutes before an unacknowledged incident auto-escalates","default":15},"sla_response_minutes":{"type":"integer","minimum":1.0,"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.0,"minimum":0.0},{"type":"null"}],"title":"Incident Threshold"},"escalation_timeout_minutes":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Escalation Timeout Minutes"},"sla_response_minutes":{"anyOf":[{"type":"integer","minimum":1.0},{"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"}},"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/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/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.0,"minimum":-90.0,"title":"Lat"},"lon":{"type":"number","maximum":180.0,"minimum":-180.0,"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"},"Vertical":{"type":"string","enum":["maritime","security","infrastructure","defense"],"title":"Vertical"},"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.0,"minimum":1800.0},{"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.0},{"type":"null"}],"title":"Decks"},"length_overall":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Length Overall","description":"LOA in metres"},"lbp":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Lbp","description":"Length between perpendiculars (m)"},"breadth_extreme":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Breadth Extreme","description":"Extreme breadth (m)"},"breadth_moulded":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Breadth Moulded","description":"Moulded breadth (m)"},"max_draught":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Max Draught","description":"Maximum draught (m)"},"depth":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Depth","description":"Depth (m)"},"freeboard":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Freeboard","description":"Freeboard (m)"},"tpc":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Tpc","description":"Tonnes per centimetre immersion"},"gross_tonnage":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Gross Tonnage"},"reduced_gross_tonnage":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Reduced Gross Tonnage"},"deadweight":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Deadweight","description":"DWT in tonnes"},"net_tonnage":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Net Tonnage"},"loaded_displacement":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Loaded Displacement"},"light_displacement":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Light Displacement"},"net_tonnage_panama":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Net Tonnage Panama"},"net_tonnage_suez":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Net Tonnage Suez"},"liquid_design":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Liquid Design","description":"Liquid capacity design (m3)"},"liquid_observed":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Liquid Observed"},"gas_design":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Gas Design","description":"Gas capacity design (m3)"},"gas_observed":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Gas Observed"},"bale_capacity":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Bale Capacity","description":"Bale capacity (m3)"},"grain_capacity":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Grain Capacity","description":"Grain capacity (m3)"},"ore_capacity":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Ore Capacity","description":"Ore capacity (m3)"},"mass_capacity":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Mass Capacity","description":"Mass capacity (tonnes)"},"teu_capacity":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Teu Capacity","description":"TEU container capacity"},"ceu_capacity":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Ceu Capacity","description":"CEU car equivalent capacity"},"engine_power_kw":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Engine Power Kw"},"engine_units":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Engine Units"},"engine_cylinders":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Engine Cylinders"},"engine_bore":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Engine Bore","description":"Bore in mm"},"engine_stroke":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Engine Stroke","description":"Stroke in mm"},"engine_rpm":{"anyOf":[{"type":"number","minimum":0.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.0},{"type":"null"}],"title":"Aux Engines"},"specific_fuel_consumption":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Specific Fuel Consumption","description":"g/kWh"},"boiloff_rate":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Boiloff Rate","description":"Boiloff rate (%/day)"},"speed_service":{"anyOf":[{"type":"number","minimum":0.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.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.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.0},{"type":"null"}],"title":"Fuel Tank Capacity 1","description":"m3"},"fuel_tank_capacity_2":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Fuel Tank Capacity 2"},"fuel_tank_capacity_3":{"anyOf":[{"type":"number","minimum":0.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.0},{"type":"null"}],"title":"Crane Swl","description":"Crane safe working load (tonnes)"},"order_price":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Order Price","description":"Order price (USD millions)"},"last_position_lat":{"anyOf":[{"type":"number","maximum":90.0,"minimum":-90.0},{"type":"null"}],"title":"Last Position Lat"},"last_position_lon":{"anyOf":[{"type":"number","maximum":180.0,"minimum":-180.0},{"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":{"type":"string","format":"uuid","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","tenant_id","trigger","actions"],"title":"WorkflowCreate","description":"POST /workflows"},"WorkflowExecutionListResponse":{"properties":{"rows":{"items":{"$ref":"#/components/schemas/WorkflowExecutionResponse"},"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":"WorkflowExecutionListResponse","description":"Paginated list wrapper for executions."},"WorkflowExecutionResponse":{"properties":{"id":{"type":"string","format":"uuid","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":["id","workflow_id"],"title":"WorkflowExecutionResponse","description":"Full workflow execution representation."},"WorkflowListResponse":{"properties":{"rows":{"items":{"$ref":"#/components/schemas/WorkflowResponse"},"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":"WorkflowListResponse","description":"Paginated list wrapper."},"WorkflowResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"trigger":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Trigger"},"actions":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Actions"},"enabled":{"type":"boolean","title":"Enabled","default":true},"execution_count":{"type":"integer","title":"Execution Count","default":0},"last_executed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Executed 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"},"execution_mode":{"type":"string","title":"Execution Mode","default":"autonomous"}},"type":"object","required":["id","name","tenant_id"],"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.0,"title":"Loiter Threshold Minutes","default":10},"speed_threshold_knots":{"type":"number","minimum":0.0,"title":"Speed Threshold Knots","default":0.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__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."}}}}