List Devices & Check Connectivity

Find your device IDs and confirm each device is online.

Transfers move files between two registered devices, identified by their deviceId. This example lists the devices in your workspace and checks whether the source and target devices are currently online.

Steps

  1. Log in and list devices with GET /api/device.
  2. Read each device's deviceId.
  3. Check online status with GET /api/device/connectivity/{deviceId}.
  4. Optionally fetch full device detail before transferring.

Configuration

Set your credentials and IDs via environment variables or a .env file (INNORIX_BASE_URL, INNORIX_WORKSPACE_ID, INNORIX_EMAIL, INNORIX_PASSWORD, and the INNORIX_SOURCE_ID / INNORIX_TARGET_ID / path variables the example uses).

API

MethodEndpointDescription
GET/api/deviceList registered devices
GET/api/device/connectivity/{deviceId}Check whether a device is online
GET/api/device/{deviceId}/detailGet full device detail
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
""" 02 - Devices & connectivity ========================== List registered devices, find the source/target deviceId, and check whether each device is online before you attempt a transfer. This file is self-contained: it embeds a minimal client so it can be read and run on its own. Endpoints: GET /api/device GET /api/device/connectivity/{deviceId} GET /api/device/{device_id}/detail Run: python 02_devices.py """ from __future__ import annotations import os import logging import requests try: from dotenv import load_dotenv load_dotenv() except ImportError: pass # --------------------------------------------------------------------------- # # Configuration # --------------------------------------------------------------------------- # BASE_URL = os.getenv("INNORIX_BASE_URL", "https://app.innorix.com") WORKSPACE_ID = os.getenv("INNORIX_WORKSPACE_ID", "<WORKSPACE_ID>") EMAIL = os.getenv("INNORIX_EMAIL", "<YOUR_EMAIL>") PASSWORD = os.getenv("INNORIX_PASSWORD", "<YOUR_PASSWORD>") SOURCE_ID = os.getenv("INNORIX_SOURCE_ID", "<SOURCE_DEVICE_ID>") TARGET_ID = os.getenv("INNORIX_TARGET_ID", "<TARGET_DEVICE_ID>") logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s", datefmt="%H:%M:%S") log = logging.getLogger("innorix") # --------------------------------------------------------------------------- # # Minimal client # --------------------------------------------------------------------------- # class ApiError(RuntimeError): """Raised when the API returns a non-2xx response.""" class InnorixClient: def __init__(self, base_url: str, workspace_id: str, timeout: float = 15.0): self.base_url = base_url.rstrip("/") self.workspace_id = workspace_id self.timeout = timeout self.session = requests.Session() def _request(self, method: str, path: str, **kwargs): kwargs.setdefault("timeout", self.timeout) res = self.session.request(method, f"{self.base_url}{path}", **kwargs) try: res.raise_for_status() except requests.HTTPError as exc: raise ApiError(f"{method} {path} -> {res.status_code}: {res.text[:500]}") from exc if not res.content: return None try: return res.json() except ValueError: return res.text def login(self, email: str, password: str) -> str: data = self._request("POST", "/api/auth/login", json={"email": email, "password": password}, timeout=10) token = data["data"]["user"]["accessToken"] self.session.headers.update({ "Authorization": f"Bearer {token}", "x-workspace-id": self.workspace_id, "Content-Type": "application/json", }) log.info("logged in") return token def list_devices(self, page: int = 1, size: int = 20) -> list: data = self._request("GET", "/api/device", params={"page": page, "size": size}, timeout=10) return data["data"]["devices"] def is_online(self, device_id: str) -> bool: result = self._request("GET", f"/api/device/connectivity/{device_id}", timeout=10) if isinstance(result, dict): return bool(result.get("data", result)) return bool(result) def device_detail(self, device_id: str): return self._request("GET", f"/api/device/{device_id}/detail", timeout=10) # --------------------------------------------------------------------------- # # Run # --------------------------------------------------------------------------- # def main() -> None: client = InnorixClient(BASE_URL, WORKSPACE_ID) client.login(EMAIL, PASSWORD) devices = client.list_devices() print(f"{len(devices)} device(s) registered:") for d in devices: name = d.get("deviceName") or d.get("name") device_id = d.get("deviceId") or d.get("id") print(f" - {name} ({device_id})") for role, device_id in (("source", SOURCE_ID), ("target", TARGET_ID)): online = client.is_online(device_id) print(f"{role} {device_id} online={online}") # Full detail of one device (uncomment to inspect): # import json # print(json.dumps(client.device_detail(SOURCE_ID), indent=2, ensure_ascii=False)) if __name__ == "__main__": main()