openapi: 3.1.0 info: title: Geutebruck Cross-Switching API description: REST API for Geutebruck GeViScope/GeViSoft Cross-Switching Control version: 1.0.0 paths: /health: get: tags: - system summary: Health Check description: 'Enhanced health check endpoint Checks connectivity to: - Database (PostgreSQL) - Redis cache - SDK Bridge (gRPC) Returns overall status and individual component statuses' operationId: health_check_health_get responses: '200': description: Successful Response content: application/json: schema: {} /metrics: get: tags: - system summary: Metrics description: 'Metrics endpoint Provides basic API metrics: - Total routes registered - API version - Environment' operationId: metrics_metrics_get responses: '200': description: Successful Response content: application/json: schema: {} /: get: tags: - system summary: Root description: API root endpoint operationId: root__get responses: '200': description: Successful Response content: application/json: schema: {} /api/v1/auth/login: post: tags: - authentication summary: User login description: Authenticate with username and password to receive JWT tokens operationId: login_api_v1_auth_login_post requestBody: content: application/json: schema: $ref: '#/components/schemas/LoginRequest' required: true responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/TokenResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/v1/auth/logout: post: tags: - authentication summary: User logout description: Logout by blacklisting the current access token operationId: logout_api_v1_auth_logout_post responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/LogoutResponse' security: - HTTPBearer: [] /api/v1/auth/refresh: post: tags: - authentication summary: Refresh access token description: Generate new access token using refresh token operationId: refresh_token_api_v1_auth_refresh_post requestBody: content: application/json: schema: $ref: '#/components/schemas/RefreshTokenRequest' required: true responses: '200': description: Successful Response content: application/json: schema: {} '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/v1/auth/me: get: tags: - authentication summary: Get current user description: Get information about the currently authenticated user operationId: get_me_api_v1_auth_me_get responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/UserInfo' security: - HTTPBearer: [] /api/v1/cameras: get: tags: - cameras summary: List all cameras description: Get list of all cameras discovered from GeViScope operationId: list_cameras_api_v1_cameras_get security: - HTTPBearer: [] parameters: - name: use_cache in: query required: false schema: type: boolean description: Use Redis cache (60s TTL) default: true title: Use Cache description: Use Redis cache (60s TTL) responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/CameraListResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/v1/cameras/{camera_id}: get: tags: - cameras summary: Get camera details description: Get detailed information about a specific camera operationId: get_camera_api_v1_cameras__camera_id__get security: - HTTPBearer: [] parameters: - name: camera_id in: path required: true schema: type: integer title: Camera Id - name: use_cache in: query required: false schema: type: boolean description: Use Redis cache (60s TTL) default: true title: Use Cache description: Use Redis cache (60s TTL) responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/CameraDetailResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/v1/cameras/refresh: post: tags: - cameras summary: Refresh camera list description: Force refresh camera list from SDK Bridge (bypass cache) operationId: refresh_cameras_api_v1_cameras_refresh_post responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/CameraListResponse' security: - HTTPBearer: [] /api/v1/cameras/search/{query}: get: tags: - cameras summary: Search cameras description: Search cameras by name or description operationId: search_cameras_api_v1_cameras_search__query__get security: - HTTPBearer: [] parameters: - name: query in: path required: true schema: type: string title: Query responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/CameraListResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/v1/cameras/filter/online: get: tags: - cameras summary: Get online cameras description: Get list of online cameras only operationId: get_online_cameras_api_v1_cameras_filter_online_get responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/CameraListResponse' security: - HTTPBearer: [] /api/v1/cameras/filter/ptz: get: tags: - cameras summary: Get PTZ cameras description: Get list of cameras with PTZ capabilities operationId: get_ptz_cameras_api_v1_cameras_filter_ptz_get responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/CameraListResponse' security: - HTTPBearer: [] /api/v1/monitors: get: tags: - monitors summary: List all monitors description: Get list of all monitors (video outputs) from GeViScope operationId: list_monitors_api_v1_monitors_get security: - HTTPBearer: [] parameters: - name: use_cache in: query required: false schema: type: boolean description: Use Redis cache (60s TTL) default: true title: Use Cache description: Use Redis cache (60s TTL) responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/MonitorListResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/v1/monitors/{monitor_id}: get: tags: - monitors summary: Get monitor details description: Get detailed information about a specific monitor operationId: get_monitor_api_v1_monitors__monitor_id__get security: - HTTPBearer: [] parameters: - name: monitor_id in: path required: true schema: type: integer title: Monitor Id - name: use_cache in: query required: false schema: type: boolean description: Use Redis cache (60s TTL) default: true title: Use Cache description: Use Redis cache (60s TTL) responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/MonitorDetailResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/v1/monitors/refresh: post: tags: - monitors summary: Refresh monitor list description: Force refresh monitor list from SDK Bridge (bypass cache) operationId: refresh_monitors_api_v1_monitors_refresh_post responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/MonitorListResponse' security: - HTTPBearer: [] /api/v1/monitors/search/{query}: get: tags: - monitors summary: Search monitors description: Search monitors by name or description operationId: search_monitors_api_v1_monitors_search__query__get security: - HTTPBearer: [] parameters: - name: query in: path required: true schema: type: string title: Query responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/MonitorListResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/v1/monitors/filter/available: get: tags: - monitors summary: Get available monitors description: Get list of available (idle/free) monitors operationId: get_available_monitors_api_v1_monitors_filter_available_get responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/MonitorListResponse' security: - HTTPBearer: [] /api/v1/monitors/filter/active: get: tags: - monitors summary: Get active monitors description: Get list of active monitors (displaying a camera) operationId: get_active_monitors_api_v1_monitors_filter_active_get responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/MonitorListResponse' security: - HTTPBearer: [] /api/v1/monitors/routing: get: tags: - monitors summary: Get current routing state description: Get current routing state (monitor -> camera mapping) operationId: get_routing_state_api_v1_monitors_routing_get responses: '200': description: Successful Response content: application/json: schema: {} security: - HTTPBearer: [] /api/v1/crossswitch: post: tags: - crossswitch summary: Execute cross-switch description: Route a camera to a monitor (requires Operator role or higher) operationId: execute_crossswitch_api_v1_crossswitch_post requestBody: content: application/json: schema: $ref: '#/components/schemas/CrossSwitchRequest' required: true responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/CrossSwitchResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - HTTPBearer: [] /api/v1/crossswitch/clear: post: tags: - crossswitch summary: Clear monitor description: Clear camera from monitor (requires Operator role or higher) operationId: clear_monitor_api_v1_crossswitch_clear_post requestBody: content: application/json: schema: $ref: '#/components/schemas/ClearMonitorRequest' required: true responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/ClearMonitorResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - HTTPBearer: [] /api/v1/crossswitch/routing: get: tags: - crossswitch summary: Get routing state description: Get current routing state (active camera-to-monitor mappings) operationId: get_routing_state_api_v1_crossswitch_routing_get responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/RoutingStateResponse' security: - HTTPBearer: [] /api/v1/crossswitch/history: get: tags: - crossswitch summary: Get routing history description: Get historical routing records (all routes including cleared) operationId: get_routing_history_api_v1_crossswitch_history_get security: - HTTPBearer: [] parameters: - name: limit in: query required: false schema: type: integer maximum: 1000 minimum: 1 description: Maximum records to return default: 100 title: Limit description: Maximum records to return - name: offset in: query required: false schema: type: integer minimum: 0 description: Number of records to skip default: 0 title: Offset description: Number of records to skip - name: camera_id in: query required: false schema: anyOf: - type: integer exclusiveMinimum: 0 - type: 'null' description: Filter by camera ID title: Camera Id description: Filter by camera ID - name: monitor_id in: query required: false schema: anyOf: - type: integer exclusiveMinimum: 0 - type: 'null' description: Filter by monitor ID title: Monitor Id description: Filter by monitor ID responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/RouteHistoryResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/v1/configuration: get: tags: - configuration summary: Get configuration tree (root level) description: Get root-level folders - fast overview operationId: read_configuration_tree_root_api_v1_configuration_get responses: '200': description: Successful Response content: application/json: schema: {} security: - HTTPBearer: [] /api/v1/configuration/path: get: tags: - configuration summary: Get specific configuration folder description: Get a specific folder (e.g., MappingRules, Users) operationId: read_configuration_path_api_v1_configuration_path_get security: - HTTPBearer: [] parameters: - name: path in: query required: true schema: type: string title: Path responses: '200': description: Successful Response content: application/json: schema: {} '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/v1/configuration/action-mappings: get: tags: - configuration summary: List all action mappings description: Get all action mappings with input/output actions operationId: list_action_mappings_api_v1_configuration_action_mappings_get responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/ActionMappingListResponse' security: - HTTPBearer: [] post: tags: - configuration summary: Create action mapping description: Create a new action mapping operationId: create_action_mapping_api_v1_configuration_action_mappings_post requestBody: content: application/json: schema: $ref: '#/components/schemas/ActionMappingCreate' required: true responses: '201': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/ActionMappingOperationResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - HTTPBearer: [] /api/v1/configuration/action-mappings/{mapping_id}: get: tags: - configuration summary: Get single action mapping description: Get details of a specific action mapping by ID operationId: get_action_mapping_api_v1_configuration_action_mappings__mapping_id__get security: - HTTPBearer: [] parameters: - name: mapping_id in: path required: true schema: type: integer title: Mapping Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/ActionMappingResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' put: tags: - configuration summary: Update action mapping description: Update an existing action mapping operationId: update_action_mapping_api_v1_configuration_action_mappings__mapping_id__put security: - HTTPBearer: [] parameters: - name: mapping_id in: path required: true schema: type: integer title: Mapping Id requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ActionMappingUpdate' responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/ActionMappingOperationResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' delete: tags: - configuration summary: Delete action mapping description: Delete an action mapping operationId: delete_action_mapping_api_v1_configuration_action_mappings__mapping_id__delete security: - HTTPBearer: [] parameters: - name: mapping_id in: path required: true schema: type: integer title: Mapping Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/ActionMappingOperationResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/v1/configuration/servers: get: tags: - configuration summary: List all servers description: Get all G-core servers from GeViGCoreServer folder operationId: list_servers_api_v1_configuration_servers_get responses: '200': description: Successful Response content: application/json: schema: {} security: - HTTPBearer: [] post: tags: - configuration summary: Create server description: Create a new G-core server operationId: create_server_api_v1_configuration_servers_post requestBody: content: application/json: schema: type: object title: Server Data required: true responses: '201': description: Successful Response content: application/json: schema: {} '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - HTTPBearer: [] /api/v1/configuration/servers/{server_id}: get: tags: - configuration summary: Get single server description: Get details of a specific G-core server by ID operationId: get_server_api_v1_configuration_servers__server_id__get security: - HTTPBearer: [] parameters: - name: server_id in: path required: true schema: type: string title: Server Id responses: '200': description: Successful Response content: application/json: schema: {} '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' put: tags: - configuration summary: Update server description: Update an existing G-core server operationId: update_server_api_v1_configuration_servers__server_id__put security: - HTTPBearer: [] parameters: - name: server_id in: path required: true schema: type: string title: Server Id requestBody: required: true content: application/json: schema: type: object title: Server Data responses: '200': description: Successful Response content: application/json: schema: {} '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' delete: tags: - configuration summary: Delete server description: Delete a G-core server operationId: delete_server_api_v1_configuration_servers__server_id__delete security: - HTTPBearer: [] parameters: - name: server_id in: path required: true schema: type: string title: Server Id responses: '200': description: Successful Response content: application/json: schema: {} '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' components: schemas: Action: properties: action: type: string title: Action description: Action name/command parameters: additionalProperties: type: string type: object title: Parameters description: Action parameters as key-value pairs type: object required: - action title: Action description: Single action with parameters example: action: CrossSwitch C_101027 -> M parameters: SwitchMode: 'True' VideoInput: '101027' VideoOutput: '1' ActionMappingCreate: properties: name: anyOf: - type: string - type: 'null' title: Name description: Optional descriptive name for the mapping input_actions: items: $ref: '#/components/schemas/Action' type: array title: Input Actions description: Input/trigger actions (currently not distinguished in binary format) output_actions: items: $ref: '#/components/schemas/Action' type: array minItems: 1 title: Output Actions description: Output/response actions (at least one required) type: object required: - output_actions title: ActionMappingCreate description: Request to create a new action mapping example: input_actions: [] name: Switch to Camera 101027 output_actions: - action: CrossSwitch C_101027 -> M parameters: SwitchMode: 'True' VideoInput: '101027' ActionMappingListResponse: properties: total_mappings: type: integer title: Total Mappings description: Total number of mappings mappings_with_parameters: type: integer title: Mappings With Parameters description: Count of mappings that have parameters mappings: items: $ref: '#/components/schemas/ActionMappingResponse' type: array title: Mappings description: List of action mappings type: object required: - total_mappings - mappings_with_parameters - mappings title: ActionMappingListResponse description: Response with list of action mappings example: mappings: - id: 1 input_actions: [] offset: 252173 output_actions: - action: CrossSwitch C_101027 -> M parameters: SwitchMode: 'True' mappings_with_parameters: 11 total_mappings: 51 ActionMappingOperationResponse: properties: success: type: boolean title: Success description: Operation success status message: type: string title: Message description: Operation result message mapping: anyOf: - $ref: '#/components/schemas/ActionMappingResponse' - type: 'null' description: The created/updated mapping (null for delete) type: object required: - success - message title: ActionMappingOperationResponse description: Response for create/update/delete operations example: mapping: id: 52 input_actions: [] name: New mapping offset: 275000 output_actions: - action: TestAction parameters: {} message: Action mapping created successfully success: true ActionMappingResponse: properties: name: anyOf: - type: string - type: 'null' title: Name description: Optional descriptive name for the mapping input_actions: items: $ref: '#/components/schemas/Action' type: array title: Input Actions description: Input/trigger actions (currently not distinguished in binary format) output_actions: items: $ref: '#/components/schemas/Action' type: array minItems: 1 title: Output Actions description: Output/response actions (at least one required) id: type: integer title: Id description: Sequential ID (1-based index) offset: type: integer title: Offset description: Byte offset in .set file type: object required: - output_actions - id - offset title: ActionMappingResponse description: Response with action mapping details example: id: 1 input_actions: [] name: Switch to Camera 101027 offset: 252173 output_actions: - action: CrossSwitch C_101027 -> M parameters: SwitchMode: 'True' VideoInput: '101027' - action: GSC ViewerConnectLive V <- C parameters: {} ActionMappingUpdate: properties: name: anyOf: - type: string - type: 'null' title: Name description: Updated name input_actions: anyOf: - items: $ref: '#/components/schemas/Action' type: array - type: 'null' title: Input Actions description: Updated input actions output_actions: anyOf: - items: $ref: '#/components/schemas/Action' type: array - type: 'null' title: Output Actions description: Updated output actions type: object title: ActionMappingUpdate description: Request to update an existing action mapping example: output_actions: - action: CrossSwitch C_101027 -> M parameters: SwitchMode: 'True' VideoInput: '101027' VideoOutput: '2' CameraDetailResponse: properties: id: type: integer title: Id description: Camera ID name: type: string title: Name description: Camera name description: anyOf: - type: string - type: 'null' title: Description description: Camera description has_ptz: type: boolean title: Has Ptz description: PTZ capability default: false has_video_sensor: type: boolean title: Has Video Sensor description: Video sensor capability default: false status: type: string title: Status description: Camera status last_seen: anyOf: - type: string format: date-time - type: 'null' title: Last Seen description: Last seen timestamp channel_id: anyOf: - type: integer - type: 'null' title: Channel Id description: Physical channel ID ip_address: anyOf: - type: string - type: 'null' title: Ip Address description: Camera IP address model: anyOf: - type: string - type: 'null' title: Model description: Camera model firmware_version: anyOf: - type: string - type: 'null' title: Firmware Version description: Firmware version type: object required: - id - name - status title: CameraDetailResponse description: Response schema for single camera detail examples: - channel_id: 1 description: Main entrance monitoring firmware_version: 7.9.975.68 has_ptz: true has_video_sensor: true id: 1 ip_address: 192.168.1.100 last_seen: '2025-12-09T10:30:00Z' model: Geutebruck G-Cam/E2510 name: Entrance Camera status: online CameraInfo: properties: id: type: integer title: Id description: Camera ID (channel number in GeViScope) name: type: string title: Name description: Camera name description: anyOf: - type: string - type: 'null' title: Description description: Camera description has_ptz: type: boolean title: Has Ptz description: Whether camera has PTZ capabilities default: false has_video_sensor: type: boolean title: Has Video Sensor description: Whether camera has video sensor (motion detection) default: false status: type: string title: Status description: Camera status (online, offline, unknown) last_seen: anyOf: - type: string format: date-time - type: 'null' title: Last Seen description: Last time camera was seen online type: object required: - id - name - status title: CameraInfo description: Camera information schema examples: - description: Main entrance monitoring has_ptz: true has_video_sensor: true id: 1 last_seen: '2025-12-09T10:30:00Z' name: Entrance Camera status: online CameraListResponse: properties: cameras: items: $ref: '#/components/schemas/CameraInfo' type: array title: Cameras description: List of cameras total: type: integer title: Total description: Total number of cameras type: object required: - cameras - total title: CameraListResponse description: Response schema for camera list endpoint examples: - cameras: - description: Main entrance has_ptz: true has_video_sensor: true id: 1 last_seen: '2025-12-09T10:30:00Z' name: Entrance Camera status: online - description: Parking area monitoring has_ptz: false has_video_sensor: true id: 2 last_seen: '2025-12-09T10:30:00Z' name: Parking Lot status: online total: 2 ClearMonitorRequest: properties: monitor_id: type: integer exclusiveMinimum: 0.0 title: Monitor Id description: Monitor ID to clear (must be positive) type: object required: - monitor_id title: ClearMonitorRequest description: Request schema for clearing a monitor examples: - monitor_id: 1 ClearMonitorResponse: properties: success: type: boolean title: Success description: Whether operation succeeded message: type: string title: Message description: Success message monitor_id: type: integer title: Monitor Id description: Monitor ID that was cleared type: object required: - success - message - monitor_id title: ClearMonitorResponse description: Response schema for successful clear monitor operation examples: - message: Successfully cleared monitor 1 monitor_id: 1 success: true CrossSwitchRequest: properties: camera_id: type: integer exclusiveMinimum: 0.0 title: Camera Id description: Camera ID (must be positive) monitor_id: type: integer exclusiveMinimum: 0.0 title: Monitor Id description: Monitor ID (must be positive) mode: type: integer minimum: 0.0 title: Mode description: 'Cross-switch mode (default: 0=normal)' default: 0 type: object required: - camera_id - monitor_id title: CrossSwitchRequest description: Request schema for executing cross-switch examples: - camera_id: 1 mode: 0 monitor_id: 1 CrossSwitchResponse: properties: success: type: boolean title: Success description: Whether operation succeeded message: type: string title: Message description: Success message route: allOf: - $ref: '#/components/schemas/RouteInfo' description: Route information type: object required: - success - message - route title: CrossSwitchResponse description: Response schema for successful cross-switch execution examples: - message: Successfully switched camera 1 to monitor 1 route: camera_id: 1 camera_name: Entrance Camera executed_at: '2025-12-09T10:30:00Z' executed_by: 550e8400-e29b-41d4-a716-446655440001 executed_by_username: operator id: 550e8400-e29b-41d4-a716-446655440000 is_active: true mode: 0 monitor_id: 1 monitor_name: Control Room Monitor 1 success: true HTTPValidationError: properties: detail: items: $ref: '#/components/schemas/ValidationError' type: array title: Detail type: object title: HTTPValidationError LoginRequest: properties: username: type: string maxLength: 50 minLength: 1 title: Username description: Username password: type: string minLength: 1 title: Password description: Password type: object required: - username - password title: LoginRequest description: Request schema for user login examples: - password: admin123 username: admin LogoutResponse: properties: message: type: string title: Message description: Logout confirmation message default: Successfully logged out type: object title: LogoutResponse description: Response schema for successful logout examples: - message: Successfully logged out MonitorDetailResponse: properties: id: type: integer title: Id description: Monitor ID name: type: string title: Name description: Monitor name description: anyOf: - type: string - type: 'null' title: Description description: Monitor description status: type: string title: Status description: Monitor status current_camera_id: anyOf: - type: integer - type: 'null' title: Current Camera Id description: Currently displayed camera ID current_camera_name: anyOf: - type: string - type: 'null' title: Current Camera Name description: Currently displayed camera name last_update: anyOf: - type: string format: date-time - type: 'null' title: Last Update description: Last update timestamp channel_id: anyOf: - type: integer - type: 'null' title: Channel Id description: Physical channel ID resolution: anyOf: - type: string - type: 'null' title: Resolution description: Monitor resolution (e.g., 1920x1080) is_available: type: boolean title: Is Available description: Whether monitor is available for cross-switching default: true type: object required: - id - name - status title: MonitorDetailResponse description: Response schema for single monitor detail examples: - channel_id: 1 current_camera_id: 5 current_camera_name: Entrance Camera description: Main monitoring display id: 1 is_available: true last_update: '2025-12-09T10:30:00Z' name: Control Room Monitor 1 resolution: 1920x1080 status: active MonitorInfo: properties: id: type: integer title: Id description: Monitor ID (output channel number in GeViScope) name: type: string title: Name description: Monitor name description: anyOf: - type: string - type: 'null' title: Description description: Monitor description status: type: string title: Status description: Monitor status (active, idle, offline, unknown) current_camera_id: anyOf: - type: integer - type: 'null' title: Current Camera Id description: Currently displayed camera ID (None if no camera) last_update: anyOf: - type: string format: date-time - type: 'null' title: Last Update description: Last update timestamp type: object required: - id - name - status title: MonitorInfo description: Monitor information schema examples: - current_camera_id: 5 description: Main monitoring display id: 1 last_update: '2025-12-09T10:30:00Z' name: Control Room Monitor 1 status: active MonitorListResponse: properties: monitors: items: $ref: '#/components/schemas/MonitorInfo' type: array title: Monitors description: List of monitors total: type: integer title: Total description: Total number of monitors type: object required: - monitors - total title: MonitorListResponse description: Response schema for monitor list endpoint examples: - monitors: - current_camera_id: 5 description: Main display id: 1 last_update: '2025-12-09T10:30:00Z' name: Control Room Monitor 1 status: active - description: Secondary display id: 2 last_update: '2025-12-09T10:30:00Z' name: Control Room Monitor 2 status: idle total: 2 RefreshTokenRequest: properties: refresh_token: type: string title: Refresh Token description: Refresh token type: object required: - refresh_token title: RefreshTokenRequest description: Request schema for token refresh examples: - refresh_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... RouteHistoryResponse: properties: history: items: $ref: '#/components/schemas/RouteInfo' type: array title: History description: List of historical routes total: type: integer title: Total description: Total number of historical records limit: type: integer title: Limit description: Pagination limit offset: type: integer title: Offset description: Pagination offset type: object required: - history - total - limit - offset title: RouteHistoryResponse description: Response schema for routing history query examples: - history: - camera_id: 1 camera_name: Entrance Camera executed_at: '2025-12-09T10:30:00Z' executed_by: 550e8400-e29b-41d4-a716-446655440001 executed_by_username: operator id: 550e8400-e29b-41d4-a716-446655440000 is_active: false mode: 0 monitor_id: 1 monitor_name: Control Room Monitor 1 limit: 10 offset: 0 total: 50 RouteInfo: properties: id: type: string title: Id description: Route UUID camera_id: type: integer title: Camera Id description: Camera ID monitor_id: type: integer title: Monitor Id description: Monitor ID mode: type: integer title: Mode description: Cross-switch mode default: 0 executed_at: type: string format: date-time title: Executed At description: When route was executed executed_by: anyOf: - type: string - type: 'null' title: Executed By description: User ID who executed the route executed_by_username: anyOf: - type: string - type: 'null' title: Executed By Username description: Username who executed the route is_active: type: boolean title: Is Active description: Whether route is currently active camera_name: anyOf: - type: string - type: 'null' title: Camera Name description: Camera name monitor_name: anyOf: - type: string - type: 'null' title: Monitor Name description: Monitor name type: object required: - id - camera_id - monitor_id - executed_at - is_active title: RouteInfo description: Route information schema examples: - camera_id: 1 camera_name: Entrance Camera executed_at: '2025-12-09T10:30:00Z' executed_by: 550e8400-e29b-41d4-a716-446655440001 executed_by_username: operator id: 550e8400-e29b-41d4-a716-446655440000 is_active: true mode: 0 monitor_id: 1 monitor_name: Control Room Monitor 1 RoutingStateResponse: properties: routes: items: $ref: '#/components/schemas/RouteInfo' type: array title: Routes description: List of active routes total: type: integer title: Total description: Total number of active routes type: object required: - routes - total title: RoutingStateResponse description: Response schema for routing state query examples: - routes: - camera_id: 1 camera_name: Entrance Camera executed_at: '2025-12-09T10:30:00Z' executed_by: 550e8400-e29b-41d4-a716-446655440001 executed_by_username: operator id: 550e8400-e29b-41d4-a716-446655440000 is_active: true mode: 0 monitor_id: 1 monitor_name: Control Room Monitor 1 total: 1 TokenResponse: properties: access_token: type: string title: Access Token description: JWT access token refresh_token: type: string title: Refresh Token description: JWT refresh token token_type: type: string title: Token Type description: Token type (always 'bearer') default: bearer expires_in: type: integer title: Expires In description: Access token expiration time in seconds user: allOf: - $ref: '#/components/schemas/UserInfo' description: Authenticated user information type: object required: - access_token - refresh_token - expires_in - user title: TokenResponse description: Response schema for successful authentication examples: - access_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... expires_in: 3600 refresh_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... token_type: bearer user: created_at: '2025-12-08T10:00:00Z' id: 550e8400-e29b-41d4-a716-446655440000 role: administrator updated_at: '2025-12-08T10:00:00Z' username: admin UserInfo: properties: id: type: string title: Id description: User UUID username: type: string title: Username description: Username role: type: string title: Role description: User role (viewer, operator, administrator) created_at: type: string format: date-time title: Created At description: Account creation timestamp updated_at: type: string format: date-time title: Updated At description: Last update timestamp type: object required: - id - username - role - created_at - updated_at title: UserInfo description: User information schema (excludes sensitive data) examples: - created_at: '2025-12-08T10:00:00Z' id: 550e8400-e29b-41d4-a716-446655440000 role: administrator updated_at: '2025-12-08T10:00:00Z' username: admin ValidationError: properties: loc: items: anyOf: - type: string - type: integer type: array title: Location msg: type: string title: Message type: type: string title: Error Type type: object required: - loc - msg - type title: ValidationError securitySchemes: HTTPBearer: type: http scheme: bearer