Manage a single device by its MAC address. Operations include retrieval, updates, deletion, resetting properties, and copying data between devices. All endpoints require authorization via Bearer token.
-
GET
/device/<mac>Fetch all details for a single device, including: -
Computed status (
devStatus) →On-line,Off-line, orDown -
Session and event counts (
devSessions,devEvents,devDownAlerts) -
Presence hours (
devPresenceHours) -
Children devices (
devChildrenDynamic) and NIC children (devChildrenNicsDynamic)
Special case: mac=new returns a template for a new device with default values.
Response (success):
{
"devMac": "AA:BB:CC:DD:EE:FF",
"devName": "Net - Huawei",
"devOwner": "Admin",
"devType": "Router",
"devVendor": "Huawei",
"devStatus": "On-line",
"devSessions": 12,
"devEvents": 5,
"devDownAlerts": 1,
"devPresenceHours": 32,
"devChildrenDynamic": [...],
"devChildrenNicsDynamic": [...],
...
}Error Responses:
- Device not found → HTTP 404
- Unauthorized → HTTP 403
MCP Integration: Available as get_device_info and set_device_alias tools. See MCP Server Bridge API.
- POST
/device/<mac>Create or update a device record.
⚠️ Full-replace (PUT) semantics. Every editable field is written on each call. Any field omitted from the payload is reset to its default (empty string or0). This matches how the frontend edit form works — it always sends the complete device state.To update a single field without affecting others, use
POST /device/<mac>/update-columninstead.
Request Body:
{
"devName": "New Device",
"devOwner": "Admin",
"createNew": true
}Behavior:
- If
createNew=true→ inserts a new device row - Otherwise → replaces all editable fields on the existing device
Response:
{
"success": true
}Error Responses:
- Unauthorized → HTTP 403
- DELETE
/device/<mac>/deleteDeletes the device with the given MAC.
Response:
{
"success": true
}Error Responses:
- Unauthorized → HTTP 403
- DELETE
/device/<mac>/events/deleteRemoves all events associated with a device.
Response:
{
"success": true
}- POST
/device/<mac>/reset-propsResets the device's custom properties to default values.
Request Body: Optional JSON for additional parameters.
Response:
{
"success": true
}- POST
/device/copyCopy all data from one device to another. If a device exists withmacTo, it is replaced.
Request Body:
{
"macFrom": "AA:BB:CC:DD:EE:FF",
"macTo": "11:22:33:44:55:66"
}Response:
{
"success": true,
"message": "Device copied from AA:BB:CC:DD:EE:FF to 11:22:33:44:55:66"
}Error Responses:
- Missing
macFromormacTo→ HTTP 400 - Unauthorized → HTTP 403
- POST
/device/<mac>/update-columnUpdate exactly one field for a device without touching any other fields.
✅ Partial-update (PATCH) semantics. Only the specified column is written. All other fields are left unchanged. Use this for automation, integrations, and any workflow that needs to update a single attribute.
To replace all fields at once (e.g. saving from the edit form), use
POST /device/<mac>.
Allowed columnName values: devName, devOwner, devType, devVendor, devGroup, devLocation, devComments, devIcon, devFavorite, devAlertEvents, devAlertDown, devCanSleep, devSkipRepeated, devReqNicsOnline, devForceStatus, devParentMAC, devParentPort, devParentRelType, devSSID, devSite, devVlan, devStaticIP, devIsNew, devIsArchived, devCustomProps.
Request Body:
{
"columnName": "devName",
"columnValue": "Updated Device Name"
}Response (success):
{
"success": true
}Error Responses:
- Device not found → HTTP 404
- Missing
columnNameorcolumnValue→ HTTP 400 - Unauthorized → HTTP 403
- POST
/device/<mac>/field/lockLock a field to prevent plugin overwrites, or unlock it to allow overwrites again.
Request Body:
{
"fieldName": "devName",
"lock": true
}| Field | Type | Required | Description |
|---|---|---|---|
fieldName |
string | ✅ | Field to lock/unlock (e.g. devName, devVendor) |
lock |
boolean | ❌ | true to lock, false to unlock (default when omitted) |
Response (success):
{
"success": true,
"fieldName": "devName",
"locked": true,
"message": "Field devName locked"
}Error Responses:
- Field does not support locking → HTTP 400
- Unauthorized → HTTP 403
- POST
/devices/fields/unlockUnlock fields (clearLOCKED/USERsources) for one device, a list of devices, or all devices.
Request Body:
{
"mac": "AA:BB:CC:DD:EE:FF",
"fields": ["devName", "devVendor"],
"clearAll": false
}| Field | Type | Required | Description |
|---|---|---|---|
mac |
string or array | ❌ | Single MAC, list of MACs, or omit for all devices |
fields |
array of strings | ❌ | Fields to unlock. Omit to unlock all tracked fields |
clearAll |
boolean | ❌ | true clears all sources; false (default) clears only LOCKED/USER |
Response (success):
{
"success": true
}Error Responses:
fieldsis not a list → HTTP 400- Unauthorized → HTTP 403
- POST
/device/<mac>/set-aliasConvenience wrapper to update the device display name (devName).
Request Body:
{
"alias": "My Router"
}Response (success):
{
"success": true
}Error Responses:
- Missing
alias→ HTTP 400 - Device not found → HTTP 404
- Unauthorized → HTTP 403
Get Device Details:
curl -X GET "http://<server_ip>:<GRAPHQL_PORT>/device/AA:BB:CC:DD:EE:FF" \
-H "Authorization: Bearer <API_TOKEN>"Update Device Fields:
curl -X POST "http://<server_ip>:<GRAPHQL_PORT>/device/AA:BB:CC:DD:EE:FF" \
-H "Authorization: Bearer <API_TOKEN>" \
-H "Content-Type: application/json" \
--data '{"devName": "New Device Name"}'Delete Device:
curl -X DELETE "http://<server_ip>:<GRAPHQL_PORT>/device/AA:BB:CC:DD:EE:FF/delete" \
-H "Authorization: Bearer <API_TOKEN>"Copy Device Data:
curl -X POST "http://<server_ip>:<GRAPHQL_PORT>/device/copy" \
-H "Authorization: Bearer <API_TOKEN>" \
-H "Content-Type: application/json" \
--data '{"macFrom":"AA:BB:CC:DD:EE:FF","macTo":"11:22:33:44:55:66"}'Update Single Column:
curl -X POST "http://<server_ip>:<GRAPHQL_PORT>/device/AA:BB:CC:DD:EE:FF/update-column" \
-H "Authorization: Bearer <API_TOKEN>" \
-H "Content-Type: application/json" \
--data '{"columnName":"devName","columnValue":"Updated Device"}'Lock a Field:
curl -X POST "http://<server_ip>:<GRAPHQL_PORT>/device/AA:BB:CC:DD:EE:FF/field/lock" \
-H "Authorization: Bearer <API_TOKEN>" \
-H "Content-Type: application/json" \
--data '{"fieldName":"devName","lock":true}'Unlock Fields (all devices):
curl -X POST "http://<server_ip>:<GRAPHQL_PORT>/devices/fields/unlock" \
-H "Authorization: Bearer <API_TOKEN>" \
-H "Content-Type: application/json" \
--data '{"fields":["devName","devVendor"]}'Set Device Alias:
curl -X POST "http://<server_ip>:<GRAPHQL_PORT>/device/AA:BB:CC:DD:EE:FF/set-alias" \
-H "Authorization: Bearer <API_TOKEN>" \
-H "Content-Type: application/json" \
--data '{"alias":"My Router"}'