Files
shopdb-flask/docs/api-inventory.json
cproudlock 762d1b7210 Make the API usable by an agent, and stop the contract going stale
Someone writing a script against ShopDB had two options: read a 705 KB spec, or
guess. The spec is the reference, not an index, and handing an agent the whole
thing means either truncating it or spending a context window on 479 operations
nobody asked about.

Three additions, each feeding the next.

/api/docs/operations.txt is the index: every operation on one line with its
method, path, tag, auth and summary, at around 70 KB for all 486. A caller can
hold the entire API at once, find the four operations it needs, and only then
fetch their schemas.

/api/docs/openapi.json?tag=... narrows the spec to one of the 41 tag groups.
Components are kept intact deliberately: pruning the schema graph to match would
leave references resolving to nothing, and a generator that fails confusingly is
worse than a file that is larger than strictly necessary.

tools/mcp/ is an MCP server built on both. Five tools rather than 483, because a
tool per operation is unusable - clients degrade past a few dozen and models
start picking the wrong one. It reads everything from the live instance at call
time, so enabling a plugin adds operations it can already reach with no change
here. The token is the security boundary and the README says so plainly: every
operation the credential permits is reachable, so exploratory work wants a
read-scoped token.

The rest of this is about the contract not drifting, which is what makes any of
the above trustworthy.

Two CI jobs:

- api-contract runs the parity gates and then regenerates the spec and fails if
  anything changed. Those gates already existed and already worked - they caught
  both routes added here, unprompted - but nothing ran them except by hand, and
  the committed spec had silently drifted by three operations, including two
  setup endpoints added the day before.
- migrations-mysql is the job the header comment has been claiming for some
  time while not existing. It described "the REAL multi-site deploy path" and
  "what catches an Alembic regression on MySQL before it ships", and there was
  no such job. That is worse than no comment: it is the false confidence that
  let a migration ship which could not build a schema on a fresh MySQL database.
  The suite runs on SQLite, and SQLite accepts a foreign key onto a table that
  does not exist.

CONTRIBUTING.md now says to run gen_openapi.py --refresh after changing a route,
and that a route the sweep cannot classify belongs in PUBLIC_ENDPOINTS with a
reason rather than hand-edited into the inventory, which the next refresh would
overwrite. The new index route is declared there alongside the spec it indexes.
2026-09-20 12:59:49 -04:00

13139 lines
452 KiB
JSON

[
{
"surface": "core-apitokens",
"endpoints": [
{
"method": "GET",
"path": "/api/apitokens",
"auth": "jwt",
"params": "not documented",
"purpose": "List the caller's own tokens. Admins may pass ?all=true for everyone's.",
"example": "curl http://localhost:5001/api/apitokens -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "all",
"type": "string",
"required": false,
"default": "false"
}
],
"responseexample": {
"data": [
{
"createddate": "2026-01-01T00:00:00.000000Z",
"displayprefix": "<redacted:secret>",
"expiresat": null,
"isactive": true,
"isexpired": false,
"lastusedat": null,
"name": "member token",
"resourcescopes": null,
"scopes": null,
"tokenid": 2,
"tokenprefix": "<redacted:secret>",
"userid": 2,
"username": "<redacted:person>"
},
{
"createddate": "2026-01-01T00:00:00.000000Z",
"displayprefix": "<redacted:secret>",
"expiresat": null,
"isactive": true,
"isexpired": false,
"lastusedat": null,
"name": "admin token",
"resourcescopes": null,
"scopes": null,
"tokenid": 1,
"tokenprefix": "<redacted:secret>",
"userid": 1,
"username": "<redacted:person>"
}
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/apitokens",
"auth": "permission:apitokens.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a token for the caller. Returns the full secret ONCE.",
"example": "curl -X POST http://localhost:5001/api/apitokens -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"name": "direct token",
"scopes": [
"applications.create"
]
},
"responseexample": {
"data": {
"createddate": "2026-01-01T00:00:00.000000Z",
"displayprefix": "<redacted:secret>",
"expiresat": null,
"isactive": true,
"isexpired": false,
"lastusedat": null,
"name": "direct token",
"resourcescopes": null,
"scopes": [
"applications.create"
],
"secret": "<redacted:secret>",
"tokenid": 1,
"tokenprefix": "<redacted:secret>",
"userid": 1,
"warning": "Save this token now. It will not be shown again. Store it somewhere safe."
},
"message": "Token created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/apitokens/<int:tokenid>",
"auth": "permission:apitokens.create",
"params": "path: tokenid (int)",
"purpose": "Revoke (deactivate) a token. Own token, or any if admin.",
"example": "curl -X DELETE http://localhost:5001/api/apitokens/1 -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"message": "Token revoked",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "PUT",
"path": "/api/apitokens/<int:tokenid>",
"auth": "permission:apitokens.create",
"params": "path: tokenid (int); body: JSON (fields not yet documented)",
"purpose": "Rename, rescope, or deactivate a token. Own token, or any if admin.",
"example": "curl -X PUT http://localhost:5001/api/apitokens/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"scopes": [
"applications.edit"
]
},
"responseexample": {
"data": {
"createddate": "2026-01-01T00:00:00.000000Z",
"displayprefix": "<redacted:secret>",
"expiresat": null,
"isactive": true,
"isexpired": false,
"lastusedat": null,
"name": "test token",
"resourcescopes": null,
"scopes": [
"applications.edit"
],
"tokenid": 1,
"tokenprefix": "<redacted:secret>",
"userid": 1
},
"message": "Token updated",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
}
]
},
{
"surface": "core-applications",
"endpoints": [
{
"method": "GET",
"path": "/api/applications",
"auth": "permission:applications.view",
"params": "not documented",
"purpose": "List all applications.",
"example": "curl http://localhost:5001/api/applications -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "appname",
"type": "string",
"required": false
},
{
"name": "installable",
"type": "string",
"required": false
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
},
{
"name": "search",
"type": "string",
"required": false
},
{
"name": "showhidden",
"type": "string",
"required": false,
"default": "false"
}
],
"responseexample": {
"data": [],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 0,
"totalpages": 0
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/applications",
"auth": "permission:applications.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a new application.",
"example": "curl -X POST http://localhost:5001/api/applications -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"appname": "No Backdate",
"createddate": "2026-01-01 00:00:00"
},
"responseexample": {
"data": {
"appdescription": null,
"appid": 1,
"applicationlink": null,
"applicationnotes": null,
"appname": "Before Revoke",
"contacts": [],
"createddate": "2026-01-01T00:00:00.000000Z",
"documentationpath": null,
"image": null,
"installersha256": null,
"installpath": null,
"isactive": true,
"ishidden": false,
"isinstallable": false,
"islicenced": false,
"ismonitorable": false,
"isprinter": false,
"isrequired": false,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"monitorlaunchpath": null,
"monitorprocessname": null,
"supportteamid": null,
"supportteamname": null,
"teamurl": null
},
"message": "Application created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/applications/<int:app_id>",
"auth": "permission:applications.delete",
"params": "path: app_id (int)",
"purpose": "Permanently delete an application, its versions, and its uploads.",
"example": "curl -X DELETE http://localhost:5001/api/applications/1 -H \"Authorization: Bearer $TOK\"",
"requestexample": {
"confirm": "OK"
},
"responseexample": {
"data": {
"deactivatedpolicies": [
"Required app: Doomed",
"Hand made push"
],
"policyresult": "kept"
},
"message": "Application deleted; deactivated 2 policy(ies) that referenced it: Required app: Doomed, Hand made push",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/applications/<int:app_id>",
"auth": "permission:applications.view",
"params": "path: app_id (int)",
"purpose": "Get a single application with details.",
"example": "curl http://localhost:5001/api/applications/1 -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"appdescription": null,
"appid": 1,
"applicationlink": null,
"applicationnotes": null,
"appname": "TeamApp",
"contacts": [
{
"name": "Alice",
"sso": "a01"
}
],
"createddate": "2026-01-01T00:00:00.000000Z",
"documentationpath": null,
"image": null,
"installedcount": 0,
"installersha256": null,
"installpath": null,
"isactive": true,
"ishidden": false,
"isinstallable": false,
"islicenced": false,
"ismonitorable": false,
"isprinter": false,
"isrequired": false,
"knowledgebase": [],
"modifieddate": "2026-01-01T00:00:00.000000Z",
"monitorlaunchpath": null,
"monitorprocessname": null,
"supportteamid": 1,
"supportteamname": "Controls",
"teamurl": "https://sn.example/controls",
"versions": []
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "PUT",
"path": "/api/applications/<int:app_id>",
"auth": "permission:applications.edit",
"params": "path: app_id (int); body: JSON (fields not yet documented)",
"purpose": "Update an application.",
"example": "curl -X PUT http://localhost:5001/api/applications/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"ismonitorable": false,
"monitorlaunchpath": "",
"monitorprocessname": ""
},
"responseexample": {
"data": {
"appdescription": null,
"appid": 1,
"applicationlink": null,
"applicationnotes": null,
"appname": "Test App",
"contacts": [],
"createddate": "2026-01-01T00:00:00.000000Z",
"documentationpath": null,
"image": null,
"installersha256": null,
"installpath": null,
"isactive": true,
"ishidden": false,
"isinstallable": false,
"islicenced": false,
"ismonitorable": false,
"isprinter": false,
"isrequired": true,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"monitorlaunchpath": null,
"monitorprocessname": null,
"policynote": "A configuration policy was created for this application, but it is not attached to any business policy and installs nothing until an admin adds it to one.",
"policyresult": "created",
"supportteamid": null,
"supportteamname": null,
"teamurl": null
},
"message": "Application updated",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/applications/<int:app_id>/image",
"auth": "permission:applications.edit",
"params": "path: app_id (int)",
"purpose": "Remove an application's image and clear the field.",
"example": "curl -X DELETE http://localhost:5001/api/applications/1/image -H \"Authorization: Bearer $TOK\""
},
{
"method": "POST",
"path": "/api/applications/<int:app_id>/image",
"auth": "permission:applications.edit",
"params": "path: app_id (int); body: JSON (fields not yet documented)",
"purpose": "Upload (or replace) an application's image.",
"example": "curl -X POST http://localhost:5001/api/applications/1/image -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"responseexample": {
"data": {
"appdescription": null,
"appid": 1,
"applicationlink": null,
"applicationnotes": null,
"appname": "Test App",
"contacts": [],
"createddate": "2026-01-01T00:00:00.000000Z",
"documentationpath": null,
"image": "/api/applications/image/application-1.png",
"installersha256": null,
"installpath": null,
"isactive": true,
"ishidden": false,
"isinstallable": false,
"islicenced": false,
"ismonitorable": false,
"isprinter": false,
"isrequired": false,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"monitorlaunchpath": null,
"monitorprocessname": null,
"supportteamid": null,
"supportteamname": null,
"teamurl": null
},
"message": "Application image uploaded",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/applications/<int:app_id>/installed",
"auth": "permission:applications.view",
"params": "path: app_id (int)",
"purpose": "List all computers that have this application installed.",
"example": "curl http://localhost:5001/api/applications/1/installed -H \"Authorization: Bearer $TOK\""
},
{
"method": "DELETE",
"path": "/api/applications/<int:app_id>/package",
"auth": "permission:applications.edit",
"params": "path: app_id (int)",
"purpose": "Remove an uploaded installer and clear the path it set.",
"example": "curl -X DELETE http://localhost:5001/api/applications/1/package -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"appdescription": null,
"appid": 1,
"applicationlink": null,
"applicationnotes": null,
"appname": "Test App",
"contacts": [],
"createddate": "2026-01-01T00:00:00.000000Z",
"documentationpath": null,
"image": null,
"installersha256": null,
"installpath": "<redacted:sharepath>",
"isactive": true,
"ishidden": false,
"isinstallable": false,
"islicenced": false,
"ismonitorable": false,
"isprinter": false,
"isrequired": false,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"monitorlaunchpath": null,
"monitorprocessname": null,
"supportteamid": null,
"supportteamname": null,
"teamurl": null
},
"message": "Installer removed",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/applications/<int:app_id>/package",
"auth": "permission:applications.edit",
"params": "path: app_id (int); body: JSON (fields not yet documented)",
"purpose": "Upload (or replace) the installer for an application.",
"example": "curl -X POST http://localhost:5001/api/applications/1/package -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"responseexample": {
"data": {
"appdescription": null,
"appid": 1,
"applicationlink": null,
"applicationnotes": null,
"appname": "Test App",
"appversionid": null,
"bytes": 130,
"contacts": [],
"createddate": "2026-01-01T00:00:00.000000Z",
"detectedversion": "<redacted:address>",
"documentationpath": null,
"image": null,
"installersha256": "<redacted:digest>",
"installpath": "/api/applications/package/1/setup.exe",
"isactive": true,
"ishidden": false,
"isinstallable": false,
"islicenced": false,
"ismonitorable": false,
"isprinter": false,
"isrequired": false,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"monitorlaunchpath": null,
"monitorprocessname": null,
"sha256": "<redacted:digest>",
"supportteamid": null,
"supportteamname": null,
"teamurl": null,
"uploadedfilename": "setup.exe"
},
"message": "Installer uploaded",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "POST",
"path": "/api/applications/<int:app_id>/revert",
"auth": "permission:applications.edit",
"params": "path: app_id (int); body: JSON (fields not yet documented)",
"purpose": "Strip an application back to a catalogue record.",
"example": "curl -X POST http://localhost:5001/api/applications/1/revert -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"confirm": "OK"
},
"responseexample": {
"data": {
"appdescription": null,
"appid": 1,
"applicationlink": null,
"applicationnotes": null,
"appname": "Test App",
"contacts": [],
"createddate": "2026-01-01T00:00:00.000000Z",
"documentationpath": null,
"image": "/api/applications/image/application-1.png",
"installersha256": null,
"installpath": null,
"isactive": true,
"ishidden": false,
"isinstallable": false,
"islicenced": false,
"ismonitorable": false,
"isprinter": false,
"isrequired": false,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"monitorlaunchpath": null,
"monitorprocessname": null,
"supportteamid": null,
"supportteamname": null,
"teamurl": null
},
"message": "Application reverted to record",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/applications/<int:app_id>/versions",
"auth": "permission:applications.view",
"params": "path: app_id (int)",
"purpose": "List all versions for an application.",
"example": "curl http://localhost:5001/api/applications/1/versions -H \"Authorization: Bearer $TOK\""
},
{
"method": "POST",
"path": "/api/applications/<int:app_id>/versions",
"auth": "permission:applications.create",
"params": "path: app_id (int); body: JSON (fields not yet documented)",
"purpose": "Create a new version for an application.",
"example": "curl -X POST http://localhost:5001/api/applications/1/versions -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"sha256": "<redacted:digest>",
"silentargs": "/S /v/qn",
"version": "1.2.3"
},
"responseexample": {
"data": {
"appid": 1,
"appversionid": 1,
"dateadded": "2026-01-01T00:00:00.000000Z",
"isactive": true,
"notes": null,
"releasedate": null,
"sha256": "<redacted:digest>",
"silentargs": "/S /v/qn",
"version": "1.2.3"
},
"message": "Version created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/applications/image/<path:filename>",
"auth": "none (reviewed: named in the public-read or mutation sweep)",
"params": "path: filename (path)",
"purpose": "Serve an uploaded application image.",
"example": "curl http://localhost:5001/api/applications/image/example.png"
},
{
"method": "GET",
"path": "/api/applications/machines/<int:machine_id>",
"auth": "permission:applications.view",
"params": "path: machine_id (int)",
"purpose": "List all applications installed on a computer.",
"example": "curl http://localhost:5001/api/applications/machines/1 -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [
{
"appdescription": null,
"appid": 1,
"appname": "Test App",
"appversionid": null,
"computerid": 1,
"id": 1,
"installeddate": "2026-01-01T00:00:00.000000Z",
"installedversion": "1.2.3",
"isactive": true
}
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/applications/machines/<int:machine_id>",
"auth": "permission:applications.create",
"params": "path: machine_id (int); body: JSON (fields not yet documented)",
"purpose": "Install an application on a computer.",
"example": "curl -X POST http://localhost:5001/api/applications/machines/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/applications/machines/<int:machine_id>/<int:app_id>",
"auth": "permission:applications.delete",
"params": "path: machine_id (int), app_id (int)",
"purpose": "Uninstall an application from a computer.",
"example": "curl -X DELETE http://localhost:5001/api/applications/machines/1/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/applications/machines/<int:machine_id>/<int:app_id>",
"auth": "permission:applications.edit",
"params": "path: machine_id (int), app_id (int); body: JSON (fields not yet documented)",
"purpose": "Update installed application (e.g., change version).",
"example": "curl -X PUT http://localhost:5001/api/applications/machines/1/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "GET",
"path": "/api/applications/package/<path:filename>",
"auth": "permission:applications.download",
"params": "path: filename (path)",
"purpose": "Download an uploaded installer.",
"example": "curl http://localhost:5001/api/applications/package/example.png -H \"Authorization: Bearer $TOK\""
}
]
},
{
"surface": "core-assets",
"endpoints": [
{
"method": "GET",
"path": "/api/assets",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "List all assets with filtering and pagination.",
"example": "curl http://localhost:5001/api/assets -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "businessunit_id",
"type": "integer",
"required": false
},
{
"name": "businessunitid",
"type": "integer",
"required": false
},
{
"name": "dir",
"type": "string",
"required": false,
"default": "asc"
},
{
"name": "include_type_data",
"type": "string",
"required": false,
"default": "false"
},
{
"name": "location_id",
"type": "integer",
"required": false
},
{
"name": "locationid",
"type": "integer",
"required": false
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
},
{
"name": "search",
"type": "string",
"required": false
},
{
"name": "sort",
"type": "string",
"required": false,
"default": "assetnumber"
},
{
"name": "status_id",
"type": "integer",
"required": false
},
{
"name": "statusid",
"type": "integer",
"required": false
},
{
"name": "type",
"type": "string",
"required": false
},
{
"name": "type_id",
"type": "integer",
"required": false
},
{
"name": "typeid",
"type": "integer",
"required": false
}
],
"responseexample": {
"data": [
{
"assetid": 1,
"assetnumber": "A-1",
"assettypecolor": null,
"assettypeid": 1,
"assettypename": "machine",
"businessunitid": null,
"createdby": "<redacted:person>",
"createddate": "2026-01-01T00:00:00.000000Z",
"deletedby": null,
"deleteddate": null,
"gaugelabreference": null,
"isactive": true,
"levelid": null,
"locationcode": null,
"locationid": null,
"maintenancereference": null,
"mapverifiedat": null,
"mapx": null,
"mapy": null,
"modifiedby": "<redacted:person>",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"name": "mill",
"notes": null,
"ownlevelid": null,
"ownlocationid": null,
"ownmapx": null,
"ownmapy": null,
"serialnumber": "<redacted:host>",
"statusid": 1
}
],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 1,
"totalpages": 1
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/assets",
"auth": "permission:assets.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a new asset.",
"example": "curl -X POST http://localhost:5001/api/assets -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/assets/<int:asset_id>",
"auth": "permission:assets.delete",
"params": "path: asset_id (int)",
"purpose": "Delete (soft delete) an asset.",
"example": "curl -X DELETE http://localhost:5001/api/assets/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/assets/<int:asset_id>",
"auth": "permission:assets.view",
"params": "path: asset_id (int)",
"purpose": "Get a single asset with full details.",
"example": "curl http://localhost:5001/api/assets/1 -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "include_type_data",
"type": "string",
"required": false,
"default": "true"
}
]
},
{
"method": "PUT",
"path": "/api/assets/<int:asset_id>",
"auth": "permission:assets.edit",
"params": "path: asset_id (int); body: JSON (fields not yet documented)",
"purpose": "Update an asset.",
"example": "curl -X PUT http://localhost:5001/api/assets/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "GET",
"path": "/api/assets/<int:asset_id>/communications",
"auth": "permission:assets.view",
"params": "path: asset_id (int)",
"purpose": "Get all communications for an asset.",
"example": "curl http://localhost:5001/api/assets/1/communications -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/assets/<int:asset_id>/relationships",
"auth": "permission:assets.view",
"params": "path: asset_id (int)",
"purpose": "Get all relationships for an asset.",
"example": "curl http://localhost:5001/api/assets/1/relationships -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"incoming": [
{
"createddate": "2026-01-01T00:00:00.000000Z",
"inheritsposition": true,
"isactive": true,
"isdirectional": true,
"label": null,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"notes": null,
"relationshipid": 1,
"relationshiptypeid": 1,
"relationshiptypename": "controls",
"sourceasset": {
"assetid": 1,
"assetnumber": "PC-1",
"assettypecolor": null,
"assettypeid": 2,
"assettypename": "computer",
"businessunitid": null,
"createdby": "<redacted:person>",
"createddate": "2026-01-01T00:00:00.000000Z",
"deletedby": null,
"deleteddate": null,
"gaugelabreference": null,
"isactive": true,
"levelid": null,
"locationcode": null,
"locationid": null,
"maintenancereference": null,
"mapverifiedat": null,
"mapx": null,
"mapy": null,
"modifiedby": "<redacted:person>",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"name": null,
"notes": null,
"ownlevelid": null,
"ownlocationid": null,
"ownmapx": null,
"ownmapy": null,
"serialnumber": "<redacted:host>",
"statusid": 1
},
"sourceassetid": 1,
"targetassetid": 2
}
],
"outgoing": []
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/assets/lookup/<assetnumber>",
"auth": "permission:assets.view",
"params": "path: assetnumber (string)",
"purpose": "Look up an asset by its asset number.",
"example": "curl http://localhost:5001/api/assets/lookup/x -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/assets/map",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "Get all assets with map positions for unified floor map display.",
"example": "curl http://localhost:5001/api/assets/map -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "assettype",
"type": "string",
"required": false
},
{
"name": "businessunitid",
"type": "integer",
"required": false
},
{
"name": "locationid",
"type": "integer",
"required": false
},
{
"name": "search",
"type": "string",
"required": false
},
{
"name": "statusid",
"type": "integer",
"required": false
},
{
"name": "subtype",
"type": "integer",
"required": false
}
],
"responseexample": {
"data": {
"assets": [
{
"assetid": 1,
"assetnumber": "2007",
"assettype": "machine",
"assettypeid": 1,
"businessunit": null,
"businessunitid": null,
"displayname": "<redacted:person>",
"dualpathpartner": null,
"levelid": null,
"location": null,
"locationid": null,
"mapx": 100,
"mapy": 100,
"name": null,
"primaryip": null,
"serialnumber": "<redacted:host>",
"status": null,
"statuscolor": null,
"statusid": 1,
"typedata": {
"assetid": 1,
"controllermodelid": null,
"controllervendorid": null,
"createddate": "2026-01-01T00:00:00.000000Z",
"isactive": true,
"islocationonly": false,
"lastmaintenancedate": null,
"machineid": 1,
"machinetypeid": null,
"maintenanceintervaldays": null,
"modelnumberid": null,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"nextmaintenancedate": null,
"requiresmanualconfig": false,
"vendorid": null
}
},
{
"assetid": 2,
"assetnumber": "2008",
"assettype": "machine",
"assettypeid": 1,
"businessunit": null,
"businessunitid": null,
"displayname": "<redacted:person>",
"dualpathpartner": null,
"levelid": null,
"location": null,
"locationid": null,
"mapx": 110,
"mapy": 110,
"name": null,
"primaryip": null,
"serialnumber": "<redacted:host>",
"status": null,
"statuscolor": null,
"statusid": 1,
"typedata": {
"assetid": 2,
"controllermodelid": null,
"controllervendorid": null,
"createddate": "2026-01-01T00:00:00.000000Z",
"isactive": true,
"islocationonly": false,
"lastmaintenancedate": null,
"machineid": 2,
"machinetypeid": null,
"maintenanceintervaldays": null,
"modelnumberid": null,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"nextmaintenancedate": null,
"requiresmanualconfig": false,
"vendorid": null
}
}
],
"filters": {
"assettypes": [
{
"assettype": "machine",
"assettypeid": 1,
"color": null,
"icon": null
}
],
"businessunits": [],
"locations": [],
"statuses": [],
"subtypes": {
"Computer": [],
"Machine": [],
"Network Device": [],
"Printer": []
}
},
"total": 2
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/assets/relationships",
"auth": "permission:assets.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a relationship between two assets.",
"example": "curl -X POST http://localhost:5001/api/assets/relationships -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"relationshiptypeid": 1,
"sourceassetid": 1,
"targetassetid": 2
},
"responseexample": {
"data": {
"createddate": "2026-01-01T00:00:00.000000Z",
"inheritsposition": true,
"isactive": true,
"label": null,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"notes": null,
"propagated": [
{
"createddate": "2026-01-01T00:00:00.000000Z",
"inheritsposition": true,
"isactive": true,
"label": null,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"notes": null,
"relationshipid": 3,
"relationshiptypeid": 1,
"sourceassetid": 1,
"targetassetid": 3
}
],
"propagatedcount": 1,
"relationshipid": 2,
"relationshiptypeid": 1,
"sourceassetid": 1,
"targetassetid": 2
},
"message": "Relationship created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/assets/relationships/<int:rel_id>",
"auth": "permission:assets.delete",
"params": "path: rel_id (int)",
"purpose": "Delete an asset relationship.",
"example": "curl -X DELETE http://localhost:5001/api/assets/relationships/1 -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"message": "Relationship deleted",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/assets/relationshiptypes",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "List all asset relationship types.",
"example": "curl http://localhost:5001/api/assets/relationshiptypes -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [
{
"color": null,
"description": null,
"isdirectional": false,
"propagatesthrough": [],
"relationshiptype": "WiFi",
"relationshiptypeid": 1
}
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/assets/relationshiptypes",
"auth": "permission:assets.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a new asset relationship type.",
"example": "curl -X POST http://localhost:5001/api/assets/relationshiptypes -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"isdirectional": false,
"relationshiptype": "Dualpath"
},
"responseexample": {
"data": {
"color": null,
"description": null,
"isdirectional": true,
"propagatesthrough": [],
"relationshiptype": "Backup For",
"relationshiptypeid": 1
},
"message": "Relationship type created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/assets/relationshiptypes/<int:type_id>",
"auth": "permission:assets.delete",
"params": "path: type_id (int)",
"purpose": "Delete a relationship type. Refused if any relationship still uses it.",
"example": "curl -X DELETE http://localhost:5001/api/assets/relationshiptypes/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/assets/relationshiptypes/<int:type_id>",
"auth": "permission:assets.edit",
"params": "path: type_id (int); body: JSON (fields not yet documented)",
"purpose": "Update a relationship type.",
"example": "curl -X PUT http://localhost:5001/api/assets/relationshiptypes/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"isdirectional": false
},
"responseexample": {
"data": {
"color": null,
"description": null,
"isdirectional": false,
"propagatesthrough": [],
"relationshiptype": "USB",
"relationshiptypeid": 1
},
"message": "Relationship type updated",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/assets/statuses",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "List all asset statuses.",
"example": "curl http://localhost:5001/api/assets/statuses -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
}
],
"responseexample": {
"data": [],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 0,
"totalpages": 0
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/assets/statuses",
"auth": "permission:assets.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a new asset status.",
"example": "curl -X POST http://localhost:5001/api/assets/statuses -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/assets/statuses/<int:status_id>",
"auth": "permission:assets.delete",
"params": "path: status_id (int)",
"purpose": "Delete an asset status. Refused if any asset still uses it.",
"example": "curl -X DELETE http://localhost:5001/api/assets/statuses/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/assets/statuses/<int:status_id>",
"auth": "permission:assets.view",
"params": "path: status_id (int)",
"purpose": "Get a single asset status.",
"example": "curl http://localhost:5001/api/assets/statuses/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/assets/statuses/<int:status_id>",
"auth": "permission:assets.edit",
"params": "path: status_id (int); body: JSON (fields not yet documented)",
"purpose": "Update an asset status.",
"example": "curl -X PUT http://localhost:5001/api/assets/statuses/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "GET",
"path": "/api/assets/types",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "List all asset types.",
"example": "curl http://localhost:5001/api/assets/types -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
}
],
"responseexample": {
"data": [],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 0,
"totalpages": 0
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/assets/types",
"auth": "permission:assets.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a new asset type.",
"example": "curl -X POST http://localhost:5001/api/assets/types -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "GET",
"path": "/api/assets/types/<int:type_id>",
"auth": "permission:assets.view",
"params": "path: type_id (int)",
"purpose": "Get a single asset type.",
"example": "curl http://localhost:5001/api/assets/types/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/assets/types/<int:type_id>",
"auth": "permission:assets.edit",
"params": "path: type_id (int); body: JSON (fields not yet documented)",
"purpose": "Update an asset type's display fields (color/icon/description). The name, plugin, and table are structural and not editable here.",
"example": "curl -X PUT http://localhost:5001/api/assets/types/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
}
]
},
{
"surface": "core-auditlogs",
"endpoints": [
{
"method": "GET",
"path": "/api/auditlogs",
"auth": "permission:audit.view",
"params": "not documented",
"purpose": "List audit logs with filtering and pagination.",
"example": "curl http://localhost:5001/api/auditlogs -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "action",
"type": "string",
"required": false
},
{
"name": "entitytype",
"type": "string",
"required": false
},
{
"name": "from_date",
"type": "string",
"required": false
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "perpage",
"type": "integer",
"required": false,
"default": 50
},
{
"name": "search",
"type": "string",
"required": false
},
{
"name": "to_date",
"type": "string",
"required": false
},
{
"name": "userid",
"type": "integer",
"required": false
}
],
"responseexample": {
"data": [],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 50,
"total": 0,
"totalpages": 0
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/auditlogs/entity/<entitytype>/<int:entityid>",
"auth": "permission:audit.view",
"params": "path: entitytype (string), entityid (int)",
"purpose": "Get audit history for a specific entity.",
"example": "curl http://localhost:5001/api/auditlogs/entity/x/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "POST",
"path": "/api/auditlogs/purge",
"auth": "permission:audit.purge",
"params": "body: JSON (fields not yet documented)",
"purpose": "Delete entries older than the retention window.",
"example": "curl -X POST http://localhost:5001/api/auditlogs/purge -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'"
},
{
"method": "GET",
"path": "/api/auditlogs/retention",
"auth": "permission:audit.view",
"params": "not documented",
"purpose": "Size of the log and what the configured retention would remove.",
"example": "curl http://localhost:5001/api/auditlogs/retention -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"expired": 0,
"newest": "2026-01-01T00:00:00.000000",
"oldest": "2026-01-01T00:00:00.000000",
"retentiondays": 30,
"total": 1
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/auditlogs/stats",
"auth": "permission:audit.view",
"params": "not documented",
"purpose": "Get audit log statistics.",
"example": "curl http://localhost:5001/api/auditlogs/stats -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"actions": {},
"activeUsers": [],
"entities": {},
"recentCount": 0
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
}
]
},
{
"surface": "core-auth",
"endpoints": [
{
"method": "POST",
"path": "/api/auth/change-password",
"auth": "jwt",
"params": "body: JSON (fields not yet documented)",
"purpose": "Change the authenticated user's own password.",
"example": "curl -X POST http://localhost:5001/api/auth/change-password -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"current_password": "<redacted:secret>",
"new_password": "<redacted:secret>"
},
"responseexample": {
"data": {
"mustchangepassword": "<redacted:secret>"
},
"message": "Password changed",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "POST",
"path": "/api/auth/login",
"auth": "none (the login surface itself; rate limited, 5-strike lockout)",
"params": "body: JSON (fields not yet documented)",
"purpose": "Authenticate user and return JWT tokens.",
"example": "curl -X POST http://localhost:5001/api/auth/login -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"password": "<redacted:secret>",
"username": "<redacted:person>"
},
"responseexample": {
"data": {
"access_token": "<redacted:secret>",
"expires_in": 3600,
"refresh_token": "<redacted:secret>",
"token_type": "<redacted:secret>",
"user": {
"email": "<redacted:person>",
"firstname": "<redacted:person>",
"lastname": "<redacted:person>",
"mustchangepassword": "<redacted:secret>",
"permissions": [
"assets.view",
"assets.create",
"assets.edit",
"<trimmed for the example: 69 more>"
],
"roles": [
"admin"
],
"userid": 1,
"username": "<redacted:person>"
}
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "POST",
"path": "/api/auth/logout",
"auth": "jwt",
"params": "body: JSON (fields not yet documented)",
"purpose": "Logout user (for frontend token cleanup).",
"example": "curl -X POST http://localhost:5001/api/auth/logout -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'"
},
{
"method": "GET",
"path": "/api/auth/me",
"auth": "jwt",
"params": "not documented",
"purpose": "Get current authenticated user info.",
"example": "curl http://localhost:5001/api/auth/me -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"email": "<redacted:person>",
"firstname": "<redacted:person>",
"lastname": "<redacted:person>",
"mustchangepassword": "<redacted:secret>",
"permissions": [
"assets.view",
"assets.create",
"assets.edit",
"<trimmed for the example: 1 more>"
],
"roles": [
"admin"
],
"userid": 1,
"username": "<redacted:person>"
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/auth/refresh",
"auth": "jwt (refresh token)",
"params": "body: JSON (fields not yet documented)",
"purpose": "Refresh access token using refresh token.",
"example": "curl -X POST http://localhost:5001/api/auth/refresh -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'"
}
]
},
{
"surface": "core-businessunits",
"endpoints": [
{
"method": "GET",
"path": "/api/businessunits",
"auth": "jwt-optional (works signed out; the handler decides what shows)",
"params": "not documented",
"purpose": "List all business units.",
"example": "curl http://localhost:5001/api/businessunits -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "businessunit",
"type": "string",
"required": false
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
},
{
"name": "search",
"type": "string",
"required": false
}
],
"responseexample": {
"data": [],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 0,
"totalpages": 0
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/businessunits",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a new business unit.",
"example": "curl -X POST http://localhost:5001/api/businessunits -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/businessunits/<int:bu_id>",
"auth": "jwt + role:admin",
"params": "path: bu_id (int)",
"purpose": "Delete (deactivate) a business unit.",
"example": "curl -X DELETE http://localhost:5001/api/businessunits/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/businessunits/<int:bu_id>",
"auth": "permission:assets.view",
"params": "path: bu_id (int)",
"purpose": "Get a single business unit.",
"example": "curl http://localhost:5001/api/businessunits/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/businessunits/<int:bu_id>",
"auth": "jwt + role:admin",
"params": "path: bu_id (int); body: JSON (fields not yet documented)",
"purpose": "Update a business unit.",
"example": "curl -X PUT http://localhost:5001/api/businessunits/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
}
]
},
{
"surface": "core-collector",
"endpoints": [
{
"method": "POST",
"path": "/api/collector/<pluginname>",
"auth": "api-key (per-plugin collector token)",
"params": "path: pluginname (string); body: JSON (fields not yet documented)",
"purpose": "Generic collector ingest for any plugin (ADR-006).",
"example": "curl -X POST http://localhost:5001/api/collector/x -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"hostname": "<redacted:host>",
"queues": [
{
"drivername": "HP Universal Printing PS",
"isdefault": true,
"portaddress": "<redacted:address>",
"portname": "IP_10.20.0.11",
"queuename": "PRINTER-A"
},
{
"drivername": "HP Universal Printing PS",
"isdefault": false,
"portaddress": "<redacted:address>",
"portname": "IP_10.20.0.12",
"queuename": "PRINTER-B"
},
{
"drivername": "HP Universal Printing PS",
"isdefault": false,
"portaddress": "<redacted:address>",
"portname": "IP_10.20.0.99",
"queuename": "Reception Copier"
}
]
},
"responseexample": {
"data": {
"accessprotocols": [],
"action": "updated",
"assetid": 2,
"identityvalue": "LEGACYPC",
"machinelinks": [],
"measuringtoollinkcount": 0,
"measuringtoollinks": [],
"partmarkers": [
{
"assetid": 3,
"assetnumber": "LEGACYPC-PARTMARKER",
"operationassetid": null
}
],
"printerlinkcount": 0,
"printerlinks": [],
"status": "ok",
"warnings": [
"mapped ComputerType not found: Shopfloor PC",
"machine number '0615' is this PC's own asset number; marker not filed under an operation. Rename the PC asset to its hostname, or create the operation asset."
]
},
"message": "computers collector updated",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/collector/_schemas",
"auth": "jwt",
"params": "not documented",
"purpose": "List collector schemas for all enabled plugins (JWT-protected).",
"example": "curl http://localhost:5001/api/collector/_schemas -H \"Authorization: Bearer $TOK\""
},
{
"method": "POST",
"path": "/api/collector/apps",
"auth": "api-key (collector token, legacy shared key)",
"params": "body: JSON (fields not yet documented)",
"purpose": "Update installed applications for a PC (matched by hostname).",
"example": "curl -X POST http://localhost:5001/api/collector/apps -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "POST",
"path": "/api/collector/bulk",
"auth": "api-key (collector token, legacy shared key)",
"params": "body: JSON (fields not yet documented)",
"purpose": "Bulk update multiple PCs at once.",
"example": "curl -X POST http://localhost:5001/api/collector/bulk -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"pcs": [
{
"hostname": "<redacted:host>"
}
]
},
"responseexample": {
"data": {
"errors": [],
"notfound": [
"WJLEG01"
],
"timestamp": "2026-01-01T00:00:00.000000",
"updated": 0
},
"message": "0 PC(s) updated",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "POST",
"path": "/api/collector/heartbeat",
"auth": "api-key (collector token, legacy shared key)",
"params": "body: JSON (fields not yet documented)",
"purpose": "Record PC online status / heartbeat (single or batch).",
"example": "curl -X POST http://localhost:5001/api/collector/heartbeat -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"hostname": "<redacted:host>"
},
"responseexample": {
"data": {
"notfound": [
"WJLEG01"
],
"timestamp": "2026-01-01T00:00:00.000000",
"updated": 0
},
"message": "0 PC(s) heartbeat recorded",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "POST",
"path": "/api/collector/pc",
"auth": "api-key (collector token, legacy shared key)",
"params": "body: JSON (fields not yet documented)",
"purpose": "Update one PC from the collection script (matched by hostname).",
"example": "curl -X POST http://localhost:5001/api/collector/pc -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "GET",
"path": "/api/collector/status",
"auth": "api-key (per-plugin collector token)",
"params": "not documented",
"purpose": "Check collector API status.",
"example": "curl http://localhost:5001/api/collector/status -H \"X-API-Key: $KEY\"",
"responseexample": {
"data": {
"endpoints": [
"POST /api/collector/<plugin>",
"GET /api/collector/_schemas",
"POST /api/collector/pc",
"<trimmed for the example: 1 more>"
],
"status": "ok",
"timestamp": "2026-01-01T00:00:00.000000"
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
}
]
},
{
"surface": "core-customfields",
"endpoints": [
{
"method": "GET",
"path": "/api/customfields",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "List custom-field definitions. Filter by ?assettypeid=. ?active=false includes inactive ones.",
"example": "curl http://localhost:5001/api/customfields -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "assettypeid",
"type": "integer",
"required": false
}
],
"responseexample": {
"data": [],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/customfields",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: customfields.create_field has no docstring.",
"example": "curl -X POST http://localhost:5001/api/customfields -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/customfields/<int:fieldid>",
"auth": "jwt + role:admin",
"params": "path: fieldid (int)",
"purpose": "UNDOCUMENTED: customfields.delete_field has no docstring.",
"example": "curl -X DELETE http://localhost:5001/api/customfields/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/customfields/<int:fieldid>",
"auth": "jwt + role:admin",
"params": "path: fieldid (int); body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: customfields.update_field has no docstring.",
"example": "curl -X PUT http://localhost:5001/api/customfields/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "GET",
"path": "/api/customfields/asset/<int:assetid>",
"auth": "permission:assets.view",
"params": "path: assetid (int)",
"purpose": "Active custom fields for an asset's type, merged with its values.",
"example": "curl http://localhost:5001/api/customfields/asset/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/customfields/asset/<int:assetid>",
"auth": "jwt + role:admin",
"params": "path: assetid (int); body: JSON (fields not yet documented)",
"purpose": "Upsert values for an asset. Body: {values: {fieldid: value, ...}}.",
"example": "curl -X PUT http://localhost:5001/api/customfields/asset/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
}
]
},
{
"surface": "core-dashboard",
"endpoints": [
{
"method": "GET",
"path": "/api/dashboard",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "Get dashboard summary data (asset-based).",
"example": "curl http://localhost:5001/api/dashboard -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"activeassets": 0,
"bystatus": {
"Unknown": 2
},
"counts": {
"machines": 2,
"networkdevices": 0,
"pcs": 0,
"printers": 0,
"total": 2
},
"countsactiveonly": true,
"dualpathcollapsed": false,
"inactiveexcluded": 0,
"inrepair": 0,
"recent": [
{
"assetid": 2,
"assetnumber": "2008",
"assettype": "machine",
"createddate": "2026-01-01T00:00:00.000000Z"
},
{
"assetid": 1,
"assetnumber": "2007",
"assettype": "machine",
"createddate": "2026-01-01T00:00:00.000000Z"
}
],
"statuses": {
"Unknown": 2
},
"totalassets": 2,
"totalmachines": 2,
"totalnetwork": 0,
"totalpc": 0,
"totalprinter": 0
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/dashboard/capabilities",
"auth": "jwt-optional (works signed out; the handler decides what shows)",
"params": "not documented",
"purpose": "What THIS caller can reach, for chrome that would otherwise only 401.",
"example": "curl http://localhost:5001/api/dashboard/capabilities -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"cansearch": false
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/dashboard/health",
"auth": "none (reviewed: named in the public-read or mutation sweep)",
"params": "not documented",
"purpose": "Health check endpoint (no auth required).",
"example": "curl http://localhost:5001/api/dashboard/health",
"responseexample": {
"data": {
"database": "healthy",
"status": "ok"
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/dashboard/navigation",
"auth": "jwt-optional (works signed out; the handler decides what shows)",
"params": "not documented",
"purpose": "Get navigation items from all loaded plugins.",
"example": "curl http://localhost:5001/api/dashboard/navigation -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [
{
"icon": "layout-dashboard",
"name": "Dashboard",
"permission": "assets.view",
"position": 0,
"route": "/"
},
{
"icon": "map",
"name": "Map",
"permission": "assets.view",
"position": 4,
"route": "/map"
},
{
"icon": "bell",
"name": "Notifications",
"permission": "notifications.view",
"plugin": "notifications",
"position": 5,
"route": "/notifications"
},
"<trimmed for the example: 1 more>"
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/dashboard/stats",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "Get detailed statistics by asset type.",
"example": "curl http://localhost:5001/api/dashboard/stats -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"bytype": []
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/dashboard/summary",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "Get dashboard summary data (asset-based).",
"example": "curl http://localhost:5001/api/dashboard/summary -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"activeassets": 0,
"bystatus": {},
"counts": {
"machines": 0,
"networkdevices": 0,
"pcs": 0,
"printers": 0,
"total": 0
},
"countsactiveonly": true,
"dualpathcollapsed": true,
"inactiveexcluded": 0,
"inrepair": 0,
"recent": [],
"statuses": {},
"totalassets": 0,
"totalmachines": 0,
"totalnetwork": 0,
"totalpc": 0,
"totalprinter": 0
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/dashboard/widgets",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "Aggregate dashboard widget definitions from all enabled plugins.",
"example": "curl http://localhost:5001/api/dashboard/widgets -H \"Authorization: Bearer $TOK\""
}
]
},
{
"surface": "core-dashboarddefaults",
"endpoints": [
{
"method": "GET",
"path": "/api/dashboarddefaults",
"auth": "permission:settings.view",
"params": "not documented",
"purpose": "List all visitor-IP -> business-unit mappings.",
"example": "curl http://localhost:5001/api/dashboarddefaults -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/dashboarddefaults",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a visitor-IP -> business-unit mapping.",
"example": "curl -X POST http://localhost:5001/api/dashboarddefaults -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"businessunitid": 1,
"description": "Materials lobby kiosk",
"ipaddress": "<redacted:host>"
},
"responseexample": {
"data": {
"businessunit": "Materials",
"businessunitid": 1,
"createddate": "2026-01-01T00:00:00.000000Z",
"dashboarddefaultid": 1,
"description": "Materials lobby kiosk",
"displaypath": "/shopfloor",
"displayrole": "Dashboard",
"fqdn": "<redacted:host>",
"ipaddress": "<redacted:host>",
"isactive": true,
"modifieddate": "2026-01-01T00:00:00.000000Z"
},
"message": "Mapping created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/dashboarddefaults/<int:default_id>",
"auth": "jwt + role:admin",
"params": "path: default_id (int)",
"purpose": "Delete (deactivate) a mapping.",
"example": "curl -X DELETE http://localhost:5001/api/dashboarddefaults/1 -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"message": "Mapping deleted",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "PUT",
"path": "/api/dashboarddefaults/<int:default_id>",
"auth": "jwt + role:admin",
"params": "path: default_id (int); body: JSON (fields not yet documented)",
"purpose": "Update a mapping.",
"example": "curl -X PUT http://localhost:5001/api/dashboarddefaults/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"description": "moved"
},
"responseexample": {
"data": {
"businessunit": "Materials",
"businessunitid": 1,
"createddate": "2026-01-01T00:00:00.000000Z",
"dashboarddefaultid": 1,
"description": "moved",
"displaypath": "/shopfloor",
"displayrole": "Dashboard",
"fqdn": "<redacted:host>",
"ipaddress": "<redacted:host>",
"isactive": true,
"modifieddate": "2026-01-01T00:00:00.000000Z"
},
"message": "Mapping updated",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/dashboarddefaults/display-role",
"auth": "none (reviewed: named in the public-read or mutation sweep)",
"params": "not documented",
"purpose": "Resolve what a single 'display' PC should show, from its own IP.",
"example": "curl http://localhost:5001/api/dashboarddefaults/display-role",
"queryparams": [
{
"name": "fqdn",
"type": "string",
"required": false
},
{
"name": "ipaddress",
"type": "string",
"required": false
}
],
"responseexample": {
"data": {
"businessunit": null,
"businessunitid": null,
"fqdn": "<redacted:host>",
"ipaddress": "<redacted:host>",
"path": "/parts-kiosk",
"role": "3DPrintRoom"
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/dashboarddefaults/visitor-location",
"auth": "none (reviewed: named in the public-read or mutation sweep)",
"params": "not documented",
"purpose": "Resolve the business unit for the calling display by its IP.",
"example": "curl http://localhost:5001/api/dashboarddefaults/visitor-location",
"queryparams": [
{
"name": "fqdn",
"type": "string",
"required": false
},
{
"name": "ipaddress",
"type": "string",
"required": false
}
],
"responseexample": {
"data": {
"businessunit": "Materials",
"businessunitid": 1,
"fqdn": "<redacted:host>",
"ipaddress": "<redacted:host>"
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
}
]
},
{
"surface": "core-docs",
"endpoints": [
{
"method": "GET",
"path": "/api/docs/",
"auth": "none (reviewed: named in the public-read or mutation sweep)",
"params": "not documented",
"purpose": "Redoc page. url_for keeps the asset URLs correct under any mount.",
"example": "curl http://localhost:5001/api/docs/"
},
{
"method": "GET",
"path": "/api/docs/llms.txt",
"auth": "none (reviewed: named in the public-read or mutation sweep)",
"params": "not documented",
"purpose": "Concise LLM-oriented API guide.",
"example": "curl http://localhost:5001/api/docs/llms.txt"
},
{
"method": "GET",
"path": "/api/docs/openapi.json",
"auth": "none (reviewed: named in the public-read or mutation sweep)",
"params": "not documented",
"purpose": "The generated OpenAPI 3.1 spec (machine + LLM readable).",
"example": "curl http://localhost:5001/api/docs/openapi.json",
"queryparams": [
{
"name": "tag",
"type": "string",
"required": false
}
]
},
{
"method": "GET",
"path": "/api/docs/operations.txt",
"auth": "none (reviewed: named in the public-read or mutation sweep)",
"params": "not documented",
"purpose": "Every operation, one line each: method, path, tag, auth, summary.",
"example": "curl http://localhost:5001/api/docs/operations.txt"
},
{
"method": "GET",
"path": "/api/docs/redoc.standalone.js",
"auth": "none (reviewed: named in the public-read or mutation sweep)",
"params": "not documented",
"purpose": "Vendored Redoc bundle (offline).",
"example": "curl http://localhost:5001/api/docs/redoc.standalone.js"
}
]
},
{
"surface": "core-employees",
"endpoints": [
{
"method": "GET",
"path": "/api/employees/lookup",
"auth": "permission:employees.view",
"params": "not documented",
"purpose": "Look up multiple employees by SSO list.",
"example": "curl http://localhost:5001/api/employees/lookup -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "sso",
"type": "string",
"required": false,
"default": ""
}
]
},
{
"method": "GET",
"path": "/api/employees/lookup/<sso>",
"auth": "permission:employees.view",
"params": "path: sso (string)",
"purpose": "Look up a single employee by SSO.",
"example": "curl http://localhost:5001/api/employees/lookup/x -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"First_Name": "Test",
"Last_Name": "Person",
"Picture": null,
"Role": null,
"SSO": 210000001,
"Team": null,
"photofilename": "photo-210000001.png",
"photourl": "/api/employees/photo/photo-210000001.png"
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/employees/search",
"auth": "permission:employees.view",
"params": "not documented",
"purpose": "Search employees by name.",
"example": "curl http://localhost:5001/api/employees/search -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "limit",
"type": "integer",
"required": false,
"default": 10
},
{
"name": "q",
"type": "string",
"required": false,
"default": ""
}
],
"responseexample": {
"data": [
{
"First_Name": "Dana",
"Last_Name": "Reyes",
"Picture": null,
"Role": null,
"SSO": 990005,
"Team": null,
"photofilename": null,
"photourl": null
},
{
"First_Name": "Sam",
"Last_Name": "Reyes",
"Picture": null,
"Role": null,
"SSO": 990006,
"Team": null,
"photofilename": null,
"photourl": null
}
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
}
]
},
{
"surface": "core-locations",
"endpoints": [
{
"method": "GET",
"path": "/api/locations",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "List all locations.",
"example": "curl http://localhost:5001/api/locations -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "locationname",
"type": "string",
"required": false
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
},
{
"name": "search",
"type": "string",
"required": false
}
],
"responseexample": {
"data": [],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 0,
"totalpages": 0
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/locations",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a new location.",
"example": "curl -X POST http://localhost:5001/api/locations -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/locations/<int:location_id>",
"auth": "jwt + role:admin",
"params": "path: location_id (int)",
"purpose": "Delete (deactivate) a location.",
"example": "curl -X DELETE http://localhost:5001/api/locations/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/locations/<int:location_id>",
"auth": "permission:assets.view",
"params": "path: location_id (int)",
"purpose": "Get a single location.",
"example": "curl http://localhost:5001/api/locations/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/locations/<int:location_id>",
"auth": "jwt + role:admin",
"params": "path: location_id (int); body: JSON (fields not yet documented)",
"purpose": "Update a location.",
"example": "curl -X PUT http://localhost:5001/api/locations/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "GET",
"path": "/api/locations/types",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "List location types. ?active=false includes inactive ones.",
"example": "curl http://localhost:5001/api/locations/types -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
}
],
"responseexample": {
"data": [],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/locations/types",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: locations.create_location_type has no docstring.",
"example": "curl -X POST http://localhost:5001/api/locations/types -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/locations/types/<int:type_id>",
"auth": "jwt + role:admin",
"params": "path: type_id (int)",
"purpose": "UNDOCUMENTED: locations.delete_location_type has no docstring.",
"example": "curl -X DELETE http://localhost:5001/api/locations/types/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/locations/types/<int:type_id>",
"auth": "jwt + role:admin",
"params": "path: type_id (int); body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: locations.update_location_type has no docstring.",
"example": "curl -X PUT http://localhost:5001/api/locations/types/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
}
]
},
{
"surface": "core-maplevels",
"endpoints": [
{
"method": "GET",
"path": "/api/maplevels",
"auth": "jwt-optional (works signed out; the handler decides what shows)",
"params": "not documented",
"purpose": "Every active level, grouped by building, in display order.",
"example": "curl http://localhost:5001/api/maplevels -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"buildings": [
{
"buildingid": 1,
"buildingname": "Public Works",
"createddate": "2026-01-01T00:00:00.000000Z",
"isactive": true,
"levels": [
{
"assetcount": 0,
"blueprintdark": null,
"blueprintlight": "floorplan.svg",
"buildingid": 1,
"buildingname": "Public Works",
"createddate": "2026-01-01T00:00:00.000000Z",
"isactive": true,
"isdefault": false,
"levelid": 1,
"levelname": "Ground",
"mapheight": 2550,
"mapwidth": 3300,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"sortorder": 1
}
],
"modifieddate": "2026-01-01T00:00:00.000000Z",
"sortorder": 1
}
],
"defaultlevelid": 1,
"totalplaced": 0
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/maplevels",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: maplevels.create_level has no docstring.",
"example": "curl -X POST http://localhost:5001/api/maplevels -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/maplevels/<int:levelid>",
"auth": "jwt + role:admin",
"params": "path: levelid (int)",
"purpose": "Deactivate a level, refusing while assets are still placed on it.",
"example": "curl -X DELETE http://localhost:5001/api/maplevels/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/maplevels/<int:levelid>",
"auth": "jwt-optional (works signed out; the handler decides what shows)",
"params": "path: levelid (int)",
"purpose": "UNDOCUMENTED: maplevels.get_level has no docstring.",
"example": "curl http://localhost:5001/api/maplevels/1 -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"blueprintdark": null,
"blueprintlight": "floorplan.svg",
"buildingid": 1,
"buildingname": "Public Works",
"createddate": "2026-01-01T00:00:00.000000Z",
"isactive": true,
"isdefault": false,
"levelid": 1,
"levelname": "Ground",
"mapheight": 2550,
"mapwidth": 3300,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"sortorder": 1
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "PATCH|PUT",
"path": "/api/maplevels/<int:levelid>",
"auth": "jwt + role:admin",
"params": "path: levelid (int); body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: maplevels.update_level has no docstring.",
"example": "curl -X PATCH http://localhost:5001/api/maplevels/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "POST",
"path": "/api/maplevels/<int:levelid>/blueprint",
"auth": "jwt + role:admin",
"params": "path: levelid (int); body: JSON (fields not yet documented)",
"purpose": "Upload this level's blueprint for one theme.",
"example": "curl -X POST http://localhost:5001/api/maplevels/1/blueprint -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "GET",
"path": "/api/maplevels/<int:levelid>/blueprint/<path:filename>",
"auth": "jwt-optional (works signed out; the handler decides what shows)",
"params": "path: levelid (int), filename (path)",
"purpose": "Serve a level's blueprint image. Public, for the same reason as above.",
"example": "curl http://localhost:5001/api/maplevels/1/blueprint/example.png -H \"Authorization: Bearer $TOK\""
},
{
"method": "POST",
"path": "/api/maplevels/buildings",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: maplevels.create_building has no docstring.",
"example": "curl -X POST http://localhost:5001/api/maplevels/buildings -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "PATCH|PUT",
"path": "/api/maplevels/buildings/<int:buildingid>",
"auth": "jwt + role:admin",
"params": "path: buildingid (int); body: JSON (fields not yet documented)",
"purpose": "Rename or reorder a building. Levels move with it; nothing repositions.",
"example": "curl -X PATCH http://localhost:5001/api/maplevels/buildings/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
}
]
},
{
"surface": "core-mappositions",
"endpoints": [
{
"method": "POST",
"path": "/api/mappositions/positions",
"auth": "permission:assets.edit",
"params": "body: JSON (fields not yet documented)",
"purpose": "Set positions for many assets at once.",
"example": "curl -X POST http://localhost:5001/api/mappositions/positions -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"positions": [
{
"assetid": 1,
"levelid": 2,
"mapx": 42,
"mapy": 43
}
]
},
"responseexample": {
"data": {
"snapshotid": 1,
"updated": 1
},
"message": "1 position(s) saved",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/mappositions/snapshots",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "Snapshots, newest first. Metadata only - the positions are large.",
"example": "curl http://localhost:5001/api/mappositions/snapshots -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/mappositions/snapshots/<int:snapshotid>/restore",
"auth": "permission:assets.edit",
"params": "path: snapshotid (int); body: JSON (fields not yet documented)",
"purpose": "Put the positions in this snapshot back.",
"example": "curl -X POST http://localhost:5001/api/mappositions/snapshots/1/restore -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"responseexample": {
"data": {
"restored": 3,
"skippedassetids": []
},
"message": "3 marker(s) restored",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/mappositions/transform",
"auth": "permission:assets.edit",
"params": "body: JSON (fields not yet documented)",
"purpose": "Move every placed marker on a level by a transform read off landmarks.",
"example": "curl -X POST http://localhost:5001/api/mappositions/transform -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"dryrun": false,
"landmarks": [
{
"fromx": 0,
"fromy": 0,
"tox": 0,
"toy": 1450
},
{
"fromx": 1000,
"fromy": 1000,
"tox": 1000,
"toy": 2450
}
],
"levelid": 1
},
"responseexample": {
"data": {
"assetcount": 3,
"dryrun": false,
"levelid": 1,
"moves": [
{
"assetid": 1,
"assetnumber": "M000",
"fromx": 100,
"fromy": 100,
"name": null,
"outofbounds": false,
"tox": 100,
"toy": 1550
},
{
"assetid": 2,
"assetnumber": "M001",
"fromx": 1500,
"fromy": 1200,
"name": null,
"outofbounds": true,
"tox": 1500,
"toy": 2650
},
{
"assetid": 3,
"assetnumber": "M002",
"fromx": 3200,
"fromy": 2500,
"name": null,
"outofbounds": true,
"tox": 3200,
"toy": 3950
}
],
"outofboundscount": 2,
"snapshotid": 1,
"tolevelid": 1,
"transform": {
"offsetx": 0.0,
"offsety": 1450.0,
"scalex": 1.0,
"scaley": 1.0
}
},
"message": "3 marker(s) moved; snapshot 1 can restore them",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "POST",
"path": "/api/mappositions/verify",
"auth": "permission:assets.edit",
"params": "body: JSON (fields not yet documented)",
"purpose": "Mark markers as reviewed against the current drawing without moving them.",
"example": "curl -X POST http://localhost:5001/api/mappositions/verify -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"assetids": [
1
],
"unverify": true
},
"responseexample": {
"data": {
"updated": 1
},
"message": "1 marker(s) unverified",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
}
]
},
{
"surface": "core-models",
"endpoints": [
{
"method": "GET",
"path": "/api/models",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "List all vendor catalog models.",
"example": "curl http://localhost:5001/api/models -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "category",
"type": "string",
"required": false
},
{
"name": "modelnumber",
"type": "string",
"required": false
},
{
"name": "modeltype",
"type": "integer",
"required": false
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
},
{
"name": "search",
"type": "string",
"required": false
},
{
"name": "vendor",
"type": "integer",
"required": false
}
],
"responseexample": {
"data": [],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 0,
"totalpages": 0
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/models",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a new model.",
"example": "curl -X POST http://localhost:5001/api/models -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/models/<int:model_id>",
"auth": "jwt + role:admin",
"params": "path: model_id (int)",
"purpose": "Delete (deactivate) a model.",
"example": "curl -X DELETE http://localhost:5001/api/models/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/models/<int:model_id>",
"auth": "permission:assets.view",
"params": "path: model_id (int)",
"purpose": "Get a single model.",
"example": "curl http://localhost:5001/api/models/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/models/<int:model_id>",
"auth": "jwt + role:admin",
"params": "path: model_id (int); body: JSON (fields not yet documented)",
"purpose": "Update a model.",
"example": "curl -X PUT http://localhost:5001/api/models/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/models/<int:model_id>/image",
"auth": "jwt + role:admin",
"params": "path: model_id (int)",
"purpose": "Clear a model image and delete the uploaded file if we own it.",
"example": "curl -X DELETE http://localhost:5001/api/models/1/image -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"createddate": "2026-01-01T00:00:00.000000Z",
"description": null,
"documentationurl": null,
"imageurl": null,
"isactive": true,
"modelnumber": "TESTMODEL-1",
"modelnumberid": 1,
"modeltypeid": null,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"notes": null,
"vendorid": null
},
"message": "Model image removed",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/models/<int:model_id>/image",
"auth": "jwt + role:admin",
"params": "path: model_id (int); body: JSON (fields not yet documented)",
"purpose": "Upload (or replace) the photo for a model.",
"example": "curl -X POST http://localhost:5001/api/models/1/image -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"responseexample": {
"data": {
"createddate": "2026-01-01T00:00:00.000000Z",
"description": null,
"documentationurl": null,
"imageurl": "/api/models/image/model-1.jpg",
"isactive": true,
"modelnumber": "TESTMODEL-1",
"modelnumberid": 1,
"modeltypeid": null,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"notes": null,
"vendorid": null
},
"message": "Model image uploaded",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/models/image/<path:filename>",
"auth": "none (reviewed: named in the public-read or mutation sweep)",
"params": "path: filename (path)",
"purpose": "Serve an uploaded model image (public - asset detail pages read it).",
"example": "curl http://localhost:5001/api/models/image/example.png"
}
]
},
{
"surface": "core-modeltypes",
"endpoints": [
{
"method": "GET",
"path": "/api/modeltypes",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "List all model types with optional filtering.",
"example": "curl http://localhost:5001/api/modeltypes -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "category",
"type": "string",
"required": false
},
{
"name": "modeltype",
"type": "string",
"required": false
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
},
{
"name": "search",
"type": "string",
"required": false
}
],
"responseexample": {
"data": [],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 0,
"totalpages": 0
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/modeltypes",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a new model type.",
"example": "curl -X POST http://localhost:5001/api/modeltypes -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/modeltypes/<int:type_id>",
"auth": "jwt + role:admin",
"params": "path: type_id (int)",
"purpose": "Delete (deactivate) a model type.",
"example": "curl -X DELETE http://localhost:5001/api/modeltypes/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/modeltypes/<int:type_id>",
"auth": "permission:assets.view",
"params": "path: type_id (int)",
"purpose": "Get a single model type.",
"example": "curl http://localhost:5001/api/modeltypes/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/modeltypes/<int:type_id>",
"auth": "jwt + role:admin",
"params": "path: type_id (int); body: JSON (fields not yet documented)",
"purpose": "Update a model type.",
"example": "curl -X PUT http://localhost:5001/api/modeltypes/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
}
]
},
{
"surface": "core-operatingsystems",
"endpoints": [
{
"method": "GET",
"path": "/api/operatingsystems",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "List all operating systems.",
"example": "curl http://localhost:5001/api/operatingsystems -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "osname",
"type": "string",
"required": false
},
{
"name": "osversion",
"type": "string",
"required": false
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
},
{
"name": "search",
"type": "string",
"required": false
}
],
"responseexample": {
"data": [],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 0,
"totalpages": 0
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/operatingsystems",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a new operating system.",
"example": "curl -X POST http://localhost:5001/api/operatingsystems -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/operatingsystems/<int:os_id>",
"auth": "jwt + role:admin",
"params": "path: os_id (int)",
"purpose": "Delete (deactivate) an operating system.",
"example": "curl -X DELETE http://localhost:5001/api/operatingsystems/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/operatingsystems/<int:os_id>",
"auth": "permission:assets.view",
"params": "path: os_id (int)",
"purpose": "Get a single operating system.",
"example": "curl http://localhost:5001/api/operatingsystems/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/operatingsystems/<int:os_id>",
"auth": "jwt + role:admin",
"params": "path: os_id (int); body: JSON (fields not yet documented)",
"purpose": "Update an operating system.",
"example": "curl -X PUT http://localhost:5001/api/operatingsystems/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
}
]
},
{
"surface": "core-plugins",
"endpoints": [
{
"method": "GET",
"path": "/api/plugins",
"auth": "permission:settings.view",
"params": "not documented",
"purpose": "List all discovered plugins (enabled or not) with their metadata and the framework contract version.",
"example": "curl http://localhost:5001/api/plugins -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/plugins/<name>",
"auth": "jwt + role:admin",
"params": "path: name (string); body: JSON (fields not yet documented)",
"purpose": "Enable or disable a plugin. Takes effect on the next app restart for route/navigation changes.",
"example": "curl -X PUT http://localhost:5001/api/plugins/x -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "GET",
"path": "/api/plugins/enabled",
"auth": "jwt-optional (works signed out; the handler decides what shows)",
"params": "not documented",
"purpose": "Return just the names of enabled plugins as a flat array.",
"example": "curl http://localhost:5001/api/plugins/enabled -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [
"backups",
"computers",
"employees",
"<trimmed for the example: 1 more>"
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/plugins/settings-routes",
"auth": "permission:settings.view",
"params": "not documented",
"purpose": "Return settings routes contributed by all enabled plugins.",
"example": "curl http://localhost:5001/api/plugins/settings-routes -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"routes": [
{
"component": "drawn.vue",
"hub": "model-catalog",
"name": "drawn-route",
"path": "drawn",
"tab": "Drawn"
},
{
"component": ".plugins-staged/computers/views/OperatingSystemsList.vue",
"hub": "model-catalog",
"name": "model-catalog-os",
"path": "operatingsystems",
"tab": "Operating Systems"
}
]
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
}
]
},
{
"surface": "core-pluginui",
"endpoints": [
{
"method": "GET",
"path": "/api/pluginui/asset-panels",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "Return the asset-detail panels matching one asset's type (get_asset_panels).",
"example": "curl http://localhost:5001/api/pluginui/asset-panels -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "assetid",
"type": "integer",
"required": false
}
],
"responseexample": {
"data": [
{
"assettypes": [
"computer"
],
"empty": "No agent report yet.",
"endpoint": "/api/endpoints/asset/{assetid}/status",
"group": "details",
"id": "endpoints-status",
"plugin": "endpoints",
"position": 10,
"render": "keyvalue",
"title": "Endpoint status"
},
{
"assettypes": [
"computer"
],
"collapsible": true,
"commandendpoint": "/api/endpoints/{assetid}/commands",
"empty": "No monitored services reported.",
"endpoint": "/api/endpoints/asset/{assetid}/services",
"facets": {
"key": "statelabel",
"order": [
"Running",
"Stopped",
"Paused",
"<trimmed for the example: 5 more>"
]
},
"filter": {
"equals": "service",
"key": "kind"
},
"group": "serviceprocess",
"id": "endpoints-tracked-services",
"map": {
"action": "action",
"badge": {
"color": "statecolor",
"label": "statelabel"
},
"title": "name"
},
"permission": "endpoints.command",
"plugin": "endpoints",
"position": 12,
"render": "list",
"status": {
"key": "statecolor",
"levels": {
"green": "ok",
"red": "critical",
"yellow": "warning"
}
},
"title": "Tracked Services"
},
{
"assettypes": [
"computer"
],
"collapsible": true,
"commandendpoint": "/api/endpoints/{assetid}/commands",
"empty": "No monitored processes reported.",
"endpoint": "/api/endpoints/asset/{assetid}/services",
"facets": {
"key": "statelabel",
"order": [
"Running",
"Stopped",
"Paused",
"<trimmed for the example: 5 more>"
]
},
"filter": {
"equals": "process",
"key": "kind"
},
"group": "serviceprocess",
"id": "endpoints-tracked-processes",
"map": {
"action": "action",
"badge": {
"color": "statecolor",
"label": "statelabel"
},
"title": "name"
},
"permission": "endpoints.command",
"plugin": "endpoints",
"position": 13,
"render": "list",
"status": {
"key": "statecolor",
"levels": {
"green": "ok",
"red": "critical",
"yellow": "warning"
}
},
"title": "Tracked Processes"
},
"<trimmed for the example: 12 more>"
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/pluginui/asset-presentation",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "Merge enabled plugins' asset-type presentation entries (hook).",
"example": "curl http://localhost:5001/api/pluginui/asset-presentation -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [
{
"assettype": "stubtype",
"plugin": "backups",
"route": "/stubtype/by-asset/{assetid}"
}
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/pluginui/asset-type-descriptors",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "Merge enabled plugins' asset-type subtype descriptors.",
"example": "curl http://localhost:5001/api/pluginui/asset-type-descriptors -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [
{
"assettype": "computer",
"edit_permission": "computers.manage",
"optional_tabs": [],
"plugin": "computers",
"subtype_color_field": "color",
"subtype_description_field": "description",
"subtype_endpoint": "/computers/types",
"subtype_id_field": "computertypeid",
"subtype_label_field": "computertype"
},
{
"assettype": "machine",
"edit_permission": "machines.manage",
"optional_tabs": [],
"plugin": "machines",
"subtype_color_field": "color",
"subtype_description_field": "description",
"subtype_endpoint": "/machines/types",
"subtype_id_field": "machinetypeid",
"subtype_label_field": "machinetype"
},
{
"assettype": "network_device",
"edit_permission": "network.manage",
"optional_tabs": [],
"plugin": "network",
"subtype_color_field": "color",
"subtype_description_field": "description",
"subtype_endpoint": "/network/types",
"subtype_id_field": "networkdevicetypeid",
"subtype_label_field": "networkdevicetype"
},
"<trimmed for the example: 1 more>"
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/pluginui/core-type-descriptors",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "Return type descriptors for core-owned non-asset types.",
"example": "curl http://localhost:5001/api/pluginui/core-type-descriptors -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [
{
"category": "location",
"edit_permission": "admin",
"group": "other",
"optional_tabs": [],
"subtype_color_field": "color",
"subtype_description_field": "description",
"subtype_endpoint": "/locations/types",
"subtype_id_field": "locationtypeid",
"subtype_label_field": "locationtype",
"type_name": "Location Type",
"type_name_plural": "Location Types"
},
{
"category": "notification",
"custom_component": "NotificationTypesTab",
"edit_permission": "admin",
"group": "other",
"optional_tabs": [],
"subtype_color_field": "typecolor",
"subtype_description_field": "typedescription",
"subtype_endpoint": "/notifications/types",
"subtype_id_field": "notificationtypeid",
"subtype_label_field": "typename",
"type_name": "Notification Type",
"type_name_plural": "Notification Types"
}
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/pluginui/map-overlays",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "Merge enabled plugins' map overlay declarations (get_map_overlays hook).",
"example": "curl http://localhost:5001/api/pluginui/map-overlays -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [
{
"endpoint": "/api/whatever",
"id": "due-soon",
"legend": true,
"plugin": "backups",
"title": "Due soon"
}
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/pluginui/settings-cards",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "Merge enabled plugins' settings-catalog cards (get_settings_cards hook).",
"example": "curl http://localhost:5001/api/pluginui/settings-cards -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [
{
"description": "Collection interval, share root for part-marker snapshots, staleness threshold and revision retention",
"group": "Machines",
"icon": "package",
"plugin": "backups",
"position": 21,
"title": "Backups",
"to": "/settings/backups"
},
{
"description": "Download the collector script stamped with this site's URL and ranges",
"group": "Computers",
"icon": "download",
"plugin": "computers",
"position": 26,
"title": "Asset reporter",
"to": "/settings/collector"
},
{
"description": "The shared agent key PCs use until they enroll, the site agent installer builder, and what the agent reports.",
"group": "Endpoints",
"icon": "key",
"plugin": "endpoints",
"position": 27,
"title": "Endpoints",
"to": "/settings/endpoints/agentkey"
},
"<trimmed for the example: 4 more>"
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
}
]
},
{
"surface": "core-reports",
"endpoints": [
{
"method": "GET",
"path": "/api/reports",
"auth": "permission:reports.view",
"params": "not documented",
"purpose": "List all available reports.",
"example": "curl http://localhost:5001/api/reports -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"reports": [
{
"category": "inventory",
"description": "Machine count grouped by machine type",
"endpoint": "/api/reports/machines-by-type",
"id": "machines-by-type",
"name": "Machines by Type"
},
{
"category": "inventory",
"description": "Asset count grouped by status",
"endpoint": "/api/reports/assets-by-status",
"id": "assets-by-status",
"name": "Assets by Status"
},
{
"category": "usage",
"description": "Most clicked knowledge base articles",
"endpoint": "/api/reports/kb-popularity",
"id": "kb-popularity",
"name": "KB Popularity"
},
"<trimmed for the example: 1 more>"
],
"total": 13
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/reports/asset-inventory",
"auth": "permission:reports.view",
"params": "not documented",
"purpose": "Report: Complete asset inventory summary.",
"example": "curl http://localhost:5001/api/reports/asset-inventory -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "businessunitid",
"type": "integer",
"required": false
},
{
"name": "format",
"type": "string",
"required": false
},
{
"name": "locationid",
"type": "integer",
"required": false
}
],
"responseexample": {
"data": {
"data": {
"bylocation": [],
"bystatus": [],
"bytype": []
},
"generated": "2026-01-01T00:00:00.000000",
"report": "asset_inventory",
"total": 0
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/reports/assets-by-status",
"auth": "permission:reports.view",
"params": "not documented",
"purpose": "Report: Asset count grouped by status.",
"example": "curl http://localhost:5001/api/reports/assets-by-status -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "assettypeid",
"type": "integer",
"required": false
},
{
"name": "businessunitid",
"type": "integer",
"required": false
},
{
"name": "format",
"type": "string",
"required": false
}
],
"responseexample": {
"data": {
"data": [],
"generated": "2026-01-01T00:00:00.000000",
"report": "assets_by_status",
"total": 0
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/reports/email",
"auth": "permission:reports.export",
"params": "body: JSON (fields not yet documented)",
"purpose": "Email a report's data as an HTML table (on-demand delivery).",
"example": "curl -X POST http://localhost:5001/api/reports/email -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"columns": [
{
"key": "vendor",
"label": "Vendor"
}
],
"rows": [
{
"vendor": "Dell"
}
],
"subject": "Warranty Report",
"to": "<redacted:email>"
},
"responseexample": {
"data": {
"reason": "notconfigured",
"sent": false
},
"message": "Email is not configured (SMTP disabled or host unset).",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/reports/kb-popularity",
"auth": "permission:reports.view",
"params": "not documented",
"purpose": "Report: Most clicked knowledge base articles.",
"example": "curl http://localhost:5001/api/reports/kb-popularity -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "format",
"type": "string",
"required": false
},
{
"name": "limit",
"type": "integer",
"required": false,
"default": 20
}
],
"responseexample": {
"data": {
"data": [],
"generated": "2026-01-01T00:00:00.000000",
"report": "kb_popularity",
"total": 0
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/reports/machines-by-type",
"auth": "permission:reports.view",
"params": "not documented",
"purpose": "Report: Machine count grouped by machine type.",
"example": "curl http://localhost:5001/api/reports/machines-by-type -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "businessunitid",
"type": "integer",
"required": false
},
{
"name": "format",
"type": "string",
"required": false
}
],
"responseexample": {
"data": {
"data": [],
"generated": "2026-01-01T00:00:00.000000",
"report": "machines_by_type",
"total": 0
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/reports/pc-relationships",
"auth": "permission:reports.view",
"params": "not documented",
"purpose": "Report: PCs with relationships to shop floor machines.",
"example": "curl http://localhost:5001/api/reports/pc-relationships -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "format",
"type": "string",
"required": false
}
],
"responseexample": {
"data": {
"data": [
{
"hostname": "<redacted:host>",
"ip": "<redacted:host>",
"machine_number": "4242",
"model": "",
"vendor": ""
}
],
"generated": "2026-01-01T00:00:00.000000",
"report": "pc_relationships",
"total": 1
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/reports/software-compliance",
"auth": "permission:reports.view",
"params": "not documented",
"purpose": "Report: Required applications vs installed (per PC).",
"example": "curl http://localhost:5001/api/reports/software-compliance -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "appid",
"type": "string",
"required": false
},
{
"name": "format",
"type": "string",
"required": false
}
],
"responseexample": {
"data": {
"data": [],
"generated": "2026-01-01T00:00:00.000000",
"message": "No required applications defined",
"report": "software_compliance"
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
}
]
},
{
"surface": "core-scripts",
"endpoints": [
{
"method": "GET",
"path": "/api/scripts",
"auth": "permission:endpoints.runscript",
"params": "not documented",
"purpose": "List scripts (active by default).",
"example": "curl http://localhost:5001/api/scripts -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "search",
"type": "string",
"required": false
}
],
"responseexample": {
"data": [],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/scripts",
"auth": "permission:endpoints.runscript",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a script catalog entry (body uploaded separately).",
"example": "curl -X POST http://localhost:5001/api/scripts -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"scriptname": "autologon",
"workingdirectory": "C:\\Program Files\\Sysinternals"
},
"responseexample": {
"data": {
"captureoutput": false,
"createddate": "2026-01-01T00:00:00.000000Z",
"errormode": "default",
"filename": null,
"hasbody": false,
"isactive": true,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"runcontext": "system",
"scriptdescription": null,
"scriptid": 1,
"scriptname": "autologon",
"sha256": null,
"workingdirectory": "C:\\Program Files\\Sysinternals"
},
"message": "Script created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/scripts/<int:script_id>",
"auth": "permission:endpoints.runscript",
"params": "path: script_id (int)",
"purpose": "UNDOCUMENTED: scripts.delete_script has no docstring.",
"example": "curl -X DELETE http://localhost:5001/api/scripts/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/scripts/<int:script_id>",
"auth": "permission:endpoints.runscript",
"params": "path: script_id (int)",
"purpose": "UNDOCUMENTED: scripts.get_script has no docstring.",
"example": "curl http://localhost:5001/api/scripts/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/scripts/<int:script_id>",
"auth": "permission:endpoints.runscript",
"params": "path: script_id (int); body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: scripts.update_script has no docstring.",
"example": "curl -X PUT http://localhost:5001/api/scripts/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"scriptdescription": "now documented"
},
"responseexample": {
"data": {
"captureoutput": true,
"createddate": "2026-01-01T00:00:00.000000Z",
"errormode": "default",
"filename": null,
"hasbody": false,
"isactive": true,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"runcontext": "system",
"scriptdescription": "now documented",
"scriptid": 1,
"scriptname": "keep-my-flag",
"sha256": null,
"workingdirectory": null
},
"message": "Script updated",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "POST",
"path": "/api/scripts/<int:script_id>/body",
"auth": "permission:endpoints.runscript",
"params": "path: script_id (int); body: JSON (fields not yet documented)",
"purpose": "Upload (or replace) the .ps1 body for a script.",
"example": "curl -X POST http://localhost:5001/api/scripts/1/body -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"responseexample": {
"data": {
"bytes": 23,
"captureoutput": false,
"createddate": "2026-01-01T00:00:00.000000Z",
"errormode": "default",
"filename": "script-1.ps1",
"hasbody": true,
"isactive": true,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"runcontext": "system",
"scriptdescription": null,
"scriptid": 1,
"scriptname": "digest-check",
"sha256": "<redacted:digest>",
"uploadedfilename": "digest-check.ps1",
"workingdirectory": null
},
"message": "Script body uploaded",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/scripts/body/<path:filename>",
"auth": "permission:endpoints.runscript",
"params": "path: filename (path)",
"purpose": "Operator-facing script body download (JWT/RBAC).",
"example": "curl http://localhost:5001/api/scripts/body/example.png -H \"Authorization: Bearer $TOK\""
}
]
},
{
"surface": "core-search",
"endpoints": [
{
"method": "GET",
"path": "/api/search",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "Global search across multiple entity types.",
"example": "curl http://localhost:5001/api/search -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "q",
"type": "string",
"required": false,
"default": ""
}
],
"responseexample": {
"data": {
"counts": {
"knowledgebase": 2
},
"degraded": [
"Employee"
],
"query": "zzkeyword",
"results": [
{
"id": 1,
"linkurl": "u",
"relevance": 25.0,
"subtitle": "Livesearchapp",
"title": "Zzrunbook for the live one",
"type": "knowledgebase",
"url": "/knowledgebase/1"
},
{
"id": 3,
"linkurl": "u",
"relevance": 25.0,
"subtitle": null,
"title": "Zzrunbook with no topic",
"type": "knowledgebase",
"url": "/knowledgebase/3"
}
],
"total": 2,
"total_all": 2
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/search/suggest",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "A better spelling for a query that found nothing, or null.",
"example": "curl http://localhost:5001/api/search/suggest -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "q",
"type": "string",
"required": false,
"default": ""
}
],
"responseexample": {
"data": {
"query": "keyecne",
"suggestion": "keyence"
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
}
]
},
{
"surface": "core-settings",
"endpoints": [
{
"method": "GET",
"path": "/api/settings",
"auth": "jwt-optional (works signed out; the handler decides what shows)",
"params": "not documented",
"purpose": "List all settings, optionally filtered by category.",
"example": "curl http://localhost:5001/api/settings -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "category",
"type": "string",
"required": false
}
],
"responseexample": {
"data": [
{
"category": "auth",
"createddate": "2026-01-01T00:00:00.000000Z",
"description": "SAML Assertion Consumer Service URL",
"key": "saml_acs_url",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"settingid": 111,
"value": "",
"valuetype": "string"
},
{
"category": "auth",
"createddate": "2026-01-01T00:00:00.000000Z",
"description": "SAML group name that grants admin role",
"key": "saml_admin_group",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"settingid": 114,
"value": "",
"valuetype": "string"
},
{
"category": "auth",
"createddate": "2026-01-01T00:00:00.000000Z",
"description": "Allow local username/password login when SAML is enabled",
"key": "saml_allow_local_login",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"settingid": 112,
"value": true,
"valuetype": "boolean"
},
"<trimmed for the example: 1 more>"
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/settings",
"auth": "permission:settings.edit",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a new setting (admin only).",
"example": "curl -X POST http://localhost:5001/api/settings -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "GET",
"path": "/api/settings/<key>",
"auth": "jwt-optional (works signed out; the handler decides what shows)",
"params": "path: key (string)",
"purpose": "Get a single setting by key.",
"example": "curl http://localhost:5001/api/settings/x -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"category": "plugin.endpoints",
"createddate": "2026-01-01T00:00:00.000000Z",
"description": "Accept a one-line install bootstrap token in the ?t= query string as well as the X-Endpoint-Bootstrap-Token header. On (the default) keeps the pasted install commands and the Download .ps1 link workin...",
"key": "plugin.endpoints.bootstrapquerytoken",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"settingid": 1,
"value": false,
"valuetype": "boolean"
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "PUT",
"path": "/api/settings/<key>",
"auth": "permission:settings.edit",
"params": "path: key (string); body: JSON (fields not yet documented)",
"purpose": "Update a setting value.",
"example": "curl -X PUT http://localhost:5001/api/settings/x -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"value": "<redacted:address>"
},
"responseexample": {
"data": {
"category": "plugin.endpoints",
"createddate": "2026-01-01T00:00:00.000000Z",
"description": "Accept a one-line install bootstrap token in the ?t= query string as well as the X-Endpoint-Bootstrap-Token header. On (the default) keeps the pasted install commands and the Download .ps1 link workin...",
"key": "plugin.endpoints.bootstrapquerytoken",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"settingid": 1,
"value": false,
"valuetype": "boolean"
},
"message": "Setting updated",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "POST",
"path": "/api/settings/asset-import/import",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Validate uploaded CSVs and, when commit=true, load them.",
"example": "curl -X POST http://localhost:5001/api/settings/asset-import/import -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "GET",
"path": "/api/settings/asset-import/script",
"auth": "jwt + role:admin",
"params": "not documented",
"purpose": "Download Collect-ShopDB.ps1 with this site's CSV path embedded.",
"example": "curl http://localhost:5001/api/settings/asset-import/script -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/settings/asset-import/templates",
"auth": "jwt + role:admin",
"params": "not documented",
"purpose": "List the importable CSV tables in the order they must be uploaded.",
"example": "curl http://localhost:5001/api/settings/asset-import/templates -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"tables": [
{
"filename": "assetstatuses.csv",
"table": "assetstatuses"
},
{
"filename": "assettypes.csv",
"table": "assettypes"
},
{
"filename": "locationtypes.csv",
"table": "locationtypes"
},
"<trimmed for the example: 1 more>"
]
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/settings/asset-import/templates/<tablename>",
"auth": "jwt + role:admin",
"params": "path: tablename (string)",
"purpose": "Download a generated CSV template for a single importable table.",
"example": "curl http://localhost:5001/api/settings/asset-import/templates/x -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/settings/asset-import/winc/batches",
"auth": "jwt + role:admin",
"params": "not documented",
"purpose": "List applied/undone WINC import batches, newest first (for the undo UI).",
"example": "curl http://localhost:5001/api/settings/asset-import/winc/batches -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"batches": [
{
"batchid": "<redacted:token>",
"createdat": "2026-01-01 00:00:00.000000",
"createdby": "<redacted:person>",
"kind": "winc-machine-adoption",
"rowcount": 1,
"status": "undone",
"undoneat": "2026-01-01 00:00:00.000000"
}
]
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/settings/asset-import/winc/commit",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Apply a WINC plan reversibly. Requires acknowledgment for needs-create.",
"example": "curl -X POST http://localhost:5001/api/settings/asset-import/winc/commit -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"responseexample": {
"data": {
"batchid": "<redacted:token>",
"blocking": false,
"committed": true,
"kind": "winc-machine-adoption",
"needscreate": {
"businessunit": {
"Large Parts": 1
}
},
"planhash": "<redacted:secret>",
"rowcount": 1,
"summary": {
"ambiguous_match": 0,
"businessunit_blank": 0,
"businessunit_needs-create": 1,
"businessunit_resolved": 0,
"businessunit_unresolved": 0,
"export_rows": 2,
"in_scope": 1,
"location_blank": 0,
"location_needs-create": 0,
"location_resolved": 1,
"location_unresolved": 0,
"non_workstation_rows": 1,
"skipped_no_existing_machine": 0
},
"uncreatable": {},
"unresolved": {}
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "POST",
"path": "/api/settings/asset-import/winc/preview",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Read-only WINC analysis: report what a commit would do. Writes nothing.",
"example": "curl -X POST http://localhost:5001/api/settings/asset-import/winc/preview -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"responseexample": {
"data": {
"blocking": true,
"committed": false,
"kind": "winc-machine-adoption",
"needscreate": {
"businessunit": {
"Large Parts": 1
},
"location": {
"T6": 1
}
},
"planhash": "<redacted:secret>",
"rowcount": 1,
"summary": {
"ambiguous_match": 0,
"businessunit_blank": 0,
"businessunit_needs-create": 1,
"businessunit_resolved": 0,
"businessunit_unresolved": 0,
"export_rows": 1,
"in_scope": 1,
"location_blank": 0,
"location_needs-create": 1,
"location_resolved": 0,
"location_unresolved": 0,
"non_workstation_rows": 0,
"skipped_no_existing_machine": 0
},
"uncreatable": {
"location": {
"T6": 1
}
},
"unresolved": {}
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/settings/asset-import/winc/undo",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Reverse an applied WINC import batch by id. Conservative and reversible.",
"example": "curl -X POST http://localhost:5001/api/settings/asset-import/winc/undo -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"batchid": "<redacted:token>"
},
"responseexample": {
"data": {
"batchid": "<redacted:token>",
"conflicts": [
{
"column": null,
"operation": "insert",
"reason": "still referenced by dashboarddefaults.businessunitid",
"table": "businessunits",
"targetid": 1
}
],
"reverted": 3
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "POST",
"path": "/api/settings/branding-logo",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Upload a branding logo image and point the matching setting at it.",
"example": "curl -X POST http://localhost:5001/api/settings/branding-logo -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"responseexample": {
"data": {
"key": "site_favicon",
"value": "/api/settings/branding/logo-favicon.ico"
},
"message": "Logo uploaded",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/settings/branding/<path:filename>",
"auth": "none (reviewed: named in the public-read or mutation sweep)",
"params": "path: filename (path)",
"purpose": "Serve an uploaded branding logo (public - kiosks/print pages read it).",
"example": "curl http://localhost:5001/api/settings/branding/example.png"
},
{
"method": "POST",
"path": "/api/settings/map-blueprint",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Upload a floor-map blueprint image and point the setting at it.",
"example": "curl -X POST http://localhost:5001/api/settings/map-blueprint -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "GET",
"path": "/api/settings/map-blueprint/<path:filename>",
"auth": "none (reviewed: named in the public-read or mutation sweep)",
"params": "path: filename (path)",
"purpose": "Serve an uploaded blueprint image (public - kiosks read it).",
"example": "curl http://localhost:5001/api/settings/map-blueprint/example.png"
},
{
"method": "POST",
"path": "/api/settings/seed",
"auth": "permission:settings.edit",
"params": "body: JSON (fields not yet documented)",
"purpose": "Seed default settings if they don't exist.",
"example": "curl -X POST http://localhost:5001/api/settings/seed -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {},
"responseexample": {
"data": {
"created": 112
},
"message": "112 default settings created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/settings/test-email",
"auth": "permission:settings.edit",
"params": "body: JSON (fields not yet documented)",
"purpose": "Send a test email to verify SMTP configuration.",
"example": "curl -X POST http://localhost:5001/api/settings/test-email -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"to": "<redacted:email>"
},
"responseexample": {
"data": {
"error": "[Errno -2] Name or service not known",
"sent": false
},
"message": "Test email failed: [Errno -2] Name or service not known",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
}
]
},
{
"surface": "core-setup",
"endpoints": [
{
"method": "GET",
"path": "/api/setup/checklist",
"auth": "jwt + role:admin",
"params": "not documented",
"purpose": "What is configured and what is not, with a link to each fix.",
"example": "curl http://localhost:5001/api/setup/checklist -H \"Authorization: Bearer $TOK\""
},
{
"method": "POST",
"path": "/api/setup/complete",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Flag the first-run setup as finished.",
"example": "curl -X POST http://localhost:5001/api/setup/complete -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'"
},
{
"method": "POST",
"path": "/api/setup/create-admin",
"auth": "none (first run only: refused once an admin exists)",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create the first admin. Only works while there are zero users, setup has not been marked complete, and the caller proves operator control (setup token or a loopback request).",
"example": "curl -X POST http://localhost:5001/api/setup/create-admin -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "GET",
"path": "/api/setup/health",
"auth": "jwt + role:admin",
"params": "not documented",
"purpose": "Post-setup reality check, including whether a restart is outstanding.",
"example": "curl http://localhost:5001/api/setup/health -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/setup/needs-admin",
"auth": "none (reviewed: named in the public-read or mutation sweep)",
"params": "not documented",
"purpose": "True when no users exist yet - the app's very first run. Public so the login screen can offer to create the first admin.",
"example": "curl http://localhost:5001/api/setup/needs-admin",
"responseexample": {
"data": {
"needsadmin": false
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/setup/seed-reference",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Seed core reference data + permissions + default settings. Idempotent - reuses the same routines as the `flask seed ...` CLI commands.",
"example": "curl -X POST http://localhost:5001/api/setup/seed-reference -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'"
},
{
"method": "POST",
"path": "/api/setup/seed-starter",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Add common vendors that are not already present. Idempotent.",
"example": "curl -X POST http://localhost:5001/api/setup/seed-starter -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'"
}
]
},
{
"surface": "core-shopdbbackups",
"endpoints": [
{
"method": "GET",
"path": "/api/shopdbbackups",
"auth": "jwt + role:admin",
"params": "not documented",
"purpose": "List every retained backup set, newest first, with a compatibility flag.",
"example": "curl http://localhost:5001/api/shopdbbackups -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [],
"meta": {
"count": 0,
"lastgoodat": null,
"requestid": "00000000",
"retention": {
"keepdaily": 5,
"keepmonthly": 6,
"keepweekly": 4
},
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/shopdbbackups",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Kick off an on-demand backup run.",
"example": "curl -X POST http://localhost:5001/api/shopdbbackups -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'"
},
{
"method": "GET",
"path": "/api/shopdbbackups/<snapshotid>",
"auth": "jwt + role:admin",
"params": "path: snapshotid (string)",
"purpose": "Return one set's full manifest plus a resolved compatibility verdict.",
"example": "curl http://localhost:5001/api/shopdbbackups/x -H \"Authorization: Bearer $TOK\""
},
{
"method": "POST",
"path": "/api/shopdbbackups/<snapshotid>/restore",
"auth": "jwt + role:admin",
"params": "path: snapshotid (string); body: JSON (fields not yet documented)",
"purpose": "Queue a restore of a set, gated on schema compatibility.",
"example": "curl -X POST http://localhost:5001/api/shopdbbackups/x/restore -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'"
},
{
"method": "POST",
"path": "/api/shopdbbackups/finalize-restore",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Run the post-restore schema upgrade in the app context.",
"example": "curl -X POST http://localhost:5001/api/shopdbbackups/finalize-restore -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"responseexample": {
"data": {
"queued": true,
"snapshotid": "wj-2026-09-06T120000Z"
},
"message": "Schema upgrade queued.",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/shopdbbackups/history",
"auth": "jwt + role:admin",
"params": "not documented",
"purpose": "Return the recorded history of backup and restore runs, newest first.",
"example": "curl http://localhost:5001/api/shopdbbackups/history -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"backups": [],
"restores": []
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/shopdbbackups/settings",
"auth": "jwt + role:admin",
"params": "not documented",
"purpose": "Return destination + retention config for the settings pane.",
"example": "curl http://localhost:5001/api/shopdbbackups/settings -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"backupsroot": "/backups",
"destinationkind": "local",
"destinationkinds": [
"local",
"smb",
"aws"
],
"fields": {},
"isarmed": true,
"retention": {
"keepdaily": 5,
"keepmonthly": 6,
"keepweekly": 4
}
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "PUT",
"path": "/api/shopdbbackups/settings",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Persist the backup destination kind and its credential/config fields.",
"example": "curl -X PUT http://localhost:5001/api/shopdbbackups/settings -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {},
"responseexample": {
"data": {
"backupsroot": "/backups",
"destinationkind": "local",
"destinationkinds": [
"local",
"smb",
"aws"
],
"fields": {},
"isarmed": true,
"retention": {
"keepdaily": 5,
"keepmonthly": 6,
"keepweekly": 4
}
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/shopdbbackups/status",
"auth": "jwt + role:admin",
"params": "not documented",
"purpose": "Return the live status of the most recent backup and restore runs.",
"example": "curl http://localhost:5001/api/shopdbbackups/status -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"backup": null,
"restore": null
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
}
]
},
{
"surface": "core-supportteams",
"endpoints": [
{
"method": "GET",
"path": "/api/supportteams",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "List support teams (with contacts). ?active and ?teamname filters.",
"example": "curl http://localhost:5001/api/supportteams -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "teamname",
"type": "string",
"required": false
}
],
"responseexample": {
"data": [
{
"contacts": [],
"createddate": "2026-01-01T00:00:00.000000Z",
"isactive": false,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"supportteamid": 1,
"teamname": "Retired",
"teamurl": null,
"webhookurl": null
}
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/supportteams",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a new support team.",
"example": "curl -X POST http://localhost:5001/api/supportteams -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"createddate": "2026-01-01 00:00:00",
"modifieddate": "2026-01-01T00:00:00",
"teamname": "Legacy"
},
"responseexample": {
"data": {
"contacts": [],
"createddate": "2026-01-01T00:00:00.000000Z",
"isactive": true,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"supportteamid": 1,
"teamname": "Controls",
"teamurl": "https://servicenow.example/group/controls",
"webhookurl": null
},
"message": "Support team created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/supportteams/<int:team_id>",
"auth": "jwt + role:admin",
"params": "path: team_id (int)",
"purpose": "Delete a support team; 409 while any application references it.",
"example": "curl -X DELETE http://localhost:5001/api/supportteams/1 -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"message": "Support team deleted",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/supportteams/<int:team_id>",
"auth": "permission:assets.view",
"params": "path: team_id (int)",
"purpose": "Get a single support team with its contacts.",
"example": "curl http://localhost:5001/api/supportteams/1 -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"contacts": [
{
"contactid": 2,
"createddate": "2026-01-01T00:00:00.000000Z",
"isactive": true,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"name": "First",
"sortorder": 1,
"sso": "111",
"supportteamid": 1
},
{
"contactid": 1,
"createddate": "2026-01-01T00:00:00.000000Z",
"isactive": true,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"name": "Second",
"sortorder": 2,
"sso": "222",
"supportteamid": 1
}
],
"createddate": "2026-01-01T00:00:00.000000Z",
"isactive": true,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"supportteamid": 1,
"teamname": "Controls",
"teamurl": null,
"webhookurl": null
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "PUT",
"path": "/api/supportteams/<int:team_id>",
"auth": "jwt + role:admin",
"params": "path: team_id (int); body: JSON (fields not yet documented)",
"purpose": "Update a support team.",
"example": "curl -X PUT http://localhost:5001/api/supportteams/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"teamname": "Controls Renamed",
"teamurl": "https://x.example"
},
"responseexample": {
"data": {
"contacts": [],
"createddate": "2026-01-01T00:00:00.000000Z",
"isactive": true,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"supportteamid": 1,
"teamname": "Controls Renamed",
"teamurl": "https://x.example",
"webhookurl": null
},
"message": "Support team updated",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "POST",
"path": "/api/supportteams/<int:team_id>/contacts",
"auth": "jwt + role:admin",
"params": "path: team_id (int); body: JSON (fields not yet documented)",
"purpose": "Add a contact to a support team.",
"example": "curl -X POST http://localhost:5001/api/supportteams/1/contacts -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"createddate": "2026-01-01 00:00:00",
"modifieddate": "2026-01-01T00:00:00",
"name": "LegacyOwner"
},
"responseexample": {
"data": {
"contactid": 1,
"createddate": "2026-01-01T00:00:00.000000Z",
"isactive": true,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"name": "Second",
"sortorder": 2,
"sso": "222",
"supportteamid": 1
},
"message": "Contact created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/supportteams/<int:team_id>/contacts/<int:contact_id>",
"auth": "jwt + role:admin",
"params": "path: team_id (int), contact_id (int)",
"purpose": "Delete a support-team contact.",
"example": "curl -X DELETE http://localhost:5001/api/supportteams/1/contacts/1 -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"message": "Contact deleted",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "PUT",
"path": "/api/supportteams/<int:team_id>/contacts/<int:contact_id>",
"auth": "jwt + role:admin",
"params": "path: team_id (int), contact_id (int); body: JSON (fields not yet documented)",
"purpose": "Update a support-team contact.",
"example": "curl -X PUT http://localhost:5001/api/supportteams/1/contacts/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"name": "First Updated"
},
"responseexample": {
"data": {
"contactid": 2,
"createddate": "2026-01-01T00:00:00.000000Z",
"isactive": true,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"name": "First Updated",
"sortorder": 1,
"sso": "111",
"supportteamid": 1
},
"message": "Contact updated",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
}
]
},
{
"surface": "core-users",
"endpoints": [
{
"method": "GET",
"path": "/api/users",
"auth": "jwt + role:admin",
"params": "not documented",
"purpose": "List all users.",
"example": "curl http://localhost:5001/api/users -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [
{
"createddate": "2026-01-01T00:00:00.000000Z",
"directpermissions": [],
"email": "<redacted:person>",
"failedlogins": 0,
"firstname": "<redacted:person>",
"isactive": true,
"islocked": false,
"lastlogindate": "2026-01-01T00:00:00Z",
"lastname": "<redacted:person>",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"mustchangepassword": "<redacted:secret>",
"permissions": [
"apitokens.create",
"applications.create",
"applications.delete",
"<trimmed for the example: 1 more>"
],
"roles": [
{
"color": null,
"roleid": 1,
"rolename": "admin"
}
],
"userid": 1,
"username": "<redacted:person>"
}
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/users",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a new user.",
"example": "curl -X POST http://localhost:5001/api/users -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"directpermissions": [
"endpoints.runscript"
],
"email": "<redacted:person>",
"password": "<redacted:secret>",
"roles": [],
"sendwelcome": false,
"username": "<redacted:person>"
},
"responseexample": {
"data": {
"createddate": "2026-01-01T00:00:00.000000Z",
"directpermissions": [
"endpoints.restart"
],
"email": "<redacted:person>",
"failedlogins": 0,
"firstname": "<redacted:person>",
"isactive": true,
"islocked": false,
"lastlogindate": null,
"lastname": "<redacted:person>",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"mustchangepassword": "<redacted:secret>",
"permissions": [
"applications.view",
"assets.view",
"backups.download",
"<trimmed for the example: 1 more>"
],
"roles": [
{
"color": "#0DCAF0",
"roleid": 3,
"rolename": "technician"
}
],
"userid": 2,
"username": "<redacted:person>",
"warning": "User created but the welcome email could not be sent."
},
"message": "User created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/users/<int:userid>",
"auth": "jwt + role:admin",
"params": "path: userid (int)",
"purpose": "Delete a user.",
"example": "curl -X DELETE http://localhost:5001/api/users/1 -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"message": "User deleted",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/users/<int:userid>",
"auth": "jwt",
"params": "path: userid (int)",
"purpose": "Get a single user.",
"example": "curl http://localhost:5001/api/users/1 -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"createddate": "2026-01-01T00:00:00.000000Z",
"directpermissions": [],
"email": "<redacted:person>",
"failedlogins": 0,
"firstname": "<redacted:person>",
"isactive": true,
"islocked": false,
"lastlogindate": "2026-01-01T00:00:00Z",
"lastname": "<redacted:person>",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"mustchangepassword": "<redacted:secret>",
"permissions": [],
"roles": [],
"userid": 1,
"username": "<redacted:person>"
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "PUT",
"path": "/api/users/<int:userid>",
"auth": "jwt",
"params": "path: userid (int); body: JSON (fields not yet documented)",
"purpose": "Update a user.",
"example": "curl -X PUT http://localhost:5001/api/users/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"password": "<redacted:secret>"
},
"responseexample": {
"data": {
"createddate": "2026-01-01T00:00:00.000000Z",
"directpermissions": [],
"email": "<redacted:person>",
"failedlogins": 0,
"firstname": "<redacted:person>",
"isactive": true,
"islocked": false,
"lastlogindate": null,
"lastname": "<redacted:person>",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"mustchangepassword": "<redacted:secret>",
"permissions": [],
"roles": [],
"userid": 2,
"username": "<redacted:person>"
},
"message": "User updated",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/users/permissions",
"auth": "jwt",
"params": "not documented",
"purpose": "List assignable permissions grouped by category.",
"example": "curl http://localhost:5001/api/users/permissions -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/users/roles",
"auth": "jwt",
"params": "not documented",
"purpose": "List all roles with their permissions.",
"example": "curl http://localhost:5001/api/users/roles -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [
{
"color": null,
"description": "Administrator",
"grantable": null,
"isadmin": true,
"isguest": false,
"permissions": [],
"roleid": 1,
"rolename": "admin",
"usercount": 1
},
{
"color": "#6C757D",
"description": "Anyone who is not signed in. Holds nothing by default; grant it a permission to open that up to people with no account.",
"grantable": [
"applications.view",
"assets.view",
"computers.view",
"<trimmed for the example: 1 more>"
],
"isadmin": false,
"isguest": true,
"permissions": [],
"roleid": 2,
"rolename": "guest",
"usercount": 0
}
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/users/roles",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a new role.",
"example": "curl -X POST http://localhost:5001/api/users/roles -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"color": "#ff8800",
"description": "colorful",
"permissions": [],
"rolename": "painters"
},
"responseexample": {
"data": {
"color": "#ff8800",
"description": "colorful",
"permissions": [],
"roleid": 2,
"rolename": "painters"
},
"message": "Role created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/users/roles/<int:roleid>",
"auth": "jwt + role:admin",
"params": "path: roleid (int)",
"purpose": "Delete a role.",
"example": "curl -X DELETE http://localhost:5001/api/users/roles/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/users/roles/<int:roleid>",
"auth": "jwt + role:admin",
"params": "path: roleid (int); body: JSON (fields not yet documented)",
"purpose": "Update a role.",
"example": "curl -X PUT http://localhost:5001/api/users/roles/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"permissions": [
"reports.view"
]
},
"responseexample": {
"data": {
"color": "#6C757D",
"description": "Anyone who is not signed in. Holds nothing by default; grant it a permission to open that up to people with no account.",
"permissions": [
"reports.view"
],
"roleid": 2,
"rolename": "guest"
},
"message": "Role updated",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
}
]
},
{
"surface": "core-vendors",
"endpoints": [
{
"method": "GET",
"path": "/api/vendors",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "List all vendors.",
"example": "curl http://localhost:5001/api/vendors -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
},
{
"name": "search",
"type": "string",
"required": false
},
{
"name": "vendor",
"type": "string",
"required": false
}
],
"responseexample": {
"data": [
{
"createddate": "2026-01-01T00:00:00.000000Z",
"description": null,
"isactive": true,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"notes": null,
"supportemail": "<redacted:person>",
"supportphone": "<redacted:person>",
"vendor": "Acme",
"vendorid": 1,
"website": null
}
],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 1,
"totalpages": 1
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/vendors",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a new vendor.",
"example": "curl -X POST http://localhost:5001/api/vendors -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"createddate": "2026-01-01 00:00:00",
"vendor": "Legacy Vendor"
},
"responseexample": {
"data": {
"createddate": "2026-01-01T00:00:00.000000Z",
"description": null,
"isactive": true,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"notes": null,
"supportemail": "<redacted:person>",
"supportphone": "<redacted:person>",
"vendor": "Unscoped Vendor",
"vendorid": 1,
"website": null
},
"message": "Vendor created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/vendors/<int:vendor_id>",
"auth": "jwt + role:admin",
"params": "path: vendor_id (int)",
"purpose": "Delete (deactivate) a vendor.",
"example": "curl -X DELETE http://localhost:5001/api/vendors/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/vendors/<int:vendor_id>",
"auth": "permission:assets.view",
"params": "path: vendor_id (int)",
"purpose": "Get a single vendor.",
"example": "curl http://localhost:5001/api/vendors/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/vendors/<int:vendor_id>",
"auth": "jwt + role:admin",
"params": "path: vendor_id (int); body: JSON (fields not yet documented)",
"purpose": "Update a vendor.",
"example": "curl -X PUT http://localhost:5001/api/vendors/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
}
]
},
{
"surface": "plugin-backups",
"endpoints": [
{
"method": "GET",
"path": "/api/backups/asset/<int:assetid>",
"auth": "permission:backups.view",
"params": "path: assetid (int)",
"purpose": "Revision history for one asset, newest first.",
"example": "curl http://localhost:5001/api/backups/asset/1 -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "kind",
"type": "string",
"required": false
}
]
},
{
"method": "GET",
"path": "/api/backups/asset/<int:assetid>/info",
"auth": "permission:backups.view",
"params": "path: assetid (int)",
"purpose": "A kind's 'at a glance' card, built from its LATEST revision.",
"example": "curl http://localhost:5001/api/backups/asset/1/info -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "kind",
"type": "string",
"required": false
}
]
},
{
"method": "GET",
"path": "/api/backups/dashboard/stale",
"auth": "permission:backups.view",
"params": "not documented",
"purpose": "Chains whose backup has stopped running.",
"example": "curl http://localhost:5001/api/backups/dashboard/stale -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/backups/kinds",
"auth": "permission:backups.view",
"params": "not documented",
"purpose": "Registered backup kinds, for UI that needs to enumerate them.",
"example": "curl http://localhost:5001/api/backups/kinds -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [
{
"assettypes": [
"machine"
],
"displayname": "<redacted:person>",
"formats": [
{
"ext": ".reg",
"hint": "Restore with the Load... button in the NTLARS settings dialog.",
"id": "ntlars",
"label": "NTLARS Load... (.reg)",
"mimetype": "application/octet-stream"
},
{
"ext": ".reg",
"hint": "Use when importing outside NTLARS on a 64-bit machine.",
"id": "wow6432node",
"label": "Direct reg import (.reg, WOW6432Node)",
"mimetype": "application/octet-stream"
}
],
"key": "ntlars",
"storagebackend": "shopdb"
},
{
"assettypes": [
"machine"
],
"displayname": "<redacted:person>",
"formats": [],
"key": "partmarker",
"storagebackend": "share"
}
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/backups/revisions/<int:backuprevisionid>",
"auth": "permission:backups.view",
"params": "path: backuprevisionid (int)",
"purpose": "One revision, including its parsed payload where there is one.",
"example": "curl http://localhost:5001/api/backups/revisions/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/backups/revisions/<int:backuprevisionid>/diff",
"auth": "permission:backups.view",
"params": "path: backuprevisionid (int)",
"purpose": "Diff two revisions of the same asset+kind.",
"example": "curl http://localhost:5001/api/backups/revisions/1/diff -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "against",
"type": "integer",
"required": false
}
],
"responseexample": {
"data": {
"againstid": 1,
"backuprevisionid": 2,
"changecount": 1,
"changes": [
{
"after": "OKUMA",
"aftertype": "REG_SZ",
"before": "",
"beforetype": "REG_SZ",
"change": "changed",
"keypath": "General",
"valuename": "Cnc"
}
]
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/backups/revisions/<int:backuprevisionid>/download",
"auth": "permission:backups.download",
"params": "path: backuprevisionid (int)",
"purpose": "Render a revision back to its native file format.",
"example": "curl http://localhost:5001/api/backups/revisions/1/download -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "format",
"type": "string",
"required": false
}
]
}
]
},
{
"surface": "plugin-computers",
"endpoints": [
{
"method": "GET",
"path": "/api/computers",
"auth": "permission:computers.view",
"params": "not documented",
"purpose": "List all computers with filtering and pagination.",
"example": "curl http://localhost:5001/api/computers -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "assetnumber",
"type": "string",
"required": false
},
{
"name": "businessunit_id",
"type": "integer",
"required": false
},
{
"name": "businessunitid",
"type": "integer",
"required": false
},
{
"name": "dir",
"type": "string",
"required": false,
"default": "asc"
},
{
"name": "location_id",
"type": "integer",
"required": false
},
{
"name": "locationid",
"type": "integer",
"required": false
},
{
"name": "os_id",
"type": "integer",
"required": false
},
{
"name": "osid",
"type": "integer",
"required": false
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
},
{
"name": "search",
"type": "string",
"required": false
},
{
"name": "shopfloor",
"type": "string",
"required": false
},
{
"name": "sort",
"type": "string",
"required": false,
"default": "hostname"
},
{
"name": "type_id",
"type": "integer",
"required": false
},
{
"name": "typeid",
"type": "integer",
"required": false
}
],
"responseexample": {
"data": [
{
"accessmethods": [],
"assetid": 1,
"assetnumber": "PC-1",
"assettypecolor": null,
"assettypeid": 1,
"assettypename": "computer",
"businessunitid": null,
"computer": {
"accessprotocolnames": [],
"assetid": 1,
"azuredevicecategory": null,
"azuredeviceid": null,
"azureobjectid": null,
"computerid": 1,
"computertypeid": 1,
"computertypename": "Standard",
"createddate": "2026-01-01T00:00:00.000000Z",
"hostname": "<redacted:host>",
"isactive": true,
"lastboottime": null,
"lastreporteddate": null,
"loggedinuser": null,
"modelnumberid": null,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"osid": null,
"vendorid": null
},
"createdby": "<redacted:person>",
"createddate": "2026-01-01T00:00:00.000000Z",
"deletedby": null,
"deleteddate": null,
"gaugelabreference": null,
"isactive": true,
"levelid": null,
"locationcode": null,
"locationid": null,
"maintenancereference": null,
"mapverifiedat": null,
"mapx": null,
"mapy": null,
"modifiedby": "<redacted:person>",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"name": null,
"notes": null,
"ownlevelid": null,
"ownlocationid": null,
"ownmapx": null,
"ownmapy": null,
"pluginid": 1,
"serialnumber": "<redacted:host>",
"statusid": 1
}
],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 1,
"totalpages": 1
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/computers",
"auth": "permission:computers.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create new computer (creates both Asset and Computer records).",
"example": "curl -X POST http://localhost:5001/api/computers -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"assetnumber": "PC-IMPORT-1",
"createddate": "2026-01-01 00:00:00",
"hostname": "<redacted:host>",
"modifieddate": "2026-01-01T00:00:00"
},
"responseexample": {
"data": {
"accessmethods": [],
"assetid": 1,
"assetnumber": "AUDIT-PC-1",
"assettypecolor": null,
"assettypeid": 1,
"assettypename": "computer",
"businessunitid": null,
"computer": {
"accessprotocolnames": [],
"assetid": 1,
"azuredevicecategory": null,
"azuredeviceid": null,
"azureobjectid": null,
"computerid": 1,
"computertypeid": null,
"createddate": "2026-01-01T00:00:00.000000Z",
"hostname": "<redacted:host>",
"isactive": true,
"lastboottime": null,
"lastreporteddate": null,
"loggedinuser": null,
"modelnumberid": null,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"osid": null,
"vendorid": null
},
"createdby": "<redacted:person>",
"createddate": "2026-01-01T00:00:00.000000Z",
"deletedby": null,
"deleteddate": null,
"gaugelabreference": null,
"isactive": true,
"levelid": null,
"locationcode": null,
"locationid": null,
"maintenancereference": null,
"mapverifiedat": null,
"mapx": null,
"mapy": null,
"modifiedby": "<redacted:person>",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"name": null,
"notes": null,
"ownlevelid": null,
"ownlocationid": null,
"ownmapx": null,
"ownmapy": null,
"pluginid": 1,
"serialnumber": "<redacted:host>",
"statuscolor": null,
"statusid": 1,
"statusname": "In Use"
},
"message": "Computer created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/computers/<int:computer_id>",
"auth": "permission:computers.delete",
"params": "path: computer_id (int)",
"purpose": "Delete (soft delete) computer.",
"example": "curl -X DELETE http://localhost:5001/api/computers/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/computers/<int:computer_id>",
"auth": "permission:computers.view",
"params": "path: computer_id (int)",
"purpose": "Get a single computer with full details.",
"example": "curl http://localhost:5001/api/computers/1 -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"accessmethods": [],
"assetid": 1,
"assetnumber": "PC-2001",
"assettypecolor": null,
"assettypeid": 1,
"assettypename": "computer",
"businessunitid": null,
"communications": [],
"computer": {
"accessprotocolnames": [],
"assetid": 1,
"azuredevicecategory": null,
"azuredeviceid": null,
"azureobjectid": null,
"computerid": 1,
"computertypeid": null,
"createddate": "2026-01-01T00:00:00.000000Z",
"hostname": "<redacted:host>",
"imageurl": "/api/models/images/model-1.png",
"isactive": true,
"lastboottime": null,
"lastreporteddate": null,
"loggedinuser": null,
"modelname": "IMG-MODEL-1",
"modelnumberid": 1,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"osid": null,
"vendorid": null
},
"createdby": "<redacted:person>",
"createddate": "2026-01-01T00:00:00.000000Z",
"deletedby": null,
"deleteddate": null,
"gaugelabreference": null,
"isactive": true,
"levelid": null,
"locationcode": null,
"locationid": null,
"maintenancereference": null,
"mapverifiedat": null,
"mapx": null,
"mapy": null,
"modifiedby": "<redacted:person>",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"name": null,
"notes": null,
"ownlevelid": null,
"ownlocationid": null,
"ownmapx": null,
"ownmapy": null,
"pluginid": 1,
"serialnumber": "<redacted:host>",
"statusid": 1
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "PUT",
"path": "/api/computers/<int:computer_id>",
"auth": "permission:computers.edit",
"params": "path: computer_id (int); body: JSON (fields not yet documented)",
"purpose": "Update computer (both Asset and Computer records).",
"example": "curl -X PUT http://localhost:5001/api/computers/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"gaugelabreference": "GL-2",
"maintenancereference": "MNT-2"
},
"responseexample": {
"data": {
"accessmethods": [
{
"id": 1,
"link": "rdp://auditpc1",
"name": "RDP",
"port": null,
"portoverride": null,
"protocolid": 1,
"scheme": "rdp"
}
],
"assetid": 1,
"assetnumber": "AUDIT-PC-1",
"assettypecolor": null,
"assettypeid": 1,
"assettypename": "computer",
"businessunitid": null,
"computer": {
"accessprotocolnames": [
"RDP"
],
"assetid": 1,
"azuredevicecategory": null,
"azuredeviceid": null,
"azureobjectid": null,
"computerid": 1,
"computertypeid": null,
"createddate": "2026-01-01T00:00:00.000000Z",
"hostname": "<redacted:host>",
"isactive": true,
"lastboottime": null,
"lastreporteddate": null,
"loggedinuser": null,
"modelnumberid": null,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"osid": null,
"vendorid": null
},
"createdby": "<redacted:person>",
"createddate": "2026-01-01T00:00:00.000000Z",
"deletedby": null,
"deleteddate": null,
"gaugelabreference": null,
"isactive": true,
"levelid": null,
"locationcode": null,
"locationid": null,
"maintenancereference": null,
"mapverifiedat": null,
"mapx": null,
"mapy": null,
"modifiedby": "<redacted:person>",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"name": null,
"notes": null,
"ownlevelid": null,
"ownlocationid": null,
"ownmapx": null,
"ownmapy": null,
"pluginid": 1,
"serialnumber": "<redacted:host>",
"statuscolor": null,
"statusid": 1,
"statusname": "In Use"
},
"message": "Computer updated",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/computers/<int:computer_id>/apps",
"auth": "permission:computers.view",
"params": "path: computer_id (int)",
"purpose": "Get all installed applications for a computer.",
"example": "curl http://localhost:5001/api/computers/1/apps -H \"Authorization: Bearer $TOK\""
},
{
"method": "POST",
"path": "/api/computers/<int:computer_id>/apps",
"auth": "permission:computers.create",
"params": "path: computer_id (int); body: JSON (fields not yet documented)",
"purpose": "Add an installed application to a computer.",
"example": "curl -X POST http://localhost:5001/api/computers/1/apps -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/computers/<int:computer_id>/apps/<int:app_id>",
"auth": "permission:computers.delete",
"params": "path: computer_id (int), app_id (int)",
"purpose": "Remove an installed application from a computer.",
"example": "curl -X DELETE http://localhost:5001/api/computers/1/apps/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "POST",
"path": "/api/computers/<int:computer_id>/report",
"auth": "permission:computers.create",
"params": "path: computer_id (int); body: JSON (fields not yet documented)",
"purpose": "Report computer status (for agent-based reporting).",
"example": "curl -X POST http://localhost:5001/api/computers/1/report -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "GET",
"path": "/api/computers/asset/<int:asset_id>/policypanel",
"auth": "permission:computers.view",
"params": "path: asset_id (int)",
"purpose": "Keyvalue panel: which policy governs this endpoint, and what it allows.",
"example": "curl http://localhost:5001/api/computers/asset/1/policypanel -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/computers/by-asset/<int:asset_id>",
"auth": "permission:computers.view",
"params": "path: asset_id (int)",
"purpose": "Get computer data by asset ID.",
"example": "curl http://localhost:5001/api/computers/by-asset/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/computers/by-hostname/<hostname>",
"auth": "permission:computers.view",
"params": "path: hostname (string)",
"purpose": "Get computer by hostname.",
"example": "curl http://localhost:5001/api/computers/by-hostname/x -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/computers/client-script",
"auth": "jwt + role:admin",
"params": "not documented",
"purpose": "The collector reporter, stamped with THIS site's values.",
"example": "curl http://localhost:5001/api/computers/client-script -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/computers/dashboard/quiet",
"auth": "permission:computers.view",
"params": "not documented",
"purpose": "PCs that WERE reporting, have stopped, and are still meant to be in use.",
"example": "curl http://localhost:5001/api/computers/dashboard/quiet -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [
{
"computerid": 2,
"hostname": "<redacted:host>",
"lastreported": "2026-01-01T00:00:00.000000Z",
"quietdays": 9
},
{
"computerid": 1,
"hostname": "<redacted:host>",
"lastreported": "2026-01-01T00:00:00.000000Z",
"quietdays": 2
}
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/computers/dashboard/sharedmachines",
"auth": "permission:computers.view",
"params": "not documented",
"purpose": "Machine numbers claimed by more than one PC, with nothing filed under them.",
"example": "curl http://localhost:5001/api/computers/dashboard/sharedmachines -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [
{
"assetid": 1,
"machinenumber": "2026",
"pccount": 2,
"pcs": "PCONE, PCTWO"
}
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/computers/dashboard/summary",
"auth": "permission:computers.view",
"params": "not documented",
"purpose": "Get computer dashboard summary data.",
"example": "curl http://localhost:5001/api/computers/dashboard/summary -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"byos": [],
"bytype": [],
"nonshopfloor": 0,
"shopfloor": 0,
"total": 0
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/computers/display-kiosks",
"auth": "permission:computers.view",
"params": "not documented",
"purpose": "Reporting display kiosks, for the Dashboard Defaults picker.",
"example": "curl http://localhost:5001/api/computers/display-kiosks -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [
{
"computerid": 1,
"fqdn": "<redacted:host>",
"hostname": "<redacted:host>",
"serialnumber": "<redacted:host>"
}
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/computers/policies/actions",
"auth": "permission:computers.view",
"params": "not documented",
"purpose": "The allowlisted action names + labels a policy may reference.",
"example": "curl http://localhost:5001/api/computers/policies/actions -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [
{
"action": "service_start",
"description": "Start a Windows service by name on the endpoint.",
"kind": "command",
"label": "Start service",
"mayauthor": true,
"requiredpermission": null
},
{
"action": "service_stop",
"description": "Stop a running Windows service by name on the endpoint.",
"kind": "command",
"label": "Stop service",
"mayauthor": true,
"requiredpermission": null
},
{
"action": "service_status",
"description": "Report whether a named Windows service is running.",
"kind": "command",
"label": "Check service",
"mayauthor": true,
"requiredpermission": null
},
"<trimmed for the example: 1 more>"
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/computers/policies/business",
"auth": "permission:computers.view",
"params": "not documented",
"purpose": "UNDOCUMENTED: computers.list_business_policies has no docstring.",
"example": "curl http://localhost:5001/api/computers/policies/business -H \"Authorization: Bearer $TOK\""
},
{
"method": "POST",
"path": "/api/computers/policies/business",
"auth": "permission:computers.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: computers.create_business_policy has no docstring.",
"example": "curl -X POST http://localhost:5001/api/computers/policies/business -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/computers/policies/business/<int:policy_id>",
"auth": "permission:computers.delete",
"params": "path: policy_id (int)",
"purpose": "UNDOCUMENTED: computers.delete_business_policy has no docstring.",
"example": "curl -X DELETE http://localhost:5001/api/computers/policies/business/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/computers/policies/business/<int:policy_id>",
"auth": "permission:computers.view",
"params": "path: policy_id (int)",
"purpose": "UNDOCUMENTED: computers.get_business_policy has no docstring.",
"example": "curl http://localhost:5001/api/computers/policies/business/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/computers/policies/business/<int:policy_id>",
"auth": "permission:computers.edit",
"params": "path: policy_id (int); body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: computers.update_business_policy has no docstring.",
"example": "curl -X PUT http://localhost:5001/api/computers/policies/business/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "GET",
"path": "/api/computers/policies/configuration",
"auth": "permission:computers.view",
"params": "not documented",
"purpose": "UNDOCUMENTED: computers.list_configuration_policies has no docstring.",
"example": "curl http://localhost:5001/api/computers/policies/configuration -H \"Authorization: Bearer $TOK\""
},
{
"method": "POST",
"path": "/api/computers/policies/configuration",
"auth": "permission:computers.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: computers.create_configuration_policy has no docstring.",
"example": "curl -X POST http://localhost:5001/api/computers/policies/configuration -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"actions": [
{
"action": "run_script"
}
],
"name": "Legitimate"
},
"responseexample": {
"data": {
"actions": [
{
"action": "run_script",
"configurationpolicyactionid": 1,
"configurationpolicyid": 1,
"createddate": "2026-01-01T00:00:00.000000Z",
"desiredstate": null,
"intervalminutes": null,
"isactive": true,
"mode": "gate",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"params": null,
"sortorder": 0
}
],
"configurationpolicyid": 1,
"createddate": "2026-01-01T00:00:00.000000Z",
"description": null,
"isactive": true,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"name": "Legitimate",
"scopejson": null,
"source": "local"
},
"message": "Configuration policy created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/computers/policies/configuration/<int:policy_id>",
"auth": "permission:computers.delete",
"params": "path: policy_id (int)",
"purpose": "UNDOCUMENTED: computers.delete_configuration_policy has no docstring.",
"example": "curl -X DELETE http://localhost:5001/api/computers/policies/configuration/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/computers/policies/configuration/<int:policy_id>",
"auth": "permission:computers.view",
"params": "path: policy_id (int)",
"purpose": "UNDOCUMENTED: computers.get_configuration_policy has no docstring.",
"example": "curl http://localhost:5001/api/computers/policies/configuration/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/computers/policies/configuration/<int:policy_id>",
"auth": "permission:computers.edit",
"params": "path: policy_id (int); body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: computers.update_configuration_policy has no docstring.",
"example": "curl -X PUT http://localhost:5001/api/computers/policies/configuration/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"description": "clearer wording",
"name": "New Name"
},
"responseexample": {
"data": {
"actions": [
{
"action": "run_script",
"configurationpolicyactionid": 1,
"configurationpolicyid": 1,
"createddate": "2026-01-01T00:00:00.000000Z",
"desiredstate": null,
"intervalminutes": null,
"isactive": true,
"mode": "gate",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"params": null,
"sortorder": 0
}
],
"configurationpolicyid": 1,
"createddate": "2026-01-01T00:00:00.000000Z",
"description": "clearer wording",
"isactive": true,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"name": "New Name",
"scopejson": null,
"source": "local"
},
"message": "Configuration policy updated",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/computers/policies/effective/<int:asset_id>",
"auth": "permission:computers.view",
"params": "path: asset_id (int)",
"purpose": "Preview the resolved effective policy for one endpoint (debug/UI).",
"example": "curl http://localhost:5001/api/computers/policies/effective/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/computers/protocols",
"auth": "permission:computers.view",
"params": "not documented",
"purpose": "List access protocols. ?active=false includes disabled ones.",
"example": "curl http://localhost:5001/api/computers/protocols -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
}
],
"responseexample": {
"data": [],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/computers/protocols",
"auth": "permission:computers.edit",
"params": "body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: computers.create_protocol has no docstring.",
"example": "curl -X POST http://localhost:5001/api/computers/protocols -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/computers/protocols/<int:protocol_id>",
"auth": "permission:computers.edit",
"params": "path: protocol_id (int)",
"purpose": "UNDOCUMENTED: computers.delete_protocol has no docstring.",
"example": "curl -X DELETE http://localhost:5001/api/computers/protocols/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PATCH|PUT",
"path": "/api/computers/protocols/<int:protocol_id>",
"auth": "permission:computers.edit",
"params": "path: protocol_id (int); body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: computers.update_protocol has no docstring.",
"example": "curl -X PATCH http://localhost:5001/api/computers/protocols/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "GET",
"path": "/api/computers/types",
"auth": "permission:computers.view",
"params": "not documented",
"purpose": "List all computer types.",
"example": "curl http://localhost:5001/api/computers/types -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
},
{
"name": "search",
"type": "string",
"required": false
}
],
"responseexample": {
"data": [],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 0,
"totalpages": 0
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/computers/types",
"auth": "permission:computers.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a new computer type.",
"example": "curl -X POST http://localhost:5001/api/computers/types -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/computers/types/<int:type_id>",
"auth": "permission:computers.delete",
"params": "path: type_id (int)",
"purpose": "Delete a computer type. Refused if any PC still uses it.",
"example": "curl -X DELETE http://localhost:5001/api/computers/types/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/computers/types/<int:type_id>",
"auth": "permission:computers.view",
"params": "path: type_id (int)",
"purpose": "Get a single computer type.",
"example": "curl http://localhost:5001/api/computers/types/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/computers/types/<int:type_id>",
"auth": "permission:computers.edit",
"params": "path: type_id (int); body: JSON (fields not yet documented)",
"purpose": "Update a computer type.",
"example": "curl -X PUT http://localhost:5001/api/computers/types/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
}
]
},
{
"surface": "plugin-endpoints",
"endpoints": [
{
"method": "GET",
"path": "/api/endpoints",
"auth": "permission:endpoints.fleet",
"params": "not documented",
"purpose": "List reported endpoint states.",
"example": "curl http://localhost:5001/api/endpoints -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "businessunitid",
"type": "string",
"required": false
},
{
"name": "computertypeid",
"type": "string",
"required": false
},
{
"name": "credentialstate",
"type": "string",
"required": false
},
{
"name": "locationid",
"type": "string",
"required": false
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
},
{
"name": "search",
"type": "string",
"required": false
},
{
"name": "sort",
"type": "string",
"required": false
},
{
"name": "status",
"type": "string",
"required": false
}
],
"responseexample": {
"data": [
{
"agentversion": "1.20.0",
"alias": "REVOKED",
"assetid": 6,
"assetnumber": "REVOKED",
"computerid": 6,
"computertype": null,
"computertypeid": null,
"cpupercent": null,
"createdat": "2026-01-01T00:00:00.000000Z",
"credentialstate": "<redacted:secret>",
"domain": null,
"endpointstateid": 6,
"health": {
"label": "ok",
"level": "ok"
},
"hostname": "<redacted:host>",
"idleseconds": null,
"lastboottime": null,
"lastreportedat": "2026-01-01T00:00:00.000000Z",
"loggedinuser": null,
"machines": [],
"memorypercent": null,
"mtconnectcheckedat": null,
"mtconnectrunning": null,
"pendingreboot": null,
"status": "reporting",
"trayversion": null,
"uptimedisplay": null,
"uptimeseconds": null
},
{
"agentversion": "1.20.0",
"alias": "SHARED",
"assetid": 5,
"assetnumber": "SHARED",
"computerid": 5,
"computertype": null,
"computertypeid": null,
"cpupercent": null,
"createdat": "2026-01-01T00:00:00.000000Z",
"credentialstate": "<redacted:secret>",
"domain": null,
"endpointstateid": 5,
"health": {
"label": "ok",
"level": "ok"
},
"hostname": "<redacted:host>",
"idleseconds": null,
"lastboottime": null,
"lastreportedat": "2026-01-01T00:00:00.000000Z",
"loggedinuser": null,
"machines": [],
"memorypercent": null,
"mtconnectcheckedat": null,
"mtconnectrunning": null,
"pendingreboot": null,
"status": "reporting",
"trayversion": null,
"uptimedisplay": null,
"uptimeseconds": null
}
],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 2,
"totalpages": 1
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/endpoints/",
"auth": "permission:endpoints.fleet",
"params": "not documented",
"purpose": "List reported endpoint states.",
"example": "curl http://localhost:5001/api/endpoints/ -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "businessunitid",
"type": "string",
"required": false
},
{
"name": "computertypeid",
"type": "string",
"required": false
},
{
"name": "credentialstate",
"type": "string",
"required": false
},
{
"name": "locationid",
"type": "string",
"required": false
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
},
{
"name": "search",
"type": "string",
"required": false
},
{
"name": "sort",
"type": "string",
"required": false
},
{
"name": "status",
"type": "string",
"required": false
}
],
"responseexample": {
"data": [
{
"agentversion": null,
"alias": "Bay 3 Controller",
"assetid": 1,
"assetnumber": "fleetbox",
"computerid": 1,
"computertype": null,
"computertypeid": null,
"cpupercent": null,
"createdat": "2026-01-01T00:00:00.000000Z",
"credentialstate": "<redacted:secret>",
"domain": null,
"endpointstateid": 1,
"health": {
"label": "no agent",
"level": "unknown"
},
"hostname": "<redacted:host>",
"idleseconds": null,
"lastboottime": null,
"lastreportedat": null,
"loggedinuser": null,
"machines": [],
"memorypercent": null,
"mtconnectcheckedat": null,
"mtconnectrunning": null,
"pendingreboot": null,
"status": "never",
"trayversion": null,
"uptimedisplay": null,
"uptimeseconds": null
}
],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 1,
"totalpages": 1
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/endpoints/<int:asset_id>",
"auth": "permission:endpoints.view",
"params": "path: asset_id (int)",
"purpose": "Get the current state for one endpoint by asset id.",
"example": "curl http://localhost:5001/api/endpoints/1 -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"actionminimums": {
"collect_log": "1.16.0"
},
"agentcurrent": "1.6.3",
"agentversion": "1.20.0",
"assetid": 2,
"cpupercent": null,
"createdat": "2026-01-01T00:00:00.000000Z",
"credential": {
"credentialprefix": "<redacted:secret>",
"enrolledvia": "auto",
"issuedat": "2026-01-01T00:00:00.000000Z",
"lastusedat": "2026-01-01T00:00:00.000000Z",
"reenrollblocked": true,
"reenrollblockedreason": "rollback",
"revokedat": "2026-01-01T00:00:00.000000Z",
"state": "reenrollblocked",
"statelabel": "Re-enroll blocked"
},
"domain": null,
"endpointstateid": 2,
"hostname": "<redacted:host>",
"idleseconds": null,
"lastboottime": null,
"lastreportedat": "2026-01-01T00:00:00.000000Z",
"loggedinuser": null,
"memorypercent": null,
"mtconnectcheckedat": null,
"mtconnectrunning": null,
"pendingreboot": null,
"status": "reporting",
"trayversion": null,
"uptimedisplay": null,
"uptimeseconds": null
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/endpoints/<int:asset_id>/agentupgrade",
"auth": "permission:endpoints.agentupdate",
"params": "path: asset_id (int); body: JSON (fields not yet documented)",
"purpose": "Push the published agent build to one endpoint.",
"example": "curl -X POST http://localhost:5001/api/endpoints/1/agentupgrade -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"action": "run_script",
"target": "script:1"
},
"responseexample": {
"data": {
"action": "run_script",
"assetid": 1,
"claimedat": null,
"completedat": null,
"createdat": "2026-01-01T00:00:00.000000Z",
"endpointcommandid": 1,
"requestedby": "<redacted:person>",
"resultmessage": null,
"status": "pending",
"target": "script:1",
"targetkind": "script"
},
"message": "Command queued",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/endpoints/<int:asset_id>/commands",
"auth": "permission:endpoints.view",
"params": "path: asset_id (int)",
"purpose": "Recent commands for one endpoint, newest first (operator view).",
"example": "curl http://localhost:5001/api/endpoints/1/commands -H \"Authorization: Bearer $TOK\""
},
{
"method": "POST",
"path": "/api/endpoints/<int:asset_id>/commands",
"auth": "permission:endpoints.command",
"params": "path: asset_id (int); body: JSON (fields not yet documented)",
"purpose": "Queue an allowlisted command for one endpoint.",
"example": "curl -X POST http://localhost:5001/api/endpoints/1/commands -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"action": "service_status",
"overridereason": "line down, need status",
"policyoverride": true,
"target": "spooler"
},
"responseexample": {
"data": {
"action": "collect_log",
"assetid": 1,
"claimedat": null,
"completedat": null,
"createdat": "2026-01-01T00:00:00.000000Z",
"endpointcommandid": 1,
"requestedby": "<redacted:person>",
"resultmessage": null,
"status": "pending",
"target": "C:\\logs\\app.log",
"targetkind": "logpath"
},
"message": "Command queued",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/endpoints/<int:asset_id>/events",
"auth": "permission:endpoints.view",
"params": "path: asset_id (int)",
"purpose": "List curated Windows events for one endpoint, newest first.",
"example": "curl http://localhost:5001/api/endpoints/1/events -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "eventid",
"type": "string",
"required": false
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
}
]
},
{
"method": "GET",
"path": "/api/endpoints/<int:asset_id>/holdableactions",
"auth": "permission:endpoints.view",
"params": "path: asset_id (int)",
"purpose": "Desired-mode actions on this endpoint, with current hold state.",
"example": "curl http://localhost:5001/api/endpoints/1/holdableactions -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [
{
"action": "service_start",
"held": false
}
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "DELETE",
"path": "/api/endpoints/<int:asset_id>/lock",
"auth": "permission:endpoints.command",
"params": "path: asset_id (int)",
"purpose": "Lift the quarantine on this endpoint.",
"example": "curl -X DELETE http://localhost:5001/api/endpoints/1/lock -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/endpoints/<int:asset_id>/lock",
"auth": "permission:endpoints.view",
"params": "path: asset_id (int)",
"purpose": "The endpoint lock standing on this endpoint, or null.",
"example": "curl http://localhost:5001/api/endpoints/1/lock -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"assetid": 1,
"endpointlockid": 1,
"lockedat": "2026-01-01T00:00:00.000000Z",
"lockedbyuserid": 1,
"lockedbyusername": "<redacted:person>",
"reason": "visible to all",
"releasedat": null,
"releasedbyusername": "<redacted:person>"
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/endpoints/<int:asset_id>/lock",
"auth": "permission:endpoints.command",
"params": "path: asset_id (int); body: JSON (fields not yet documented)",
"purpose": "Quarantine this endpoint against non-admin commands.",
"example": "curl -X POST http://localhost:5001/api/endpoints/1/lock -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"reason": "locked but still reconciled"
},
"responseexample": {
"data": {
"assetid": 1,
"endpointlockid": 1,
"lockedat": "2026-01-01T00:00:00.000000Z",
"lockedbyuserid": 1,
"lockedbyusername": "<redacted:person>",
"reason": "locked but still reconciled",
"releasedat": null,
"releasedbyusername": "<redacted:person>"
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/endpoints/<int:asset_id>/logcollections",
"auth": "permission:endpoints.view",
"params": "path: asset_id (int)",
"purpose": "Collected-log history for one endpoint, newest first.",
"example": "curl http://localhost:5001/api/endpoints/1/logcollections -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/endpoints/<int:asset_id>/policyholds",
"auth": "permission:endpoints.view",
"params": "path: asset_id (int)",
"purpose": "Active break-glass holds for one endpoint.",
"example": "curl http://localhost:5001/api/endpoints/1/policyholds -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [
{
"action": "service_stop",
"createdbyusername": "<redacted:person>",
"expiresat": "2026-01-01T00:00:00.000000",
"reason": "vendor on site"
}
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/endpoints/<int:asset_id>/policyholds",
"auth": "permission:endpoints.command",
"params": "path: asset_id (int); body: JSON (fields not yet documented)",
"purpose": "Deliberately suspend desired-state reconciliation for one or more actions.",
"example": "curl -X POST http://localhost:5001/api/endpoints/1/policyholds -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"actions": [
"service_start",
"service_stop"
],
"minutes": 60,
"reason": "stripping the enclosure"
},
"responseexample": {
"data": [
{
"action": "service_stop",
"createdbyusername": "<redacted:person>",
"expiresat": "2026-01-01T00:00:00.000000",
"reason": "stripping the enclosure"
},
{
"action": "service_start",
"createdbyusername": "<redacted:person>",
"expiresat": "2026-01-01T00:00:00.000000",
"reason": "stripping the enclosure"
}
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/endpoints/<int:asset_id>/policyholds/<action>",
"auth": "permission:endpoints.command",
"params": "path: asset_id (int), action (string)",
"purpose": "End a hold early, resuming reconciliation of one action.",
"example": "curl -X DELETE http://localhost:5001/api/endpoints/1/policyholds/x -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/endpoints/<int:asset_id>/scriptruns",
"auth": "permission:endpoints.view",
"params": "path: asset_id (int)",
"purpose": "The last few run_script commands for one endpoint, newest first.",
"example": "curl http://localhost:5001/api/endpoints/1/scriptruns -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "limit",
"type": "integer",
"required": false,
"default": 5
}
],
"responseexample": {
"data": [
{
"action": "run_script",
"assetid": 1,
"claimedat": null,
"completedat": null,
"createdat": "2026-01-01T00:00:00Z",
"endpointcommandid": 6,
"requestedby": "<redacted:person>",
"resultdetail": null,
"resultmessage": null,
"scriptname": "test-open-notepad",
"status": "succeeded",
"target": "script:1",
"targetkind": null
},
{
"action": "run_script",
"assetid": 1,
"claimedat": null,
"completedat": null,
"createdat": "2026-01-01T00:00:00Z",
"endpointcommandid": 5,
"requestedby": "<redacted:person>",
"resultdetail": null,
"resultmessage": null,
"scriptname": "test-open-notepad",
"status": "succeeded",
"target": "script:1",
"targetkind": null
},
{
"action": "run_script",
"assetid": 1,
"claimedat": null,
"completedat": null,
"createdat": "2026-01-01T00:00:00Z",
"endpointcommandid": 4,
"requestedby": "<redacted:person>",
"resultdetail": null,
"resultmessage": null,
"scriptname": "test-open-notepad",
"status": "succeeded",
"target": "script:1",
"targetkind": null
},
"<trimmed for the example: 1 more>"
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/endpoints/adoptiontool/package",
"auth": "permission:endpoints.agentpackage",
"params": "body: JSON (fields not yet documented)",
"purpose": "Bundle the adoption tool as a downloadable ZIP.",
"example": "curl -X POST http://localhost:5001/api/endpoints/adoptiontool/package -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/endpoints/agentkey",
"auth": "jwt + role:admin",
"params": "not documented",
"purpose": "Revoke the endpoint agent key: stop all managed-token endpoint traffic.",
"example": "curl -X DELETE http://localhost:5001/api/endpoints/agentkey -H \"Authorization: Bearer $TOK\"",
"requestexample": {},
"responseexample": {
"data": {
"envkeyfallback": true,
"key": null,
"provisioned": false,
"revoked": 0
},
"message": "Endpoint agent key revoked",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/endpoints/agentkey",
"auth": "jwt + role:admin",
"params": "not documented",
"purpose": "Report the endpoint agent key state (no secret).",
"example": "curl http://localhost:5001/api/endpoints/agentkey -H \"Authorization: Bearer $TOK\""
},
{
"method": "POST",
"path": "/api/endpoints/agentkey/regenerate",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Mint a fresh endpoint agent key, revoking any previous one.",
"example": "curl -X POST http://localhost:5001/api/endpoints/agentkey/regenerate -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {},
"responseexample": {
"data": {
"envkeyfallback": false,
"key": {
"createddate": "2026-01-01T00:00:00.000000Z",
"displayprefix": "<redacted:secret>",
"expiresat": null,
"isactive": true,
"isexpired": false,
"lastusedat": null,
"name": "Endpoint agent key",
"resourcescopes": null,
"scopes": [
"collector.ingest.endpoints"
],
"tokenid": 1,
"tokenprefix": "<redacted:secret>",
"userid": 1
},
"provisioned": true,
"secret": "<redacted:secret>",
"warning": "Save this key now. It will not be shown again. Configure it as the agent X-API-Key."
},
"message": "Endpoint agent key generated",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/endpoints/alerts",
"auth": "api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)",
"params": "not documented",
"purpose": "Fleet alerts for one endpoint by hostname (collector-token auth).",
"example": "curl http://localhost:5001/api/endpoints/alerts -H \"X-API-Key: $KEY\"",
"queryparams": [
{
"name": "hostname",
"type": "string",
"required": false
}
],
"responseexample": {
"data": [
{
"message": "Scheduled maintenance at 3:30 PM",
"notificationId": 1,
"notificationid": 1,
"timeout": 0,
"title": "Scheduled maintenance at 3:30 PM",
"type": "Fleet Alert",
"typeColor": "#ffc107",
"typecolor": "#ffc107"
}
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/endpoints/alerts/<int:notification_id>/acknowledge",
"auth": "api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)",
"params": "path: notification_id (int); body: JSON (fields not yet documented)",
"purpose": "Agent acknowledges a fleet alert (collector-token auth).",
"example": "curl -X POST http://localhost:5001/api/endpoints/alerts/1/acknowledge -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"assetid": 1,
"hostname": "<redacted:host>"
},
"responseexample": {
"data": {
"acknowledged": true
},
"message": "Alert already acknowledged",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/endpoints/apppackage/<int:appversionid>",
"auth": "api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)",
"params": "path: appversionid (int)",
"purpose": "Agent-facing installer download (collector-token auth).",
"example": "curl http://localhost:5001/api/endpoints/apppackage/1 -H \"X-API-Key: $KEY\""
},
{
"method": "GET",
"path": "/api/endpoints/apppackage/app/<int:app_id>",
"auth": "api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)",
"params": "path: app_id (int)",
"purpose": "Agent-facing installer download by APP (collector-token auth).",
"example": "curl http://localhost:5001/api/endpoints/apppackage/app/1 -H \"X-API-Key: $KEY\""
},
{
"method": "GET",
"path": "/api/endpoints/apppackage/app/<int:app_id>/<path:filename>",
"auth": "api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)",
"params": "path: app_id (int), filename (path)",
"purpose": "Agent-facing installer download by APP (collector-token auth).",
"example": "curl http://localhost:5001/api/endpoints/apppackage/app/1/example.png -H \"X-API-Key: $KEY\""
},
{
"method": "GET",
"path": "/api/endpoints/asset/<int:asset_id>/activity",
"auth": "permission:endpoints.view",
"params": "path: asset_id (int)",
"purpose": "List panel: one chronological feed of what happened to this endpoint.",
"example": "curl http://localhost:5001/api/endpoints/asset/1/activity -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/endpoints/asset/<int:asset_id>/applications",
"auth": "permission:endpoints.view",
"params": "path: asset_id (int)",
"purpose": "Table panel: the installed-software (SBOM) snapshot for this endpoint.",
"example": "curl http://localhost:5001/api/endpoints/asset/1/applications -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/endpoints/asset/<int:asset_id>/diskhealth",
"auth": "permission:endpoints.view",
"params": "path: asset_id (int)",
"purpose": "Physical drive health rows.",
"example": "curl http://localhost:5001/api/endpoints/asset/1/diskhealth -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/endpoints/asset/<int:asset_id>/hardware",
"auth": "permission:endpoints.view",
"params": "path: asset_id (int)",
"purpose": "Keyvalue panel: processor, memory and system chassis inventory.",
"example": "curl http://localhost:5001/api/endpoints/asset/1/hardware -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/endpoints/asset/<int:asset_id>/interfaces",
"auth": "permission:endpoints.view",
"params": "path: asset_id (int)",
"purpose": "Table panel: every hardware NIC the agent last reported.",
"example": "curl http://localhost:5001/api/endpoints/asset/1/interfaces -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/endpoints/asset/<int:asset_id>/iphistory",
"auth": "permission:endpoints.view",
"params": "path: asset_id (int)",
"purpose": "Table panel: every address this asset has held, newest change first.",
"example": "curl http://localhost:5001/api/endpoints/asset/1/iphistory -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/endpoints/asset/<int:asset_id>/listeners",
"auth": "permission:endpoints.view",
"params": "path: asset_id (int)",
"purpose": "Table panel: TCP sockets in LISTEN, with the owning process.",
"example": "curl http://localhost:5001/api/endpoints/asset/1/listeners -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/endpoints/asset/<int:asset_id>/mappeddrives",
"auth": "permission:endpoints.view",
"params": "path: asset_id (int)",
"purpose": "List panel: mapped network drives with a health badge each.",
"example": "curl http://localhost:5001/api/endpoints/asset/1/mappeddrives -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/endpoints/asset/<int:asset_id>/osinfo",
"auth": "permission:endpoints.view",
"params": "path: asset_id (int)",
"purpose": "Keyvalue panel: operating system, firmware and domain membership.",
"example": "curl http://localhost:5001/api/endpoints/asset/1/osinfo -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/endpoints/asset/<int:asset_id>/recentevents",
"auth": "permission:endpoints.view",
"params": "path: asset_id (int)",
"purpose": "List panel: the endpoint's most recent curated events, newest first.",
"example": "curl http://localhost:5001/api/endpoints/asset/1/recentevents -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/endpoints/asset/<int:asset_id>/services",
"auth": "permission:endpoints.view",
"params": "path: asset_id (int)",
"purpose": "List panel: monitored services/processes with a run-state badge per row.",
"example": "curl http://localhost:5001/api/endpoints/asset/1/services -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [
{
"action": {
"running": false,
"start": "process_start",
"status": "process_status",
"stop": "process_stop",
"target": "dncMain.exe",
"targetkind": "process"
},
"drift": true,
"kind": "process",
"name": "eDNC",
"statecolor": "gray",
"statelabel": "Unknown"
}
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/endpoints/asset/<int:asset_id>/status",
"auth": "permission:endpoints.view",
"params": "path: asset_id (int)",
"purpose": "Keyvalue panel: the endpoint's current status snapshot.",
"example": "curl http://localhost:5001/api/endpoints/asset/1/status -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"agentbehind": false,
"agentcurrent": "1.6.3",
"agentversion": "1.20.0",
"credential": {
"credentialprefix": "<redacted:secret>",
"enrolledvia": "auto",
"issuedat": "2026-01-01T00:00:00.000000Z",
"lastusedat": "2026-01-01T00:00:00.000000Z",
"reenrollblocked": true,
"reenrollblockedreason": "rollback",
"revokedat": "2026-01-01T00:00:00.000000Z",
"state": "reenrollblocked",
"statelabel": "Re-enroll blocked"
},
"fields": [
{
"label": "Agent",
"mono": true,
"value": "1.20.0"
},
{
"format": "datetime",
"label": "Last reported",
"mono": false,
"value": "2026-01-01T00:00:00.000000Z"
},
{
"label": "Credential",
"mono": false,
"value": "Re-enroll blocked"
},
"<trimmed for the example: 1 more>"
]
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/endpoints/asset/<int:asset_id>/storage",
"auth": "permission:endpoints.view",
"params": "path: asset_id (int)",
"purpose": "Tabs panel: volume capacity and physical drive health as two sections.",
"example": "curl http://localhost:5001/api/endpoints/asset/1/storage -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/endpoints/asset/<int:asset_id>/telemetrymeta",
"auth": "permission:endpoints.view",
"params": "path: asset_id (int)",
"purpose": "Lightweight freshness probe for the panels.",
"example": "curl http://localhost:5001/api/endpoints/asset/1/telemetrymeta -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/endpoints/asset/<int:asset_id>/usercontext",
"auth": "permission:endpoints.view",
"params": "path: asset_id (int)",
"purpose": "Keyvalue panel: session-scoped data from the interactive user probe.",
"example": "curl http://localhost:5001/api/endpoints/asset/1/usercontext -H \"Authorization: Bearer $TOK\""
},
{
"method": "POST",
"path": "/api/endpoints/collect",
"auth": "api-key (endpoints collector token)",
"params": "body: JSON (fields not yet documented)",
"purpose": "Agent telemetry ingest. Same handler as POST /api/collector/endpoints.",
"example": "curl -X POST http://localhost:5001/api/endpoints/collect -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"agentversion": "1.20.0",
"hostname": "<redacted:host>"
},
"responseexample": {
"data": {
"action": "created",
"assetid": 1,
"identityvalue": "BAY-01",
"status": "ok",
"warnings": []
},
"message": "endpoints collector created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/endpoints/commands/<int:command_id>/result",
"auth": "api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)",
"params": "path: command_id (int); body: JSON (fields not yet documented)",
"purpose": "Agent reports a claimed command's outcome (collector-token auth).",
"example": "curl -X POST http://localhost:5001/api/endpoints/commands/1/result -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'",
"queryparams": [
{
"name": "hostname",
"type": "string",
"required": false
}
],
"requestexample": {
"succeeded": true
},
"responseexample": {
"data": {
"action": "mtconnect_status",
"assetid": 1,
"claimedat": null,
"completedat": "2026-01-01T00:00:00.000000Z",
"createdat": "2026-01-01T00:00:00.000000Z",
"endpointcommandid": 1,
"requestedby": "<redacted:person>",
"resultmessage": null,
"status": "succeeded",
"target": null,
"targetkind": null
},
"message": "Result recorded",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/endpoints/commands/next",
"auth": "api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)",
"params": "not documented",
"purpose": "Agent long-poll: claim the next pending command for a hostname.",
"example": "curl http://localhost:5001/api/endpoints/commands/next -H \"X-API-Key: $KEY\"",
"queryparams": [
{
"name": "hostname",
"type": "string",
"required": false
}
],
"responseexample": {
"data": {
"action": "mtconnect_status",
"endpointcommandid": 1,
"target": null,
"targetkind": null
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/endpoints/dashboard/enrollmentpending",
"auth": "permission:endpoints.fleet",
"params": "not documented",
"purpose": "One queue row while enroll requests wait for an admin, else nothing.",
"example": "curl http://localhost:5001/api/endpoints/dashboard/enrollmentpending -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [
{
"pendingcount": 2,
"summary": "2 PCs waiting for enrollment approval"
}
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/endpoints/dashboard/quiet",
"auth": "permission:endpoints.fleet",
"params": "not documented",
"purpose": "Endpoints that reported before, then went quiet past the window.",
"example": "curl http://localhost:5001/api/endpoints/dashboard/quiet -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/endpoints/dashboard/reenrollblocked",
"auth": "permission:endpoints.fleet",
"params": "not documented",
"purpose": "PCs kept from re-enrolling for more than 7 days.",
"example": "curl http://localhost:5001/api/endpoints/dashboard/reenrollblocked -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [
{
"assetid": 2,
"blockeddays": 9,
"computerid": 2,
"hostname": "<redacted:host>",
"reason": "rollback"
}
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/endpoints/dashboard/stability",
"auth": "permission:endpoints.fleet",
"params": "not documented",
"purpose": "Endpoints with recent crash/shutdown/corruption events.",
"example": "curl http://localhost:5001/api/endpoints/dashboard/stability -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/endpoints/dashboard/summary",
"auth": "permission:endpoints.fleet",
"params": "not documented",
"purpose": "High-level fleet counts for the endpoints dashboard.",
"example": "curl http://localhost:5001/api/endpoints/dashboard/summary -H \"Authorization: Bearer $TOK\""
},
{
"method": "POST",
"path": "/api/endpoints/enroll",
"auth": "none (per-IP rate limited and capped; a valid fleet key only decides auto-enroll)",
"params": "body: JSON (fields not yet documented)",
"purpose": "A PC asks for its own credential.",
"example": "curl -X POST http://localhost:5001/api/endpoints/enroll -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"agentversion": "1.20.0",
"deviceid": null,
"enrollnonce": "mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
"hostname": "<redacted:host>",
"serialnumber": "<redacted:host>"
},
"responseexample": {
"data": {
"assetid": 1,
"credential": "<redacted:secret>",
"status": "enrolled"
},
"message": "Endpoint enrolled",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/endpoints/enrollment",
"auth": "permission:endpoints.fleet",
"params": "not documented",
"purpose": "Credential state of every computer, plus pending and recent requests.",
"example": "curl http://localhost:5001/api/endpoints/enrollment -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "search",
"type": "string",
"required": false
},
{
"name": "state",
"type": "string",
"required": false
}
],
"responseexample": {
"data": {
"computers": [
{
"assetid": 1,
"credentialprefix": "<redacted:secret>",
"enrolledvia": "auto",
"hostname": "<redacted:host>",
"issuedat": "2026-01-01T00:00:00.000000Z",
"lastusedat": null,
"reenrollblocked": false,
"reenrollblockedreason": null,
"serialnumber": "<redacted:host>",
"state": "enrolled"
},
{
"assetid": 2,
"credentialprefix": "<redacted:secret>",
"enrolledvia": null,
"hostname": "<redacted:host>",
"issuedat": null,
"lastusedat": null,
"reenrollblocked": false,
"reenrollblockedreason": null,
"serialnumber": "<redacted:host>",
"state": "notenrolled"
},
{
"assetid": 3,
"credentialprefix": "<redacted:secret>",
"enrolledvia": null,
"hostname": "<redacted:host>",
"issuedat": null,
"lastusedat": null,
"reenrollblocked": false,
"reenrollblockedreason": null,
"serialnumber": "<redacted:host>",
"state": "pending"
}
],
"counts": {
"enrolled": 1,
"notenrolled": 1,
"pending": 1,
"pendingcomputers": 1
},
"requests": [
{
"agentversion": "1.20.0",
"decidedat": null,
"decidedby": null,
"deviceid": null,
"hostname": "<redacted:host>",
"lastseenat": "2026-01-01T00:00:00.000000Z",
"matchedassetid": 3,
"reason": "no serial on record",
"requestedat": "2026-01-01T00:00:00.000000Z",
"requestid": "00000000",
"serialnumber": "<redacted:host>",
"sourceip": "127.0.0.1",
"status": "pending"
},
{
"agentversion": "1.20.0",
"decidedat": null,
"decidedby": null,
"deviceid": null,
"hostname": "<redacted:host>",
"lastseenat": "2026-01-01T00:00:00.000000Z",
"matchedassetid": 1,
"reason": null,
"requestedat": "2026-01-01T00:00:00.000000Z",
"requestid": "00000000",
"serialnumber": "<redacted:host>",
"sourceip": "127.0.0.1",
"status": "issued"
}
],
"settings": {
"autoenroll": true,
"maxpendingenrollments": 500,
"revokeddeniessharedkey": false,
"sharedkeyallowed": true
}
},
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 3,
"totalpages": 1
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/endpoints/enrollment/assets/<int:assetid>/allow-reenroll",
"auth": "jwt + role:admin",
"params": "path: assetid (int); body: JSON (fields not yet documented)",
"purpose": "Lift a re-enrollment block. The PC enrolls on its next attempt.",
"example": "curl -X POST http://localhost:5001/api/endpoints/enrollment/assets/1/allow-reenroll -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"responseexample": {
"data": {
"assetid": 1,
"credentialid": 1,
"credentialprefix": "<redacted:secret>",
"enrolledvia": "auto",
"issuedat": "2026-01-01T00:00:00.000000Z",
"lastusedat": null,
"reenrollblocked": false,
"reenrollblockedreason": null,
"revokedat": "2026-01-01T00:00:00.000000Z",
"revokedby": "testadmin"
},
"message": "Re-enrollment allowed",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/endpoints/enrollment/assets/<int:assetid>/revoke",
"auth": "jwt + role:admin",
"params": "path: assetid (int); body: JSON (fields not yet documented)",
"purpose": "Un-enroll a PC. Its agent gets CREDENTIAL_INVALID and enrolls again.",
"example": "curl -X POST http://localhost:5001/api/endpoints/enrollment/assets/1/revoke -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"blockreenroll": true,
"reason": "rollback"
},
"responseexample": {
"data": {
"assetid": 1,
"credentialid": 1,
"credentialprefix": "<redacted:secret>",
"enrolledvia": "auto",
"issuedat": "2026-01-01T00:00:00.000000Z",
"lastusedat": null,
"reenrollblocked": true,
"reenrollblockedreason": "rollback",
"revokedat": "2026-01-01T00:00:00.000000Z",
"revokedby": "testadmin"
},
"message": "Endpoint credential revoked",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/endpoints/enrollment/migration",
"auth": "permission:endpoints.fleet",
"params": "not documented",
"purpose": "Per-computer readiness to move onto per-PC credentials, plus waves.",
"example": "curl http://localhost:5001/api/endpoints/enrollment/migration -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "search",
"type": "string",
"required": false
},
{
"name": "state",
"type": "string",
"required": false
}
],
"responseexample": {
"data": {
"computers": [
{
"agentversion": "1.19.0",
"assetid": 2,
"blockers": [],
"hostname": "<redacted:host>",
"lastreportedat": "2026-01-01T00:00:00.000000Z",
"state": "ready"
},
{
"agentversion": "1.19.0",
"assetid": 3,
"blockers": [],
"hostname": "<redacted:host>",
"lastreportedat": "2026-01-01T00:00:00.000000Z",
"state": "ready"
},
{
"agentversion": "1.20.0",
"assetid": 1,
"blockers": [
"awaiting enrollment"
],
"hostname": "<redacted:host>",
"lastreportedat": "2026-01-01T00:00:00.000000Z",
"state": "blocked"
}
],
"counts": {
"blocked": 1,
"enrolled": 0,
"notreporting": 0,
"pending": 0,
"ready": 2,
"upgrading": 0
},
"target": "1.20.0",
"waves": [
{
"createdat": "2026-01-01T00:00:00Z",
"createdby": "<redacted:person>",
"done": false,
"enrolled": 0,
"failed": 1,
"queued": 3,
"size": 3,
"waveid": 1
},
{
"createdat": "2026-01-01T00:00:00Z",
"createdby": "<redacted:person>",
"done": false,
"enrolled": 0,
"failed": 0,
"queued": 2,
"size": 2,
"waveid": 2
}
]
},
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 3,
"totalpages": 1
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/endpoints/enrollment/migration/wave",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Push the agent upgrade to a batch of READY PCs.",
"example": "curl -X POST http://localhost:5001/api/endpoints/enrollment/migration/wave -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"action": "run_script",
"target": "script:1"
},
"responseexample": {
"data": {
"queued": [
1
],
"retried": [],
"skipped": [
{
"assetid": 2,
"reason": "offline"
},
{
"assetid": 3,
"reason": "notreporting"
},
{
"assetid": 999999,
"reason": "not a computer"
}
],
"waveid": 1
},
"message": "1 PC(s) queued",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "POST",
"path": "/api/endpoints/enrollment/requests/<int:requestid>/approve",
"auth": "jwt + role:admin",
"params": "path: requestid (int); body: JSON (fields not yet documented)",
"purpose": "Bind a pending request to the asset the admin picked.",
"example": "curl -X POST http://localhost:5001/api/endpoints/enrollment/requests/1/approve -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"assetid": 1,
"sethostname": "<redacted:host>"
},
"responseexample": {
"data": {
"agentversion": "1.20.0",
"decidedat": "2026-01-01T00:00:00.000000Z",
"decidedby": "testadmin",
"deviceid": null,
"hostname": "<redacted:host>",
"hostnameresult": "<redacted:host>",
"lastseenat": "2026-01-01T00:00:00.000000Z",
"matchedassetid": 1,
"reason": null,
"requestedat": "2026-01-01T00:00:00.000000Z",
"requestid": "00000000",
"serialnumber": "<redacted:host>",
"sourceip": "127.0.0.1",
"status": "approved"
},
"message": "Enroll request approved; that computer was renamed to the hostname the PC reports",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "POST",
"path": "/api/endpoints/enrollment/requests/<int:requestid>/reject",
"auth": "jwt + role:admin",
"params": "path: requestid (int); body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: endpoints.reject_enroll_request has no docstring.",
"example": "curl -X POST http://localhost:5001/api/endpoints/enrollment/requests/1/reject -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"responseexample": {
"data": {
"agentversion": "1.20.0",
"decidedat": "2026-01-01T00:00:00.000000Z",
"decidedby": "testadmin",
"deviceid": null,
"hostname": "<redacted:host>",
"lastseenat": "2026-01-01T00:00:00.000000Z",
"matchedassetid": 1,
"reason": "awaiting approval",
"requestedat": "2026-01-01T00:00:00.000000Z",
"requestid": "00000000",
"serialnumber": "<redacted:host>",
"sourceip": "127.0.0.1",
"status": "rejected"
},
"message": "Enroll request rejected",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "PUT",
"path": "/api/endpoints/enrollment/settings",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Change the enrollment settings.",
"example": "curl -X PUT http://localhost:5001/api/endpoints/enrollment/settings -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"revokeddeniessharedkey": true
},
"responseexample": {
"data": {
"autoenroll": true,
"maxpendingenrollments": 500,
"revokeddeniessharedkey": false,
"sharedkeyallowed": false
},
"message": "Enrollment settings saved",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/endpoints/logcollections/<int:collection_id>",
"auth": "permission:endpoints.updateapp",
"params": "path: collection_id (int)",
"purpose": "One collected log including its content, for the scrollable pane.",
"example": "curl http://localhost:5001/api/endpoints/logcollections/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/endpoints/logcollections/<int:collection_id>/download",
"auth": "permission:endpoints.updateapp",
"params": "path: collection_id (int)",
"purpose": "Serve a collected log as a file attachment.",
"example": "curl http://localhost:5001/api/endpoints/logcollections/1/download -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/endpoints/monitors",
"auth": "permission:endpoints.view",
"params": "not documented",
"purpose": "List monitor definitions (shipped and local).",
"example": "curl http://localhost:5001/api/endpoints/monitors -H \"Authorization: Bearer $TOK\""
},
{
"method": "POST",
"path": "/api/endpoints/monitors",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a user-defined (local) monitor definition.",
"example": "curl -X POST http://localhost:5001/api/endpoints/monitors -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/endpoints/monitors/<int:monitor_id>",
"auth": "jwt + role:admin",
"params": "path: monitor_id (int)",
"purpose": "Delete a local monitor definition. Shipped rows are protected.",
"example": "curl -X DELETE http://localhost:5001/api/endpoints/monitors/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/endpoints/monitors/<int:monitor_id>",
"auth": "jwt + role:admin",
"params": "path: monitor_id (int); body: JSON (fields not yet documented)",
"purpose": "Update a local monitor definition. Shipped rows are read-only.",
"example": "curl -X PUT http://localhost:5001/api/endpoints/monitors/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"launchpath": "D:\\Dnc\\bin\\DncMain.exe"
},
"responseexample": {
"data": {
"createdat": "2026-01-01T00:00:00.000000Z",
"datacollectorpath": null,
"displayname": "<redacted:person>",
"endpointmonitorid": 1,
"isactive": false,
"kind": "process",
"launchpath": "C:\\Program Files\\Dnc\\bin\\DncMain.exe",
"logcollectorpath": null,
"processname": "UDC",
"servicename": null,
"source": "shipped"
},
"message": "Monitor updated",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/endpoints/monitors/resolve",
"auth": "permission:endpoints.view",
"params": "not documented",
"purpose": "Resolve the monitor set for a PC type (agent runtime fetch).",
"example": "curl http://localhost:5001/api/endpoints/monitors/resolve -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "pctype",
"type": "string",
"required": false
}
]
},
{
"method": "GET",
"path": "/api/endpoints/monitors/resolved",
"auth": "api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)",
"params": "not documented",
"purpose": "Agent watch list: the monitors this endpoint should report on.",
"example": "curl http://localhost:5001/api/endpoints/monitors/resolved -H \"X-API-Key: $KEY\"",
"queryparams": [
{
"name": "hostname",
"type": "string",
"required": false
}
],
"responseexample": {
"data": {
"processes": [
{
"app": "Edge",
"launchpath": "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe",
"name": "msedge.exe"
}
],
"services": []
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/endpoints/operatorreports",
"auth": "api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)",
"params": "body: JSON (fields not yet documented)",
"purpose": "Agent uploads one operator issue report (collector-token auth).",
"example": "curl -X POST http://localhost:5001/api/endpoints/operatorreports -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'",
"responseexample": {
"data": {
"assetid": 1,
"createdat": "2026-01-01T00:00:00.000000Z",
"details": "the CMM app will not start",
"hasimage": true,
"imagebytesize": 70,
"imagemimetype": "image/png",
"operatorreportid": 1,
"reason": "Other (free text)",
"reportedhostname": "<redacted:host>"
},
"message": "Operator report received",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/endpoints/operatorreports/<int:operatorreportid>/image",
"auth": "permission:endpoints.operatorreports",
"params": "path: operatorreportid (int)",
"purpose": "Serve one operator report's screenshot.",
"example": "curl http://localhost:5001/api/endpoints/operatorreports/1/image -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/endpoints/panel/<int:asset_id>/operatorreports",
"auth": "permission:endpoints.operatorreports",
"params": "path: asset_id (int)",
"purpose": "Operator Reports panel: this PC's recent operator issue reports.",
"example": "curl http://localhost:5001/api/endpoints/panel/1/operatorreports -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"reports": [
{
"assetid": 1,
"createdat": "2026-01-01T00:00:00.000000Z",
"details": "second",
"hasimage": false,
"imagebytesize": null,
"imagemimetype": null,
"operatorreportid": 2,
"reason": "Other (free text)",
"reportedhostname": "<redacted:host>"
},
{
"assetid": 1,
"createdat": "2026-01-01T00:00:00.000000Z",
"details": "first",
"hasimage": false,
"imagebytesize": null,
"imagemimetype": null,
"operatorreportid": 1,
"reason": "Other (free text)",
"reportedhostname": "<redacted:host>"
}
]
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/endpoints/scriptbody/<int:script_id>",
"auth": "api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)",
"params": "path: script_id (int)",
"purpose": "Agent-facing script body download (collector-token auth).",
"example": "curl http://localhost:5001/api/endpoints/scriptbody/1 -H \"X-API-Key: $KEY\""
},
{
"method": "GET",
"path": "/api/endpoints/settings/server-cert",
"auth": "jwt + role:admin",
"params": "not documented",
"purpose": "Get details about the current server certificate.",
"example": "curl http://localhost:5001/api/endpoints/settings/server-cert -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"expires_in_days": 29,
"is_self_signed": true,
"issuer": "CN = pin.example.test",
"not_after": "Oct 18 18:57:47 2026 GMT",
"not_before": "Sep 17 18:57:47 2026 GMT",
"san_list": [],
"sha1thumbprint": "<redacted:digest>",
"spkisha256": "<redacted:digest>",
"subject_cn": "pin.example.test",
"thumbprint": "99:F1:E1:1D:5A:66:EE:44:8C:CA:5C:D8:BF:EA:C3:F3:8F:82:40:D3:5E:C9:4D:F0:AC:0B:3C:AD:80:D7:C1:DF"
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/endpoints/settings/server-cert/download",
"auth": "permission:endpoints.fleet",
"params": "not documented",
"purpose": "The PUBLIC server certificate as a DER .cer file, never the key.",
"example": "curl http://localhost:5001/api/endpoints/settings/server-cert/download -H \"Authorization: Bearer $TOK\""
},
{
"method": "POST",
"path": "/api/endpoints/settings/server-cert/generate",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Generate a new self-signed server certificate.",
"example": "curl -X POST http://localhost:5001/api/endpoints/settings/server-cert/generate -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"cn": "shopdb.example.test",
"days": 30,
"san": "<redacted:address>"
},
"responseexample": {
"data": {
"message": "Certificate generated successfully. Nginx is restarting."
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/endpoints/settings/server-cert/live",
"auth": "permission:endpoints.fleet",
"params": "not documented",
"purpose": "The certificate PCs actually receive from this site's public address.",
"example": "curl http://localhost:5001/api/endpoints/settings/server-cert/live -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"configured": true,
"error": "Could not read the certificate from shopdb.example.test:443 (Connection refused)",
"matchesfile": false,
"presentedsha1thumbprint": null,
"presentedspkisha256": null,
"url": "https://shopdb.example.test"
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/endpoints/settings/server-cert/upload",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Upload a new server certificate and private key.",
"example": "curl -X POST http://localhost:5001/api/endpoints/settings/server-cert/upload -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"responseexample": {
"data": {
"message": "Certificate uploaded successfully. Nginx is restarting."
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/endpoints/siteagent",
"auth": "permission:endpoints.agentpackage",
"params": "not documented",
"purpose": "Report whether the site agent build has a prebuilt binary staged.",
"example": "curl http://localhost:5001/api/endpoints/siteagent -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"agentcurrent": null,
"agentlegacy": null,
"agentstaged": false,
"agentversions": [],
"certavailable": true,
"serverpin": "<redacted:digest>",
"sharedkeyallowed": false,
"traycurrent": null,
"traylegacy": null,
"traystaged": false,
"trayversions": []
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/endpoints/siteagent/binaries/<binkey>",
"auth": "permission:endpoints.agentpackage",
"params": "path: binkey (string)",
"purpose": "List staged versions for a binary (agent or tray), newest first.",
"example": "curl http://localhost:5001/api/endpoints/siteagent/binaries/x -H \"Authorization: Bearer $TOK\""
},
{
"method": "POST",
"path": "/api/endpoints/siteagent/binaries/<binkey>",
"auth": "permission:endpoints.agentpackage",
"params": "path: binkey (string); body: JSON (fields not yet documented)",
"purpose": "Stage an uploaded binary as a new version.",
"example": "curl -X POST http://localhost:5001/api/endpoints/siteagent/binaries/x -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"responseexample": {
"data": {
"binary": "agent",
"current": "<redacted:address>",
"registration": {
"agentversion": "<redacted:address>",
"appid": 1,
"appname": "ShopDB Endpoint Agent",
"contents": {
"agent": {
"filename": "shopdbagent.exe",
"sha256": "<redacted:digest>",
"version": "<redacted:address>"
}
},
"created": false,
"installpath": "/api/applications/package/1/shopdb-endpoint-agent.zip",
"ok": true,
"sha256": "<redacted:digest>",
"size": 135
},
"versions": [
{
"iscurrent": true,
"size": 130,
"uploadedat": "2026-01-01T00:00:00.000000Z",
"version": "<redacted:address>"
},
{
"iscurrent": false,
"size": 130,
"uploadedat": "2026-01-01T00:00:00.000000Z",
"version": "<redacted:address>"
}
]
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "POST",
"path": "/api/endpoints/siteagent/binaries/<binkey>/adopt",
"auth": "permission:endpoints.agentpackage",
"params": "path: binkey (string); body: JSON (fields not yet documented)",
"purpose": "Adopt the unmanaged legacy flat file into the version store.",
"example": "curl -X POST http://localhost:5001/api/endpoints/siteagent/binaries/x/adopt -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "PUT",
"path": "/api/endpoints/siteagent/binaries/<binkey>/current",
"auth": "permission:endpoints.agentpackage",
"params": "path: binkey (string); body: JSON (fields not yet documented)",
"purpose": "Point 'current' at an already-staged version (roll back or forward).",
"example": "curl -X PUT http://localhost:5001/api/endpoints/siteagent/binaries/x/current -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"version": "<redacted:address>"
},
"responseexample": {
"data": {
"binary": "agent",
"current": "<redacted:address>",
"registration": {
"agentversion": "<redacted:address>",
"appid": 1,
"appname": "ShopDB Endpoint Agent",
"contents": {
"agent": {
"filename": "shopdbagent.exe",
"sha256": "<redacted:digest>",
"version": "<redacted:address>"
}
},
"created": false,
"installpath": "/api/applications/package/1/shopdb-endpoint-agent.zip",
"ok": true,
"sha256": "<redacted:digest>",
"size": 135
},
"versions": [
{
"iscurrent": false,
"size": 258,
"uploadedat": "2026-01-01T00:00:00.000000Z",
"version": "<redacted:address>"
},
{
"iscurrent": true,
"size": 258,
"uploadedat": "2026-01-01T00:00:00.000000Z",
"version": "<redacted:address>"
}
]
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "POST",
"path": "/api/endpoints/siteagent/binaries/<binkey>/detect",
"auth": "permission:endpoints.agentpackage",
"params": "path: binkey (string); body: JSON (fields not yet documented)",
"purpose": "Read the PE file version of an uploaded EXE without staging it.",
"example": "curl -X POST http://localhost:5001/api/endpoints/siteagent/binaries/x/detect -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "GET",
"path": "/api/endpoints/siteagent/bootstrap.ps1",
"auth": "api-key (single-use bootstrap token in the X-Endpoint-Bootstrap-Token header, or ?t= while that is enabled; per-IP rate limited, 404 when not usable)",
"params": "not documented",
"purpose": "The PowerShell the one-line command downloads, runs and deletes.",
"example": "curl http://localhost:5001/api/endpoints/siteagent/bootstrap.ps1"
},
{
"method": "GET",
"path": "/api/endpoints/siteagent/bootstrap/package",
"auth": "api-key (single-use bootstrap token in the X-Endpoint-Bootstrap-Token header, or ?t= while that is enabled; per-IP rate limited, 404 when not usable)",
"params": "not documented",
"purpose": "The keyless agent package the bootstrap script installs.",
"example": "curl http://localhost:5001/api/endpoints/siteagent/bootstrap/package"
},
{
"method": "GET",
"path": "/api/endpoints/siteagent/bootstrap/tokens",
"auth": "jwt + role:admin",
"params": "not documented",
"purpose": "Every bootstrap token, newest first. Never a secret.",
"example": "curl http://localhost:5001/api/endpoints/siteagent/bootstrap/tokens -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"tokens": [
{
"createdat": "2026-01-01T00:00:00.000000Z",
"createdby": "<redacted:person>",
"expiresat": "2026-01-01T00:00:00.000000Z",
"lastusedat": null,
"lastusedip": null,
"maxuses": 25,
"remaining": 25,
"revokedat": null,
"state": "active",
"tokenid": 1,
"tokenprefix": "<redacted:secret>",
"usecount": 0
}
]
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/endpoints/siteagent/bootstrap/tokens",
"auth": "jwt + role:admin",
"params": "body: JSON (fields not yet documented)",
"purpose": "Mint one short-lived bootstrap token. The secret is returned ONCE.",
"example": "curl -X POST http://localhost:5001/api/endpoints/siteagent/bootstrap/tokens -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"hours": 6,
"maxuses": 3
},
"responseexample": {
"data": {
"command": "powershell -ExecutionPolicy Bypass -c \"try { New-Item -ItemType Directory -Force -Path 'C:\\Program Files\\ShopDB\\bootstrap' | Out-Null; icacls 'C:\\Program Files\\ShopDB\\bootstrap' /inheritance:r /grant ...",
"scripturl": "https://shopdb.test/shopdb/api/endpoints/siteagent/bootstrap.ps1?t=<redacted:token>&via=download",
"secret": "<redacted:secret>",
"token": {
"createdat": "2026-01-01T00:00:00.000000Z",
"createdby": "<redacted:person>",
"expiresat": "2026-01-01T00:00:00.000000Z",
"lastusedat": null,
"lastusedip": null,
"maxuses": 500,
"remaining": 500,
"revokedat": null,
"state": "active",
"tokenid": 1,
"tokenprefix": "<redacted:secret>",
"usecount": 0
}
},
"message": "Bootstrap token created. The command is shown once.",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "POST",
"path": "/api/endpoints/siteagent/bootstrap/tokens/<int:tokenid>/revoke",
"auth": "jwt + role:admin",
"params": "path: tokenid (int); body: JSON (fields not yet documented)",
"purpose": "Kill a bootstrap token now. Already-revoked is a no-op, not an error.",
"example": "curl -X POST http://localhost:5001/api/endpoints/siteagent/bootstrap/tokens/1/revoke -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"responseexample": {
"data": {
"token": {
"createdat": "2026-01-01T00:00:00.000000Z",
"createdby": "<redacted:person>",
"expiresat": "2026-01-01T00:00:00.000000Z",
"lastusedat": null,
"lastusedip": null,
"maxuses": 25,
"remaining": 25,
"revokedat": "2026-01-01T00:00:00.000000Z",
"state": "revoked",
"tokenid": 1,
"tokenprefix": "<redacted:secret>",
"usecount": 0
}
},
"message": "Bootstrap token revoked",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/endpoints/siteagent/package",
"auth": "permission:endpoints.agentpackage",
"params": "body: JSON (fields not yet documented)",
"purpose": "Bundle the site agent as a downloadable ZIP.",
"example": "curl -X POST http://localhost:5001/api/endpoints/siteagent/package -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"baseurl": "https://shopdb.test",
"bundlecert": true,
"cadenceseconds": 900,
"collectorkey": "<redacted:token>",
"nextserverpin": "<redacted:digest>"
},
"readsbody": true
}
]
},
{
"surface": "plugin-guides",
"endpoints": [
{
"method": "GET",
"path": "/api/guides",
"auth": "permission:guides.view",
"params": "not documented",
"purpose": "Published guides, plus the caller's own drafts if they can author.",
"example": "curl http://localhost:5001/api/guides -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "q",
"type": "string",
"required": false
},
{
"name": "tag",
"type": "string",
"required": false
}
],
"responseexample": {
"data": [
{
"canedit": false,
"checklistitems": 0,
"createdat": "2026-01-01T00:00:00.000000Z",
"guideid": 1,
"ispublished": true,
"publishedat": "2026-01-01T00:00:00.000000Z",
"revision": 2,
"slug": "published-procedure",
"status": "published",
"summary": null,
"tags": [],
"title": "Published procedure",
"updatedat": "2026-01-01T00:00:00.000000Z"
}
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/guides",
"auth": "permission:guides.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: guides.create_guide has no docstring.",
"example": "curl -X POST http://localhost:5001/api/guides -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"blocks": [],
"title": "Replacing a marker controler"
},
"responseexample": {
"data": {
"blocks": [],
"createdat": "2026-01-01T00:00:00.000000Z",
"guideid": 1,
"publishedat": null,
"revision": 1,
"slug": "replacing-a-marker-controler",
"status": "draft",
"summary": null,
"tags": [],
"title": "Replacing a marker controler",
"updatedat": "2026-01-01T00:00:00.000000Z"
},
"message": "Guide created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/guides/<int:guideid>",
"auth": "permission:guides.delete",
"params": "path: guideid (int)",
"purpose": "UNDOCUMENTED: guides.delete_guide has no docstring.",
"example": "curl -X DELETE http://localhost:5001/api/guides/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/guides/<int:guideid>",
"auth": "permission:guides.view",
"params": "path: guideid (int); body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: guides.update_guide has no docstring.",
"example": "curl -X PUT http://localhost:5001/api/guides/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"blocks": [],
"title": "Replacing a marker controller"
},
"responseexample": {
"data": {
"blocks": [],
"createdat": "2026-01-01T00:00:00.000000Z",
"guideid": 1,
"publishedat": null,
"revision": 2,
"saved": true,
"slug": "replacing-a-marker-controler",
"status": "draft",
"summary": null,
"tags": [],
"title": "Replacing a marker controller",
"updatedat": "2026-01-01T00:00:00.000000Z"
},
"message": "Saved",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "POST",
"path": "/api/guides/<int:guideid>/publish",
"auth": "permission:guides.publish",
"params": "path: guideid (int); body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: guides.publish_guide has no docstring.",
"example": "curl -X POST http://localhost:5001/api/guides/1/publish -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'"
},
{
"method": "POST",
"path": "/api/guides/<int:guideid>/restore/<int:revisionid>",
"auth": "permission:guides.view",
"params": "path: guideid (int), revisionid (int); body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: guides.restore_revision has no docstring.",
"example": "curl -X POST http://localhost:5001/api/guides/1/restore/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'"
},
{
"method": "GET",
"path": "/api/guides/<int:guideid>/revisions",
"auth": "permission:guides.view",
"params": "path: guideid (int)",
"purpose": "UNDOCUMENTED: guides.list_revisions has no docstring.",
"example": "curl http://localhost:5001/api/guides/1/revisions -H \"Authorization: Bearer $TOK\""
},
{
"method": "POST",
"path": "/api/guides/<int:guideid>/unpublish",
"auth": "permission:guides.publish",
"params": "path: guideid (int); body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: guides.unpublish_guide has no docstring.",
"example": "curl -X POST http://localhost:5001/api/guides/1/unpublish -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'"
},
{
"method": "GET",
"path": "/api/guides/<int:guideid>/working",
"auth": "permission:guides.view",
"params": "path: guideid (int)",
"purpose": "The working copy, for the editor.",
"example": "curl http://localhost:5001/api/guides/1/working -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/guides/<slug>",
"auth": "permission:guides.view",
"params": "path: slug (string)",
"purpose": "What a reader gets: the published revision.",
"example": "curl http://localhost:5001/api/guides/x -H \"Authorization: Bearer $TOK\""
},
{
"method": "POST",
"path": "/api/guides/images",
"auth": "permission:guides.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "Take a pasted or dropped image.",
"example": "curl -X POST http://localhost:5001/api/guides/images -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"responseexample": {
"data": {
"bytesize": 40,
"createdat": "2026-01-01T00:00:00.000000Z",
"filename": "screenshot.png",
"guideid": null,
"guideimageid": 1,
"mimetype": "image/png",
"url": "/api/guides/images/1"
},
"message": "Image uploaded",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/guides/images/<int:imageid>",
"auth": "permission:guides.view",
"params": "path: imageid (int)",
"purpose": "The image itself, under the same rule as the guide that holds it.",
"example": "curl http://localhost:5001/api/guides/images/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/guides/revisions/<int:revisionid>",
"auth": "permission:guides.view",
"params": "path: revisionid (int)",
"purpose": "One revision by id.",
"example": "curl http://localhost:5001/api/guides/revisions/1 -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"blocks": [
{
"id": "b1",
"text": "secret draft wording",
"type": "paragraph"
}
],
"createdat": "2026-01-01T00:00:00.000000Z",
"createdby": "<redacted:person>",
"guideid": 1,
"guiderevisionid": 1,
"note": null,
"revision": 1,
"shorthash": "<redacted:secret>",
"summary": null,
"tags": [],
"title": "Published procedure"
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/guides/tags",
"auth": "permission:guides.view",
"params": "not documented",
"purpose": "Every tag in use, with a count, for the filter chips.",
"example": "curl http://localhost:5001/api/guides/tags -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
}
]
},
{
"surface": "plugin-knowledgebase",
"endpoints": [
{
"method": "GET",
"path": "/api/knowledgebase",
"auth": "permission:kb.view",
"params": "not documented",
"purpose": "List all knowledge base articles.",
"example": "curl http://localhost:5001/api/knowledgebase -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "appid",
"type": "integer",
"required": false
},
{
"name": "linkurl",
"type": "string",
"required": false
},
{
"name": "order",
"type": "string",
"required": false,
"default": "desc"
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
},
{
"name": "search",
"type": "string",
"required": false
},
{
"name": "shortdescription",
"type": "string",
"required": false
},
{
"name": "sort",
"type": "string",
"required": false,
"default": "clicks"
}
],
"responseexample": {
"data": [
{
"appid": 1,
"application": {
"appid": 1,
"appname": "Spotfire"
},
"clicks": 0,
"createddate": "2026-01-01T00:00:00.000000Z",
"isactive": true,
"keywords": "install",
"lastupdated": "2026-01-01T00:00:00.000000Z",
"linkid": 3,
"linkurl": "https://kb.example/c",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"shortdescription": "Spotfire install guide"
},
{
"appid": 1,
"application": {
"appid": 1,
"appname": "Spotfire"
},
"clicks": 0,
"createddate": "2026-01-01T00:00:00.000000Z",
"isactive": true,
"keywords": "export",
"lastupdated": "2026-01-01T00:00:00.000000Z",
"linkid": 2,
"linkurl": "https://kb.example/b",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"shortdescription": "Export a visualization"
},
{
"appid": 1,
"application": {
"appid": 1,
"appname": "Spotfire"
},
"clicks": 0,
"createddate": "2026-01-01T00:00:00.000000Z",
"isactive": true,
"keywords": "login",
"lastupdated": "2026-01-01T00:00:00.000000Z",
"linkid": 1,
"linkurl": "https://kb.example/a",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"shortdescription": "Dashboard login steps"
}
],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 3,
"totalpages": 1
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/knowledgebase",
"auth": "permission:kb.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a new knowledge base article.",
"example": "curl -X POST http://localhost:5001/api/knowledgebase -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"keywords": "printer reset",
"linkurl": "https://kb.example/printer-reset",
"shortdescription": "How to reset a printer"
},
"responseexample": {
"data": {
"appid": null,
"clicks": 0,
"createddate": "2026-01-01T00:00:00.000000Z",
"isactive": true,
"keywords": "printer reset",
"lastupdated": "2026-01-01T00:00:00.000000Z",
"linkid": 1,
"linkurl": "https://kb.example/printer-reset",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"shortdescription": "How to reset a printer"
},
"message": "Article created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/knowledgebase/<int:link_id>",
"auth": "permission:kb.delete",
"params": "path: link_id (int)",
"purpose": "Delete (deactivate) a knowledge base article.",
"example": "curl -X DELETE http://localhost:5001/api/knowledgebase/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/knowledgebase/<int:link_id>",
"auth": "permission:kb.view",
"params": "path: link_id (int)",
"purpose": "Get a single knowledge base article.",
"example": "curl http://localhost:5001/api/knowledgebase/1 -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"appid": null,
"application": null,
"clicks": 0,
"createddate": "2026-01-01T00:00:00.000000Z",
"isactive": true,
"keywords": "printer reset",
"lastupdated": "2026-01-01T00:00:00.000000Z",
"linkid": 1,
"linkurl": "https://kb.example/printer-reset",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"shortdescription": "How to reset a printer"
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "PUT",
"path": "/api/knowledgebase/<int:link_id>",
"auth": "permission:kb.edit",
"params": "path: link_id (int); body: JSON (fields not yet documented)",
"purpose": "Update a knowledge base article.",
"example": "curl -X PUT http://localhost:5001/api/knowledgebase/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "POST",
"path": "/api/knowledgebase/<int:link_id>/click",
"auth": "permission:kb.view",
"params": "path: link_id (int); body: JSON (fields not yet documented)",
"purpose": "Increment the click counter for an article the caller is allowed to read.",
"example": "curl -X POST http://localhost:5001/api/knowledgebase/1/click -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'"
},
{
"method": "GET",
"path": "/api/knowledgebase/stats",
"auth": "permission:kb.view",
"params": "not documented",
"purpose": "Get knowledge base statistics.",
"example": "curl http://localhost:5001/api/knowledgebase/stats -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"totalarticles": 0,
"totalclicks": 0
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
}
]
},
{
"surface": "plugin-machines",
"endpoints": [
{
"method": "GET",
"path": "/api/machines",
"auth": "permission:machines.view",
"params": "not documented",
"purpose": "List all machines with filtering and pagination.",
"example": "curl http://localhost:5001/api/machines -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "assetnumber",
"type": "string",
"required": false
},
{
"name": "businessunit_id",
"type": "integer",
"required": false
},
{
"name": "businessunitid",
"type": "integer",
"required": false
},
{
"name": "dir",
"type": "string",
"required": false,
"default": "asc"
},
{
"name": "location_id",
"type": "integer",
"required": false
},
{
"name": "locationid",
"type": "integer",
"required": false
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
},
{
"name": "search",
"type": "string",
"required": false
},
{
"name": "sort",
"type": "string",
"required": false,
"default": "assetnumber"
},
{
"name": "type_id",
"type": "integer",
"required": false
},
{
"name": "typeid",
"type": "integer",
"required": false
},
{
"name": "vendor_id",
"type": "integer",
"required": false
},
{
"name": "vendorid",
"type": "integer",
"required": false
}
],
"responseexample": {
"data": [
{
"assetid": 1,
"assetnumber": "2007",
"assettypecolor": null,
"assettypeid": 1,
"assettypename": "machine",
"businessunitid": null,
"createdby": "<redacted:person>",
"createddate": "2026-01-01T00:00:00.000000Z",
"deletedby": null,
"deleteddate": null,
"dualpathpartner": {
"assetid": 2,
"assetnumber": "2008",
"machineid": 2
},
"gaugelabreference": null,
"isactive": true,
"levelid": null,
"locationcode": null,
"locationid": null,
"machine": {
"assetid": 1,
"controllermodelid": null,
"controllervendorid": null,
"createddate": "2026-01-01T00:00:00.000000Z",
"isactive": true,
"islocationonly": false,
"lastmaintenancedate": null,
"machineid": 1,
"machinetypeid": null,
"maintenanceintervaldays": null,
"modelnumberid": null,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"nextmaintenancedate": null,
"requiresmanualconfig": false,
"vendorid": null
},
"maintenancereference": null,
"mapverifiedat": null,
"mapx": 100,
"mapy": 100,
"modifiedby": "<redacted:person>",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"name": null,
"notes": null,
"ownlevelid": null,
"ownlocationid": null,
"ownmapx": 100,
"ownmapy": 100,
"pluginid": 1,
"serialnumber": "<redacted:host>",
"statusid": 1
}
],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 1,
"totalpages": 1
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/machines",
"auth": "permission:machines.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create new machine (creates both Asset and Machine records).",
"example": "curl -X POST http://localhost:5001/api/machines -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"assetnumber": "MAINT-DATE-1",
"lastmaintenancedate": "2026-01-01",
"name": "Maintenance date probe",
"nextmaintenancedate": "2026-01-01"
},
"responseexample": {
"data": {
"assetid": 1,
"assetnumber": "MAINT-DATE-1",
"assettypecolor": null,
"assettypeid": 1,
"assettypename": "machine",
"businessunitid": null,
"createdby": "<redacted:person>",
"createddate": "2026-01-01T00:00:00.000000Z",
"deletedby": null,
"deleteddate": null,
"gaugelabreference": null,
"isactive": true,
"levelid": null,
"locationcode": null,
"locationid": null,
"machine": {
"assetid": 1,
"controllermodelid": null,
"controllervendorid": null,
"createddate": "2026-01-01T00:00:00.000000Z",
"isactive": true,
"islocationonly": false,
"lastmaintenancedate": "2026-01-01",
"machineid": 1,
"machinetypeid": null,
"maintenanceintervaldays": null,
"modelnumberid": null,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"nextmaintenancedate": "2026-01-01",
"requiresmanualconfig": false,
"vendorid": null
},
"maintenancereference": null,
"mapverifiedat": null,
"mapx": null,
"mapy": null,
"modifiedby": "<redacted:person>",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"name": "Maintenance date probe",
"notes": null,
"ownlevelid": null,
"ownlocationid": null,
"ownmapx": null,
"ownmapy": null,
"pluginid": 1,
"serialnumber": "<redacted:host>",
"statusid": 1
},
"message": "Machine created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/machines/<int:machine_id>",
"auth": "permission:machines.delete",
"params": "path: machine_id (int)",
"purpose": "Delete (soft delete) machine.",
"example": "curl -X DELETE http://localhost:5001/api/machines/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/machines/<int:machine_id>",
"auth": "permission:machines.view",
"params": "path: machine_id (int)",
"purpose": "Get a single machine item with full details.",
"example": "curl http://localhost:5001/api/machines/1 -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"assetid": 1,
"assetnumber": "2007",
"assettypecolor": null,
"assettypeid": 1,
"assettypename": "machine",
"businessunitid": null,
"createdby": "<redacted:person>",
"createddate": "2026-01-01T00:00:00.000000Z",
"deletedby": null,
"deleteddate": null,
"dualpathpartner": {
"assetid": 2,
"assetnumber": "2008",
"machineid": 2
},
"gaugelabreference": null,
"isactive": true,
"levelid": null,
"locationcode": null,
"locationid": null,
"machine": {
"assetid": 1,
"controllermodelid": null,
"controllervendorid": null,
"createddate": "2026-01-01T00:00:00.000000Z",
"isactive": true,
"islocationonly": false,
"lastmaintenancedate": null,
"machineid": 1,
"machinetypeid": null,
"maintenanceintervaldays": null,
"modelnumberid": null,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"nextmaintenancedate": null,
"requiresmanualconfig": false,
"vendorid": null
},
"maintenancereference": null,
"mapverifiedat": null,
"mapx": 100,
"mapy": 100,
"modifiedby": "<redacted:person>",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"name": null,
"notes": null,
"ownlevelid": null,
"ownlocationid": null,
"ownmapx": 100,
"ownmapy": 100,
"pluginid": 1,
"serialnumber": "<redacted:host>",
"statusid": 1
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "PUT",
"path": "/api/machines/<int:machine_id>",
"auth": "permission:machines.edit",
"params": "path: machine_id (int); body: JSON (fields not yet documented)",
"purpose": "Update machine (both Asset and Machine records).",
"example": "curl -X PUT http://localhost:5001/api/machines/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "GET",
"path": "/api/machines/by-asset/<int:asset_id>",
"auth": "permission:machines.view",
"params": "path: asset_id (int)",
"purpose": "Get machine data by asset ID.",
"example": "curl http://localhost:5001/api/machines/by-asset/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/machines/dashboard/outofservice",
"auth": "permission:machines.view",
"params": "not documented",
"purpose": "Machines whose status says they are not running.",
"example": "curl http://localhost:5001/api/machines/dashboard/outofservice -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/machines/dashboard/summary",
"auth": "permission:machines.view",
"params": "not documented",
"purpose": "Get machine dashboard summary data.",
"example": "curl http://localhost:5001/api/machines/dashboard/summary -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"bystatus": [
{
"count": 1,
"status": "In Use"
}
],
"bytype": [],
"total": 1
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/machines/types",
"auth": "permission:machines.view",
"params": "not documented",
"purpose": "List all machine types.",
"example": "curl http://localhost:5001/api/machines/types -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
},
{
"name": "search",
"type": "string",
"required": false
}
],
"responseexample": {
"data": [],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 0,
"totalpages": 0
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/machines/types",
"auth": "permission:machines.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a new machine type.",
"example": "curl -X POST http://localhost:5001/api/machines/types -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/machines/types/<int:type_id>",
"auth": "permission:machines.delete",
"params": "path: type_id (int)",
"purpose": "Delete a machine type. Refused if any asset still uses it.",
"example": "curl -X DELETE http://localhost:5001/api/machines/types/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/machines/types/<int:type_id>",
"auth": "permission:machines.view",
"params": "path: type_id (int)",
"purpose": "Get a single machine type.",
"example": "curl http://localhost:5001/api/machines/types/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/machines/types/<int:type_id>",
"auth": "permission:machines.edit",
"params": "path: type_id (int); body: JSON (fields not yet documented)",
"purpose": "Update a machine type.",
"example": "curl -X PUT http://localhost:5001/api/machines/types/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
}
]
},
{
"surface": "plugin-network",
"endpoints": [
{
"method": "GET",
"path": "/api/network",
"auth": "permission:network.view",
"params": "not documented",
"purpose": "List all network devices with filtering and pagination.",
"example": "curl http://localhost:5001/api/network -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "assetnumber",
"type": "string",
"required": false
},
{
"name": "businessunit_id",
"type": "integer",
"required": false
},
{
"name": "businessunitid",
"type": "integer",
"required": false
},
{
"name": "dir",
"type": "string",
"required": false,
"default": "asc"
},
{
"name": "location_id",
"type": "integer",
"required": false
},
{
"name": "locationid",
"type": "integer",
"required": false
},
{
"name": "managed",
"type": "string",
"required": false
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
},
{
"name": "poe",
"type": "string",
"required": false
},
{
"name": "search",
"type": "string",
"required": false
},
{
"name": "sort",
"type": "string",
"required": false,
"default": "hostname"
},
{
"name": "type_id",
"type": "integer",
"required": false
},
{
"name": "typeid",
"type": "integer",
"required": false
},
{
"name": "vendor_id",
"type": "integer",
"required": false
},
{
"name": "vendorid",
"type": "integer",
"required": false
}
],
"responseexample": {
"data": [
{
"assetid": 1,
"assetnumber": "NET-1",
"assettypecolor": null,
"assettypeid": 1,
"assettypename": "network_device",
"businessunitid": null,
"createdby": "<redacted:person>",
"createddate": "2026-01-01T00:00:00.000000Z",
"deletedby": null,
"deleteddate": null,
"gaugelabreference": null,
"ipaddress": "<redacted:host>",
"isactive": true,
"levelid": null,
"locationcode": null,
"locationid": null,
"maintenancereference": null,
"mapverifiedat": null,
"mapx": null,
"mapy": null,
"modifiedby": "<redacted:person>",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"name": null,
"networkdevice": {
"assetid": 1,
"createddate": "2026-01-01T00:00:00.000000Z",
"firmwareversion": null,
"hostname": "<redacted:host>",
"isactive": true,
"ismanaged": false,
"ispoe": false,
"modelnumberid": null,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"networkdeviceid": 1,
"networkdevicetypeid": 1,
"networkdevicetypename": "Switch",
"portcount": null,
"rackunit": null,
"vendorid": 1,
"vendorname": "Cisco"
},
"notes": null,
"ownlevelid": null,
"ownlocationid": null,
"ownmapx": null,
"ownmapy": null,
"pluginid": 1,
"serialnumber": "<redacted:host>",
"statusid": 1
}
],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 1,
"totalpages": 1
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/network",
"auth": "permission:network.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create new network device (creates both Asset and NetworkDevice records).",
"example": "curl -X POST http://localhost:5001/api/network -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"assetnumber": "SW-CORE-01",
"hostname": "<redacted:host>",
"ipaddress": "<redacted:host>",
"name": "Core switch"
},
"responseexample": {
"data": {
"assetid": 1,
"assetnumber": "APNL-Dock-Door-4",
"assettypecolor": null,
"assettypeid": 1,
"assettypename": "network_device",
"businessunitid": null,
"createdby": "<redacted:person>",
"createddate": "2026-01-01T00:00:00.000000Z",
"deletedby": null,
"deleteddate": null,
"gaugelabreference": null,
"ipaddress": "<redacted:host>",
"isactive": true,
"levelid": null,
"locationcode": null,
"locationid": null,
"maintenancereference": null,
"mapverifiedat": null,
"mapx": null,
"mapy": null,
"modifiedby": "<redacted:person>",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"name": "Dock Door 4",
"networkdevice": {
"assetid": 1,
"createddate": "2026-01-01T00:00:00.000000Z",
"firmwareversion": null,
"hostname": "<redacted:host>",
"isactive": true,
"ismanaged": false,
"ispoe": false,
"modelnumberid": null,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"networkdeviceid": 1,
"networkdevicetypeid": 1,
"networkdevicetypename": "Access Panel",
"portcount": null,
"rackunit": null,
"vendorid": null
},
"notes": null,
"ownlevelid": null,
"ownlocationid": null,
"ownmapx": null,
"ownmapy": null,
"pluginid": 1,
"serialnumber": "<redacted:host>",
"statusid": 1
},
"message": "Network device created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/network/<int:device_id>",
"auth": "permission:network.delete",
"params": "path: device_id (int)",
"purpose": "Delete (soft delete) network device.",
"example": "curl -X DELETE http://localhost:5001/api/network/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/network/<int:device_id>",
"auth": "permission:network.view",
"params": "path: device_id (int)",
"purpose": "Get a single network device with full details.",
"example": "curl http://localhost:5001/api/network/1 -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"assetid": 1,
"assetnumber": "AST-networkdevice",
"assettypecolor": null,
"assettypeid": 3,
"assettypename": "network_device",
"businessunitid": null,
"createdby": "<redacted:person>",
"createddate": "2026-01-01T00:00:00.000000Z",
"deletedby": null,
"deleteddate": null,
"gaugelabreference": "GL-2",
"ipaddress": "<redacted:host>",
"isactive": true,
"levelid": null,
"locationcode": null,
"locationid": null,
"maintenancereference": "MNT-2",
"mapverifiedat": null,
"mapx": null,
"mapy": null,
"modifiedby": "<redacted:person>",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"name": null,
"networkdevice": {
"assetid": 1,
"createddate": "2026-01-01T00:00:00.000000Z",
"firmwareversion": null,
"hostname": "<redacted:host>",
"isactive": true,
"ismanaged": false,
"ispoe": false,
"modelnumberid": null,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"networkdeviceid": 1,
"networkdevicetypeid": null,
"portcount": null,
"rackunit": null,
"vendorid": null
},
"notes": null,
"ownlevelid": null,
"ownlocationid": null,
"ownmapx": null,
"ownmapy": null,
"pluginid": 1,
"serialnumber": "<redacted:host>",
"statusid": 1
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "PUT",
"path": "/api/network/<int:device_id>",
"auth": "permission:network.edit",
"params": "path: device_id (int); body: JSON (fields not yet documented)",
"purpose": "Update network device (both Asset and NetworkDevice records).",
"example": "curl -X PUT http://localhost:5001/api/network/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"gaugelabreference": "GL-2",
"maintenancereference": "MNT-2"
},
"responseexample": {
"data": {
"assetid": 1,
"assetnumber": "AST-networkdevice",
"assettypecolor": null,
"assettypeid": 3,
"assettypename": "network_device",
"businessunitid": null,
"createdby": "<redacted:person>",
"createddate": "2026-01-01T00:00:00.000000Z",
"deletedby": null,
"deleteddate": null,
"gaugelabreference": "GL-2",
"ipaddress": "<redacted:host>",
"isactive": true,
"levelid": null,
"locationcode": null,
"locationid": null,
"maintenancereference": "MNT-2",
"mapverifiedat": null,
"mapx": null,
"mapy": null,
"modifiedby": "<redacted:person>",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"name": null,
"networkdevice": {
"assetid": 1,
"createddate": "2026-01-01T00:00:00.000000Z",
"firmwareversion": null,
"hostname": "<redacted:host>",
"isactive": true,
"ismanaged": false,
"ispoe": false,
"modelnumberid": null,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"networkdeviceid": 1,
"networkdevicetypeid": null,
"portcount": null,
"rackunit": null,
"vendorid": null
},
"notes": null,
"ownlevelid": null,
"ownlocationid": null,
"ownmapx": null,
"ownmapy": null,
"pluginid": 1,
"serialnumber": "<redacted:host>",
"statusid": 1
},
"message": "Network device updated",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/network/by-asset/<int:asset_id>",
"auth": "permission:network.view",
"params": "path: asset_id (int)",
"purpose": "Get network device data by asset ID.",
"example": "curl http://localhost:5001/api/network/by-asset/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/network/by-hostname/<hostname>",
"auth": "permission:network.view",
"params": "path: hostname (string)",
"purpose": "Get network device by hostname.",
"example": "curl http://localhost:5001/api/network/by-hostname/x -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/network/dashboard/summary",
"auth": "permission:network.view",
"params": "not documented",
"purpose": "Get network device dashboard summary data.",
"example": "curl http://localhost:5001/api/network/dashboard/summary -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"bytype": [],
"byvendor": [],
"nonpoe": 0,
"poe": 0,
"total": 0
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/network/subnets",
"auth": "permission:network.view",
"params": "not documented",
"purpose": "List all subnets with filtering and pagination.",
"example": "curl http://localhost:5001/api/network/subnets -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "locationid",
"type": "integer",
"required": false
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
},
{
"name": "search",
"type": "string",
"required": false
},
{
"name": "type",
"type": "string",
"required": false
},
{
"name": "vlanid",
"type": "integer",
"required": false
}
],
"responseexample": {
"data": [],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 0,
"totalpages": 0
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/network/subnets",
"auth": "permission:network.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a new subnet.",
"example": "curl -X POST http://localhost:5001/api/network/subnets -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"cidr": "<redacted:address>",
"name": "Attached",
"vlanid": 1
},
"responseexample": {
"data": {
"broadcastaddress": null,
"cidr": "<redacted:address>",
"createddate": "2026-01-01T00:00:00.000000Z",
"description": null,
"dhcpenabled": true,
"dhcprangeend": null,
"dhcprangestart": null,
"dns1": null,
"dns2": null,
"gatewayip": null,
"isactive": true,
"locationid": null,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"name": "Attached",
"networkaddress": null,
"subnetid": 1,
"subnetmask": null,
"subnettype": null,
"vlanid": 1,
"vlanname": "In use",
"vlannumber": 77
},
"message": "Subnet created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/network/subnets/<int:subnet_id>",
"auth": "permission:network.delete",
"params": "path: subnet_id (int)",
"purpose": "Delete (soft delete) a subnet.",
"example": "curl -X DELETE http://localhost:5001/api/network/subnets/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/network/subnets/<int:subnet_id>",
"auth": "permission:network.view",
"params": "path: subnet_id (int)",
"purpose": "Get a single subnet plus the network devices whose primary IP falls in its CIDR range.",
"example": "curl http://localhost:5001/api/network/subnets/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/network/subnets/<int:subnet_id>",
"auth": "permission:network.edit",
"params": "path: subnet_id (int); body: JSON (fields not yet documented)",
"purpose": "Update a subnet.",
"example": "curl -X PUT http://localhost:5001/api/network/subnets/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "GET",
"path": "/api/network/types",
"auth": "permission:network.view",
"params": "not documented",
"purpose": "List all network device types.",
"example": "curl http://localhost:5001/api/network/types -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
},
{
"name": "search",
"type": "string",
"required": false
}
],
"responseexample": {
"data": [],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 0,
"totalpages": 0
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/network/types",
"auth": "permission:network.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a new network device type.",
"example": "curl -X POST http://localhost:5001/api/network/types -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"networkdevicetype": "Door Controller",
"prefix": "DOOR"
},
"responseexample": {
"data": {
"color": null,
"createddate": "2026-01-01T00:00:00.000000Z",
"description": null,
"icon": null,
"isactive": true,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"networkdevicetype": "Door Controller",
"networkdevicetypeid": 1,
"prefix": "DOOR"
},
"message": "Network device type created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/network/types/<int:type_id>",
"auth": "permission:network.delete",
"params": "path: type_id (int)",
"purpose": "Delete a network device type. Refused if any device still uses it.",
"example": "curl -X DELETE http://localhost:5001/api/network/types/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/network/types/<int:type_id>",
"auth": "permission:network.view",
"params": "path: type_id (int)",
"purpose": "Get a single network device type.",
"example": "curl http://localhost:5001/api/network/types/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/network/types/<int:type_id>",
"auth": "permission:network.edit",
"params": "path: type_id (int); body: JSON (fields not yet documented)",
"purpose": "Update a network device type.",
"example": "curl -X PUT http://localhost:5001/api/network/types/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"prefix": "DR"
},
"responseexample": {
"data": {
"color": null,
"createddate": "2026-01-01T00:00:00.000000Z",
"description": null,
"icon": null,
"isactive": true,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"networkdevicetype": "Door Controller",
"networkdevicetypeid": 1,
"prefix": "DR"
},
"message": "Network device type updated",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/network/vlans",
"auth": "permission:network.view",
"params": "not documented",
"purpose": "List all VLANs with filtering and pagination.",
"example": "curl http://localhost:5001/api/network/vlans -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
},
{
"name": "search",
"type": "string",
"required": false
},
{
"name": "type",
"type": "string",
"required": false
}
],
"responseexample": {
"data": [],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 0,
"totalpages": 0
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/network/vlans",
"auth": "permission:network.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a new VLAN.",
"example": "curl -X POST http://localhost:5001/api/network/vlans -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"name": "VLAN 4094",
"vlannumber": 4094
},
"responseexample": {
"data": {
"createddate": "2026-01-01T00:00:00.000000Z",
"description": null,
"isactive": true,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"name": "VLAN 4094",
"subnetcount": 0,
"vlanid": 1,
"vlannumber": 4094,
"vlantype": null
},
"message": "VLAN created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/network/vlans/<int:vlan_id>",
"auth": "permission:network.delete",
"params": "path: vlan_id (int)",
"purpose": "Delete (soft delete) a VLAN.",
"example": "curl -X DELETE http://localhost:5001/api/network/vlans/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/network/vlans/<int:vlan_id>",
"auth": "permission:network.view",
"params": "path: vlan_id (int)",
"purpose": "Get a single VLAN with its subnets.",
"example": "curl http://localhost:5001/api/network/vlans/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/network/vlans/<int:vlan_id>",
"auth": "permission:network.edit",
"params": "path: vlan_id (int); body: JSON (fields not yet documented)",
"purpose": "Update a VLAN.",
"example": "curl -X PUT http://localhost:5001/api/network/vlans/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
}
]
},
{
"surface": "plugin-notifications",
"endpoints": [
{
"method": "GET",
"path": "/api/notifications",
"auth": "permission:notifications.view",
"params": "not documented",
"purpose": "List all notifications with filtering and pagination.",
"example": "curl http://localhost:5001/api/notifications -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "current",
"type": "string",
"required": false,
"default": "false"
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
},
{
"name": "search",
"type": "string",
"required": false
},
{
"name": "ticketnumber",
"type": "string",
"required": false
},
{
"name": "type_id",
"type": "integer",
"required": false
},
{
"name": "typeid",
"type": "integer",
"required": false
}
],
"responseexample": {
"data": [],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 0,
"totalpages": 0
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/notifications",
"auth": "permission:notifications.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a new notification.",
"example": "curl -X POST http://localhost:5001/api/notifications -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"alertfleet": true,
"alertscope": {
"computertype": "CMM PC",
"hostname": [
"<redacted:host>",
"<redacted:host>"
]
},
"notification": "Line 3 is down",
"notificationtypeid": 1
},
"responseexample": {
"data": {
"alertfleet": true,
"alertscope": {
"computertype": "CMM PC",
"hostname": [
"<redacted:host>",
"<redacted:host>"
]
},
"alerttimeout": 0,
"appid": null,
"businessunitid": null,
"employeename": "<redacted:person>",
"employeesso": "<redacted:person>",
"enddate": null,
"endtime": null,
"isactive": true,
"iscurrent": true,
"isshopfloor": false,
"link": null,
"linkurl": null,
"message": "Line 3 is down",
"notification": "Line 3 is down",
"notificationid": 1,
"notificationtypeid": 1,
"startdate": "2026-01-01T00:00:00.000000+00:00",
"starttime": "2026-01-01T00:00:00.000000+00:00",
"ticketnumber": null,
"title": "Line 3 is down",
"typecolor": "#d93f3f",
"typename": "Fleet Alert"
},
"message": "Notification created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/notifications/<int:notification_id>",
"auth": "permission:notifications.delete",
"params": "path: notification_id (int)",
"purpose": "Delete (soft delete) a notification.",
"example": "curl -X DELETE http://localhost:5001/api/notifications/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/notifications/<int:notification_id>",
"auth": "permission:notifications.view",
"params": "path: notification_id (int)",
"purpose": "Get a single notification.",
"example": "curl http://localhost:5001/api/notifications/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/notifications/<int:notification_id>",
"auth": "permission:notifications.edit",
"params": "path: notification_id (int); body: JSON (fields not yet documented)",
"purpose": "Update a notification.",
"example": "curl -X PUT http://localhost:5001/api/notifications/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"alertfleet": null,
"alerttimeout": null
},
"responseexample": {
"data": {
"alertfleet": false,
"alertscope": null,
"alerttimeout": 0,
"appid": null,
"businessunitid": null,
"employeename": "<redacted:person>",
"employeesso": "<redacted:person>",
"enddate": null,
"endtime": null,
"isactive": true,
"iscurrent": true,
"isshopfloor": false,
"link": null,
"linkurl": null,
"message": "Line 3 is down",
"notification": "Line 3 is down",
"notificationid": 1,
"notificationtypeid": 1,
"startdate": "2026-01-01T00:00:00.000000+00:00",
"starttime": "2026-01-01T00:00:00.000000+00:00",
"ticketnumber": null,
"title": "Line 3 is down",
"typecolor": "#d93f3f",
"typename": "Fleet Alert"
},
"message": "Notification updated",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/notifications/active",
"auth": "permission:notifications.view",
"params": "not documented",
"purpose": "Get currently active notifications for display.",
"example": "curl http://localhost:5001/api/notifications/active -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"notifications": [],
"total": 0
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/notifications/calendar",
"auth": "permission:notifications.view",
"params": "not documented",
"purpose": "Get notifications in FullCalendar event format.",
"example": "curl http://localhost:5001/api/notifications/calendar -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "end",
"type": "string",
"required": false
},
{
"name": "start",
"type": "string",
"required": false
}
],
"responseexample": {
"data": [],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/notifications/dashboard/active",
"auth": "permission:notifications.view",
"params": "not documented",
"purpose": "Notifications currently showing on the floor.",
"example": "curl http://localhost:5001/api/notifications/dashboard/active -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/notifications/dashboard/summary",
"auth": "permission:notifications.view",
"params": "not documented",
"purpose": "Get notifications dashboard summary.",
"example": "curl http://localhost:5001/api/notifications/dashboard/summary -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"active": 0,
"bytype": []
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/notifications/employee/<sso>",
"auth": "none (reviewed: named in the public-read or mutation sweep)",
"params": "path: sso (string)",
"purpose": "Get recognitions for a specific employee by SSO.",
"example": "curl http://localhost:5001/api/notifications/employee/x"
},
{
"method": "GET",
"path": "/api/notifications/shopfloor",
"auth": "none (reviewed: named in the public-read or mutation sweep)",
"params": "not documented",
"purpose": "Get notifications for shopfloor TV dashboard.",
"example": "curl http://localhost:5001/api/notifications/shopfloor",
"queryparams": [
{
"name": "businessunit",
"type": "string",
"required": false
}
],
"responseexample": {
"data": {
"configversion": "2b7c2d2f543f",
"current": [
{
"boardcategory": "Current Events",
"boardorder": 50,
"displaystyle": "grid",
"employeename": "<redacted:person>",
"employeepicture": "<redacted:person>",
"employeesso": "<redacted:person>",
"endtime": null,
"isactive": true,
"isshopfloor": true,
"link": null,
"notification": "press down",
"notificationid": 2,
"resolved": false,
"starttime": null,
"ticketnumber": null,
"typecolor": "#17a2b8",
"typename": "Incident"
},
{
"boardcategory": "Current Events",
"boardorder": 30,
"displaystyle": "grid",
"employeename": "<redacted:person>",
"employeepicture": "<redacted:person>",
"employeesso": "<redacted:person>",
"endtime": null,
"isactive": true,
"isshopfloor": true,
"link": null,
"notification": "retooling",
"notificationid": 1,
"resolved": false,
"starttime": null,
"ticketnumber": null,
"typecolor": "#17a2b8",
"typename": "Change"
}
],
"timestamp": "2026-01-01T00:00:00.000000",
"upcoming": []
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/notifications/types",
"auth": "permission:notifications.view",
"params": "not documented",
"purpose": "List all notification types.",
"example": "curl http://localhost:5001/api/notifications/types -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
}
],
"responseexample": {
"data": [
{
"boardcategory": "Alerts",
"boardorder": 100,
"displaystyle": "grid",
"expirydays": null,
"expiryhour": null,
"expiryminute": 0,
"expirymode": "none",
"gracewindowminutes": 0,
"isactive": true,
"notificationtypeid": 1,
"showemployeephoto": "<redacted:person>",
"splitperemployee": "<redacted:person>",
"typecolor": "#17a2b8",
"typedescription": null,
"typename": "Awareness"
}
],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 1,
"totalpages": 1
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/notifications/types",
"auth": "permission:notifications.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a new notification type.",
"example": "curl -X POST http://localhost:5001/api/notifications/types -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"boardcategory": "Alerts",
"displaystyle": "grid",
"typename": "Awareness"
},
"responseexample": {
"data": {
"boardcategory": "Alerts",
"boardorder": 100,
"displaystyle": "grid",
"expirydays": null,
"expiryhour": null,
"expiryminute": 0,
"expirymode": "none",
"gracewindowminutes": 0,
"isactive": true,
"notificationtypeid": 1,
"showemployeephoto": "<redacted:person>",
"splitperemployee": "<redacted:person>",
"typecolor": "#17a2b8",
"typedescription": null,
"typename": "Awareness"
},
"message": "Notification type created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "PATCH|PUT",
"path": "/api/notifications/types/<int:type_id>",
"auth": "permission:notifications.create",
"params": "path: type_id (int); body: JSON (fields not yet documented)",
"purpose": "Update a notification type, including its auto-expiry rule.",
"example": "curl -X PATCH http://localhost:5001/api/notifications/types/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"boardcategory": "Alerts"
},
"responseexample": {
"data": {
"boardcategory": "Alerts",
"boardorder": 100,
"displaystyle": "grid",
"expirydays": null,
"expiryhour": null,
"expiryminute": 0,
"expirymode": "none",
"gracewindowminutes": 0,
"isactive": true,
"notificationtypeid": 1,
"showemployeephoto": "<redacted:person>",
"splitperemployee": "<redacted:person>",
"typecolor": "#17a2b8",
"typedescription": null,
"typename": "Awareness"
},
"message": "Notification type updated",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
}
]
},
{
"surface": "plugin-printers",
"endpoints": [
{
"method": "GET",
"path": "/api/printers",
"auth": "permission:printers.view",
"params": "not documented",
"purpose": "List all printers with filtering and pagination.",
"example": "curl http://localhost:5001/api/printers -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "assetnumber",
"type": "string",
"required": false
},
{
"name": "businessunit_id",
"type": "integer",
"required": false
},
{
"name": "businessunitid",
"type": "integer",
"required": false
},
{
"name": "dir",
"type": "string",
"required": false,
"default": "asc"
},
{
"name": "location_id",
"type": "integer",
"required": false
},
{
"name": "locationid",
"type": "integer",
"required": false
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
},
{
"name": "search",
"type": "string",
"required": false
},
{
"name": "sort",
"type": "string",
"required": false,
"default": "hostname"
},
{
"name": "type_id",
"type": "integer",
"required": false
},
{
"name": "typeid",
"type": "integer",
"required": false
},
{
"name": "vendor_id",
"type": "integer",
"required": false
},
{
"name": "vendorid",
"type": "integer",
"required": false
}
],
"responseexample": {
"data": [
{
"assetid": 1,
"assetnumber": "PR-1",
"assettypecolor": null,
"assettypeid": 1,
"assettypename": "printer",
"businessunitid": null,
"createdby": "<redacted:person>",
"createddate": "2026-01-01T00:00:00.000000Z",
"deletedby": null,
"deleteddate": null,
"gaugelabreference": null,
"ipaddress": "<redacted:host>",
"isactive": true,
"levelid": null,
"locationcode": null,
"locationid": null,
"maintenancereference": null,
"mapverifiedat": null,
"mapx": null,
"mapy": null,
"modifiedby": "<redacted:person>",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"name": null,
"notes": null,
"ownlevelid": null,
"ownlocationid": null,
"ownmapx": null,
"ownmapy": null,
"pluginid": 1,
"printer": {
"assetid": 1,
"createddate": "2026-01-01T00:00:00.000000Z",
"hostname": "<redacted:host>",
"installpath": null,
"isactive": true,
"iscolor": false,
"iscsf": false,
"isduplex": false,
"isnetwork": true,
"modelname": "ZT411",
"modelnumberid": 1,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"pin": null,
"printerid": 1,
"printertypeid": 1,
"printertypename": "Thermal",
"sharename": null,
"vendorid": null,
"windowsname": null
},
"serialnumber": "<redacted:host>",
"statusid": 1
}
],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 1,
"totalpages": 1
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/printers",
"auth": "permission:printers.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create new printer (creates both Asset and Printer records).",
"example": "curl -X POST http://localhost:5001/api/printers -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"assetnumber": "CSF01-Materials-HP",
"hostname": "<redacted:host>",
"installpath": "<redacted:sharepath>",
"mapx": 120,
"mapy": 240
},
"responseexample": {
"data": {
"assetid": 1,
"assetnumber": "SpoolsInspection-Xerox",
"assettypecolor": null,
"assettypeid": 1,
"assettypename": "printer",
"businessunitid": null,
"createdby": "<redacted:person>",
"createddate": "2026-01-01T00:00:00.000000Z",
"deletedby": null,
"deleteddate": null,
"gaugelabreference": null,
"isactive": true,
"levelid": null,
"locationcode": null,
"locationid": null,
"maintenancereference": null,
"mapverifiedat": null,
"mapx": null,
"mapy": null,
"modifiedby": "<redacted:person>",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"name": null,
"notes": null,
"ownlevelid": null,
"ownlocationid": null,
"ownmapx": null,
"ownmapy": null,
"pluginid": 1,
"printer": {
"assetid": 1,
"createddate": "2026-01-01T00:00:00.000000Z",
"hostname": "<redacted:host>",
"installpath": null,
"isactive": true,
"iscolor": false,
"iscsf": false,
"isduplex": false,
"isnetwork": true,
"modelname": "VersaLink C7125",
"modelnumberid": 1,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"pin": null,
"printerid": 1,
"printertypeid": null,
"sharename": null,
"vendorfrommodel": true,
"vendorid": null,
"vendorname": "Xerox",
"windowsname": null
},
"serialnumber": "<redacted:host>",
"statusid": 1
},
"message": "Printer created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/printers/<int:printer_id>",
"auth": "permission:printers.delete",
"params": "path: printer_id (int)",
"purpose": "Delete (soft delete) printer.",
"example": "curl -X DELETE http://localhost:5001/api/printers/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/printers/<int:printer_id>",
"auth": "permission:printers.view",
"params": "path: printer_id (int)",
"purpose": "Get a single printer with full details.",
"example": "curl http://localhost:5001/api/printers/1 -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"assetid": 1,
"assetnumber": "PR-2001",
"assettypecolor": null,
"assettypeid": 1,
"assettypename": "printer",
"businessunitid": null,
"communications": [],
"createdby": "<redacted:person>",
"createddate": "2026-01-01T00:00:00.000000Z",
"deletedby": null,
"deleteddate": null,
"drivers": [],
"gaugelabreference": null,
"isactive": true,
"levelid": null,
"locationcode": null,
"locationid": null,
"maintenancereference": null,
"mapverifiedat": null,
"mapx": null,
"mapy": null,
"modifiedby": "<redacted:person>",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"name": null,
"notes": null,
"ownlevelid": null,
"ownlocationid": null,
"ownmapx": null,
"ownmapy": null,
"pluginid": 1,
"printer": {
"assetid": 1,
"createddate": "2026-01-01T00:00:00.000000Z",
"hostname": "<redacted:host>",
"imageurl": "/api/models/images/model-1.png",
"installpath": null,
"isactive": true,
"iscolor": false,
"iscsf": false,
"isduplex": false,
"isnetwork": true,
"modelname": "IMG-MODEL-1",
"modelnumberid": 1,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"pin": null,
"printerid": 1,
"printertypeid": null,
"sharename": null,
"vendorid": null,
"windowsname": null
},
"serialnumber": "<redacted:host>",
"statusid": 1
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "PUT",
"path": "/api/printers/<int:printer_id>",
"auth": "permission:printers.edit",
"params": "path: printer_id (int); body: JSON (fields not yet documented)",
"purpose": "Update printer (both Asset and Printer records).",
"example": "curl -X PUT http://localhost:5001/api/printers/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"gaugelabreference": "GL-2",
"maintenancereference": "MNT-2"
},
"responseexample": {
"data": {
"assetid": 1,
"assetnumber": "AST-printer",
"assettypecolor": null,
"assettypeid": 2,
"assettypename": "printer",
"businessunitid": null,
"createdby": "<redacted:person>",
"createddate": "2026-01-01T00:00:00.000000Z",
"deletedby": null,
"deleteddate": null,
"gaugelabreference": "GL-2",
"isactive": true,
"levelid": null,
"locationcode": null,
"locationid": null,
"maintenancereference": "MNT-2",
"mapverifiedat": null,
"mapx": null,
"mapy": null,
"modifiedby": "<redacted:person>",
"modifieddate": "2026-01-01T00:00:00.000000Z",
"name": null,
"notes": null,
"ownlevelid": null,
"ownlocationid": null,
"ownmapx": null,
"ownmapy": null,
"pluginid": 1,
"printer": {
"assetid": 1,
"createddate": "2026-01-01T00:00:00.000000Z",
"hostname": "<redacted:host>",
"installpath": null,
"isactive": true,
"iscolor": false,
"iscsf": false,
"isduplex": false,
"isnetwork": true,
"modelnumberid": null,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"pin": null,
"printerid": 1,
"printertypeid": null,
"sharename": null,
"vendorid": null,
"windowsname": null
},
"serialnumber": "<redacted:host>",
"statusid": 1
},
"message": "Printer updated",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/printers/<int:printer_id>/supplies",
"auth": "permission:printers.view",
"params": "path: printer_id (int)",
"purpose": "Get supply levels from Zabbix (real-time lookup).",
"example": "curl http://localhost:5001/api/printers/1/supplies -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/printers/assignments/for-asset/<int:asset_id>",
"auth": "permission:printers.view",
"params": "path: asset_id (int)",
"purpose": "What THIS asset is assigned, without inheritance.",
"example": "curl http://localhost:5001/api/printers/assignments/for-asset/1 -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"assetid": 4,
"defaultprinterassetid": null,
"printerassetids": []
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "PUT",
"path": "/api/printers/assignments/for-asset/<int:asset_id>",
"auth": "permission:printers.edit",
"params": "path: asset_id (int); body: JSON (fields not yet documented)",
"purpose": "Reconcile one asset's whole printer assignment in a single call.",
"example": "curl -X PUT http://localhost:5001/api/printers/assignments/for-asset/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"defaultprinterassetid": 4,
"printerassetids": [
4,
5
]
},
"responseexample": {
"data": {
"assetid": 3,
"defaultprinterassetid": 4,
"printerassetids": [
4,
5
]
},
"message": "Printer assignment updated",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "POST",
"path": "/api/printers/assignments/seed-from-observed/<int:asset_id>",
"auth": "permission:printers.edit",
"params": "path: asset_id (int); body: JSON (fields not yet documented)",
"purpose": "Write what a PC observed as the assignment of the asset in the path.",
"example": "curl -X POST http://localhost:5001/api/printers/assignments/seed-from-observed/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "GET",
"path": "/api/printers/by-asset/<int:asset_id>",
"auth": "permission:printers.view",
"params": "path: asset_id (int)",
"purpose": "Get printer data by asset ID.",
"example": "curl http://localhost:5001/api/printers/by-asset/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/printers/dashboard/summary",
"auth": "permission:printers.view",
"params": "not documented",
"purpose": "Get printer dashboard summary data.",
"example": "curl http://localhost:5001/api/printers/dashboard/summary -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"bytype": [],
"byvendor": [],
"criticalsupplies": 0,
"lowsupplies": 0,
"online": 0,
"total": 0,
"totalprinters": 0
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/printers/dashboard/supplies",
"auth": "permission:printers.view",
"params": "not documented",
"purpose": "Printers needing a cartridge, flattened to one row per printer.",
"example": "curl http://localhost:5001/api/printers/dashboard/supplies -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"rows": [
{
"iscritical": true,
"levelid": null,
"location": "Shop floor",
"mapx": null,
"mapy": null,
"printerid": 2,
"printername": "Bravo",
"supplies": [
{
"level": "critical",
"text": "Black Toner 0%",
"title": "No part number on file for this model"
}
],
"worstremaining": 0
},
{
"iscritical": true,
"levelid": null,
"location": "Shop floor",
"mapx": null,
"mapy": null,
"printerid": 3,
"printername": "Charlie",
"supplies": [
{
"level": "critical",
"text": "Black Toner 2%",
"title": "No part number on file for this model"
}
],
"worstremaining": 2
},
{
"iscritical": true,
"levelid": null,
"location": "Shop floor",
"mapx": null,
"mapy": null,
"printerid": 1,
"printername": "Alpha",
"supplies": [
{
"level": "critical",
"text": "Black Toner 4%",
"title": "No part number on file for this model"
}
],
"worstremaining": 4
},
"<trimmed for the example: 1 more>"
],
"unavailable": null
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/printers/drivers",
"auth": "permission:printers.view",
"params": "not documented",
"purpose": "List printer drivers. ?active=false includes inactive ones.",
"example": "curl http://localhost:5001/api/printers/drivers -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
}
],
"responseexample": {
"data": [],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/printers/drivers",
"auth": "permission:printers.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: printers_asset.create_driver has no docstring.",
"example": "curl -X POST http://localhost:5001/api/printers/drivers -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"drivername": "HP Universal Printing PCL 6",
"location": "<redacted:sharepath>",
"name": "HP universal",
"vendorid": 1
},
"responseexample": {
"data": {
"description": null,
"driverid": 1,
"drivername": "HP Universal Printing PCL 6",
"isactive": true,
"location": "<redacted:sharepath>",
"modelname": null,
"modelnumberid": null,
"name": "HP universal",
"vendorid": 1
},
"message": "Driver created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/printers/drivers/<int:driver_id>",
"auth": "permission:printers.delete",
"params": "path: driver_id (int)",
"purpose": "UNDOCUMENTED: printers_asset.delete_driver has no docstring.",
"example": "curl -X DELETE http://localhost:5001/api/printers/drivers/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/printers/drivers/<int:driver_id>",
"auth": "permission:printers.edit",
"params": "path: driver_id (int); body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: printers_asset.update_driver has no docstring.",
"example": "curl -X PUT http://localhost:5001/api/printers/drivers/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"drivername": "Xerox Global Print Driver PCL6",
"vendorid": 2
},
"responseexample": {
"data": {
"description": null,
"driverid": 1,
"drivername": "Xerox Global Print Driver PCL6",
"isactive": true,
"location": "<redacted:sharepath>",
"modelname": null,
"modelnumberid": null,
"name": "Xerox universal",
"vendorid": 2
},
"message": "Driver updated",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/printers/for-host/<hostname>",
"auth": "jwt-optional (works signed out; the handler decides what shows)",
"params": "path: hostname (string)",
"purpose": "Printers assigned to a PC, by hostname, with what it takes to install one.",
"example": "curl http://localhost:5001/api/printers/for-host/x -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"assetid": 1,
"assetnumber": "1001",
"defaultprinterid": null,
"hostname": "<redacted:host>",
"printers": [
{
"assetid": 4,
"driverid": null,
"driverlocation": null,
"drivername": null,
"hostname": "<redacted:host>",
"inheritedfromassetid": 3,
"installpath": null,
"ipaddress": "<redacted:host>",
"isdefault": false,
"port": null,
"printerid": 1,
"queuename": "PRINTER-A",
"sharename": null,
"windowsname": "PRINTER-A"
},
{
"assetid": 5,
"driverid": null,
"driverlocation": null,
"drivername": null,
"hostname": "<redacted:host>",
"inheritedfromassetid": 3,
"installpath": null,
"ipaddress": "<redacted:host>",
"isdefault": false,
"port": null,
"printerid": 2,
"queuename": "PRINTER-B",
"sharename": null,
"windowsname": "PRINTER-B"
},
{
"assetid": 6,
"driverid": null,
"driverlocation": null,
"drivername": null,
"hostname": "<redacted:host>",
"inheritedfromassetid": 3,
"installpath": null,
"ipaddress": "<redacted:host>",
"isdefault": false,
"port": null,
"printerid": 3,
"queuename": "PRINTER-C",
"sharename": null,
"windowsname": "PRINTER-C"
}
],
"source": "inherited"
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/printers/install-batch",
"auth": "jwt-optional (works signed out; the handler decides what shows)",
"params": "not documented",
"purpose": "Generate a Windows .bat that installs the selected printers.",
"example": "curl http://localhost:5001/api/printers/install-batch -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "printerids",
"type": "string",
"required": false
}
]
},
{
"method": "GET",
"path": "/api/printers/install-list",
"auth": "jwt-optional (works signed out; the handler decides what shows)",
"params": "not documented",
"purpose": "Flat, unpaginated list of network printers for the printer installer.",
"example": "curl http://localhost:5001/api/printers/install-list -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "format",
"type": "string",
"required": false
}
],
"responseexample": {
"data": [
{
"hostname": "<redacted:host>",
"installpath": "<redacted:sharepath>",
"ipaddress": "<redacted:host>",
"iscsf": false,
"levelid": null,
"locationname": null,
"machinenumber": "CSF01-Materials-HP",
"mapx": 120,
"mapy": 240,
"modelnumber": null,
"name": "CSF01-Materials-HP",
"printerid": 1,
"sharename": null,
"vendorname": "",
"windowsname": null
}
],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/printers/lookup",
"auth": "permission:printers.view",
"params": "not documented",
"purpose": "Find a printer by IP or FQDN. Parity with the classic printerlookup.asp.",
"example": "curl http://localhost:5001/api/printers/lookup -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "fqdn",
"type": "string",
"required": false
},
{
"name": "ip",
"type": "string",
"required": false
}
]
},
{
"method": "GET",
"path": "/api/printers/lowsupplies",
"auth": "permission:printers.view",
"params": "not documented",
"purpose": "Get printers with low or critical supply levels.",
"example": "curl http://localhost:5001/api/printers/lowsupplies -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"printers": [],
"summary": {
"critical": 0,
"low": 0,
"total_checked": 0
}
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/printers/models",
"auth": "permission:printers.view",
"params": "not documented",
"purpose": "List models with a supply count, for the supply-management picker.",
"example": "curl http://localhost:5001/api/printers/models -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
},
{
"name": "search",
"type": "string",
"required": false
},
{
"name": "vendor_id",
"type": "integer",
"required": false
},
{
"name": "vendorid",
"type": "integer",
"required": false
},
{
"name": "withsupplies",
"type": "string",
"required": false,
"default": ""
}
],
"responseexample": {
"data": [
{
"modelnumber": "TestModel C999",
"modelnumberid": 1,
"supplycount": 1,
"vendor": "TestVendor",
"vendorid": 1
}
],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 1,
"totalpages": 1
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/printers/models/<int:modelnumberid>/supplies",
"auth": "permission:printers.view",
"params": "path: modelnumberid (int)",
"purpose": "List all supplies mapped to a model.",
"example": "curl http://localhost:5001/api/printers/models/1/supplies -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"modelnumber": "TestModel C999",
"modelnumberid": 1,
"supplies": [
{
"capacitytier": "standard",
"color": "black",
"createddate": "2026-01-01T00:00:00.000000Z",
"isactive": true,
"marketingname": "414A Black",
"modelnumber": "TestModel C999",
"modelnumberid": 1,
"modelsupplyid": 1,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"notes": null,
"pageyield": 2400,
"partnumber": "W2020A",
"supplytype": "toner"
}
]
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/printers/models/<int:modelnumberid>/supplies",
"auth": "permission:printers.create",
"params": "path: modelnumberid (int); body: JSON (fields not yet documented)",
"purpose": "Add a supply to a model.",
"example": "curl -X POST http://localhost:5001/api/printers/models/1/supplies -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"capacitytier": "standard",
"color": "black",
"marketingname": "414A Black",
"pageyield": 2400,
"partnumber": "W2020A",
"supplytype": "toner"
},
"responseexample": {
"data": {
"capacitytier": "standard",
"color": "black",
"createddate": "2026-01-01T00:00:00.000000Z",
"isactive": true,
"marketingname": "414A Black",
"modelnumber": "TestModel C999",
"modelnumberid": 1,
"modelsupplyid": 1,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"notes": null,
"pageyield": 2400,
"partnumber": "W2020A",
"supplytype": "toner"
},
"message": "Supply added",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/printers/observed/<hostname>",
"auth": "permission:printers.view",
"params": "path: hostname (string)",
"purpose": "What a host last reported, each queue judged against what it is assigned.",
"example": "curl http://localhost:5001/api/printers/observed/x -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/printers/observed/for-asset/<int:asset_id>",
"auth": "permission:printers.view",
"params": "path: asset_id (int)",
"purpose": "The same comparison, reached from an asset page: one block per host.",
"example": "curl http://localhost:5001/api/printers/observed/for-asset/1 -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"assetid": 1,
"assetnumber": "1001",
"hosts": [
{
"assetid": 1,
"assetnumber": "1001",
"hostname": "<redacted:host>",
"observedat": "2026-01-01T00:00:00.000000",
"queues": [
{
"classification": "extra",
"driftfields": [],
"drivername": "HP Universal Printing PS",
"expecteddrivername": null,
"expectedportaddress": null,
"expectedqueuename": null,
"inheritedfromassetid": null,
"isassigneddefault": false,
"isdefault": true,
"isshared": false,
"portaddress": "<redacted:address>",
"portname": "IP_10.20.0.11",
"printerassetid": 5,
"printerid": 1,
"printername": "Bay label printer",
"queuename": "PRINTER-A"
},
{
"classification": "extra",
"driftfields": [],
"drivername": "HP Universal Printing PS",
"expecteddrivername": null,
"expectedportaddress": null,
"expectedqueuename": null,
"inheritedfromassetid": null,
"isassigneddefault": false,
"isdefault": false,
"isshared": false,
"portaddress": "<redacted:address>",
"portname": "IP_10.20.0.12",
"printerassetid": 6,
"printerid": 2,
"printername": "Bay laser printer",
"queuename": "PRINTER-B"
},
{
"classification": "unknown",
"driftfields": [],
"drivername": "HP Universal Printing PS",
"expecteddrivername": null,
"expectedportaddress": null,
"expectedqueuename": null,
"inheritedfromassetid": null,
"isassigneddefault": false,
"isdefault": false,
"isshared": false,
"portaddress": "<redacted:address>",
"portname": "IP_10.20.0.99",
"printerassetid": null,
"printerid": null,
"printername": null,
"queuename": "Reception Copier"
}
],
"seedcandidate": {
"defaultprinterassetid": 5,
"printerassetids": [
5,
6
],
"skipped": [
{
"drivername": "HP Universal Printing PS",
"isdefault": false,
"portaddress": "<redacted:address>",
"portname": "IP_10.20.0.99",
"queuename": "Reception Copier"
}
]
},
"source": "none",
"summary": {
"drifted": 0,
"extra": 2,
"matching": 0,
"missing": 0,
"unknown": 1
}
}
]
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/printers/pc-default",
"auth": "jwt-optional (works signed out; the handler decides what shows)",
"params": "not documented",
"purpose": "Default printer for a PC, by machine (asset) number.",
"example": "curl http://localhost:5001/api/printers/pc-default -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "format",
"type": "string",
"required": false
},
{
"name": "machine",
"type": "string",
"required": false
}
],
"responseexample": {
"data": {
"printerid": 1,
"windowsname": "HP-CSF04-Materials"
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "DELETE",
"path": "/api/printers/supplies/<int:modelsupplyid>",
"auth": "permission:printers.delete",
"params": "path: modelsupplyid (int)",
"purpose": "Delete a model supply.",
"example": "curl -X DELETE http://localhost:5001/api/printers/supplies/1 -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"message": "Supply deleted",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "PUT",
"path": "/api/printers/supplies/<int:modelsupplyid>",
"auth": "permission:printers.edit",
"params": "path: modelsupplyid (int); body: JSON (fields not yet documented)",
"purpose": "Update a model supply.",
"example": "curl -X PUT http://localhost:5001/api/printers/supplies/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"capacitytier": "high",
"marketingname": "414X Black"
},
"responseexample": {
"data": {
"capacitytier": "high",
"color": "black",
"createddate": "2026-01-01T00:00:00.000000Z",
"isactive": true,
"marketingname": "414X Black",
"modelnumber": "TestModel C999",
"modelnumberid": 1,
"modelsupplyid": 1,
"modifieddate": "2026-01-01T00:00:00.000000Z",
"notes": null,
"pageyield": null,
"partnumber": "W2020A",
"supplytype": "toner"
},
"message": "Supply updated",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/printers/supplies/forecast",
"auth": "permission:printers.view",
"params": "not documented",
"purpose": "Days-to-empty and replacement counts per printer.",
"example": "curl http://localhost:5001/api/printers/supplies/forecast -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "days",
"type": "integer",
"required": false,
"default": 90
}
],
"responseexample": {
"data": {
"available": false,
"cartridges": [],
"days": 90,
"horizondays": 14,
"orderlist": [],
"reason": "Zabbix is not configured or not reachable",
"unestimated": []
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/printers/supplies/meta",
"auth": "permission:printers.view",
"params": "not documented",
"purpose": "Allowed values for supply type, color, and capacity tier (for the UI).",
"example": "curl http://localhost:5001/api/printers/supplies/meta -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"capacitytiers": [
"standard",
"high",
"extrahigh",
"<trimmed for the example: 1 more>"
],
"colors": [
"black",
"cyan",
"magenta",
"<trimmed for the example: 1 more>"
],
"supplytypes": [
"toner",
"drum",
"waste",
"<trimmed for the example: 1 more>"
]
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/printers/supplies/refresh",
"auth": "permission:printers.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "Clear cached Zabbix supply data so the next read pulls fresh values.",
"example": "curl -X POST http://localhost:5001/api/printers/supplies/refresh -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {},
"responseexample": {
"message": "Supply cache cleared",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/printers/types",
"auth": "permission:printers.view",
"params": "not documented",
"purpose": "List all printer types.",
"example": "curl http://localhost:5001/api/printers/types -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "page",
"type": "integer",
"required": false,
"default": 1
},
{
"name": "per_page",
"type": "integer",
"required": false
},
{
"name": "perpage",
"type": "integer",
"required": false
},
{
"name": "search",
"type": "string",
"required": false
}
],
"responseexample": {
"data": [],
"meta": {
"pagination": {
"hasnext": false,
"hasprev": false,
"page": 1,
"perpage": 20,
"total": 0,
"totalpages": 0
},
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/printers/types",
"auth": "permission:printers.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "Create a new printer type.",
"example": "curl -X POST http://localhost:5001/api/printers/types -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/printers/types/<int:type_id>",
"auth": "permission:printers.delete",
"params": "path: type_id (int)",
"purpose": "Delete a printer type. Refused if any printer still uses it.",
"example": "curl -X DELETE http://localhost:5001/api/printers/types/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/printers/types/<int:type_id>",
"auth": "permission:printers.view",
"params": "path: type_id (int)",
"purpose": "Get a single printer type.",
"example": "curl http://localhost:5001/api/printers/types/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/printers/types/<int:type_id>",
"auth": "permission:printers.edit",
"params": "path: type_id (int); body: JSON (fields not yet documented)",
"purpose": "Update a printer type.",
"example": "curl -X PUT http://localhost:5001/api/printers/types/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
}
]
},
{
"surface": "plugin-slides",
"endpoints": [
{
"method": "GET",
"path": "/api/slides/<surface>",
"auth": "permission:slides.view or slides.manage",
"params": "path: surface (string)",
"purpose": "UNDOCUMENTED: slides.list_slides has no docstring.",
"example": "curl http://localhost:5001/api/slides/x -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "PATCH",
"path": "/api/slides/<surface>/<int:slideid>",
"auth": "permission:slides.manage",
"params": "path: surface (string), slideid (int); body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: slides.update_slide has no docstring.",
"example": "curl -X PATCH http://localhost:5001/api/slides/x/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "POST",
"path": "/api/slides/<surface>/delete",
"auth": "permission:slides.manage",
"params": "path: surface (string); body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: slides.delete_slides has no docstring.",
"example": "curl -X POST http://localhost:5001/api/slides/x/delete -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "POST",
"path": "/api/slides/<surface>/order",
"auth": "permission:slides.manage",
"params": "path: surface (string); body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: slides.reorder_slides has no docstring.",
"example": "curl -X POST http://localhost:5001/api/slides/x/order -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "POST",
"path": "/api/slides/<surface>/upload",
"auth": "permission:slides.manage",
"params": "path: surface (string); body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: slides.upload_slides has no docstring.",
"example": "curl -X POST http://localhost:5001/api/slides/x/upload -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"readsbody": true
},
{
"method": "GET",
"path": "/api/slides/feed",
"auth": "none (reviewed: named in the public-read or mutation sweep)",
"params": "not documented",
"purpose": "Flat playlist for a surface. NOT wrapped in the success_response envelope so the screensaver's existing parser needs no change.",
"example": "curl http://localhost:5001/api/slides/feed",
"queryparams": [
{
"name": "surface",
"type": "string",
"required": false,
"default": "lobby"
}
],
"responseexample": {
"basepath": "/api/slides/img/lobby/",
"interval": 10,
"slides": [],
"success": true,
"surface": "lobby"
}
},
{
"method": "GET",
"path": "/api/slides/img/<surface>/<path:filename>",
"auth": "none (reviewed: named in the public-read or mutation sweep)",
"params": "path: surface (string), filename (path)",
"purpose": "Serve a slide image with a path-traversal guard.",
"example": "curl http://localhost:5001/api/slides/img/x/example.png"
}
]
},
{
"surface": "plugin-tools",
"endpoints": [
{
"method": "POST",
"path": "/api/tools/secrets",
"auth": "jwt-optional (works signed out; the handler decides what shows)",
"params": "body: JSON (fields not yet documented)",
"purpose": "Store an already-encrypted secret and return its token.",
"example": "curl -X POST http://localhost:5001/api/tools/secrets -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"ciphertext": "<redacted:token>",
"iv": "MTIzNDU2Nzg5MDEy",
"views": 100
},
"responseexample": {
"data": {
"createddate": "2026-01-01T00:00:00.000000",
"expiresat": "2026-01-01T00:00:00.000000",
"token": "<redacted:secret>",
"viewcount": 0,
"viewsremaining": 100
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "GET",
"path": "/api/tools/secrets/<token>",
"auth": "none (the unguessable token in the path is the authorisation)",
"params": "path: token (string)",
"purpose": "Whether a link is still live, WITHOUT spending it.",
"example": "curl http://localhost:5001/api/tools/secrets/x",
"responseexample": {
"data": {
"available": false
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/tools/secrets/<token>",
"auth": "none (the unguessable token in the path is the authorisation; redeeming spends the secret)",
"params": "path: token (string); body: JSON (fields not yet documented)",
"purpose": "Hand over the ciphertext once, then spend the view.",
"example": "curl -X POST http://localhost:5001/api/tools/secrets/x -H 'Content-Type: application/json' -d '{}'",
"responseexample": {
"data": {
"ciphertext": "<redacted:token>",
"iv": "MTIzNDU2Nzg5MDEy"
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
}
]
},
{
"surface": "plugin-warranty",
"endpoints": [
{
"method": "GET",
"path": "/api/warranty",
"auth": "permission:warranty.view",
"params": "not documented",
"purpose": "List warranties. Filters: ?status=, ?assetid=, ?active=false.",
"example": "curl http://localhost:5001/api/warranty -H \"Authorization: Bearer $TOK\"",
"queryparams": [
{
"name": "active",
"type": "string",
"required": false,
"default": "true"
},
{
"name": "assetid",
"type": "integer",
"required": false
},
{
"name": "servicetag",
"type": "string",
"required": false
},
{
"name": "status",
"type": "string",
"required": false
},
{
"name": "vendor",
"type": "string",
"required": false
}
],
"responseexample": {
"data": [],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/warranty",
"auth": "permission:warranty.create",
"params": "body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: warranty.create_warranty has no docstring.",
"example": "curl -X POST http://localhost:5001/api/warranty -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"enddate": "2026-01-01",
"servicetag": "<redacted:host>",
"vendor": "Acme"
},
"responseexample": {
"data": {
"assets": [],
"enddate": "2026-01-01",
"isactive": true,
"lastcheckeddate": null,
"notes": null,
"prooffilename": null,
"proofurl": null,
"provider": "manual",
"servicelevel": null,
"servicetag": "<redacted:host>",
"startdate": null,
"status": "active",
"statuscolor": "#4CAF50",
"vendor": "Acme",
"warrantyid": 1
},
"message": "Warranty created",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/warranty/<int:warrantyid>",
"auth": "permission:warranty.delete",
"params": "path: warrantyid (int)",
"purpose": "UNDOCUMENTED: warranty.delete_warranty has no docstring.",
"example": "curl -X DELETE http://localhost:5001/api/warranty/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/warranty/<int:warrantyid>",
"auth": "permission:warranty.view",
"params": "path: warrantyid (int)",
"purpose": "UNDOCUMENTED: warranty.get_warranty has no docstring.",
"example": "curl http://localhost:5001/api/warranty/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "PUT",
"path": "/api/warranty/<int:warrantyid>",
"auth": "permission:warranty.edit",
"params": "path: warrantyid (int); body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: warranty.update_warranty has no docstring.",
"example": "curl -X PUT http://localhost:5001/api/warranty/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"requestexample": {
"enddate": ""
},
"responseexample": {
"data": {
"assets": [],
"enddate": null,
"isactive": true,
"lastcheckeddate": null,
"notes": null,
"prooffilename": null,
"proofurl": null,
"provider": "manual",
"servicelevel": null,
"servicetag": "<redacted:host>",
"startdate": null,
"status": "unknown",
"statuscolor": "#9E9E9E",
"vendor": "Acme",
"warrantyid": 1
},
"message": "Warranty updated",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "DELETE",
"path": "/api/warranty/<int:warrantyid>/proof",
"auth": "permission:warranty.edit",
"params": "path: warrantyid (int)",
"purpose": "Remove a warranty's proof document.",
"example": "curl -X DELETE http://localhost:5001/api/warranty/1/proof -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"enddate": null,
"isactive": true,
"lastcheckeddate": null,
"notes": null,
"prooffilename": null,
"proofurl": null,
"provider": "manual",
"servicelevel": null,
"servicetag": "<redacted:host>",
"startdate": null,
"status": "unknown",
"statuscolor": "#9E9E9E",
"vendor": "Dell",
"warrantyid": 1
},
"message": "Proof removed",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/warranty/<int:warrantyid>/proof",
"auth": "permission:warranty.edit",
"params": "path: warrantyid (int); body: JSON (fields not yet documented)",
"purpose": "Upload (or replace) the proof-of-cover document for a warranty.",
"example": "curl -X POST http://localhost:5001/api/warranty/1/proof -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"responseexample": {
"data": {
"enddate": null,
"isactive": true,
"lastcheckeddate": null,
"notes": null,
"prooffilename": "Dell invoice 4471.pdf",
"proofurl": "/api/warranty/proof/warranty-1.pdf",
"provider": "manual",
"servicelevel": null,
"servicetag": "<redacted:host>",
"startdate": null,
"status": "unknown",
"statuscolor": "#9E9E9E",
"vendor": "Dell",
"warrantyid": 1
},
"message": "Proof uploaded",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
},
"readsbody": true
},
{
"method": "POST",
"path": "/api/warranty/<int:warrantyid>/refresh",
"auth": "permission:warranty.edit",
"params": "path: warrantyid (int); body: JSON (fields not yet documented)",
"purpose": "UNDOCUMENTED: warranty.refresh_warranty has no docstring.",
"example": "curl -X POST http://localhost:5001/api/warranty/1/refresh -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'"
},
{
"method": "GET",
"path": "/api/warranty/asset/<int:assetid>",
"auth": "permission:warranty.view",
"params": "path: assetid (int)",
"purpose": "Warranties covering one asset (for the asset-detail panel).",
"example": "curl http://localhost:5001/api/warranty/asset/1 -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/warranty/dashboard/expiring",
"auth": "permission:warranty.view",
"params": "not documented",
"purpose": "Warranties running out, and ones that already have.",
"example": "curl http://localhost:5001/api/warranty/dashboard/expiring -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": [],
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "GET",
"path": "/api/warranty/proof/<path:filename>",
"auth": "permission:warranty.view",
"params": "path: filename (path)",
"purpose": "Download a proof document.",
"example": "curl http://localhost:5001/api/warranty/proof/example.png -H \"Authorization: Bearer $TOK\""
},
{
"method": "GET",
"path": "/api/warranty/report",
"auth": "permission:warranty.view",
"params": "not documented",
"purpose": "Counts + lists bucketed by derived status.",
"example": "curl http://localhost:5001/api/warranty/report -H \"Authorization: Bearer $TOK\"",
"responseexample": {
"data": {
"buckets": {
"active": [],
"expired": [],
"expiring": [],
"unknown": []
},
"counts": {
"active": 0,
"expired": 0,
"expiring": 0,
"unknown": 0
}
},
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
},
{
"method": "POST",
"path": "/api/warranty/sync/dell",
"auth": "permission:warranty.edit",
"params": "body: JSON (fields not yet documented)",
"purpose": "Look up every asset serial (= Dell service tag) that has no warranty yet and create warranties for the ones Dell recognizes.",
"example": "curl -X POST http://localhost:5001/api/warranty/sync/dell -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
"queryparams": [
{
"name": "all",
"type": "string",
"required": false,
"default": "false"
}
],
"requestexample": {},
"responseexample": {
"data": {
"candidates": 0,
"created": 0,
"matched": 0,
"updated": 0
},
"message": "No PCs need a warranty lookup.",
"meta": {
"requestid": "00000000",
"timestamp": "2026-01-01T00:00:00.000000Z"
},
"status": "success"
}
}
]
}
]