From 0267b1712b9f3f2f299146d3d723ca02acc9a53a Mon Sep 17 00:00:00 2001 From: Mike Geppert Date: Sun, 4 Jan 2026 06:16:40 -0600 Subject: [PATCH] Fix UniFi OS (UDM-SE) API endpoints for client/device queries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit UDM-SE uses UniFi OS which requires /proxy/network prefix for Network application API endpoints. The legacy controller endpoints (/api/s/...) return 404 on UniFi OS devices. Changes: - Updated get_clients() to use /proxy/network/api/s/{site}/stat/sta - Updated get_devices() to use /proxy/network/api/s/{site}/stat/device - Added comments explaining UniFi OS API structure Fixes 404 errors when querying UniFi controller for devices 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- unifi_client.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/unifi_client.py b/unifi_client.py index 73654f6..a34b0a3 100644 --- a/unifi_client.py +++ b/unifi_client.py @@ -122,25 +122,26 @@ class UnifiClient: def get_clients(self) -> List[Dict]: """ Get all clients from the UniFi controller. - + Returns: list: List of client dictionaries - + Raises: UniFiDataError: If request fails """ - endpoint = f'/api/s/{self.site_id}/stat/sta' - + # UniFi OS (UDM-SE) uses /proxy/network prefix for Network application API + endpoint = f'/proxy/network/api/s/{self.site_id}/stat/sta' + try: response = self._request_json(endpoint) - + if isinstance(response, dict) and 'data' in response: clients = response['data'] self.logger.debug(f"Retrieved {len(clients)} clients from UniFi controller") return clients else: raise UniFiDataError("Unexpected response format from UniFi controller") - + except UniFiDataError as e: self.logger.error(f"Failed to get clients: {e}") raise @@ -148,25 +149,26 @@ class UnifiClient: def get_devices(self) -> List[Dict]: """ Get all devices (APs, switches, etc.) from the UniFi controller. - + Returns: list: List of device dictionaries - + Raises: UniFiDataError: If request fails """ - endpoint = f'/api/s/{self.site_id}/stat/device' - + # UniFi OS (UDM-SE) uses /proxy/network prefix for Network application API + endpoint = f'/proxy/network/api/s/{self.site_id}/stat/device' + try: response = self._request_json(endpoint) - + if isinstance(response, dict) and 'data' in response: devices = response['data'] self.logger.debug(f"Retrieved {len(devices)} devices from UniFi controller") return devices else: raise UniFiDataError("Unexpected response format from UniFi controller") - + except UniFiDataError as e: self.logger.error(f"Failed to get devices: {e}") raise \ No newline at end of file