REST API
NetXMS provides a REST API for programmatic access to the monitoring system.
The API is served directly from the netxmsd process; resource endpoint paths start with /v1/.
It is the primary integration API and is used by the Grafana data source plugin.
All API endpoints use JSON for request and response bodies.
The standalone WebAPI service (nxapisrv) used with older NetXMS versions is deprecated and has been removed; use the built-in web API described on this page.
|
Built-in Web API
Enabling the API
The HTTP listener, request routing, and the authentication endpoints (/, /v1/login, /v1/logout, /v1/ha/status) are part of the server core and are active by default (Enable defaults to true).
Loading the webapi server module adds the resource endpoints (/v1/objects, /v1/alarms, …).
To load the module, add it to netxmsd.conf and restart the server:
Module = webapi
The API listener is configured in the [WEBAPI] section of netxmsd.conf:
| Parameter | Default | Description |
|---|---|---|
|
|
Enable or disable the API listener |
|
loopback |
Address the HTTP listener binds to. Set to |
|
|
HTTP listener port |
|
|
Enable the TLS listener |
|
|
Address the TLS listener binds to |
|
|
TLS listener port |
|
Path to the TLS certificate file |
|
|
Path to the TLS certificate key file |
|
|
Path to the |
By default the HTTP listener accepts connections on the loopback interface only.
For remote clients, set Address in the [WEBAPI] section to any, *, or an explicit IP address.
|
The listener itself serves plain HTTP.
The TLS listener is terminated by an external reproxy process started by the server: it is bundled with the server on Windows, while on Linux reproxy must be installed separately.
Alternatively, place a TLS-offloading reverse proxy (nginx, Caddy, Traefik, etc.) in front of the HTTP port.
The base URL for API calls is:
http://<server>:8000/v1/
Authentication
Login
Obtain an authentication token by sending credentials to the login endpoint:
curl -X POST http://server:8000/v1/login \
-H "Content-Type: application/json" \
-d '{"username": "admin", "password": "netxms"}'
On success, the server responds with status 201 and a token:
{
"token": "...",
"userId": 1,
"systemAccessRights": 576460752303423487,
"changePassword": false,
"graceLogins": 0
}
Login tokens are ephemeral: each use extends the token’s validity by up to 4 hours, up to the absolute lifetime limit set by the WebAPI.AuthTokenMaxLifetime server configuration variable (24 hours by default).
The server reports the remaining lifetime in the X-Token-Expires-In response header and sets X-Token-Refresh-Recommended when the token approaches expiration.
Use the token in the Authorization header of subsequent requests:
curl http://server:8000/v1/objects \
-H "Authorization: Bearer <token>"
To end the session, invalidate the token:
curl -X POST http://server:8000/v1/logout \
-H "Authorization: Bearer <token>"
Persistent Tokens
For long-lived integrations, issue a persistent token instead of logging in with credentials:
-
In the management client, navigate to Configuration > Users and groups, right-click the user, and select Issue authentication token…. The dialog lets you set the expiration time and a description.
-
Programmatically,
POST /v1/users/{user-id}/tokenswith a body containingvalidFor(seconds, required),persistent(defaulttrue),singleUse(allowed only together with"persistent": false), anddescription(up to 127 characters) fields. The expiration time of persistent tokens is capped at 2038-01-19.
Tokens are issued per user and are not scoped: a token grants the same access as the user account it was issued for. Create a dedicated account with minimal permissions for each integration.
Objects
| Method | Endpoint | Description |
|---|---|---|
GET |
|
List all objects accessible to the authenticated user |
POST |
|
Create a new object |
GET |
|
Get details of a specific object |
PATCH |
|
Update common object properties |
POST |
|
Execute an object query |
POST |
|
Search objects by name, address, and other criteria |
Object queries use NXSL object query scripts, the same as in the management client:
curl -X POST http://server:8000/v1/objects/query \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"query": "type == NODE"}'
Optional body fields include rootObjectId (limit the query to a subtree), fields (additional object attributes to return), orderBy, and limit.
Alarms
| Method | Endpoint | Description |
|---|---|---|
GET |
|
List active alarms (optional |
GET |
|
Get details of a specific alarm |
POST |
|
Acknowledge an alarm |
POST |
|
Resolve an alarm |
POST |
|
Terminate an alarm |
GET |
|
List comments of an alarm |
POST |
|
Add a comment to an alarm |
GET |
|
List events correlated to an alarm |
Alarm state change operations return status 204 on success.
Incidents
| Method | Endpoint | Description |
|---|---|---|
GET |
|
List incidents |
POST |
|
Create an incident |
GET |
|
Get details of a specific incident |
PUT |
|
Update an incident |
POST |
|
Change incident state |
POST |
|
Assign an incident to a user |
POST |
|
Add a comment to an incident |
POST |
|
Link an alarm to an incident |
DELETE |
|
Unlink an alarm from an incident |
GET |
|
Get incident activity log |
Data Collection
| Method | Endpoint | Description |
|---|---|---|
GET |
|
List DCIs configured on an object |
GET |
|
Get current values of all DCIs on an object |
GET |
|
Get historical values of a DCI |
Query parameters for historical data:
-
timeFrom— start time (Unix timestamp, seconds) -
timeTo— end time (Unix timestamp, seconds) -
maxRows— maximum number of data points to return -
maxDataPoints— when set, the server aggregates the response down to at most this many data points -
tier— storage tier to read from:auto(default),raw,hourly, ordaily -
function— aggregation function to apply when data is aggregated -
historicalDataType— type of historical data (0=processed, default; 1=raw; 2=raw and processed; 3=full table)
curl "http://server:8000/v1/objects/100/data-collection/200/history?timeFrom=1740000000&timeTo=1740086400&maxRows=1000" \
-H "Authorization: Bearer <token>"
Summary Tables
| Method | Endpoint | Description |
|---|---|---|
POST |
|
Query a configured DCI summary table. Body: |
POST |
|
Execute an ad-hoc summary table query from a table definition supplied in the request body |
Log Queries
| Method | Endpoint | Description |
|---|---|---|
GET |
|
List available server logs |
GET |
|
Get details of a specific log |
POST |
|
Query a log using filter definitions |
POST |
|
Query a log using an SQL fragment |
GET |
|
Get a specific log record |
Server Information
| Method | Endpoint | Description |
|---|---|---|
GET |
|
Get server version, build, and configuration details |
GET |
|
Lightweight server status for health checks |
GET |
|
HA status; requires no authentication and works on a standby server |
Command Execution
| Method | Endpoint | Description |
|---|---|---|
POST |
|
Execute an agent action on a node |
POST |
|
Execute an NXSL script on an object |
POST |
|
Execute a dashboard script on an object |
POST |
|
Expand macros in text in the context of an object |
POST |
|
Start a remote control (VNC) session to a node |
POST |
|
Enter or leave maintenance mode |
POST |
|
Set object managed or unmanaged state |
POST |
|
Send wake-on-LAN to a node or interface (requires Control access right) |
POST |
|
Take a screenshot on a node via the agent |
The built-in API has no endpoints for injecting events or pushing DCI values — use the nxevent, nxpush, or nxapush command line tools for those operations.
|
Error Handling
The API returns standard HTTP status codes:
| Code | Description |
|---|---|
200 |
Success |
201 |
Resource created |
204 |
Success, no response body |
400 |
Bad request (invalid parameters) |
401 |
Authentication required or token expired |
403 |
Access denied (insufficient permissions) |
404 |
Resource not found |
415 |
Unsupported media type (request body must be JSON) |
426 |
Upgrade required (WebSocket endpoints) |
500 |
Internal server error |
503 |
Service unavailable (returned for most routes on a standby server in an HA setup) |
Error responses include a JSON body with the failure reason:
{
"reason": "Access denied"
}
Failed login attempts may additionally return an errorCode field with details on the failure reason.
Usage Examples
Python — Acknowledge All Critical Alarms
import requests
BASE = "http://server:8000/v1"
# Login
resp = requests.post(f"{BASE}/login",
json={"username": "admin", "password": "netxms"})
resp.raise_for_status()
headers = {"Authorization": f"Bearer {resp.json()['token']}"}
# Get active alarms and acknowledge critical ones (severity 4)
for alarm in requests.get(f"{BASE}/alarms", headers=headers).json():
if alarm["severity"] == 4:
requests.post(f"{BASE}/alarms/{alarm['id']}/acknowledge", headers=headers)
print(f"Acknowledged alarm {alarm['id']}: {alarm['message']}")
# Logout
requests.post(f"{BASE}/logout", headers=headers)
Bash — Acknowledge All Critical Alarms
#!/bin/bash
API="http://server:8000/v1"
# Login
TOKEN=$(curl -s -X POST "$API/login" \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"netxms"}' | jq -r '.token')
# Get critical alarms and acknowledge them
curl -s "$API/alarms" -H "Authorization: Bearer $TOKEN" | \
jq -r '.[] | select(.severity == 4) | .id' | \
while read id; do
curl -s -X POST "$API/alarms/$id/acknowledge" \
-H "Authorization: Bearer $TOKEN"
echo "Acknowledged alarm $id"
done
# Logout
curl -s -X POST "$API/logout" -H "Authorization: Bearer $TOKEN"
Best Practices
-
Use persistent tokens for automated integrations instead of logging in with credentials
-
Log out when done
-
Avoid polling too frequently; use reasonable intervals (30 seconds or more for dashboards)
-
Create a dedicated user account with minimal permissions for each integration
Next Steps
-
Grafana Integration — using the REST API with Grafana
-
External Tools Integration — connecting external tools to NetXMS