Thanks @jbudd. Since it's over 600 lines long, I've just included a single entry for a network user:
[
[
{
"site_id": "xxxxxxxxxxxxxxxxxxx",
"assoc_time": 1719157675,
"latest_assoc_time": 1719157965,
"hostname": "Galaxy-S10",
"oui": "",
"user_id": "xxxxxxxxxxxxxxx",
"_id": "xxxxxxxxxxxxxxx",
"mac": "AA:AA:AA:AA:AA:AA", //Dax note: this is the ID you need
"is_guest": true,
"first_seen": 1715947769,
"last_seen": 1719158113, //Dax note: this is not used in the current iteration
"is_wired": false,
"usergroup_id": "",
"wlanconf_id": "xxxxxxxxxxxxxxx",
"disconnect_timestamp": 1719157673,
"local_dns_record_enabled": false,
"local_dns_record": "",
"name": "XXXXX's phone",
"use_fixedip": false,
"network_id": "xxxxxxxxxxxxxxx",
"fixed_ip": "xxxxxxxxxxxxxxx",
"fixed_ap_enabled": false,
"noted": true,
"_uptime_by_uap": 149,
"_last_seen_by_uap": 1719158113,
"_is_guest_by_uap": true,
"ap_mac": "BB:BB:BB:BB:BB:BB",
"channel": 6,
"radio": "ng",
"radio_name": "wifi0",
"essid": "SSID",
"bssid": "CC:CC:CC:CC:CC:CC",
"powersave_enabled": false,
"is_11r": false,
"user_group_id_computed": "xxxxxxxxxxxxxxx",
"anomalies": 0,
"anon_client_id": "xxxxxxxxxxxxxxx",
"ccq": 989,
"dhcpend_time": 0,
"idletime": 0,
"ip": "xxxxxxxxxxxxxxx",
"noise": -100,
"nss": 2,
"rx_rate": 86531,
"rssi": 26,
"satisfaction": 99,
"satisfaction_now": 99,
"satisfaction_real": 99,
"satisfaction_reason": 2048,
"signal": -70,
"tx_mcs": 5,
"tx_power": 34,
"tx_rate": 104000,
"vlan": 0,
"radio_proto": "ng",
"channel_width": 20,
"satisfaction_avg": {
"total": 2781,
"count": 28
},
"uptime": 438,
"tx_bytes": 6107149,
"rx_bytes": 3497757,
"tx_packets": 9879,
"rx_packets": 9007,
"bytes-r": 126356,
"tx_bytes-r": 73229,
"rx_bytes-r": 53126,
"tx_retries": 4308,
"wifi_tx_attempts": 13481,
"authorized": true,
"qos_policy_applied": true,
"roam_count": 3
} //Dax note: there is normally a trailing comma (,) to separate each device, with the last one having no comma.
]
]