diff --git a/docs/api-inventory.json b/docs/api-inventory.json index 2484f037..ed02d270 100644 --- a/docs/api-inventory.json +++ b/docs/api-inventory.json @@ -1,15838 +1,15869 @@ [ - { - "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": "", - "expiresat": null, - "isactive": true, - "isexpired": false, - "lastusedat": null, - "name": "member token", - "resourcescopes": null, - "scopes": null, - "tokenid": 2, - "tokenprefix": "", - "userid": 2, - "username": "" - }, - { - "createddate": "2026-01-01T00:00:00.000000Z", - "displayprefix": "", - "expiresat": null, - "isactive": true, - "isexpired": false, - "lastusedat": null, - "name": "admin token", - "resourcescopes": null, - "scopes": null, - "tokenid": 1, - "tokenprefix": "", - "userid": 1, - "username": "" - } - ], - "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": "display svc", - "resourcescopes": [ - "gea-shopfloor-display" - ], - "scopes": [ - "geenforce.fetch" - ] - }, - "responseexample": { - "data": { - "createddate": "2026-01-01T00:00:00.000000Z", - "displayprefix": "", - "expiresat": null, - "isactive": true, - "isexpired": false, - "lastusedat": null, - "name": "display svc", - "resourcescopes": [ - "gea-shopfloor-display" - ], - "scopes": [ - "geenforce.fetch" - ], - "secret": "", - "tokenid": 1, - "tokenprefix": "", - "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/", - "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/", - "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": "", - "expiresat": null, - "isactive": true, - "isexpired": false, - "lastusedat": null, - "name": "test token", - "resourcescopes": null, - "scopes": [ - "applications.edit" - ], - "tokenid": 1, - "tokenprefix": "", - "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": "Monitored App", - "ismonitorable": true, - "monitorlaunchpath": "C:\\Vendor\\app.exe", - "monitorprocessname": "app.exe" - }, - "responseexample": { - "data": { - "appdescription": null, - "appid": 1, - "applicationlink": null, - "applicationnotes": null, - "appname": "Fleet 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 created", - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "DELETE", - "path": "/api/applications/", - "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/", - "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/", - "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//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//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//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//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": "", - "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//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": "", - "documentationpath": null, - "image": null, - "installersha256": "", - "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": "", - "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//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//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//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": "", - "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": "", - "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/", - "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/", - "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/", - "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//", - "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//", - "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/", - "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": "", - "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": "", - "modifieddate": "2026-01-01T00:00:00.000000Z", - "name": "mill", - "notes": null, - "ownlevelid": null, - "ownlocationid": null, - "ownmapx": null, - "ownmapy": null, - "serialnumber": "", - "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/", - "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/", - "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/", - "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//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//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": "", - "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": "", - "modifieddate": "2026-01-01T00:00:00.000000Z", - "name": null, - "notes": null, - "ownlevelid": null, - "ownlocationid": null, - "ownmapx": null, - "ownmapy": null, - "serialnumber": "", - "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/", - "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": "", - "levelid": null, - "location": null, - "locationid": null, - "mapx": 100, - "mapy": 100, - "name": null, - "primaryip": null, - "serialnumber": "", - "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": "", - "levelid": null, - "location": null, - "locationid": null, - "mapx": 110, - "mapy": 110, - "name": null, - "primaryip": null, - "serialnumber": "", - "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": [], - "Measuring Tool": [], - "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/", - "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/", - "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/", - "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/", - "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/", - "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/", - "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/", - "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/", - "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//", - "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": "", - "new_password": "" - }, - "responseexample": { - "data": { - "mustchangepassword": "" - }, - "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": "", - "username": "" - }, - "responseexample": { - "data": { - "access_token": "", - "expires_in": 3600, - "refresh_token": "", - "token_type": "", - "user": { - "email": "", - "firstname": "", - "lastname": "", - "mustchangepassword": "", - "permissions": [ - "endpoints.runscript", - "endpoints.agentupdate", - "endpoints.view", - "" - ], - "roles": [ - "upgradeoperatorrole" - ], - "userid": 2, - "username": "" - } - }, - "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": "", - "firstname": "", - "lastname": "", - "mustchangepassword": "", - "permissions": [ - "assets.view", - "assets.create", - "assets.edit", - "" - ], - "roles": [ - "admin" - ], - "userid": 1, - "username": "" - }, - "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/", - "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/", - "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/", - "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/", - "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": "", - "queues": [ - { - "drivername": "HP Universal Printing PS", - "isdefault": true, - "portaddress": "", - "portname": "IP_10.20.0.11", - "queuename": "PRINTER-A" - }, - { - "drivername": "HP Universal Printing PS", - "isdefault": false, - "portaddress": "", - "portname": "IP_10.20.0.12", - "queuename": "PRINTER-B" - }, - { - "drivername": "HP Universal Printing PS", - "isdefault": false, - "portaddress": "", - "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": "" - } - ] - }, - "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": "" - }, - "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/", - "GET /api/collector/_schemas", - "POST /api/collector/pc", - "" - ], - "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/", - "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/", - "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/", - "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/", - "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": 14, - "bystatus": { - "In Use": 14 - }, - "counts": { - "machines": 0, - "measuringtools": 14, - "networkdevices": 0, - "pcs": 0, - "printers": 0, - "total": 14 - }, - "countsactiveonly": true, - "dualpathcollapsed": true, - "inactiveexcluded": 0, - "inrepair": 0, - "recent": [ - { - "assetid": 14, - "assetnumber": "MT-MAP-TD", - "assettype": "measuring_tool", - "createddate": "2026-01-01T00:00:00.000000Z" - }, - { - "assetid": 13, - "assetnumber": "MT-MAP-MIC", - "assettype": "measuring_tool", - "createddate": "2026-01-01T00:00:00.000000Z" - }, - { - "assetid": 12, - "assetnumber": "MT-MAP-CAL", - "assettype": "measuring_tool", - "createddate": "2026-01-01T00:00:00.000000Z" - }, - "" - ], - "statuses": { - "In Use": 14 - }, - "totalassets": 14, - "totalmachines": 0, - "totalmeasuringtool": 14, - "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" - }, - "" - ], - "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, - "measuringtools": 0, - "networkdevices": 0, - "pcs": 0, - "printers": 0, - "total": 0 - }, - "countsactiveonly": true, - "dualpathcollapsed": true, - "inactiveexcluded": 0, - "inrepair": 0, - "recent": [], - "statuses": {}, - "totalassets": 0, - "totalmachines": 0, - "totalmeasuringtool": 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\"", - "responseexample": { - "data": [ - { - "empty": "hide", - "endpoint": "/api/geenforce/dashboard/failures", - "id": "geenforce-failures", - "map": { - "detail": "entryname", - "link": "/pcs/{computerid}", - "meta": [ - { - "key": "message" - }, - { - "key": "exitcode", - "label": "exit" - } - ], - "timestamp": "receivedat", - "title": "hostname" - }, - "permission": "geenforce.manage", - "plugin": "geenforce", - "position": 10, - "render": "exceptions", - "severity": "critical", - "shortname": "Enforcement", - "title": "Enforcement failures", - "viewall": "/geenforce" - }, - { - "empty": "hide", - "endpoint": "/api/computers/dashboard/sharedmachines", - "id": "computers-sharedmachines", - "map": { - "detail": "pcs", - "link": "/machines/{assetid}", - "meta": [ - { - "key": "pccount", - "suffix": " PCs" - } - ], - "title": "machinenumber" - }, - "permission": "computers.view", - "plugin": "computers", - "position": 15, - "render": "exceptions", - "severity": "critical", - "shortname": "Duplicate machine no.", - "title": "Machine numbers on two PCs", - "viewall": "/machines" - }, - { - "empty": "hide", - "endpoint": "/api/endpoints/dashboard/stability", - "id": "endpoints-stability", - "map": { - "detail": "", - "link": "/pcs/{computerid}", - "meta": [ - { - "key": "eventcount", - "suffix": " events (48h)" - } - ], - "title": "hostname" - }, - "permission": "endpoints.fleet", - "plugin": "endpoints", - "position": 16, - "render": "exceptions", - "severity": "critical", - "shortname": "Crashes", - "title": "Endpoints with crashes or shutdowns", - "viewall": "/pcs" - }, - "" - ], - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - } - ] - }, - { - "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": "" - }, - "responseexample": { - "data": { - "businessunit": "Materials", - "businessunitid": 1, - "createddate": "2026-01-01T00:00:00.000000Z", - "dashboarddefaultid": 1, - "description": "Materials lobby kiosk", - "displaypath": "/shopfloor", - "displayrole": "Dashboard", - "fqdn": "", - "ipaddress": "", - "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/", - "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/", - "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": "", - "ipaddress": "", - "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": "", - "ipaddress": "", - "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": "", - "ipaddress": "" - }, - "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" - }, - { - "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-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/", - "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/", - "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/", - "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/", - "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/", - "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/", - "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/", - "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/", - "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//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//blueprint/", - "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/", - "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//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/", - "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/", - "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/", - "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//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//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/", - "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/", - "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/", - "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/", - "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/", - "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/", - "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/", - "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/", - "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", - "" - ], - "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", - "" - ] - }, - "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", - "" - ] - }, - "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" - }, - "" - ], - "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": "measuring_tool", - "icon": "ruler", - "label": "Measuring Tool", - "plugin": "measuringtools", - "route": "/measuringtools/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": "measuring_tool", - "edit_permission": "measuringtools.manage", - "optional_tabs": [], - "plugin": "measuringtools", - "subtype_color_field": "color", - "subtype_description_field": "description", - "subtype_endpoint": "/measuringtools/types", - "subtype_id_field": "measuringtooltypeid", - "subtype_label_field": "name" - }, - "" - ], - "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/measuringtools/map-overlay", - "id": "calibration-due", - "label": "Calibration due", - "legend": true, - "plugin": "measuringtools", - "style": "badge" - } - ], - "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" - }, - "" - ], - "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" - }, - "" - ], - "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": "" - }, - "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": "", - "ip": "", - "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/", - "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/", - "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/", - "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//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": "", - "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/", - "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" - }, - "" - ], - "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/", - "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/", - "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": "" - }, - "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" - }, - "" - ] - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "GET", - "path": "/api/settings/asset-import/templates/", - "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": "", - "createdat": "2026-01-01 00:00:00.000000", - "createdby": "", - "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": "", - "blocking": false, - "committed": true, - "kind": "winc-machine-adoption", - "needscreate": { - "businessunit": { - "Large Parts": 1 - } - }, - "planhash": "", - "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": "", - "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": "" - }, - "responseexample": { - "data": { - "batchid": "", - "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/", - "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/", - "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": "" - }, - "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": "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/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/", - "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//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/", - "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/", - "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/", - "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//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//contacts/", - "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//contacts/", - "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": "", - "failedlogins": 0, - "firstname": "", - "isactive": true, - "islocked": false, - "lastlogindate": "2026-01-01T00:00:00Z", - "lastname": "", - "modifieddate": "2026-01-01T00:00:00.000000Z", - "mustchangepassword": "", - "permissions": [ - "apitokens.create", - "applications.create", - "applications.delete", - "" - ], - "roles": [ - { - "color": null, - "roleid": 1, - "rolename": "admin" - } - ], - "userid": 1, - "username": "" - } - ], - "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": "", - "password": "", - "roles": [], - "sendwelcome": false, - "username": "" - }, - "responseexample": { - "data": { - "createddate": "2026-01-01T00:00:00.000000Z", - "directpermissions": [ - "endpoints.restart" - ], - "email": "", - "failedlogins": 0, - "firstname": "", - "isactive": true, - "islocked": false, - "lastlogindate": null, - "lastname": "", - "modifieddate": "2026-01-01T00:00:00.000000Z", - "mustchangepassword": "", - "permissions": [ - "applications.view", - "assets.view", - "backups.download", - "" - ], - "roles": [ - { - "color": "#0DCAF0", - "roleid": 3, - "rolename": "technician" - } - ], - "userid": 2, - "username": "", - "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/", - "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/", - "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": "", - "failedlogins": 0, - "firstname": "", - "isactive": true, - "islocked": false, - "lastlogindate": "2026-01-01T00:00:00Z", - "lastname": "", - "modifieddate": "2026-01-01T00:00:00.000000Z", - "mustchangepassword": "", - "permissions": [], - "roles": [], - "userid": 1, - "username": "" - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "PUT", - "path": "/api/users/", - "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": "" - }, - "responseexample": { - "data": { - "createddate": "2026-01-01T00:00:00.000000Z", - "directpermissions": [], - "email": "", - "failedlogins": 0, - "firstname": "", - "isactive": true, - "islocked": false, - "lastlogindate": null, - "lastname": "", - "modifieddate": "2026-01-01T00:00:00.000000Z", - "mustchangepassword": "", - "permissions": [], - "roles": [], - "userid": 2, - "username": "" - }, - "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", - "" - ], - "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/", - "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/", - "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": "", - "supportphone": "", - "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", - "modifieddate": "2026-01-01T00:00:00", - "vendor": "LegacyVendor" - }, - "responseexample": { - "data": { - "createddate": "2026-01-01T00:00:00.000000Z", - "description": null, - "isactive": true, - "modifieddate": "2026-01-01T00:00:00.000000Z", - "notes": null, - "supportemail": "", - "supportphone": "", - "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/", - "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/", - "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/", - "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/", - "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//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": "", - "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": "", - "formats": [], - "key": "partmarker", - "storagebackend": "share" - } - ], - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "GET", - "path": "/api/backups/revisions/", - "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//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//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": "", - "isactive": true, - "lastboottime": null, - "lastreporteddate": null, - "loggedinuser": null, - "modelnumberid": null, - "modifieddate": "2026-01-01T00:00:00.000000Z", - "osid": null, - "vendorid": null - }, - "createdby": "", - "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": "", - "modifieddate": "2026-01-01T00:00:00.000000Z", - "name": null, - "notes": null, - "ownlevelid": null, - "ownlocationid": null, - "ownmapx": null, - "ownmapy": null, - "pluginid": 1, - "serialnumber": "", - "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": "", - "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": "", - "isactive": true, - "lastboottime": null, - "lastreporteddate": null, - "loggedinuser": null, - "modelnumberid": null, - "modifieddate": "2026-01-01T00:00:00.000000Z", - "osid": null, - "vendorid": null - }, - "createdby": "", - "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": "", - "modifieddate": "2026-01-01T00:00:00.000000Z", - "name": null, - "notes": null, - "ownlevelid": null, - "ownlocationid": null, - "ownmapx": null, - "ownmapy": null, - "pluginid": 1, - "serialnumber": "", - "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/", - "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/", - "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": "", - "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": "", - "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": "", - "modifieddate": "2026-01-01T00:00:00.000000Z", - "name": null, - "notes": null, - "ownlevelid": null, - "ownlocationid": null, - "ownmapx": null, - "ownmapy": null, - "pluginid": 1, - "serialnumber": "", - "statusid": 1 - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "PUT", - "path": "/api/computers/", - "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": "", - "isactive": true, - "lastboottime": null, - "lastreporteddate": null, - "loggedinuser": null, - "modelnumberid": null, - "modifieddate": "2026-01-01T00:00:00.000000Z", - "osid": null, - "vendorid": null - }, - "createdby": "", - "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": "", - "modifieddate": "2026-01-01T00:00:00.000000Z", - "name": null, - "notes": null, - "ownlevelid": null, - "ownlocationid": null, - "ownmapx": null, - "ownmapy": null, - "pluginid": 1, - "serialnumber": "", - "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//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//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//apps/", - "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//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//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/", - "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/", - "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": "", - "lastreported": "2026-01-01T00:00:00.000000Z", - "quietdays": 9 - }, - { - "computerid": 1, - "hostname": "", - "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": "", - "hostname": "", - "serialnumber": "" - } - ], - "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 - }, - "" - ], - "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/", - "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/", - "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/", - "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/", - "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/", - "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/", - "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/", - "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/", - "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/", - "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/", - "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/", - "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/", - "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-employees", - "endpoints": [ - { - "method": "DELETE", - "path": "/api/employees//photo", - "auth": "jwt + role:admin", - "params": "path: sso (int)", - "purpose": "Clear an employee photo and delete the uploaded file. External mode 409s.", - "example": "curl -X DELETE http://localhost:5001/api/employees/1/photo -H \"Authorization: Bearer $TOK\"", - "responseexample": { - "data": { - "First_Name": "Test", - "Last_Name": "Person", - "Picture": null, - "Role": null, - "SSO": 210000001, - "Team": null, - "photofilename": null, - "photourl": null - }, - "message": "Employee photo removed", - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "POST", - "path": "/api/employees//photo", - "auth": "jwt + role:admin", - "params": "path: sso (int); body: JSON (fields not yet documented)", - "purpose": "Upload (or replace) the photo for a self-hosted directory employee.", - "example": "curl -X POST http://localhost:5001/api/employees/1/photo -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "responseexample": { - "data": { - "First_Name": "Test", - "Last_Name": "Person", - "Picture": null, - "Role": null, - "SSO": 210000001, - "Team": null, - "photofilename": "photo-210000001.jpg", - "photourl": "/api/employees/photo/photo-210000001.jpg" - }, - "message": "Employee photo uploaded", - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "GET", - "path": "/api/employees/directory", - "auth": "permission:employees.view", - "params": "not documented", - "purpose": "Full self-hosted directory (for the management page).", - "example": "curl http://localhost:5001/api/employees/directory -H \"Authorization: Bearer $TOK\"" - }, - { - "method": "POST", - "path": "/api/employees/directory", - "auth": "jwt + role:admin", - "params": "body: JSON (fields not yet documented)", - "purpose": "UNDOCUMENTED: employees.create_directory_employee has no docstring.", - "example": "curl -X POST http://localhost:5001/api/employees/directory -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "readsbody": true - }, - { - "method": "DELETE", - "path": "/api/employees/directory/", - "auth": "jwt + role:admin", - "params": "path: sso (int)", - "purpose": "UNDOCUMENTED: employees.delete_directory_employee has no docstring.", - "example": "curl -X DELETE http://localhost:5001/api/employees/directory/1 -H \"Authorization: Bearer $TOK\"" - }, - { - "method": "PUT", - "path": "/api/employees/directory/", - "auth": "jwt + role:admin", - "params": "path: sso (int); body: JSON (fields not yet documented)", - "purpose": "UNDOCUMENTED: employees.update_directory_employee has no docstring.", - "example": "curl -X PUT http://localhost:5001/api/employees/directory/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "readsbody": true - }, - { - "method": "POST", - "path": "/api/employees/directory/import", - "auth": "jwt + role:admin", - "params": "body: JSON (fields not yet documented)", - "purpose": "Bulk upsert from CSV. Accepts headers SSO,First_Name,Last_Name,Team,Role, Picture (case-insensitive; sso/firstname/... also accepted).", - "example": "curl -X POST http://localhost:5001/api/employees/directory/import -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "readsbody": true - }, - { - "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/", - "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/photo/", - "auth": "none (reviewed: named in the public-read or mutation sweep)", - "params": "path: filename (path)", - "purpose": "Serve an uploaded employee photo (public - kiosk cards read it).", - "example": "curl http://localhost:5001/api/employees/photo/example.png" - }, - { - "method": "GET", - "path": "/api/employees/resolve/", - "auth": "permission:employees.view", - "params": "path: sso (string)", - "purpose": "Resolve one SSO to a name and photo, and say HOW.", - "example": "curl http://localhost:5001/api/employees/resolve/x -H \"Authorization: Bearer $TOK\"", - "responseexample": { - "data": { - "error": "No name found in the directory or in a user account", - "mode": "selfhosted", - "name": null, - "photourl": null, - "source": null, - "sso": "999999" - }, - "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": "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": "", - "domain": null, - "endpointstateid": 6, - "health": { - "label": "ok", - "level": "ok" - }, - "hostname": "", - "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": "", - "domain": null, - "endpointstateid": 5, - "health": { - "label": "ok", - "level": "ok" - }, - "hostname": "", - "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": "", - "domain": null, - "endpointstateid": 1, - "health": { - "label": "no agent", - "level": "unknown" - }, - "hostname": "", - "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/", - "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": "", - "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": "", - "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//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": "", - "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//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//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": "", - "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//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//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//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//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": "", - "reason": "visible to all", - "releasedat": null, - "releasedbyusername": "" - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "POST", - "path": "/api/endpoints//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": "", - "reason": "locked but still reconciled", - "releasedat": null, - "releasedbyusername": "" - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "GET", - "path": "/api/endpoints//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//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": "", - "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//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": "", - "expiresat": "2026-01-01T00:00:00.000000", - "reason": "stripping the enclosure" - }, - { - "action": "service_start", - "createdbyusername": "", - "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//policyholds/", - "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//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": "", - "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": "", - "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": "", - "resultdetail": null, - "resultmessage": null, - "scriptname": "test-open-notepad", - "status": "succeeded", - "target": "script:1", - "targetkind": null - }, - "" - ], - "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": "", - "expiresat": null, - "isactive": true, - "isexpired": false, - "lastusedat": null, - "name": "Endpoint agent key", - "resourcescopes": null, - "scopes": [ - "collector.ingest.endpoints" - ], - "tokenid": 1, - "tokenprefix": "", - "userid": 1 - }, - "provisioned": true, - "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//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": "" - }, - "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/", - "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/", - "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//", - "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//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//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//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//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//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//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//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//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//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//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//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//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": "", - "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" - }, - "" - ] - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "GET", - "path": "/api/endpoints/asset//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//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//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": "" - }, - "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//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": "", - "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": "", - "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": "", - "serialnumber": "" - }, - "responseexample": { - "data": { - "assetid": 1, - "credential": "", - "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": "", - "enrolledvia": "auto", - "hostname": "", - "issuedat": "2026-01-01T00:00:00.000000Z", - "lastusedat": null, - "reenrollblocked": false, - "reenrollblockedreason": null, - "serialnumber": "", - "state": "enrolled" - }, - { - "assetid": 2, - "credentialprefix": "", - "enrolledvia": null, - "hostname": "", - "issuedat": null, - "lastusedat": null, - "reenrollblocked": false, - "reenrollblockedreason": null, - "serialnumber": "", - "state": "notenrolled" - }, - { - "assetid": 3, - "credentialprefix": "", - "enrolledvia": null, - "hostname": "", - "issuedat": null, - "lastusedat": null, - "reenrollblocked": false, - "reenrollblockedreason": null, - "serialnumber": "", - "state": "pending" - } - ], - "counts": { - "enrolled": 1, - "notenrolled": 1, - "pending": 1, - "pendingcomputers": 1 - }, - "requests": [ - { - "agentversion": "1.20.0", - "decidedat": null, - "decidedby": null, - "deviceid": null, - "hostname": "", - "lastseenat": "2026-01-01T00:00:00.000000Z", - "matchedassetid": 3, - "reason": "no serial on record", - "requestedat": "2026-01-01T00:00:00.000000Z", - "requestid": "00000000", - "serialnumber": "", - "sourceip": "127.0.0.1", - "status": "pending" - }, - { - "agentversion": "1.20.0", - "decidedat": null, - "decidedby": null, - "deviceid": null, - "hostname": "", - "lastseenat": "2026-01-01T00:00:00.000000Z", - "matchedassetid": 1, - "reason": null, - "requestedat": "2026-01-01T00:00:00.000000Z", - "requestid": "00000000", - "serialnumber": "", - "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//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": "", - "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//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": "", - "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": "", - "lastreportedat": "2026-01-01T00:00:00.000000Z", - "state": "ready" - }, - { - "agentversion": "1.19.0", - "assetid": 3, - "blockers": [], - "hostname": "", - "lastreportedat": "2026-01-01T00:00:00.000000Z", - "state": "ready" - }, - { - "agentversion": "1.20.0", - "assetid": 1, - "blockers": [ - "awaiting enrollment" - ], - "hostname": "", - "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": "", - "done": false, - "enrolled": 0, - "failed": 1, - "queued": 3, - "size": 3, - "waveid": 1 - }, - { - "createdat": "2026-01-01T00:00:00Z", - "createdby": "", - "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//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": "" - }, - "responseexample": { - "data": { - "agentversion": "1.20.0", - "decidedat": "2026-01-01T00:00:00.000000Z", - "decidedby": "testadmin", - "deviceid": null, - "hostname": "", - "hostnameresult": "", - "lastseenat": "2026-01-01T00:00:00.000000Z", - "matchedassetid": 1, - "reason": null, - "requestedat": "2026-01-01T00:00:00.000000Z", - "requestid": "00000000", - "serialnumber": "", - "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//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": "", - "lastseenat": "2026-01-01T00:00:00.000000Z", - "matchedassetid": 1, - "reason": "awaiting approval", - "requestedat": "2026-01-01T00:00:00.000000Z", - "requestid": "00000000", - "serialnumber": "", - "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/", - "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//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/", - "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/", - "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": "", - "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": "" - }, - "message": "Operator report received", - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "GET", - "path": "/api/endpoints/operatorreports//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//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": "" - }, - { - "assetid": 1, - "createdat": "2026-01-01T00:00:00.000000Z", - "details": "first", - "hasimage": false, - "imagebytesize": null, - "imagemimetype": null, - "operatorreportid": 1, - "reason": "Other (free text)", - "reportedhostname": "" - } - ] - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "GET", - "path": "/api/endpoints/scriptbody/", - "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": "", - "spkisha256": "", - "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": "" - }, - "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": "", - "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/", - "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/", - "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": "", - "registration": { - "agentversion": "", - "appid": 1, - "appname": "ShopDB Endpoint Agent", - "contents": { - "agent": { - "filename": "shopdbagent.exe", - "sha256": "", - "version": "" - } - }, - "created": false, - "installpath": "/api/applications/package/1/shopdb-endpoint-agent.zip", - "ok": true, - "sha256": "", - "size": 135 - }, - "versions": [ - { - "iscurrent": true, - "size": 130, - "uploadedat": "2026-01-01T00:00:00.000000Z", - "version": "" - }, - { - "iscurrent": false, - "size": 130, - "uploadedat": "2026-01-01T00:00:00.000000Z", - "version": "" - } - ] - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "POST", - "path": "/api/endpoints/siteagent/binaries//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//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": "" - }, - "responseexample": { - "data": { - "binary": "agent", - "current": "", - "registration": { - "agentversion": "", - "appid": 1, - "appname": "ShopDB Endpoint Agent", - "contents": { - "agent": { - "filename": "shopdbagent.exe", - "sha256": "", - "version": "" - } - }, - "created": false, - "installpath": "/api/applications/package/1/shopdb-endpoint-agent.zip", - "ok": true, - "sha256": "", - "size": 135 - }, - "versions": [ - { - "iscurrent": false, - "size": 258, - "uploadedat": "2026-01-01T00:00:00.000000Z", - "version": "" - }, - { - "iscurrent": true, - "size": 258, - "uploadedat": "2026-01-01T00:00:00.000000Z", - "version": "" - } - ] - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "POST", - "path": "/api/endpoints/siteagent/binaries//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": "", - "expiresat": "2026-01-01T00:00:00.000000Z", - "lastusedat": null, - "lastusedip": null, - "maxuses": 25, - "remaining": 25, - "revokedat": null, - "state": "active", - "tokenid": 1, - "tokenprefix": "", - "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=&via=download", - "secret": "", - "token": { - "createdat": "2026-01-01T00:00:00.000000Z", - "createdby": "", - "expiresat": "2026-01-01T00:00:00.000000Z", - "lastusedat": null, - "lastusedip": null, - "maxuses": 500, - "remaining": 500, - "revokedat": null, - "state": "active", - "tokenid": 1, - "tokenprefix": "", - "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//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": "", - "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": "", - "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": "", - "nextserverpin": "" - }, - "readsbody": true - } - ] - }, - { - "surface": "plugin-geenforce", - "endpoints": [ - { - "method": "GET", - "path": "/api/geenforce/applications", - "auth": "permission:geenforce.view or geenforce.manage", - "params": "not documented", - "purpose": "The core Applications catalog (id + name) for the curated entry->app link picker in the entry editor.", - "example": "curl http://localhost:5001/api/geenforce/applications -H \"Authorization: Bearer $TOK\"", - "responseexample": { - "data": [ - { - "appid": 1, - "appname": "eDNC (tracked)" - } - ], - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "GET", - "path": "/api/geenforce/config", - "auth": "permission:geenforce.view or geenforce.manage", - "params": "not documented", - "purpose": "Plugin config: the on-share export root + the client IP allowlist.", - "example": "curl http://localhost:5001/api/geenforce/config -H \"Authorization: Bearer $TOK\"", - "responseexample": { - "data": { - "allowedcidrs": "", - "shareroot": "" - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "PUT", - "path": "/api/geenforce/config", - "auth": "permission:geenforce.publish", - "params": "body: JSON (fields not yet documented)", - "purpose": "UNDOCUMENTED: geenforce.put_config has no docstring.", - "example": "curl -X PUT http://localhost:5001/api/geenforce/config -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "requestexample": { - "shareroot": "" - }, - "responseexample": { - "data": { - "shareroot": "" - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "GET", - "path": "/api/geenforce/dashboard/failures", - "auth": "permission:geenforce.view or geenforce.manage", - "params": "not documented", - "purpose": "Entries that FAILED on their PC's most recent enforcement cycle.", - "example": "curl http://localhost:5001/api/geenforce/dashboard/failures -H \"Authorization: Bearer $TOK\"", - "responseexample": { - "data": [ - { - "computerid": null, - "entryname": "Install OpenText", - "exitcode": 1603, - "hostname": "", - "message": "Fatal error during installation", - "receivedat": "2026-01-01T00:00:00Z", - "scopename": "gea-shopfloor-cmm" - } - ], - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "DELETE", - "path": "/api/geenforce/entries/", - "auth": "permission:geenforce.manage", - "params": "path: entryid (int)", - "purpose": "UNDOCUMENTED: geenforce.delete_entry has no docstring.", - "example": "curl -X DELETE http://localhost:5001/api/geenforce/entries/1 -H \"Authorization: Bearer $TOK\"", - "responseexample": { - "data": { - "deleted": 2 - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "PUT", - "path": "/api/geenforce/entries/", - "auth": "permission:geenforce.manage", - "params": "path: entryid (int); body: JSON (fields not yet documented)", - "purpose": "UNDOCUMENTED: geenforce.update_entry has no docstring.", - "example": "curl -X PUT http://localhost:5001/api/geenforce/entries/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "requestexample": { - "InUseCheck": { - "Behavior": "CloseAndReopen", - "Processes": [ - { - "ExePath": "C:\\PCDLRN.exe", - "GracefulCloseTimeoutSec": 15, - "Name": "PCDLRN" - } - ] - }, - "Installer": "apps/pcdmis.msi", - "LogFile": "C:\\Logs\\pcdmis.log", - "Name": "PC-DMIS", - "PCTypesStrict": true, - "PreEnrollment": true, - "Type": "MSI" - }, - "responseexample": { - "data": { - "InUseCheck": { - "Behavior": "CloseAndReopen", - "Processes": [ - { - "ExePath": "C:\\PCDLRN.exe", - "GracefulCloseTimeoutSec": 15, - "Name": "PCDLRN" - } - ] - }, - "Installer": "apps/pcdmis.msi", - "LogFile": "C:\\Logs\\pcdmis.log", - "Name": "PC-DMIS", - "PCTypesStrict": true, - "PreEnrollment": true, - "Type": "MSI", - "appid": null, - "appname": null, - "entryid": 1, - "haspayload": false, - "payloadref": null, - "payloadsha256": null, - "payloadsource": "smb", - "sortorder": 0 - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "GET", - "path": "/api/geenforce/entries//payload", - "auth": "permission:geenforce.view or geenforce.manage", - "params": "path: entryid (int)", - "purpose": "Return the stored inline payload bytes for an entry (404 if none).", - "example": "curl http://localhost:5001/api/geenforce/entries/1/payload -H \"Authorization: Bearer $TOK\"" - }, - { - "method": "POST", - "path": "/api/geenforce/entries//payload", - "auth": "permission:geenforce.publish", - "params": "path: entryid (int); body: JSON (fields not yet documented)", - "purpose": "Store an inline payload (<= 1 MB) for an entry and point the entry at it.", - "example": "curl -X POST http://localhost:5001/api/geenforce/entries/1/payload -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "responseexample": { - "data": { - "Name": "eDNC install", - "PayloadRef": "config.reg", - "PayloadSha256": "", - "PayloadSource": "inline", - "Script": "scripts/x.ps1", - "Type": "PS1", - "appid": null, - "appname": null, - "entryid": 1, - "haspayload": true, - "payloadref": "config.reg", - "payloadsha256": "", - "payloadsource": "inline", - "sortorder": 0 - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "GET", - "path": "/api/geenforce/manifest", - "auth": "api-key (geenforce fetch token, or the IP allowlist)", - "params": "not documented", - "purpose": "Serve the current published manifest for a scope (fat-client: full scope).", - "example": "curl http://localhost:5001/api/geenforce/manifest -H \"X-API-Key: $KEY\"", - "queryparams": [ - { - "name": "pctype", - "type": "string", - "required": false - }, - { - "name": "phase", - "type": "string", - "required": false - } - ], - "responseexample": { - "Version": "2.6", - "Applications": [ - { - "Name": "Alpha", - "Type": "MSI", - "Installer": "apps/alpha.msi", - "DetectionMethod": "Registry", - "DetectionPath": "HKLM:\\SOFTWARE\\Alpha" - }, - { - "Name": "Beta", - "Type": "PS1", - "Script": "scripts/beta.ps1", - "DetectionMethod": "Always" - }, - { - "Name": "Gamma", - "Type": "PS1", - "Script": "scripts/gamma.ps1" - } - ] - } - }, - { - "method": "GET", - "path": "/api/geenforce/payload/", - "auth": "api-key (geenforce fetch token, or the IP allowlist)", - "params": "path: sha256 (string)", - "purpose": "Serve a payload blob by content hash over HTTPS.", - "example": "curl http://localhost:5001/api/geenforce/payload/x -H \"X-API-Key: $KEY\"" - }, - { - "method": "POST", - "path": "/api/geenforce/report", - "auth": "api-key (geenforce report token)", - "params": "body: JSON (fields not yet documented)", - "purpose": "Record one PC's enforcement cycle: applied version (did it receive the update?) + per-entry self-heal outcomes (installed/skipped/failed).", - "example": "curl -X POST http://localhost:5001/api/geenforce/report -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'", - "requestexample": { - "appliedversion": 1, - "counts": { - "failed": 1, - "filtered": 0, - "installed": 2, - "skipped": 1 - }, - "enforcerversion": "2.6", - "hostname": "", - "phase": "runtime", - "results": [ - { - "action": "installed", - "exitcode": 0, - "message": "rule re-added", - "name": "VNC firewall rule", - "selfhealed": true - }, - { - "action": "skipped", - "exitcode": 0, - "message": "", - "name": "PC-DMIS 2023.1", - "selfhealed": false - }, - { - "action": "installed", - "exitcode": 0, - "name": "eDNC config", - "selfhealed": true - }, - "" - ], - "scopename": "gea-shopfloor-cmm" - }, - "responseexample": { - "data": { - "reportid": 1, - "status": "selfhealed" - }, - "message": "recorded", - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "GET", - "path": "/api/geenforce/reports", - "auth": "permission:geenforce.view or geenforce.manage", - "params": "not documented", - "purpose": "Latest enforcement report per PC (fleet compliance view).", - "example": "curl http://localhost:5001/api/geenforce/reports -H \"Authorization: Bearer $TOK\"", - "queryparams": [ - { - "name": "hostname", - "type": "string", - "required": false - }, - { - "name": "scopename", - "type": "string", - "required": false - } - ], - "responseexample": { - "data": [ - { - "appliedversion": null, - "assetnumber": "WJBAK10", - "backupcollectedat": "2026-01-01T00:00:00.000000Z", - "backupkind": "partmarker", - "backuplastseen": "2026-01-01T00:00:00.000000Z", - "backupok": false, - "backupstaleafterdays": 3, - "computerid": 1, - "displayrole": null, - "enforcerversion": null, - "failed": 0, - "filtered": 0, - "hostname": "", - "installed": 0, - "isstale": false, - "lastcheckin": null, - "latestversion": 1, - "levelid": null, - "location": null, - "machineassetid": null, - "machinenumber": null, - "machinepluginid": null, - "mapx": null, - "mapy": null, - "phase": "runtime", - "receivedat": "2026-01-01T00:00:00.000000Z", - "receivedlatest": false, - "reportid": 1, - "scopename": "gea-shopfloor-cmm", - "skipped": 0, - "staleafterminutes": 30, - "status": "ok", - "toolassetid": null, - "toolassetnumber": null, - "toolpluginid": null - } - ], - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "GET", - "path": "/api/geenforce/reports/", - "auth": "permission:geenforce.view or geenforce.manage", - "params": "path: reportid (int)", - "purpose": "One report with per-entry outcomes (self-heal / failure detail).", - "example": "curl http://localhost:5001/api/geenforce/reports/1 -H \"Authorization: Bearer $TOK\"", - "responseexample": { - "data": { - "appliedversion": 1, - "hostname": "", - "latestversion": 1, - "phase": "runtime", - "receivedlatest": true, - "reportid": 1, - "results": [ - { - "action": "installed", - "entryname": "VNC firewall rule", - "exitcode": 0, - "message": "rule re-added", - "selfhealed": true - }, - { - "action": "skipped", - "entryname": "PC-DMIS 2023.1", - "exitcode": 0, - "message": "", - "selfhealed": false - }, - { - "action": "installed", - "entryname": "eDNC config", - "exitcode": 0, - "message": null, - "selfhealed": true - }, - "" - ], - "scopename": "gea-shopfloor-cmm", - "status": "failed" - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "GET", - "path": "/api/geenforce/scopes", - "auth": "permission:geenforce.view or geenforce.manage", - "params": "not documented", - "purpose": "List imaging PC-type scopes with entry + published-version counts.", - "example": "curl http://localhost:5001/api/geenforce/scopes -H \"Authorization: Bearer $TOK\"", - "responseexample": { - "data": [ - { - "computertypeid": null, - "entrycount": 2, - "iscommon": false, - "manifestversion": "2.6", - "measuringtooltypeid": null, - "minlibversion": null, - "phase": "runtime", - "publishedversion": 1, - "scopeid": 1, - "scopename": "gea-shopfloor-cmm" - } - ], - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "POST", - "path": "/api/geenforce/scopes", - "auth": "permission:geenforce.manage", - "params": "body: JSON (fields not yet documented)", - "purpose": "UNDOCUMENTED: geenforce.create_scope has no docstring.", - "example": "curl -X POST http://localhost:5001/api/geenforce/scopes -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "requestexample": { - "description": "test scope", - "phase": "runtime", - "scopename": "gea-shopfloor-collections" - }, - "responseexample": { - "data": { - "computertypeid": null, - "description": "test scope", - "entrycount": 0, - "iscommon": false, - "manifestversion": "1.0", - "measuringtooltypeid": null, - "phase": "runtime", - "publishedversion": null, - "scopeid": 1, - "scopename": "gea-shopfloor-collections" - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "DELETE", - "path": "/api/geenforce/scopes/", - "auth": "permission:geenforce.manage", - "params": "path: scopeid (int)", - "purpose": "UNDOCUMENTED: geenforce.delete_scope has no docstring.", - "example": "curl -X DELETE http://localhost:5001/api/geenforce/scopes/1 -H \"Authorization: Bearer $TOK\"", - "responseexample": { - "data": { - "deleted": 1 - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "GET", - "path": "/api/geenforce/scopes/", - "auth": "permission:geenforce.view or geenforce.manage", - "params": "path: scopeid (int)", - "purpose": "UNDOCUMENTED: geenforce.get_scope has no docstring.", - "example": "curl http://localhost:5001/api/geenforce/scopes/1 -H \"Authorization: Bearer $TOK\"", - "responseexample": { - "data": { - "computertypeid": null, - "description": "test scope", - "entries": [ - { - "Name": "Beta", - "Script": "scripts/b.ps1", - "Type": "PS1", - "appid": null, - "appname": null, - "entryid": 2, - "haspayload": false, - "payloadref": null, - "payloadsha256": null, - "payloadsource": "smb", - "sortorder": 0 - }, - { - "DetectionMethod": "FileVersion", - "DetectionPath": "C:\\a.exe", - "DetectionValue": "1.0", - "Installer": "apps/a.exe", - "Name": "Alpha", - "Type": "EXE", - "appid": null, - "appname": null, - "entryid": 1, - "haspayload": false, - "payloadref": null, - "payloadsha256": null, - "payloadsource": "smb", - "sortorder": 1 - } - ], - "entrycount": 2, - "iscommon": false, - "manifestversion": "1.0", - "measuringtooltypeid": null, - "phase": "runtime", - "publishedversion": null, - "scopeid": 1, - "scopename": "gea-shopfloor-test" - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "PUT", - "path": "/api/geenforce/scopes/", - "auth": "permission:geenforce.manage", - "params": "path: scopeid (int); body: JSON (fields not yet documented)", - "purpose": "UNDOCUMENTED: geenforce.update_scope has no docstring.", - "example": "curl -X PUT http://localhost:5001/api/geenforce/scopes/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "requestexample": { - "computertypeid": 3, - "description": "updated" - }, - "responseexample": { - "data": { - "computertypeid": 3, - "description": "updated", - "entrycount": 0, - "iscommon": false, - "manifestversion": "1.0", - "measuringtooltypeid": null, - "phase": "runtime", - "publishedversion": null, - "scopeid": 1, - "scopename": "gea-shopfloor-test" - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "GET", - "path": "/api/geenforce/scopes//compliance", - "auth": "permission:geenforce.view or geenforce.manage", - "params": "path: scopeid (int)", - "purpose": "Fleet-install coverage per app-linked entry (from collected PC data).", - "example": "curl http://localhost:5001/api/geenforce/scopes/1/compliance -H \"Authorization: Bearer $TOK\"", - "responseexample": { - "data": { - "computersplugin": false, - "phase": "runtime", - "rows": [ - { - "appid": 1, - "appname": "PC-DMIS", - "coveragenote": "computers plugin not installed; install counts unavailable", - "entryid": 1, - "entryname": "PC-DMIS 2019", - "expectedversion": "2019 R1", - "installedcount": null, - "versionmatchcount": null - } - ], - "scopeid": 1, - "scopename": "gea-shopfloor-cmm" - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "POST", - "path": "/api/geenforce/scopes//entries", - "auth": "permission:geenforce.manage", - "params": "path: scopeid (int); body: JSON (fields not yet documented)", - "purpose": "UNDOCUMENTED: geenforce.create_entry has no docstring.", - "example": "curl -X POST http://localhost:5001/api/geenforce/scopes/1/entries -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "requestexample": { - "InUseCheck": { - "Behavior": "CloseAndReopen", - "Processes": [ - { - "ExePath": "C:\\PCDLRN.exe", - "GracefulCloseTimeoutSec": 15, - "Name": "PCDLRN" - } - ] - }, - "Installer": "apps/pcdmis.msi", - "LogFile": "C:\\Logs\\pcdmis.log", - "Name": "PC-DMIS", - "PCTypesStrict": true, - "PreEnrollment": true, - "Type": "MSI" - }, - "responseexample": { - "data": { - "InUseCheck": { - "Behavior": "CloseAndReopen", - "Processes": [ - { - "ExePath": "C:\\PCDLRN.exe", - "GracefulCloseTimeoutSec": 15, - "Name": "PCDLRN" - } - ] - }, - "Installer": "apps/pcdmis.msi", - "LogFile": "C:\\Logs\\pcdmis.log", - "Name": "PC-DMIS", - "PCTypesStrict": true, - "PreEnrollment": true, - "Type": "MSI", - "appid": null, - "appname": null, - "entryid": 1, - "haspayload": false, - "payloadref": null, - "payloadsha256": null, - "payloadsource": "smb", - "sortorder": 0 - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "PUT", - "path": "/api/geenforce/scopes//entries/reorder", - "auth": "permission:geenforce.manage", - "params": "path: scopeid (int); body: JSON (fields not yet documented)", - "purpose": "Set entry order from a list of entryids (the ordering contract).", - "example": "curl -X PUT http://localhost:5001/api/geenforce/scopes/1/entries/reorder -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "requestexample": { - "order": [ - 2, - 1 - ] - }, - "responseexample": { - "data": { - "order": [ - 2, - 1 - ] - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "POST", - "path": "/api/geenforce/scopes//export-share", - "auth": "permission:geenforce.publish", - "params": "path: scopeid (int); body: JSON (fields not yet documented)", - "purpose": "Write the scope's current published JSON to the configured share root (backing up the old file to _meta/history first).", - "example": "curl -X POST http://localhost:5001/api/geenforce/scopes/1/export-share -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "responseexample": { - "data": { - "path": "" - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "GET", - "path": "/api/geenforce/scopes//preview", - "auth": "permission:geenforce.view or geenforce.manage", - "params": "path: scopeid (int)", - "purpose": "Render the DRAFT manifest JSON a publish would freeze (review before ship).", - "example": "curl http://localhost:5001/api/geenforce/scopes/1/preview -H \"Authorization: Bearer $TOK\"", - "responseexample": { - "data": { - "manifest": { - "Applications": [ - { - "DetectionMethod": "Registry", - "DetectionPath": "HKLM:\\SOFTWARE\\Alpha", - "Installer": "apps/alpha.msi", - "Name": "Alpha", - "Type": "MSI" - }, - { - "DetectionMethod": "Always", - "Name": "Beta", - "Script": "scripts/beta.ps1", - "Type": "PS1" - } - ], - "Version": "2.6" - }, - "scopename": "gea-shopfloor-cmm" - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "POST", - "path": "/api/geenforce/scopes//publish", - "auth": "permission:geenforce.publish", - "params": "path: scopeid (int); body: JSON (fields not yet documented)", - "purpose": "UNDOCUMENTED: geenforce.publish_scope_route has no docstring.", - "example": "curl -X POST http://localhost:5001/api/geenforce/scopes/1/publish -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "requestexample": { - "notes": "v1" - }, - "responseexample": { - "data": { - "versionnumber": 1 - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "GET", - "path": "/api/geenforce/scopes//publish-preflight", - "auth": "permission:geenforce.view or geenforce.manage", - "params": "path: scopeid (int)", - "purpose": "Would publishing this scope outrun the fleet's enforcer lib?", - "example": "curl http://localhost:5001/api/geenforce/scopes/1/publish-preflight -H \"Authorization: Bearer $TOK\"" - }, - { - "method": "POST", - "path": "/api/geenforce/scopes//rollback", - "auth": "permission:geenforce.publish", - "params": "path: scopeid (int); body: JSON (fields not yet documented)", - "purpose": "UNDOCUMENTED: geenforce.rollback_scope_route has no docstring.", - "example": "curl -X POST http://localhost:5001/api/geenforce/scopes/1/rollback -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "requestexample": { - "versionnumber": 1 - }, - "responseexample": { - "data": { - "versionnumber": 1 - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "GET", - "path": "/api/geenforce/scopes//simulate", - "auth": "permission:geenforce.view or geenforce.manage", - "params": "path: scopeid (int)", - "purpose": "Which draft entries apply to a given machine profile, and why the rest are filtered out (reuses the engine-mirror filters).", - "example": "curl http://localhost:5001/api/geenforce/scopes/1/simulate -H \"Authorization: Bearer $TOK\"", - "queryparams": [ - { - "name": "cmmversion", - "type": "string", - "required": false - }, - { - "name": "hostname", - "type": "string", - "required": false - }, - { - "name": "machinenumber", - "type": "string", - "required": false - }, - { - "name": "pctype", - "type": "string", - "required": false - }, - { - "name": "subtype", - "type": "string", - "required": false - } - ], - "responseexample": { - "data": { - "applied": [ - "CLM (untagged)", - "PC-DMIS 2019" - ], - "filtered": [ - { - "filteredby": [ - "_CmmVersion" - ], - "name": "PC-DMIS 2016" - } - ], - "profile": { - "cmmversion": "2019", - "hostname": "", - "machinenumber": null, - "pctype": "gea-shopfloor-cmm", - "phase": "runtime", - "subtype": null - } - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "GET", - "path": "/api/geenforce/scopes//versions", - "auth": "permission:geenforce.view or geenforce.manage", - "params": "path: scopeid (int)", - "purpose": "UNDOCUMENTED: geenforce.list_versions has no docstring.", - "example": "curl http://localhost:5001/api/geenforce/scopes/1/versions -H \"Authorization: Bearer $TOK\"", - "responseexample": { - "data": [ - { - "iscurrent": false, - "notes": "v2", - "publishedat": "2026-01-01T00:00:00.000000Z", - "publishedby": 1, - "versionnumber": 2 - }, - { - "iscurrent": true, - "notes": "v1", - "publishedat": "2026-01-01T00:00:00.000000Z", - "publishedby": 1, - "versionnumber": 1 - } - ], - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "GET", - "path": "/api/geenforce/scopes//versions/", - "auth": "permission:geenforce.view or geenforce.manage", - "params": "path: scopeid (int), versionnumber (int)", - "purpose": "UNDOCUMENTED: geenforce.get_version has no docstring.", - "example": "curl http://localhost:5001/api/geenforce/scopes/1/versions/1 -H \"Authorization: Bearer $TOK\"", - "responseexample": { - "data": { - "manifest": { - "Applications": [ - { - "Name": "Alpha", - "Type": "MSI" - }, - { - "Name": "Beta", - "Type": "PS1" - } - ], - "Version": "1.0" - }, - "versionnumber": 2 - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - } - ] - }, - { - "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/", - "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/", - "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//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//restore/", - "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//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//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//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/", - "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/", - "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/", - "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": "", - "guideid": 1, - "guiderevisionid": 1, - "note": null, - "revision": 1, - "shorthash": "", - "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/", - "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/", - "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/", - "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//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": "0410", - "assettypecolor": null, - "assettypeid": 1, - "assettypename": "machine", - "businessunitid": null, - "createdby": "", - "createddate": "2026-01-01T00:00:00.000000Z", - "deletedby": null, - "deleteddate": null, - "dualpathpartner": 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": null, - "machineid": 1, - "machinetypeid": 1, - "machinetypename": "Part Washer", - "maintenanceintervaldays": null, - "modelnumberid": null, - "modifieddate": "2026-01-01T00:00:00.000000Z", - "nextmaintenancedate": null, - "requiresmanualconfig": false, - "vendorid": 1, - "vendorname": "Acme Industrial" - }, - "maintenancereference": null, - "mapverifiedat": null, - "mapx": null, - "mapy": null, - "modifiedby": "", - "modifieddate": "2026-01-01T00:00:00.000000Z", - "name": "Cell 4 washer", - "notes": null, - "ownlevelid": null, - "ownlocationid": null, - "ownmapx": null, - "ownmapy": null, - "pluginid": 1, - "serialnumber": "", - "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": "", - "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": "", - "modifieddate": "2026-01-01T00:00:00.000000Z", - "name": "Maintenance date probe", - "notes": null, - "ownlevelid": null, - "ownlocationid": null, - "ownmapx": null, - "ownmapy": null, - "pluginid": 1, - "serialnumber": "", - "statusid": 1 - }, - "message": "Machine created", - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "DELETE", - "path": "/api/machines/", - "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/", - "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": "2001", - "assettypecolor": null, - "assettypeid": 1, - "assettypename": "machine", - "businessunitid": null, - "createdby": "", - "createddate": "2026-01-01T00:00:00.000000Z", - "deletedby": null, - "deleteddate": null, - "dualpathpartner": 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", - "imageurl": "/api/models/images/model-1.png", - "isactive": true, - "islocationonly": false, - "lastmaintenancedate": null, - "machineid": 1, - "machinetypeid": null, - "maintenanceintervaldays": null, - "modelname": "IMG-MODEL-1", - "modelnumberid": 1, - "modifieddate": "2026-01-01T00:00:00.000000Z", - "nextmaintenancedate": null, - "requiresmanualconfig": false, - "vendorid": null - }, - "maintenancereference": null, - "mapverifiedat": null, - "mapx": null, - "mapy": null, - "modifiedby": "", - "modifieddate": "2026-01-01T00:00:00.000000Z", - "name": null, - "notes": null, - "ownlevelid": null, - "ownlocationid": null, - "ownmapx": null, - "ownmapy": null, - "pluginid": 1, - "serialnumber": "", - "statusid": 1 - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "PUT", - "path": "/api/machines/", - "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/", - "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/", - "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/", - "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/", - "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-measuringtools", - "endpoints": [ - { - "method": "GET", - "path": "/api/measuringtools", - "auth": "permission:measuringtools.view", - "params": "not documented", - "purpose": "List measuring tools with filters + pagination.", - "example": "curl http://localhost:5001/api/measuringtools -H \"Authorization: Bearer $TOK\"", - "queryparams": [ - { - "name": "active", - "type": "string", - "required": false, - "default": "true" - }, - { - "name": "assetnumber", - "type": "string", - "required": false - }, - { - "name": "calibrationstatus", - "type": "string", - "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": "statusid", - "type": "integer", - "required": false - }, - { - "name": "typeid", - "type": "integer", - "required": false - } - ], - "responseexample": { - "data": [ - { - "assetid": 26, - "assetnumber": "MT-PAGE-05", - "assettypecolor": null, - "assettypeid": 1, - "assettypename": "measuring_tool", - "businessunitid": null, - "createdby": "", - "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, - "measuringtool": { - "assetid": 26, - "calibrationintervaldays": null, - "calibrationprovider": null, - "calibrationstatus": "overdue", - "calibrationstatuscolor": "#F44336", - "createddate": "2026-01-01T00:00:00.000000Z", - "isactive": true, - "lastcalibrationdate": null, - "measuringtoolid": 26, - "measuringtooltypeid": null, - "modifieddate": "2026-01-01T00:00:00.000000Z", - "nextcalibrationdate": "2026-01-01", - "notes": null - }, - "modifiedby": "", - "modifieddate": "2026-01-01T00:00:00.000000Z", - "name": "Paged tool 5", - "notes": null, - "ownlevelid": null, - "ownlocationid": null, - "ownmapx": null, - "ownmapy": null, - "pluginid": 26, - "serialnumber": "", - "statuscolor": null, - "statusid": 1, - "statusname": "In Use" - } - ], - "meta": { - "pagination": { - "hasnext": false, - "hasprev": false, - "page": 1, - "perpage": 2, - "total": 1, - "totalpages": 1 - }, - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "POST", - "path": "/api/measuringtools", - "auth": "permission:measuringtools.create", - "params": "body: JSON (fields not yet documented)", - "purpose": "Create a measuring tool: one Asset core row + one extension row.", - "example": "curl -X POST http://localhost:5001/api/measuringtools -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "requestexample": { - "assetnumber": "MT-001", - "calibrationintervaldays": 365, - "calibrationprovider": "Metro Cal Lab", - "gaugelabreference": "GL-42", - "lastcalibrationdate": "2026-01-01", - "measuringtooltypeid": 1, - "name": "Bench caliper", - "nextcalibrationdate": "2026-01-01", - "serialnumber": "", - "statusid": 1 - }, - "responseexample": { - "data": { - "assetid": 1, - "assetnumber": "MT-001", - "assettypecolor": null, - "assettypeid": 1, - "assettypename": "measuring_tool", - "businessunitid": null, - "createdby": "", - "createddate": "2026-01-01T00:00:00.000000Z", - "deletedby": null, - "deleteddate": null, - "gaugelabreference": "GL-42", - "isactive": true, - "levelid": null, - "locationcode": null, - "locationid": null, - "maintenancereference": null, - "mapverifiedat": null, - "mapx": null, - "mapy": null, - "measuringtool": { - "assetid": 1, - "calibrationintervaldays": 365, - "calibrationprovider": "Metro Cal Lab", - "calibrationstatus": "current", - "calibrationstatuscolor": "#4CAF50", - "createddate": "2026-01-01T00:00:00.000000Z", - "isactive": true, - "lastcalibrationdate": "2026-01-01", - "measuringtoolid": 1, - "measuringtooltypecolor": "#14abef", - "measuringtooltypeid": 1, - "measuringtooltypename": "Caliper", - "modifieddate": "2026-01-01T00:00:00.000000Z", - "nextcalibrationdate": "2026-01-01", - "notes": null - }, - "modifiedby": "", - "modifieddate": "2026-01-01T00:00:00.000000Z", - "name": "Bench caliper", - "notes": null, - "ownlevelid": null, - "ownlocationid": null, - "ownmapx": null, - "ownmapy": null, - "pluginid": 1, - "serialnumber": "", - "statuscolor": null, - "statusid": 1, - "statusname": "In Use" - }, - "message": "Measuring tool created", - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "DELETE", - "path": "/api/measuringtools/", - "auth": "permission:measuringtools.delete", - "params": "path: tool_id (int)", - "purpose": "Soft delete a measuring tool (deactivates its asset).", - "example": "curl -X DELETE http://localhost:5001/api/measuringtools/1 -H \"Authorization: Bearer $TOK\"", - "responseexample": { - "message": "Measuring tool deleted", - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "GET", - "path": "/api/measuringtools/", - "auth": "permission:measuringtools.view", - "params": "path: tool_id (int)", - "purpose": "Get one measuring tool (asset core merged with the extension).", - "example": "curl http://localhost:5001/api/measuringtools/1 -H \"Authorization: Bearer $TOK\"", - "responseexample": { - "data": { - "assetid": 1, - "assetnumber": "MT-001", - "assettypecolor": null, - "assettypeid": 1, - "assettypename": "measuring_tool", - "businessunitid": null, - "createdby": "", - "createddate": "2026-01-01T00:00:00.000000Z", - "deletedby": null, - "deleteddate": null, - "gaugelabreference": "GL-42", - "isactive": true, - "levelid": null, - "locationcode": null, - "locationid": null, - "maintenancereference": null, - "mapverifiedat": null, - "mapx": null, - "mapy": null, - "measuringtool": { - "assetid": 1, - "calibrationintervaldays": 365, - "calibrationprovider": "Metro Cal Lab", - "calibrationstatus": "current", - "calibrationstatuscolor": "#4CAF50", - "createddate": "2026-01-01T00:00:00.000000Z", - "isactive": true, - "lastcalibrationdate": "2026-01-01", - "measuringtoolid": 1, - "measuringtooltypecolor": "#14abef", - "measuringtooltypeid": 1, - "measuringtooltypename": "Caliper", - "modifieddate": "2026-01-01T00:00:00.000000Z", - "nextcalibrationdate": "2026-01-01", - "notes": null - }, - "modifiedby": "", - "modifieddate": "2026-01-01T00:00:00.000000Z", - "name": "Bench caliper", - "notes": null, - "ownlevelid": null, - "ownlocationid": null, - "ownmapx": null, - "ownmapy": null, - "pluginid": 1, - "serialnumber": "", - "statuscolor": null, - "statusid": 1, - "statusname": "In Use" - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "PUT", - "path": "/api/measuringtools/", - "auth": "permission:measuringtools.edit", - "params": "path: tool_id (int); body: JSON (fields not yet documented)", - "purpose": "Update a measuring tool (asset core fields + extension in one payload).", - "example": "curl -X PUT http://localhost:5001/api/measuringtools/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "requestexample": { - "calibrationprovider": "In-house", - "name": "Renamed tool", - "nextcalibrationdate": "2026-01-01" - }, - "responseexample": { - "data": { - "assetid": 20, - "assetnumber": "MT-AUDIT-1", - "assettypecolor": null, - "assettypeid": 1, - "assettypename": "measuring_tool", - "businessunitid": null, - "createdby": "", - "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, - "measuringtool": { - "assetid": 20, - "calibrationintervaldays": null, - "calibrationprovider": null, - "calibrationstatus": "current", - "calibrationstatuscolor": "#4CAF50", - "createddate": "2026-01-01T00:00:00.000000Z", - "isactive": true, - "lastcalibrationdate": "2026-01-01", - "measuringtoolid": 20, - "measuringtooltypeid": null, - "modifieddate": "2026-01-01T00:00:00.000000Z", - "nextcalibrationdate": "2026-01-01", - "notes": null - }, - "modifiedby": "", - "modifieddate": "2026-01-01T00:00:00.000000Z", - "name": "After rename", - "notes": null, - "ownlevelid": null, - "ownlocationid": null, - "ownmapx": null, - "ownmapy": null, - "pluginid": 20, - "serialnumber": "", - "statuscolor": null, - "statusid": 1, - "statusname": "In Use" - }, - "message": "Measuring tool updated", - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "GET", - "path": "/api/measuringtools/by-asset/", - "auth": "permission:measuringtools.view", - "params": "path: asset_id (int)", - "purpose": "Get a measuring tool by its core asset id.", - "example": "curl http://localhost:5001/api/measuringtools/by-asset/1 -H \"Authorization: Bearer $TOK\"" - }, - { - "method": "GET", - "path": "/api/measuringtools/map-overlay", - "auth": "permission:measuringtools.view", - "params": "not documented", - "purpose": "Calibration-status overlay for active measuring tools.", - "example": "curl http://localhost:5001/api/measuringtools/map-overlay -H \"Authorization: Bearer $TOK\"", - "responseexample": { - "data": [ - { - "assetid": 4, - "color": "#F44336", - "label": "Overdue" - }, - { - "assetid": 6, - "color": "#F44336", - "label": "Overdue" - }, - { - "assetid": 16, - "color": "#F44336", - "label": "Overdue" - } - ], - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "GET", - "path": "/api/measuringtools/report/calibration", - "auth": "permission:measuringtools.view", - "params": "not documented", - "purpose": "Counts + lists bucketed by derived calibration status.", - "example": "curl http://localhost:5001/api/measuringtools/report/calibration -H \"Authorization: Bearer $TOK\"", - "responseexample": { - "data": { - "buckets": { - "current": [], - "duesoon": [], - "overdue": [], - "unknown": [] - }, - "counts": { - "current": 0, - "duesoon": 0, - "overdue": 0, - "unknown": 0 - }, - "statuscolors": { - "current": "#4CAF50", - "duesoon": "#FF9800", - "overdue": "#F44336", - "unknown": "#9E9E9E" - } - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "GET", - "path": "/api/measuringtools/types", - "auth": "permission:measuringtools.view", - "params": "not documented", - "purpose": "List measuring-tool types.", - "example": "curl http://localhost:5001/api/measuringtools/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": [ - { - "color": "#7934f3", - "createddate": "2026-01-01T00:00:00.000000Z", - "description": "Bore / hole diameter gage", - "isactive": true, - "measuringtooltypeid": 4, - "modifieddate": "2026-01-01T00:00:00.000000Z", - "name": "Bore Gage" - }, - { - "color": "#14abef", - "createddate": "2026-01-01T00:00:00.000000Z", - "description": "Vernier / digital caliper", - "isactive": true, - "measuringtooltypeid": 1, - "modifieddate": "2026-01-01T00:00:00.000000Z", - "name": "Caliper" - }, - { - "color": "#e83e8c", - "createddate": "2026-01-01T00:00:00.000000Z", - "description": "Reference gage block set", - "isactive": true, - "measuringtooltypeid": 7, - "modifieddate": "2026-01-01T00:00:00.000000Z", - "name": "Gage Block Set" - }, - "" - ], - "meta": { - "pagination": { - "hasnext": false, - "hasprev": false, - "page": 1, - "perpage": 20, - "total": 8, - "totalpages": 1 - }, - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "POST", - "path": "/api/measuringtools/types", - "auth": "permission:measuringtools.create", - "params": "body: JSON (fields not yet documented)", - "purpose": "Create a measuring-tool type (reactivates a soft-deleted same-named one).", - "example": "curl -X POST http://localhost:5001/api/measuringtools/types -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "requestexample": { - "color": "#123456", - "description": "Pin gage set", - "name": "Pin Gage" - }, - "responseexample": { - "data": { - "color": "#123456", - "createddate": "2026-01-01T00:00:00.000000Z", - "description": "Pin gage set", - "isactive": true, - "measuringtooltypeid": 9, - "modifieddate": "2026-01-01T00:00:00.000000Z", - "name": "Pin Gage" - }, - "message": "Measuring-tool type created", - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "DELETE", - "path": "/api/measuringtools/types/", - "auth": "permission:measuringtools.delete", - "params": "path: type_id (int)", - "purpose": "Delete a measuring-tool type. Refused if any tool still uses it.", - "example": "curl -X DELETE http://localhost:5001/api/measuringtools/types/1 -H \"Authorization: Bearer $TOK\"", - "responseexample": { - "message": "Measuring-tool type deleted", - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "GET", - "path": "/api/measuringtools/types/", - "auth": "permission:measuringtools.view", - "params": "path: type_id (int)", - "purpose": "Get one measuring-tool type.", - "example": "curl http://localhost:5001/api/measuringtools/types/1 -H \"Authorization: Bearer $TOK\"" - }, - { - "method": "PUT", - "path": "/api/measuringtools/types/", - "auth": "permission:measuringtools.edit", - "params": "path: type_id (int); body: JSON (fields not yet documented)", - "purpose": "Update a measuring-tool type.", - "example": "curl -X PUT http://localhost:5001/api/measuringtools/types/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "requestexample": { - "description": "Updated" - }, - "responseexample": { - "data": { - "color": "#123456", - "createddate": "2026-01-01T00:00:00.000000Z", - "description": "Updated", - "isactive": true, - "measuringtooltypeid": 9, - "modifieddate": "2026-01-01T00:00:00.000000Z", - "name": "Pin Gage" - }, - "message": "Measuring-tool type updated", - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "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": "", - "createddate": "2026-01-01T00:00:00.000000Z", - "deletedby": null, - "deleteddate": null, - "gaugelabreference": null, - "ipaddress": "", - "isactive": true, - "levelid": null, - "locationcode": null, - "locationid": null, - "maintenancereference": null, - "mapverifiedat": null, - "mapx": null, - "mapy": null, - "modifiedby": "", - "modifieddate": "2026-01-01T00:00:00.000000Z", - "name": null, - "networkdevice": { - "assetid": 1, - "createddate": "2026-01-01T00:00:00.000000Z", - "firmwareversion": null, - "hostname": "", - "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": "", - "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": "", - "ipaddress": "", - "name": "Core switch" - }, - "responseexample": { - "data": { - "assetid": 1, - "assetnumber": "APNL-Dock-Door-4", - "assettypecolor": null, - "assettypeid": 1, - "assettypename": "network_device", - "businessunitid": null, - "createdby": "", - "createddate": "2026-01-01T00:00:00.000000Z", - "deletedby": null, - "deleteddate": null, - "gaugelabreference": null, - "ipaddress": "", - "isactive": true, - "levelid": null, - "locationcode": null, - "locationid": null, - "maintenancereference": null, - "mapverifiedat": null, - "mapx": null, - "mapy": null, - "modifiedby": "", - "modifieddate": "2026-01-01T00:00:00.000000Z", - "name": "Dock Door 4", - "networkdevice": { - "assetid": 1, - "createddate": "2026-01-01T00:00:00.000000Z", - "firmwareversion": null, - "hostname": "", - "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": "", - "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/", - "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/", - "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": "", - "createddate": "2026-01-01T00:00:00.000000Z", - "deletedby": null, - "deleteddate": null, - "gaugelabreference": "GL-2", - "ipaddress": "", - "isactive": true, - "levelid": null, - "locationcode": null, - "locationid": null, - "maintenancereference": "MNT-2", - "mapverifiedat": null, - "mapx": null, - "mapy": null, - "modifiedby": "", - "modifieddate": "2026-01-01T00:00:00.000000Z", - "name": null, - "networkdevice": { - "assetid": 1, - "createddate": "2026-01-01T00:00:00.000000Z", - "firmwareversion": null, - "hostname": "", - "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": "", - "statusid": 1 - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "PUT", - "path": "/api/network/", - "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": "", - "createddate": "2026-01-01T00:00:00.000000Z", - "deletedby": null, - "deleteddate": null, - "gaugelabreference": "GL-2", - "ipaddress": "", - "isactive": true, - "levelid": null, - "locationcode": null, - "locationid": null, - "maintenancereference": "MNT-2", - "mapverifiedat": null, - "mapx": null, - "mapy": null, - "modifiedby": "", - "modifieddate": "2026-01-01T00:00:00.000000Z", - "name": null, - "networkdevice": { - "assetid": 1, - "createddate": "2026-01-01T00:00:00.000000Z", - "firmwareversion": null, - "hostname": "", - "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": "", - "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/", - "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/", - "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": "", - "name": "Attached", - "vlanid": 1 - }, - "responseexample": { - "data": { - "broadcastaddress": null, - "cidr": "", - "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/", - "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/", - "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/", - "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/", - "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/", - "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/", - "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/", - "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/", - "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/", - "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": [ - "", - "" - ] - }, - "notification": "Line 3 is down", - "notificationtypeid": 1 - }, - "responseexample": { - "data": { - "alertfleet": true, - "alertscope": { - "computertype": "CMM PC", - "hostname": [ - "", - "" - ] - }, - "alerttimeout": 0, - "appid": null, - "businessunitid": null, - "employeename": "", - "employeesso": "", - "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/", - "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/", - "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/", - "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": "", - "employeesso": "", - "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/", - "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": "", - "employeepicture": "", - "employeesso": "", - "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": "", - "employeepicture": "", - "employeesso": "", - "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": "", - "splitperemployee": "", - "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": "", - "splitperemployee": "", - "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/", - "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": "", - "splitperemployee": "", - "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-printedparts", - "endpoints": [ - { - "method": "DELETE", - "path": "/api/printedparts/files/", - "auth": "permission:printedparts.delete", - "params": "path: file_id (int)", - "purpose": "Remove a bad revision (wrong file uploaded). History otherwise stays.", - "example": "curl -X DELETE http://localhost:5001/api/printedparts/files/1 -H \"Authorization: Bearer $TOK\"" - }, - { - "method": "GET", - "path": "/api/printedparts/files//download", - "auth": "permission:printedparts.view", - "params": "path: file_id (int)", - "purpose": "Download a revision under its original filename.", - "example": "curl http://localhost:5001/api/printedparts/files/1/download -H \"Authorization: Bearer $TOK\"" - }, - { - "method": "GET", - "path": "/api/printedparts/image/", - "auth": "none (reviewed: named in the public-read or mutation sweep)", - "params": "path: filename (path)", - "purpose": "Serve an uploaded item image (public - kiosk and list read it).", - "example": "curl http://localhost:5001/api/printedparts/image/example.png" - }, - { - "method": "GET", - "path": "/api/printedparts/items", - "auth": "permission:printedparts.view", - "params": "not documented", - "purpose": "List printed items, paginated; search + low-stock filter.", - "example": "curl http://localhost:5001/api/printedparts/items -H \"Authorization: Bearer $TOK\"", - "queryparams": [ - { - "name": "active", - "type": "string", - "required": false, - "default": "true" - }, - { - "name": "lowstock", - "type": "string", - "required": false, - "default": "" - }, - { - "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": [ - { - "binlocation": null, - "createddate": "2026-01-01T00:00:00.000000Z", - "gagelabtag": "WJRP0117", - "imageurl": null, - "isactive": true, - "islowstock": true, - "itemcode": "3DP0001", - "itemdescription": null, - "itemname": "Gage block holder", - "latestrevision": null, - "lowstockthreshold": 5, - "modifieddate": "2026-01-01T00:00:00.000000Z", - "printeditemid": 1, - "printnotes": null, - "quantityonhand": 0 - } - ], - "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/printedparts/items", - "auth": "permission:printedparts.create", - "params": "body: JSON (fields not yet documented)", - "purpose": "Create a printed item.", - "example": "curl -X POST http://localhost:5001/api/printedparts/items -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "requestexample": { - "gagelabtag": "wjrp0117", - "itemname": "Gage block holder" - }, - "responseexample": { - "data": { - "binlocation": null, - "createddate": "2026-01-01T00:00:00.000000Z", - "gagelabtag": "WJRP0117", - "imageurl": null, - "isactive": true, - "islowstock": true, - "itemcode": "3DP0001", - "itemdescription": null, - "itemname": "Gage block holder", - "latestrevision": null, - "lowstockthreshold": 5, - "modifieddate": "2026-01-01T00:00:00.000000Z", - "printeditemid": 1, - "printnotes": null, - "quantityonhand": 0 - }, - "message": "Printed item created", - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "DELETE", - "path": "/api/printedparts/items/", - "auth": "permission:printedparts.delete", - "params": "path: item_id (int)", - "purpose": "Soft-retire an item; its ledger history stays.", - "example": "curl -X DELETE http://localhost:5001/api/printedparts/items/1 -H \"Authorization: Bearer $TOK\"", - "responseexample": { - "message": "Printed item retired", - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "GET", - "path": "/api/printedparts/items/", - "auth": "permission:printedparts.view", - "params": "path: item_id (int)", - "purpose": "Get one printed item with its recent transactions.", - "example": "curl http://localhost:5001/api/printedparts/items/1 -H \"Authorization: Bearer $TOK\"" - }, - { - "method": "PUT", - "path": "/api/printedparts/items/", - "auth": "permission:printedparts.edit", - "params": "path: item_id (int); body: JSON (fields not yet documented)", - "purpose": "Update catalog fields. Quantity moves ONLY through the ledger.", - "example": "curl -X PUT http://localhost:5001/api/printedparts/items/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "readsbody": true - }, - { - "method": "POST", - "path": "/api/printedparts/items//adjust", - "auth": "permission:printedparts.restock", - "params": "path: item_id (int); body: JSON (fields not yet documented)", - "purpose": "Correct the count (damage, recount). Body: {quantitychange, reason, badge}.", - "example": "curl -X POST http://localhost:5001/api/printedparts/items/1/adjust -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "readsbody": true - }, - { - "method": "GET", - "path": "/api/printedparts/items//files", - "auth": "permission:printedparts.view", - "params": "path: item_id (int)", - "purpose": "Revision history, newest first.", - "example": "curl http://localhost:5001/api/printedparts/items/1/files -H \"Authorization: Bearer $TOK\"", - "responseexample": { - "data": [ - { - "fileid": 2, - "filename": "clip_v2.gcode", - "filesize": 8, - "printeditemid": 1, - "revision": 2, - "uploadedby": "testadmin", - "uploadeddate": "2026-01-01T00:00:00.000000Z", - "uploadnote": null - }, - { - "fileid": 1, - "filename": "clip_v1.stl", - "filesize": 10, - "printeditemid": 1, - "revision": 1, - "uploadedby": "testadmin", - "uploadeddate": "2026-01-01T00:00:00.000000Z", - "uploadnote": "initial" - } - ], - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "POST", - "path": "/api/printedparts/items//files", - "auth": "permission:printedparts.edit", - "params": "path: item_id (int); body: JSON (fields not yet documented)", - "purpose": "Upload the next revision of the item's print file.", - "example": "curl -X POST http://localhost:5001/api/printedparts/items/1/files -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "responseexample": { - "data": { - "fileid": 1, - "filename": "clip_v1.stl", - "filesize": 10, - "printeditemid": 1, - "revision": 1, - "uploadedby": "testadmin", - "uploadeddate": "2026-01-01T00:00:00.000000Z", - "uploadnote": "initial" - }, - "message": "Revision 1 uploaded", - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "DELETE", - "path": "/api/printedparts/items//image", - "auth": "permission:printedparts.delete", - "params": "path: item_id (int)", - "purpose": "Clear an item image; delete the file only if this plugin owns it.", - "example": "curl -X DELETE http://localhost:5001/api/printedparts/items/1/image -H \"Authorization: Bearer $TOK\"" - }, - { - "method": "POST", - "path": "/api/printedparts/items//image", - "auth": "permission:printedparts.edit", - "params": "path: item_id (int); body: JSON (fields not yet documented)", - "purpose": "Upload (or replace) the photo for an item (multipart file=).", - "example": "curl -X POST http://localhost:5001/api/printedparts/items/1/image -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "readsbody": true - }, - { - "method": "POST", - "path": "/api/printedparts/items//restock", - "auth": "permission:printedparts.restock", - "params": "path: item_id (int); body: JSON (fields not yet documented)", - "purpose": "Add freshly printed stock. Body: {quantity, badge}.", - "example": "curl -X POST http://localhost:5001/api/printedparts/items/1/restock -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "requestexample": { - "badge": "", - "quantity": 10 - }, - "responseexample": { - "data": { - "binlocation": null, - "createddate": "2026-01-01T00:00:00.000000Z", - "gagelabtag": null, - "imageurl": null, - "isactive": true, - "islowstock": false, - "itemcode": "3DP-9001", - "itemdescription": null, - "itemname": "Test clip", - "latestrevision": null, - "lowstockthreshold": 5, - "modifieddate": "2026-01-01T00:00:00.000000Z", - "printeditemid": 1, - "printnotes": null, - "quantityonhand": 10 - }, - "message": "Stock added", - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "POST", - "path": "/api/printedparts/items//restore", - "auth": "permission:printedparts.delete", - "params": "path: item_id (int); body: JSON (fields not yet documented)", - "purpose": "Bring a retired item back; code, photo, and history are intact.", - "example": "curl -X POST http://localhost:5001/api/printedparts/items/1/restore -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "responseexample": { - "data": { - "binlocation": null, - "createddate": "2026-01-01T00:00:00.000000Z", - "gagelabtag": null, - "imageurl": null, - "isactive": true, - "islowstock": true, - "itemcode": "3DP-9001", - "itemdescription": null, - "itemname": "Test clip", - "latestrevision": null, - "lowstockthreshold": 5, - "modifieddate": "2026-01-01T00:00:00.000000Z", - "printeditemid": 1, - "printnotes": null, - "quantityonhand": 0 - }, - "message": "Printed item restored", - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "GET", - "path": "/api/printedparts/kiosk/item/", - "auth": "api-key-optional (kiosk: the per-device token in the X-Kiosk-Token header, OR a caller address inside the site's kiosk CIDR allowlist - an allowlisted caller sends no credential; 404 while the site's kiosk flag is off)", - "params": "path: itemcode (string)", - "purpose": "Item summary for a scanned bin barcode. Kiosk-token gated.", - "example": "curl http://localhost:5001/api/printedparts/kiosk/item/x", - "responseexample": { - "data": { - "binlocation": null, - "createddate": "2026-01-01T00:00:00.000000Z", - "gagelabtag": "WJRP0117", - "imageurl": null, - "isactive": true, - "islowstock": true, - "itemcode": "3DP0001", - "itemdescription": null, - "itemname": "Gage block holder", - "latestrevision": null, - "lowstockthreshold": 5, - "modifieddate": "2026-01-01T00:00:00.000000Z", - "printeditemid": 1, - "printnotes": null, - "quantityonhand": 0 - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "GET", - "path": "/api/printedparts/kiosk/provisioning-link", - "auth": "permission:settings.edit", - "params": "not documented", - "purpose": "The URL that provisions a screen, token included, for an administrator.", - "example": "curl http://localhost:5001/api/printedparts/kiosk/provisioning-link -H \"Authorization: Bearer $TOK\"" - }, - { - "method": "POST", - "path": "/api/printedparts/kiosk/take", - "auth": "api-key-optional (kiosk: the per-device token in the X-Kiosk-Token header, OR a caller address inside the site's kiosk CIDR allowlist - an allowlisted caller sends no credential; 404 while the site's kiosk flag is off)", - "params": "body: JSON (fields not yet documented)", - "purpose": "Take parts from a bin. Body: {itemcode, badge, quantity}.", - "example": "curl -X POST http://localhost:5001/api/printedparts/kiosk/take -H 'Content-Type: application/json' -d '{}'", - "requestexample": { - "badge": "", - "itemcode": "WJRP7000|3", - "quantity": 1 - }, - "responseexample": { - "data": { - "binlocation": null, - "createddate": "2026-01-01T00:00:00.000000Z", - "gagelabtag": "WJRP7000", - "imageurl": null, - "isactive": true, - "islowstock": false, - "itemcode": "3DP-7000", - "itemdescription": null, - "itemname": "Rev part", - "latestrevision": null, - "lowstockthreshold": 2, - "modifieddate": "2026-01-01T00:00:00.000000Z", - "printeditemid": 1, - "printnotes": null, - "quantityonhand": 8 - }, - "message": "Took 1, 8 left", - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "GET", - "path": "/api/printedparts/reports/by-person", - "auth": "permission:printedparts.view", - "params": "not documented", - "purpose": "Takes grouped by employee, optionally bounded by ?days= (default 30).", - "example": "curl http://localhost:5001/api/printedparts/reports/by-person -H \"Authorization: Bearer $TOK\"", - "queryparams": [ - { - "name": "days", - "type": "integer", - "required": false, - "default": 30 - }, - { - "name": "format", - "type": "string", - "required": false - } - ], - "responseexample": { - "data": { - "columns": [ - "employeesso", - "employeename", - "takes", - "" - ], - "days": 30, - "rows": [] - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "GET", - "path": "/api/printedparts/reports/consumption", - "auth": "permission:printedparts.view", - "params": "not documented", - "purpose": "Takes per item, optionally bounded by ?days= (default 30).", - "example": "curl http://localhost:5001/api/printedparts/reports/consumption -H \"Authorization: Bearer $TOK\"", - "queryparams": [ - { - "name": "days", - "type": "integer", - "required": false, - "default": 30 - }, - { - "name": "format", - "type": "string", - "required": false - } - ], - "responseexample": { - "data": { - "columns": [ - "itemcode", - "itemname", - "takes", - "" - ], - "days": 30, - "rows": [] - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "GET", - "path": "/api/printedparts/reports/stock", - "auth": "permission:printedparts.view", - "params": "not documented", - "purpose": "Stock levels with low-stock flags and the cache-vs-ledger reconcile.", - "example": "curl http://localhost:5001/api/printedparts/reports/stock -H \"Authorization: Bearer $TOK\"", - "queryparams": [ - { - "name": "format", - "type": "string", - "required": false - } - ], - "responseexample": { - "data": { - "columns": [ - "itemcode", - "itemname", - "binlocation", - "" - ], - "rows": [] - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - } - ] - }, - { - "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": "", - "createddate": "2026-01-01T00:00:00.000000Z", - "deletedby": null, - "deleteddate": null, - "gaugelabreference": null, - "ipaddress": "", - "isactive": true, - "levelid": null, - "locationcode": null, - "locationid": null, - "maintenancereference": null, - "mapverifiedat": null, - "mapx": null, - "mapy": null, - "modifiedby": "", - "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": "", - "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": "", - "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": "", - "installpath": "", - "mapx": 120, - "mapy": 240 - }, - "responseexample": { - "data": { - "assetid": 1, - "assetnumber": "SpoolsInspection-Xerox", - "assettypecolor": null, - "assettypeid": 1, - "assettypename": "printer", - "businessunitid": null, - "createdby": "", - "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": "", - "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": "", - "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": "", - "statusid": 1 - }, - "message": "Printer created", - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "DELETE", - "path": "/api/printers/", - "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/", - "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": "", - "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": "", - "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": "", - "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": "", - "statusid": 1 - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "PUT", - "path": "/api/printers/", - "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": "", - "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": "", - "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": "", - "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": "", - "statusid": 1 - }, - "message": "Printer updated", - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "GET", - "path": "/api/printers//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/", - "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/", - "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/", - "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/", - "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 - }, - "" - ], - "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": "", - "name": "HP universal", - "vendorid": 1 - }, - "responseexample": { - "data": { - "description": null, - "driverid": 1, - "drivername": "HP Universal Printing PCL 6", - "isactive": true, - "location": "", - "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/", - "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/", - "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": "", - "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/", - "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": "", - "printers": [ - { - "assetid": 4, - "driverid": null, - "driverlocation": null, - "drivername": null, - "hostname": "", - "inheritedfromassetid": 3, - "installpath": null, - "ipaddress": "", - "isdefault": false, - "port": null, - "printerid": 1, - "queuename": "PRINTER-A", - "sharename": null, - "windowsname": "PRINTER-A" - }, - { - "assetid": 5, - "driverid": null, - "driverlocation": null, - "drivername": null, - "hostname": "", - "inheritedfromassetid": 3, - "installpath": null, - "ipaddress": "", - "isdefault": false, - "port": null, - "printerid": 2, - "queuename": "PRINTER-B", - "sharename": null, - "windowsname": "PRINTER-B" - }, - { - "assetid": 6, - "driverid": null, - "driverlocation": null, - "drivername": null, - "hostname": "", - "inheritedfromassetid": 3, - "installpath": null, - "ipaddress": "", - "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": "", - "installpath": "", - "ipaddress": "", - "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//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//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/", - "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/", - "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": "", - "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": "", - "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": "", - "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": "", - "portname": "IP_10.20.0.99", - "printerassetid": null, - "printerid": null, - "printername": null, - "queuename": "Reception Copier" - } - ], - "seedcandidate": { - "defaultprinterassetid": 5, - "printerassetids": [ - 5, - 6 - ], - "skipped": [ + { + "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": [ { - "drivername": "HP Universal Printing PS", - "isdefault": false, - "portaddress": "", - "portname": "IP_10.20.0.99", - "queuename": "Reception Copier" + "name": "all", + "type": "string", + "required": false, + "default": "false" } - ] - }, - "source": "none", - "summary": { - "drifted": 0, - "extra": 2, - "matching": 0, - "missing": 0, - "unknown": 1 + ], + "responseexample": { + "data": [ + { + "createddate": "2026-01-01T00:00:00.000000Z", + "displayprefix": "", + "expiresat": null, + "isactive": true, + "isexpired": false, + "lastusedat": null, + "name": "member token", + "resourcescopes": null, + "scopes": null, + "tokenid": 2, + "tokenprefix": "", + "userid": 2, + "username": "" + }, + { + "createddate": "2026-01-01T00:00:00.000000Z", + "displayprefix": "", + "expiresat": null, + "isactive": true, + "isexpired": false, + "lastusedat": null, + "name": "admin token", + "resourcescopes": null, + "scopes": null, + "tokenid": 1, + "tokenprefix": "", + "userid": 1, + "username": "" + } + ], + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" } - } - ] - }, - "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/", - "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/", - "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", - "" - ], - "colors": [ - "black", - "cyan", - "magenta", - "" - ], - "supplytypes": [ - "toner", - "drum", - "waste", - "" - ] - }, - "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/", - "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/", - "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/", - "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/", - "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//", - "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//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//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//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//", - "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": "", - "iv": "MTIzNDU2Nzg5MDEy", - "views": 100 - }, - "responseexample": { - "data": { - "createddate": "2026-01-01T00:00:00.000000", - "expiresat": "2026-01-01T00:00:00.000000", - "token": "", - "viewcount": 0, - "viewsremaining": 100 - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "GET", - "path": "/api/tools/secrets/", - "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/", - "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": "", - "iv": "MTIzNDU2Nzg5MDEy" - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - } - ] - }, - { - "surface": "plugin-usb", - "endpoints": [ - { - "method": "GET", - "path": "/api/usb", - "auth": "permission:usb.view", - "params": "not documented", - "purpose": "List USB devices with checkout status.", - "example": "curl http://localhost:5001/api/usb -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, - "default": "" - }, - { - "name": "status", - "type": "string", - "required": false, - "default": "" - } - ] - }, - { - "method": "POST", - "path": "/api/usb", - "auth": "permission:usb.create", - "params": "body: JSON (fields not yet documented)", - "purpose": "Add a device (starts checked-in).", - "example": "curl -X POST http://localhost:5001/api/usb -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "readsbody": true - }, - { - "method": "GET", - "path": "/api/usb/", - "auth": "permission:usb.view", - "params": "path: device_id (string)", - "purpose": "Get a single device plus its last 20 check-in/out log rows.", - "example": "curl http://localhost:5001/api/usb/x -H \"Authorization: Bearer $TOK\"" - }, - { - "method": "PUT", - "path": "/api/usb/", - "auth": "permission:usb.edit", - "params": "path: device_id (string); body: JSON (fields not yet documented)", - "purpose": "Edit device_desc / device_owner / locker_location / status.", - "example": "curl -X PUT http://localhost:5001/api/usb/x -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "readsbody": true - }, - { - "method": "POST", - "path": "/api/usb//checkin", - "auth": "permission:usb.create", - "params": "path: device_id (string); body: JSON (fields not yet documented)", - "purpose": "Check a device back in from a badge.", - "example": "curl -X POST http://localhost:5001/api/usb/x/checkin -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "readsbody": true - }, - { - "method": "POST", - "path": "/api/usb//checkout", - "auth": "permission:usb.create", - "params": "path: device_id (string); body: JSON (fields not yet documented)", - "purpose": "Check a device out to a badge.", - "example": "curl -X POST http://localhost:5001/api/usb/x/checkout -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", - "readsbody": true - }, - { - "method": "GET", - "path": "/api/usb//history", - "auth": "permission:usb.view", - "params": "path: device_id (string)", - "purpose": "Paginated check-in/out log for one device.", - "example": "curl http://localhost:5001/api/usb/x/history -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 - } - ] - }, - { - "method": "POST", - "path": "/api/usb//retire", - "auth": "permission:usb.edit", - "params": "path: device_id (string); body: JSON (fields not yet documented)", - "purpose": "Retire a device (status -> retired).", - "example": "curl -X POST http://localhost:5001/api/usb/x/retire -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'" - }, - { - "method": "GET", - "path": "/api/usb/checkouts", - "auth": "permission:usb.view", - "params": "not documented", - "purpose": "List check-out log rows.", - "example": "curl http://localhost:5001/api/usb/checkouts -H \"Authorization: Bearer $TOK\"", - "queryparams": [ - { - "name": "active", - "type": "string", - "required": false, - "default": "" - }, - { - "name": "badge", - "type": "string", - "required": false, - "default": "" - }, - { - "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/usb/checkouts/active", - "auth": "permission:usb.view", - "params": "not documented", - "purpose": "List the latest check-out log row for every currently checked-out device.", - "example": "curl http://localhost:5001/api/usb/checkouts/active -H \"Authorization: Bearer $TOK\"", - "queryparams": [ - { - "name": "badge", - "type": "string", - "required": false, - "default": "" - } - ] - }, - { - "method": "POST", - "path": "/api/usb/kiosk/checkin", - "auth": "api-key-optional (kiosk: the per-device token in the X-Kiosk-Token header, OR a caller address inside the site's kiosk CIDR allowlist - an allowlisted caller sends no credential; 404 while the site's kiosk flag is off)", - "params": "body: JSON (fields not yet documented)", - "purpose": "Check a device in at the kiosk. Body: {device_id, badge, forsomeoneelse}.", - "example": "curl -X POST http://localhost:5001/api/usb/kiosk/checkin -H 'Content-Type: application/json' -d '{}'", - "requestexample": { - "badge": "", - "device_id": "USB-1", - "forsomeoneelse": true - }, - "responseexample": { - "data": { - "device_id": "USB-1" - }, - "message": "USB-1 checked in", - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "POST", - "path": "/api/usb/kiosk/checkout", - "auth": "api-key-optional (kiosk: the per-device token in the X-Kiosk-Token header, OR a caller address inside the site's kiosk CIDR allowlist - an allowlisted caller sends no credential; 404 while the site's kiosk flag is off)", - "params": "body: JSON (fields not yet documented)", - "purpose": "Check a device out at the kiosk. Body: {device_id, badge}.", - "example": "curl -X POST http://localhost:5001/api/usb/kiosk/checkout -H 'Content-Type: application/json' -d '{}'", - "requestexample": { - "badge": "", - "device_id": "USB-1" - }, - "responseexample": { - "data": { - "device_id": "USB-1", - "holdername": "Dana Reyes" - }, - "message": "USB-1 checked out to Dana Reyes", - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "GET", - "path": "/api/usb/kiosk/device/", - "auth": "api-key-optional (kiosk: the per-device token in the X-Kiosk-Token header, OR a caller address inside the site's kiosk CIDR allowlist - an allowlisted caller sends no credential; 404 while the site's kiosk flag is off)", - "params": "path: device_id (string)", - "purpose": "What the kiosk shows after a device is scanned.", - "example": "curl http://localhost:5001/api/usb/kiosk/device/x", - "responseexample": { - "data": { - "device_desc": "Blue Kingston", - "device_id": "USB-1", - "holdername": "Dana Reyes", - "locker_location": null, - "status": "checked-out" - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "POST", - "path": "/api/usb/kiosk/others", - "auth": "api-key-optional (kiosk: the per-device token in the X-Kiosk-Token header, OR a caller address inside the site's kiosk CIDR allowlist - an allowlisted caller sends no credential; 404 while the site's kiosk flag is off)", - "params": "body: JSON (fields not yet documented)", - "purpose": "Drives checked out to OTHER people, with holder names. Body: {badge}.", - "example": "curl -X POST http://localhost:5001/api/usb/kiosk/others -H 'Content-Type: application/json' -d '{}'", - "requestexample": { - "badge": "" - }, - "responseexample": { - "data": [ { - "device_desc": "Blue Kingston", - "device_id": "USB-1", - "holdername": "Dana Reyes", - "locker_location": null - } - ], - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "GET", - "path": "/api/usb/kiosk/provisioning-link", - "auth": "permission:settings.edit", - "params": "not documented", - "purpose": "The URL that provisions a screen, token included, for an administrator.", - "example": "curl http://localhost:5001/api/usb/kiosk/provisioning-link -H \"Authorization: Bearer $TOK\"", - "responseexample": { - "data": { - "expiresinminutes": 30, - "url": "/api/usb/kiosk/setup?code=" - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - } - }, - { - "method": "POST", - "path": "/api/usb/kiosk/session", - "auth": "api-key-optional (kiosk: the per-device token in the X-Kiosk-Token header, OR a caller address inside the site's kiosk CIDR allowlist - an allowlisted caller sends no credential; 404 while the site's kiosk flag is off)", - "params": "body: JSON (fields not yet documented)", - "purpose": "What one badge may do right now. Body: {badge}.", - "example": "curl -X POST http://localhost:5001/api/usb/kiosk/session -H 'Content-Type: application/json' -d '{}'", - "requestexample": { - "badge": "" - }, - "responseexample": { - "data": { - "available": [ - { - "device_desc": "Second", - "device_id": "USB-2", - "locker_location": null - } - ], - "name": "Dana Reyes", - "otherscount": 0, - "yours": [ - { - "device_desc": "Blue Kingston", - "device_id": "USB-1", - "locker_location": null - } - ] - }, - "meta": { - "requestid": "00000000", - "timestamp": "2026-01-01T00:00:00.000000Z" - }, - "status": "success" - }, - "readsbody": true - }, - { - "method": "GET", - "path": "/api/usb/kiosk/setup", - "auth": "setup-code (single-use kiosk setup code in ?code=, issued by the permission-gated provisioning link; spent on any attempt, 410 once used or expired)", - "params": "not documented", - "purpose": "Trade a setup code for this browser's kiosk cookie, then open the kiosk.", - "example": "curl http://localhost:5001/api/usb/kiosk/setup", - "queryparams": [ - { - "name": "code", - "type": "string", - "required": false - } - ] - }, - { - "method": "GET", - "path": "/api/usb/reports/audit", - "auth": "permission:usb.view", - "params": "not documented", - "purpose": "Every check-out and check-in in the window, newest first.", - "example": "curl http://localhost:5001/api/usb/reports/audit -H \"Authorization: Bearer $TOK\"", - "responseexample": { - "data": { - "columns": [ - "timestamp", - "action", - "device_id", - "" - ], - "days": 365, - "rows": [ - { - "action": "check-in", - "badge": "", - "device_desc": "Blue Kingston", - "device_id": "USB-1", - "locker_location": "", - "name": "Dana Reyes", - "sanitized": "", - "scanned_viruses": "", - "timestamp": "2026-01-01T00:00:00.000000" - }, - { - "action": "check-out", - "badge": "", - "device_desc": "Blue Kingston", - "device_id": "USB-1", - "locker_location": "", - "name": "Dana Reyes", - "sanitized": "", - "scanned_viruses": "", - "timestamp": "2026-01-01T00:00:00.000000" - }, - { - "action": "check-out", - "badge": "", - "device_desc": "Red SanDisk", - "device_id": "USB-2", - "locker_location": "", - "name": "Sam Okafor", - "sanitized": "", - "scanned_viruses": "", - "timestamp": "2026-01-01T00:00:00.000000" - } - ], - "summary": { - "checkins": 1, - "checkouts": 2, - "devices": 2, - "events": 3, - "people": 2 - } - }, - "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": "", - "vendor": "Acme" - }, - "responseexample": { - "data": { - "assets": [], - "enddate": "2026-01-01", - "isactive": true, - "lastcheckeddate": null, - "notes": null, - "prooffilename": null, - "proofurl": null, - "provider": "manual", - "servicelevel": null, - "servicetag": "", - "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/", - "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/", - "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/", - "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": "", - "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//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": "", - "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//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": "", - "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//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/", - "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/", - "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": [] + "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": "display svc", + "resourcescopes": [ + "gea-shopfloor-display" + ], + "scopes": [ + "geenforce.fetch" + ] + }, + "responseexample": { + "data": { + "createddate": "2026-01-01T00:00:00.000000Z", + "displayprefix": "", + "expiresat": null, + "isactive": true, + "isexpired": false, + "lastusedat": null, + "name": "display svc", + "resourcescopes": [ + "gea-shopfloor-display" + ], + "scopes": [ + "geenforce.fetch" + ], + "secret": "", + "tokenid": 1, + "tokenprefix": "", + "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 }, - "counts": { - "active": 0, - "expired": 0, - "expiring": 0, - "unknown": 0 + { + "method": "DELETE", + "path": "/api/apitokens/", + "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/", + "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": "", + "expiresat": null, + "isactive": true, + "isexpired": false, + "lastusedat": null, + "name": "test token", + "resourcescopes": null, + "scopes": [ + "applications.edit" + ], + "tokenid": 1, + "tokenprefix": "", + "userid": 1 + }, + "message": "Token updated", + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true } - }, - "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" - } - } - ] - } -] \ No newline at end of file + ] + }, + { + "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": "Monitored App", + "ismonitorable": true, + "monitorlaunchpath": "C:\\Vendor\\app.exe", + "monitorprocessname": "app.exe" + }, + "responseexample": { + "data": { + "appdescription": null, + "appid": 1, + "applicationlink": null, + "applicationnotes": null, + "appname": "Fleet 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 created", + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "DELETE", + "path": "/api/applications/", + "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/", + "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/", + "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//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//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//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//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": "", + "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//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": "", + "documentationpath": null, + "image": null, + "installersha256": "", + "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": "", + "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//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//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//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": "", + "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": "", + "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/", + "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/", + "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/", + "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//", + "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//", + "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/", + "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": "", + "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": "", + "modifieddate": "2026-01-01T00:00:00.000000Z", + "name": "mill", + "notes": null, + "ownlevelid": null, + "ownlocationid": null, + "ownmapx": null, + "ownmapy": null, + "serialnumber": "", + "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/", + "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/", + "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/", + "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//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//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": "", + "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": "", + "modifieddate": "2026-01-01T00:00:00.000000Z", + "name": null, + "notes": null, + "ownlevelid": null, + "ownlocationid": null, + "ownmapx": null, + "ownmapy": null, + "serialnumber": "", + "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/", + "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": "", + "levelid": null, + "location": null, + "locationid": null, + "mapx": 100, + "mapy": 100, + "name": null, + "primaryip": null, + "serialnumber": "", + "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": "", + "levelid": null, + "location": null, + "locationid": null, + "mapx": 110, + "mapy": 110, + "name": null, + "primaryip": null, + "serialnumber": "", + "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": [], + "Measuring Tool": [], + "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/", + "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/", + "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/", + "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/", + "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/", + "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/", + "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/", + "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/", + "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//", + "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": "", + "new_password": "" + }, + "responseexample": { + "data": { + "mustchangepassword": "" + }, + "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": "", + "username": "" + }, + "responseexample": { + "data": { + "access_token": "", + "expires_in": 3600, + "refresh_token": "", + "token_type": "", + "user": { + "email": "", + "firstname": "", + "lastname": "", + "mustchangepassword": "", + "permissions": [ + "endpoints.runscript", + "endpoints.agentupdate", + "endpoints.view", + "" + ], + "roles": [ + "upgradeoperatorrole" + ], + "userid": 2, + "username": "" + } + }, + "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": "", + "firstname": "", + "lastname": "", + "mustchangepassword": "", + "permissions": [ + "assets.view", + "assets.create", + "assets.edit", + "" + ], + "roles": [ + "admin" + ], + "userid": 1, + "username": "" + }, + "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/", + "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/", + "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/", + "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/", + "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": "", + "queues": [ + { + "drivername": "HP Universal Printing PS", + "isdefault": true, + "portaddress": "", + "portname": "IP_10.20.0.11", + "queuename": "PRINTER-A" + }, + { + "drivername": "HP Universal Printing PS", + "isdefault": false, + "portaddress": "", + "portname": "IP_10.20.0.12", + "queuename": "PRINTER-B" + }, + { + "drivername": "HP Universal Printing PS", + "isdefault": false, + "portaddress": "", + "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": "" + } + ] + }, + "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": "" + }, + "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/", + "GET /api/collector/_schemas", + "POST /api/collector/pc", + "" + ], + "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/", + "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/", + "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/", + "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/", + "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": 14, + "bystatus": { + "In Use": 14 + }, + "counts": { + "machines": 0, + "measuringtools": 14, + "networkdevices": 0, + "pcs": 0, + "printers": 0, + "total": 14 + }, + "countsactiveonly": true, + "dualpathcollapsed": true, + "inactiveexcluded": 0, + "inrepair": 0, + "recent": [ + { + "assetid": 14, + "assetnumber": "MT-MAP-TD", + "assettype": "measuring_tool", + "createddate": "2026-01-01T00:00:00.000000Z" + }, + { + "assetid": 13, + "assetnumber": "MT-MAP-MIC", + "assettype": "measuring_tool", + "createddate": "2026-01-01T00:00:00.000000Z" + }, + { + "assetid": 12, + "assetnumber": "MT-MAP-CAL", + "assettype": "measuring_tool", + "createddate": "2026-01-01T00:00:00.000000Z" + }, + "" + ], + "statuses": { + "In Use": 14 + }, + "totalassets": 14, + "totalmachines": 0, + "totalmeasuringtool": 14, + "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" + }, + "" + ], + "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, + "measuringtools": 0, + "networkdevices": 0, + "pcs": 0, + "printers": 0, + "total": 0 + }, + "countsactiveonly": true, + "dualpathcollapsed": true, + "inactiveexcluded": 0, + "inrepair": 0, + "recent": [], + "statuses": {}, + "totalassets": 0, + "totalmachines": 0, + "totalmeasuringtool": 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\"", + "responseexample": { + "data": [ + { + "empty": "hide", + "endpoint": "/api/geenforce/dashboard/failures", + "id": "geenforce-failures", + "map": { + "detail": "entryname", + "link": "/pcs/{computerid}", + "meta": [ + { + "key": "message" + }, + { + "key": "exitcode", + "label": "exit" + } + ], + "timestamp": "receivedat", + "title": "hostname" + }, + "permission": "geenforce.manage", + "plugin": "geenforce", + "position": 10, + "render": "exceptions", + "severity": "critical", + "shortname": "Enforcement", + "title": "Enforcement failures", + "viewall": "/geenforce" + }, + { + "empty": "hide", + "endpoint": "/api/computers/dashboard/sharedmachines", + "id": "computers-sharedmachines", + "map": { + "detail": "pcs", + "link": "/machines/{assetid}", + "meta": [ + { + "key": "pccount", + "suffix": " PCs" + } + ], + "title": "machinenumber" + }, + "permission": "computers.view", + "plugin": "computers", + "position": 15, + "render": "exceptions", + "severity": "critical", + "shortname": "Duplicate machine no.", + "title": "Machine numbers on two PCs", + "viewall": "/machines" + }, + { + "empty": "hide", + "endpoint": "/api/endpoints/dashboard/stability", + "id": "endpoints-stability", + "map": { + "detail": "", + "link": "/pcs/{computerid}", + "meta": [ + { + "key": "eventcount", + "suffix": " events (48h)" + } + ], + "title": "hostname" + }, + "permission": "endpoints.fleet", + "plugin": "endpoints", + "position": 16, + "render": "exceptions", + "severity": "critical", + "shortname": "Crashes", + "title": "Endpoints with crashes or shutdowns", + "viewall": "/pcs" + }, + "" + ], + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + } + ] + }, + { + "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": "" + }, + "responseexample": { + "data": { + "businessunit": "Materials", + "businessunitid": 1, + "createddate": "2026-01-01T00:00:00.000000Z", + "dashboarddefaultid": 1, + "description": "Materials lobby kiosk", + "displaypath": "/shopfloor", + "displayrole": "Dashboard", + "fqdn": "", + "ipaddress": "", + "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/", + "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/", + "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": "", + "ipaddress": "", + "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": "", + "ipaddress": "", + "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": "", + "ipaddress": "" + }, + "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-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/", + "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/", + "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/", + "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/", + "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/", + "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/", + "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/", + "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/", + "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//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//blueprint/", + "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/", + "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//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/", + "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/", + "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/", + "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//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//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/", + "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/", + "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/", + "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/", + "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/", + "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/", + "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/", + "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/", + "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", + "" + ], + "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", + "" + ] + }, + "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", + "" + ] + }, + "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" + }, + "" + ], + "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": "measuring_tool", + "icon": "ruler", + "label": "Measuring Tool", + "plugin": "measuringtools", + "route": "/measuringtools/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": "measuring_tool", + "edit_permission": "measuringtools.manage", + "optional_tabs": [], + "plugin": "measuringtools", + "subtype_color_field": "color", + "subtype_description_field": "description", + "subtype_endpoint": "/measuringtools/types", + "subtype_id_field": "measuringtooltypeid", + "subtype_label_field": "name" + }, + "" + ], + "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/measuringtools/map-overlay", + "id": "calibration-due", + "label": "Calibration due", + "legend": true, + "plugin": "measuringtools", + "style": "badge" + } + ], + "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" + }, + "" + ], + "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" + }, + "" + ], + "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": "" + }, + "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": "", + "ip": "", + "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/", + "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/", + "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/", + "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//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": "", + "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/", + "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" + }, + "" + ], + "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/", + "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/", + "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": "" + }, + "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" + }, + "" + ] + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "GET", + "path": "/api/settings/asset-import/templates/", + "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": "", + "createdat": "2026-01-01 00:00:00.000000", + "createdby": "", + "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": "", + "blocking": false, + "committed": true, + "kind": "winc-machine-adoption", + "needscreate": { + "businessunit": { + "Large Parts": 1 + } + }, + "planhash": "", + "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": "", + "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": "" + }, + "responseexample": { + "data": { + "batchid": "", + "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/", + "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/", + "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": "" + }, + "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/", + "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//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/", + "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/", + "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/", + "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//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//contacts/", + "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//contacts/", + "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": "", + "failedlogins": 0, + "firstname": "", + "isactive": true, + "islocked": false, + "lastlogindate": "2026-01-01T00:00:00Z", + "lastname": "", + "modifieddate": "2026-01-01T00:00:00.000000Z", + "mustchangepassword": "", + "permissions": [ + "apitokens.create", + "applications.create", + "applications.delete", + "" + ], + "roles": [ + { + "color": null, + "roleid": 1, + "rolename": "admin" + } + ], + "userid": 1, + "username": "" + } + ], + "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": "", + "password": "", + "roles": [], + "sendwelcome": false, + "username": "" + }, + "responseexample": { + "data": { + "createddate": "2026-01-01T00:00:00.000000Z", + "directpermissions": [ + "endpoints.restart" + ], + "email": "", + "failedlogins": 0, + "firstname": "", + "isactive": true, + "islocked": false, + "lastlogindate": null, + "lastname": "", + "modifieddate": "2026-01-01T00:00:00.000000Z", + "mustchangepassword": "", + "permissions": [ + "applications.view", + "assets.view", + "backups.download", + "" + ], + "roles": [ + { + "color": "#0DCAF0", + "roleid": 3, + "rolename": "technician" + } + ], + "userid": 2, + "username": "", + "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/", + "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/", + "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": "", + "failedlogins": 0, + "firstname": "", + "isactive": true, + "islocked": false, + "lastlogindate": "2026-01-01T00:00:00Z", + "lastname": "", + "modifieddate": "2026-01-01T00:00:00.000000Z", + "mustchangepassword": "", + "permissions": [], + "roles": [], + "userid": 1, + "username": "" + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "PUT", + "path": "/api/users/", + "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": "" + }, + "responseexample": { + "data": { + "createddate": "2026-01-01T00:00:00.000000Z", + "directpermissions": [], + "email": "", + "failedlogins": 0, + "firstname": "", + "isactive": true, + "islocked": false, + "lastlogindate": null, + "lastname": "", + "modifieddate": "2026-01-01T00:00:00.000000Z", + "mustchangepassword": "", + "permissions": [], + "roles": [], + "userid": 2, + "username": "" + }, + "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", + "" + ], + "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/", + "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/", + "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": "", + "supportphone": "", + "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", + "modifieddate": "2026-01-01T00:00:00", + "vendor": "LegacyVendor" + }, + "responseexample": { + "data": { + "createddate": "2026-01-01T00:00:00.000000Z", + "description": null, + "isactive": true, + "modifieddate": "2026-01-01T00:00:00.000000Z", + "notes": null, + "supportemail": "", + "supportphone": "", + "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/", + "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/", + "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/", + "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/", + "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//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": "", + "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": "", + "formats": [], + "key": "partmarker", + "storagebackend": "share" + } + ], + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "GET", + "path": "/api/backups/revisions/", + "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//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//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": "", + "isactive": true, + "lastboottime": null, + "lastreporteddate": null, + "loggedinuser": null, + "modelnumberid": null, + "modifieddate": "2026-01-01T00:00:00.000000Z", + "osid": null, + "vendorid": null + }, + "createdby": "", + "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": "", + "modifieddate": "2026-01-01T00:00:00.000000Z", + "name": null, + "notes": null, + "ownlevelid": null, + "ownlocationid": null, + "ownmapx": null, + "ownmapy": null, + "pluginid": 1, + "serialnumber": "", + "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": "", + "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": "", + "isactive": true, + "lastboottime": null, + "lastreporteddate": null, + "loggedinuser": null, + "modelnumberid": null, + "modifieddate": "2026-01-01T00:00:00.000000Z", + "osid": null, + "vendorid": null + }, + "createdby": "", + "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": "", + "modifieddate": "2026-01-01T00:00:00.000000Z", + "name": null, + "notes": null, + "ownlevelid": null, + "ownlocationid": null, + "ownmapx": null, + "ownmapy": null, + "pluginid": 1, + "serialnumber": "", + "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/", + "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/", + "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": "", + "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": "", + "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": "", + "modifieddate": "2026-01-01T00:00:00.000000Z", + "name": null, + "notes": null, + "ownlevelid": null, + "ownlocationid": null, + "ownmapx": null, + "ownmapy": null, + "pluginid": 1, + "serialnumber": "", + "statusid": 1 + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "PUT", + "path": "/api/computers/", + "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": "", + "isactive": true, + "lastboottime": null, + "lastreporteddate": null, + "loggedinuser": null, + "modelnumberid": null, + "modifieddate": "2026-01-01T00:00:00.000000Z", + "osid": null, + "vendorid": null + }, + "createdby": "", + "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": "", + "modifieddate": "2026-01-01T00:00:00.000000Z", + "name": null, + "notes": null, + "ownlevelid": null, + "ownlocationid": null, + "ownmapx": null, + "ownmapy": null, + "pluginid": 1, + "serialnumber": "", + "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//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//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//apps/", + "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//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//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/", + "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/", + "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": "", + "lastreported": "2026-01-01T00:00:00.000000Z", + "quietdays": 9 + }, + { + "computerid": 1, + "hostname": "", + "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": "", + "hostname": "", + "serialnumber": "" + } + ], + "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 + }, + "" + ], + "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/", + "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/", + "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/", + "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/", + "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/", + "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/", + "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/", + "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/", + "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/", + "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/", + "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/", + "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/", + "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-employees", + "endpoints": [ + { + "method": "DELETE", + "path": "/api/employees//photo", + "auth": "jwt + role:admin", + "params": "path: sso (int)", + "purpose": "Clear an employee photo and delete the uploaded file. External mode 409s.", + "example": "curl -X DELETE http://localhost:5001/api/employees/1/photo -H \"Authorization: Bearer $TOK\"", + "responseexample": { + "data": { + "First_Name": "Test", + "Last_Name": "Person", + "Picture": null, + "Role": null, + "SSO": 210000001, + "Team": null, + "photofilename": null, + "photourl": null + }, + "message": "Employee photo removed", + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "POST", + "path": "/api/employees//photo", + "auth": "jwt + role:admin", + "params": "path: sso (int); body: JSON (fields not yet documented)", + "purpose": "Upload (or replace) the photo for a self-hosted directory employee.", + "example": "curl -X POST http://localhost:5001/api/employees/1/photo -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "responseexample": { + "data": { + "First_Name": "Test", + "Last_Name": "Person", + "Picture": null, + "Role": null, + "SSO": 210000001, + "Team": null, + "photofilename": "photo-210000001.jpg", + "photourl": "/api/employees/photo/photo-210000001.jpg" + }, + "message": "Employee photo uploaded", + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "GET", + "path": "/api/employees/directory", + "auth": "permission:employees.view", + "params": "not documented", + "purpose": "Full self-hosted directory (for the management page).", + "example": "curl http://localhost:5001/api/employees/directory -H \"Authorization: Bearer $TOK\"" + }, + { + "method": "POST", + "path": "/api/employees/directory", + "auth": "jwt + role:admin", + "params": "body: JSON (fields not yet documented)", + "purpose": "UNDOCUMENTED: employees.create_directory_employee has no docstring.", + "example": "curl -X POST http://localhost:5001/api/employees/directory -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "readsbody": true + }, + { + "method": "DELETE", + "path": "/api/employees/directory/", + "auth": "jwt + role:admin", + "params": "path: sso (int)", + "purpose": "UNDOCUMENTED: employees.delete_directory_employee has no docstring.", + "example": "curl -X DELETE http://localhost:5001/api/employees/directory/1 -H \"Authorization: Bearer $TOK\"" + }, + { + "method": "PUT", + "path": "/api/employees/directory/", + "auth": "jwt + role:admin", + "params": "path: sso (int); body: JSON (fields not yet documented)", + "purpose": "UNDOCUMENTED: employees.update_directory_employee has no docstring.", + "example": "curl -X PUT http://localhost:5001/api/employees/directory/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "readsbody": true + }, + { + "method": "POST", + "path": "/api/employees/directory/import", + "auth": "jwt + role:admin", + "params": "body: JSON (fields not yet documented)", + "purpose": "Bulk upsert from CSV. Accepts headers SSO,First_Name,Last_Name,Team,Role, Picture (case-insensitive; sso/firstname/... also accepted).", + "example": "curl -X POST http://localhost:5001/api/employees/directory/import -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "readsbody": true + }, + { + "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/", + "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/photo/", + "auth": "none (reviewed: named in the public-read or mutation sweep)", + "params": "path: filename (path)", + "purpose": "Serve an uploaded employee photo (public - kiosk cards read it).", + "example": "curl http://localhost:5001/api/employees/photo/example.png" + }, + { + "method": "GET", + "path": "/api/employees/resolve/", + "auth": "permission:employees.view", + "params": "path: sso (string)", + "purpose": "Resolve one SSO to a name and photo, and say HOW.", + "example": "curl http://localhost:5001/api/employees/resolve/x -H \"Authorization: Bearer $TOK\"", + "responseexample": { + "data": { + "error": "No name found in the directory or in a user account", + "mode": "selfhosted", + "name": null, + "photourl": null, + "source": null, + "sso": "999999" + }, + "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": "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": "", + "domain": null, + "endpointstateid": 6, + "health": { + "label": "ok", + "level": "ok" + }, + "hostname": "", + "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": "", + "domain": null, + "endpointstateid": 5, + "health": { + "label": "ok", + "level": "ok" + }, + "hostname": "", + "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": "", + "domain": null, + "endpointstateid": 1, + "health": { + "label": "no agent", + "level": "unknown" + }, + "hostname": "", + "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/", + "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": "", + "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": "", + "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//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": "", + "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//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//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": "", + "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//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//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//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//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": "", + "reason": "visible to all", + "releasedat": null, + "releasedbyusername": "" + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "POST", + "path": "/api/endpoints//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": "", + "reason": "locked but still reconciled", + "releasedat": null, + "releasedbyusername": "" + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "GET", + "path": "/api/endpoints//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//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": "", + "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//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": "", + "expiresat": "2026-01-01T00:00:00.000000", + "reason": "stripping the enclosure" + }, + { + "action": "service_start", + "createdbyusername": "", + "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//policyholds/", + "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//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": "", + "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": "", + "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": "", + "resultdetail": null, + "resultmessage": null, + "scriptname": "test-open-notepad", + "status": "succeeded", + "target": "script:1", + "targetkind": null + }, + "" + ], + "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": "", + "expiresat": null, + "isactive": true, + "isexpired": false, + "lastusedat": null, + "name": "Endpoint agent key", + "resourcescopes": null, + "scopes": [ + "collector.ingest.endpoints" + ], + "tokenid": 1, + "tokenprefix": "", + "userid": 1 + }, + "provisioned": true, + "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//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": "" + }, + "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/", + "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/", + "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//", + "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//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//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//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//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//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//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//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//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//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//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//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//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": "", + "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" + }, + "" + ] + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "GET", + "path": "/api/endpoints/asset//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//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//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": "" + }, + "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//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": "", + "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": "", + "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": "", + "serialnumber": "" + }, + "responseexample": { + "data": { + "assetid": 1, + "credential": "", + "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": "", + "enrolledvia": "auto", + "hostname": "", + "issuedat": "2026-01-01T00:00:00.000000Z", + "lastusedat": null, + "reenrollblocked": false, + "reenrollblockedreason": null, + "serialnumber": "", + "state": "enrolled" + }, + { + "assetid": 2, + "credentialprefix": "", + "enrolledvia": null, + "hostname": "", + "issuedat": null, + "lastusedat": null, + "reenrollblocked": false, + "reenrollblockedreason": null, + "serialnumber": "", + "state": "notenrolled" + }, + { + "assetid": 3, + "credentialprefix": "", + "enrolledvia": null, + "hostname": "", + "issuedat": null, + "lastusedat": null, + "reenrollblocked": false, + "reenrollblockedreason": null, + "serialnumber": "", + "state": "pending" + } + ], + "counts": { + "enrolled": 1, + "notenrolled": 1, + "pending": 1, + "pendingcomputers": 1 + }, + "requests": [ + { + "agentversion": "1.20.0", + "decidedat": null, + "decidedby": null, + "deviceid": null, + "hostname": "", + "lastseenat": "2026-01-01T00:00:00.000000Z", + "matchedassetid": 3, + "reason": "no serial on record", + "requestedat": "2026-01-01T00:00:00.000000Z", + "requestid": "00000000", + "serialnumber": "", + "sourceip": "127.0.0.1", + "status": "pending" + }, + { + "agentversion": "1.20.0", + "decidedat": null, + "decidedby": null, + "deviceid": null, + "hostname": "", + "lastseenat": "2026-01-01T00:00:00.000000Z", + "matchedassetid": 1, + "reason": null, + "requestedat": "2026-01-01T00:00:00.000000Z", + "requestid": "00000000", + "serialnumber": "", + "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//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": "", + "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//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": "", + "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": "", + "lastreportedat": "2026-01-01T00:00:00.000000Z", + "state": "ready" + }, + { + "agentversion": "1.19.0", + "assetid": 3, + "blockers": [], + "hostname": "", + "lastreportedat": "2026-01-01T00:00:00.000000Z", + "state": "ready" + }, + { + "agentversion": "1.20.0", + "assetid": 1, + "blockers": [ + "awaiting enrollment" + ], + "hostname": "", + "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": "", + "done": false, + "enrolled": 0, + "failed": 1, + "queued": 3, + "size": 3, + "waveid": 1 + }, + { + "createdat": "2026-01-01T00:00:00Z", + "createdby": "", + "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//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": "" + }, + "responseexample": { + "data": { + "agentversion": "1.20.0", + "decidedat": "2026-01-01T00:00:00.000000Z", + "decidedby": "testadmin", + "deviceid": null, + "hostname": "", + "hostnameresult": "", + "lastseenat": "2026-01-01T00:00:00.000000Z", + "matchedassetid": 1, + "reason": null, + "requestedat": "2026-01-01T00:00:00.000000Z", + "requestid": "00000000", + "serialnumber": "", + "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//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": "", + "lastseenat": "2026-01-01T00:00:00.000000Z", + "matchedassetid": 1, + "reason": "awaiting approval", + "requestedat": "2026-01-01T00:00:00.000000Z", + "requestid": "00000000", + "serialnumber": "", + "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/", + "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//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/", + "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/", + "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": "", + "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": "" + }, + "message": "Operator report received", + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "GET", + "path": "/api/endpoints/operatorreports//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//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": "" + }, + { + "assetid": 1, + "createdat": "2026-01-01T00:00:00.000000Z", + "details": "first", + "hasimage": false, + "imagebytesize": null, + "imagemimetype": null, + "operatorreportid": 1, + "reason": "Other (free text)", + "reportedhostname": "" + } + ] + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "GET", + "path": "/api/endpoints/scriptbody/", + "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": "", + "spkisha256": "", + "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": "" + }, + "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": "", + "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/", + "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/", + "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": "", + "registration": { + "agentversion": "", + "appid": 1, + "appname": "ShopDB Endpoint Agent", + "contents": { + "agent": { + "filename": "shopdbagent.exe", + "sha256": "", + "version": "" + } + }, + "created": false, + "installpath": "/api/applications/package/1/shopdb-endpoint-agent.zip", + "ok": true, + "sha256": "", + "size": 135 + }, + "versions": [ + { + "iscurrent": true, + "size": 130, + "uploadedat": "2026-01-01T00:00:00.000000Z", + "version": "" + }, + { + "iscurrent": false, + "size": 130, + "uploadedat": "2026-01-01T00:00:00.000000Z", + "version": "" + } + ] + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "POST", + "path": "/api/endpoints/siteagent/binaries//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//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": "" + }, + "responseexample": { + "data": { + "binary": "agent", + "current": "", + "registration": { + "agentversion": "", + "appid": 1, + "appname": "ShopDB Endpoint Agent", + "contents": { + "agent": { + "filename": "shopdbagent.exe", + "sha256": "", + "version": "" + } + }, + "created": false, + "installpath": "/api/applications/package/1/shopdb-endpoint-agent.zip", + "ok": true, + "sha256": "", + "size": 135 + }, + "versions": [ + { + "iscurrent": false, + "size": 258, + "uploadedat": "2026-01-01T00:00:00.000000Z", + "version": "" + }, + { + "iscurrent": true, + "size": 258, + "uploadedat": "2026-01-01T00:00:00.000000Z", + "version": "" + } + ] + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "POST", + "path": "/api/endpoints/siteagent/binaries//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": "", + "expiresat": "2026-01-01T00:00:00.000000Z", + "lastusedat": null, + "lastusedip": null, + "maxuses": 25, + "remaining": 25, + "revokedat": null, + "state": "active", + "tokenid": 1, + "tokenprefix": "", + "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=&via=download", + "secret": "", + "token": { + "createdat": "2026-01-01T00:00:00.000000Z", + "createdby": "", + "expiresat": "2026-01-01T00:00:00.000000Z", + "lastusedat": null, + "lastusedip": null, + "maxuses": 500, + "remaining": 500, + "revokedat": null, + "state": "active", + "tokenid": 1, + "tokenprefix": "", + "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//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": "", + "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": "", + "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": "", + "nextserverpin": "" + }, + "readsbody": true + } + ] + }, + { + "surface": "plugin-geenforce", + "endpoints": [ + { + "method": "GET", + "path": "/api/geenforce/applications", + "auth": "permission:geenforce.view or geenforce.manage", + "params": "not documented", + "purpose": "The core Applications catalog (id + name) for the curated entry->app link picker in the entry editor.", + "example": "curl http://localhost:5001/api/geenforce/applications -H \"Authorization: Bearer $TOK\"", + "responseexample": { + "data": [ + { + "appid": 1, + "appname": "eDNC (tracked)" + } + ], + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "GET", + "path": "/api/geenforce/config", + "auth": "permission:geenforce.view or geenforce.manage", + "params": "not documented", + "purpose": "Plugin config: the on-share export root + the client IP allowlist.", + "example": "curl http://localhost:5001/api/geenforce/config -H \"Authorization: Bearer $TOK\"", + "responseexample": { + "data": { + "allowedcidrs": "", + "shareroot": "" + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "PUT", + "path": "/api/geenforce/config", + "auth": "permission:geenforce.publish", + "params": "body: JSON (fields not yet documented)", + "purpose": "UNDOCUMENTED: geenforce.put_config has no docstring.", + "example": "curl -X PUT http://localhost:5001/api/geenforce/config -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "requestexample": { + "shareroot": "" + }, + "responseexample": { + "data": { + "shareroot": "" + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "GET", + "path": "/api/geenforce/dashboard/failures", + "auth": "permission:geenforce.view or geenforce.manage", + "params": "not documented", + "purpose": "Entries that FAILED on their PC's most recent enforcement cycle.", + "example": "curl http://localhost:5001/api/geenforce/dashboard/failures -H \"Authorization: Bearer $TOK\"", + "responseexample": { + "data": [ + { + "computerid": null, + "entryname": "Install OpenText", + "exitcode": 1603, + "hostname": "", + "message": "Fatal error during installation", + "receivedat": "2026-01-01T00:00:00Z", + "scopename": "gea-shopfloor-cmm" + } + ], + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "DELETE", + "path": "/api/geenforce/entries/", + "auth": "permission:geenforce.manage", + "params": "path: entryid (int)", + "purpose": "UNDOCUMENTED: geenforce.delete_entry has no docstring.", + "example": "curl -X DELETE http://localhost:5001/api/geenforce/entries/1 -H \"Authorization: Bearer $TOK\"", + "responseexample": { + "data": { + "deleted": 2 + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "PUT", + "path": "/api/geenforce/entries/", + "auth": "permission:geenforce.manage", + "params": "path: entryid (int); body: JSON (fields not yet documented)", + "purpose": "UNDOCUMENTED: geenforce.update_entry has no docstring.", + "example": "curl -X PUT http://localhost:5001/api/geenforce/entries/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "requestexample": { + "InUseCheck": { + "Behavior": "CloseAndReopen", + "Processes": [ + { + "ExePath": "C:\\PCDLRN.exe", + "GracefulCloseTimeoutSec": 15, + "Name": "PCDLRN" + } + ] + }, + "Installer": "apps/pcdmis.msi", + "LogFile": "C:\\Logs\\pcdmis.log", + "Name": "PC-DMIS", + "PCTypesStrict": true, + "PreEnrollment": true, + "Type": "MSI" + }, + "responseexample": { + "data": { + "InUseCheck": { + "Behavior": "CloseAndReopen", + "Processes": [ + { + "ExePath": "C:\\PCDLRN.exe", + "GracefulCloseTimeoutSec": 15, + "Name": "PCDLRN" + } + ] + }, + "Installer": "apps/pcdmis.msi", + "LogFile": "C:\\Logs\\pcdmis.log", + "Name": "PC-DMIS", + "PCTypesStrict": true, + "PreEnrollment": true, + "Type": "MSI", + "appid": null, + "appname": null, + "entryid": 1, + "haspayload": false, + "payloadref": null, + "payloadsha256": null, + "payloadsource": "smb", + "sortorder": 0 + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "GET", + "path": "/api/geenforce/entries//payload", + "auth": "permission:geenforce.view or geenforce.manage", + "params": "path: entryid (int)", + "purpose": "Return the stored inline payload bytes for an entry (404 if none).", + "example": "curl http://localhost:5001/api/geenforce/entries/1/payload -H \"Authorization: Bearer $TOK\"" + }, + { + "method": "POST", + "path": "/api/geenforce/entries//payload", + "auth": "permission:geenforce.publish", + "params": "path: entryid (int); body: JSON (fields not yet documented)", + "purpose": "Store an inline payload (<= 1 MB) for an entry and point the entry at it.", + "example": "curl -X POST http://localhost:5001/api/geenforce/entries/1/payload -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "responseexample": { + "data": { + "Name": "eDNC install", + "PayloadRef": "config.reg", + "PayloadSha256": "", + "PayloadSource": "inline", + "Script": "scripts/x.ps1", + "Type": "PS1", + "appid": null, + "appname": null, + "entryid": 1, + "haspayload": true, + "payloadref": "config.reg", + "payloadsha256": "", + "payloadsource": "inline", + "sortorder": 0 + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "GET", + "path": "/api/geenforce/manifest", + "auth": "api-key (geenforce fetch token, or the IP allowlist)", + "params": "not documented", + "purpose": "Serve the current published manifest for a scope (fat-client: full scope).", + "example": "curl http://localhost:5001/api/geenforce/manifest -H \"X-API-Key: $KEY\"", + "queryparams": [ + { + "name": "pctype", + "type": "string", + "required": false + }, + { + "name": "phase", + "type": "string", + "required": false + } + ], + "responseexample": { + "Version": "2.6", + "Applications": [ + { + "Name": "Alpha", + "Type": "MSI", + "Installer": "apps/alpha.msi", + "DetectionMethod": "Registry", + "DetectionPath": "HKLM:\\SOFTWARE\\Alpha" + }, + { + "Name": "Beta", + "Type": "PS1", + "Script": "scripts/beta.ps1", + "DetectionMethod": "Always" + }, + { + "Name": "Gamma", + "Type": "PS1", + "Script": "scripts/gamma.ps1" + } + ] + } + }, + { + "method": "GET", + "path": "/api/geenforce/payload/", + "auth": "api-key (geenforce fetch token, or the IP allowlist)", + "params": "path: sha256 (string)", + "purpose": "Serve a payload blob by content hash over HTTPS.", + "example": "curl http://localhost:5001/api/geenforce/payload/x -H \"X-API-Key: $KEY\"" + }, + { + "method": "POST", + "path": "/api/geenforce/report", + "auth": "api-key (geenforce report token)", + "params": "body: JSON (fields not yet documented)", + "purpose": "Record one PC's enforcement cycle: applied version (did it receive the update?) + per-entry self-heal outcomes (installed/skipped/failed).", + "example": "curl -X POST http://localhost:5001/api/geenforce/report -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'", + "requestexample": { + "appliedversion": 1, + "counts": { + "failed": 1, + "filtered": 0, + "installed": 2, + "skipped": 1 + }, + "enforcerversion": "2.6", + "hostname": "", + "phase": "runtime", + "results": [ + { + "action": "installed", + "exitcode": 0, + "message": "rule re-added", + "name": "VNC firewall rule", + "selfhealed": true + }, + { + "action": "skipped", + "exitcode": 0, + "message": "", + "name": "PC-DMIS 2023.1", + "selfhealed": false + }, + { + "action": "installed", + "exitcode": 0, + "name": "eDNC config", + "selfhealed": true + }, + "" + ], + "scopename": "gea-shopfloor-cmm" + }, + "responseexample": { + "data": { + "reportid": 1, + "status": "selfhealed" + }, + "message": "recorded", + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "GET", + "path": "/api/geenforce/reports", + "auth": "permission:geenforce.view or geenforce.manage", + "params": "not documented", + "purpose": "Latest enforcement report per PC (fleet compliance view).", + "example": "curl http://localhost:5001/api/geenforce/reports -H \"Authorization: Bearer $TOK\"", + "queryparams": [ + { + "name": "hostname", + "type": "string", + "required": false + }, + { + "name": "scopename", + "type": "string", + "required": false + } + ], + "responseexample": { + "data": [ + { + "appliedversion": null, + "assetnumber": "WJBAK10", + "backupcollectedat": "2026-01-01T00:00:00.000000Z", + "backupkind": "partmarker", + "backuplastseen": "2026-01-01T00:00:00.000000Z", + "backupok": false, + "backupstaleafterdays": 3, + "computerid": 1, + "displayrole": null, + "enforcerversion": null, + "failed": 0, + "filtered": 0, + "hostname": "", + "installed": 0, + "isstale": false, + "lastcheckin": null, + "latestversion": 1, + "levelid": null, + "location": null, + "machineassetid": null, + "machinenumber": null, + "machinepluginid": null, + "mapx": null, + "mapy": null, + "phase": "runtime", + "receivedat": "2026-01-01T00:00:00.000000Z", + "receivedlatest": false, + "reportid": 1, + "scopename": "gea-shopfloor-cmm", + "skipped": 0, + "staleafterminutes": 30, + "status": "ok", + "toolassetid": null, + "toolassetnumber": null, + "toolpluginid": null + } + ], + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "GET", + "path": "/api/geenforce/reports/", + "auth": "permission:geenforce.view or geenforce.manage", + "params": "path: reportid (int)", + "purpose": "One report with per-entry outcomes (self-heal / failure detail).", + "example": "curl http://localhost:5001/api/geenforce/reports/1 -H \"Authorization: Bearer $TOK\"", + "responseexample": { + "data": { + "appliedversion": 1, + "hostname": "", + "latestversion": 1, + "phase": "runtime", + "receivedlatest": true, + "reportid": 1, + "results": [ + { + "action": "installed", + "entryname": "VNC firewall rule", + "exitcode": 0, + "message": "rule re-added", + "selfhealed": true + }, + { + "action": "skipped", + "entryname": "PC-DMIS 2023.1", + "exitcode": 0, + "message": "", + "selfhealed": false + }, + { + "action": "installed", + "entryname": "eDNC config", + "exitcode": 0, + "message": null, + "selfhealed": true + }, + "" + ], + "scopename": "gea-shopfloor-cmm", + "status": "failed" + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "GET", + "path": "/api/geenforce/scopes", + "auth": "permission:geenforce.view or geenforce.manage", + "params": "not documented", + "purpose": "List imaging PC-type scopes with entry + published-version counts.", + "example": "curl http://localhost:5001/api/geenforce/scopes -H \"Authorization: Bearer $TOK\"", + "responseexample": { + "data": [ + { + "computertypeid": null, + "entrycount": 2, + "iscommon": false, + "manifestversion": "2.6", + "measuringtooltypeid": null, + "minlibversion": null, + "phase": "runtime", + "publishedversion": 1, + "scopeid": 1, + "scopename": "gea-shopfloor-cmm" + } + ], + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "POST", + "path": "/api/geenforce/scopes", + "auth": "permission:geenforce.manage", + "params": "body: JSON (fields not yet documented)", + "purpose": "UNDOCUMENTED: geenforce.create_scope has no docstring.", + "example": "curl -X POST http://localhost:5001/api/geenforce/scopes -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "requestexample": { + "description": "test scope", + "phase": "runtime", + "scopename": "gea-shopfloor-collections" + }, + "responseexample": { + "data": { + "computertypeid": null, + "description": "test scope", + "entrycount": 0, + "iscommon": false, + "manifestversion": "1.0", + "measuringtooltypeid": null, + "phase": "runtime", + "publishedversion": null, + "scopeid": 1, + "scopename": "gea-shopfloor-collections" + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "DELETE", + "path": "/api/geenforce/scopes/", + "auth": "permission:geenforce.manage", + "params": "path: scopeid (int)", + "purpose": "UNDOCUMENTED: geenforce.delete_scope has no docstring.", + "example": "curl -X DELETE http://localhost:5001/api/geenforce/scopes/1 -H \"Authorization: Bearer $TOK\"", + "responseexample": { + "data": { + "deleted": 1 + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "GET", + "path": "/api/geenforce/scopes/", + "auth": "permission:geenforce.view or geenforce.manage", + "params": "path: scopeid (int)", + "purpose": "UNDOCUMENTED: geenforce.get_scope has no docstring.", + "example": "curl http://localhost:5001/api/geenforce/scopes/1 -H \"Authorization: Bearer $TOK\"", + "responseexample": { + "data": { + "computertypeid": null, + "description": "test scope", + "entries": [ + { + "Name": "Beta", + "Script": "scripts/b.ps1", + "Type": "PS1", + "appid": null, + "appname": null, + "entryid": 2, + "haspayload": false, + "payloadref": null, + "payloadsha256": null, + "payloadsource": "smb", + "sortorder": 0 + }, + { + "DetectionMethod": "FileVersion", + "DetectionPath": "C:\\a.exe", + "DetectionValue": "1.0", + "Installer": "apps/a.exe", + "Name": "Alpha", + "Type": "EXE", + "appid": null, + "appname": null, + "entryid": 1, + "haspayload": false, + "payloadref": null, + "payloadsha256": null, + "payloadsource": "smb", + "sortorder": 1 + } + ], + "entrycount": 2, + "iscommon": false, + "manifestversion": "1.0", + "measuringtooltypeid": null, + "phase": "runtime", + "publishedversion": null, + "scopeid": 1, + "scopename": "gea-shopfloor-test" + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "PUT", + "path": "/api/geenforce/scopes/", + "auth": "permission:geenforce.manage", + "params": "path: scopeid (int); body: JSON (fields not yet documented)", + "purpose": "UNDOCUMENTED: geenforce.update_scope has no docstring.", + "example": "curl -X PUT http://localhost:5001/api/geenforce/scopes/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "requestexample": { + "computertypeid": 3, + "description": "updated" + }, + "responseexample": { + "data": { + "computertypeid": 3, + "description": "updated", + "entrycount": 0, + "iscommon": false, + "manifestversion": "1.0", + "measuringtooltypeid": null, + "phase": "runtime", + "publishedversion": null, + "scopeid": 1, + "scopename": "gea-shopfloor-test" + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "GET", + "path": "/api/geenforce/scopes//compliance", + "auth": "permission:geenforce.view or geenforce.manage", + "params": "path: scopeid (int)", + "purpose": "Fleet-install coverage per app-linked entry (from collected PC data).", + "example": "curl http://localhost:5001/api/geenforce/scopes/1/compliance -H \"Authorization: Bearer $TOK\"", + "responseexample": { + "data": { + "computersplugin": false, + "phase": "runtime", + "rows": [ + { + "appid": 1, + "appname": "PC-DMIS", + "coveragenote": "computers plugin not installed; install counts unavailable", + "entryid": 1, + "entryname": "PC-DMIS 2019", + "expectedversion": "2019 R1", + "installedcount": null, + "versionmatchcount": null + } + ], + "scopeid": 1, + "scopename": "gea-shopfloor-cmm" + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "POST", + "path": "/api/geenforce/scopes//entries", + "auth": "permission:geenforce.manage", + "params": "path: scopeid (int); body: JSON (fields not yet documented)", + "purpose": "UNDOCUMENTED: geenforce.create_entry has no docstring.", + "example": "curl -X POST http://localhost:5001/api/geenforce/scopes/1/entries -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "requestexample": { + "InUseCheck": { + "Behavior": "CloseAndReopen", + "Processes": [ + { + "ExePath": "C:\\PCDLRN.exe", + "GracefulCloseTimeoutSec": 15, + "Name": "PCDLRN" + } + ] + }, + "Installer": "apps/pcdmis.msi", + "LogFile": "C:\\Logs\\pcdmis.log", + "Name": "PC-DMIS", + "PCTypesStrict": true, + "PreEnrollment": true, + "Type": "MSI" + }, + "responseexample": { + "data": { + "InUseCheck": { + "Behavior": "CloseAndReopen", + "Processes": [ + { + "ExePath": "C:\\PCDLRN.exe", + "GracefulCloseTimeoutSec": 15, + "Name": "PCDLRN" + } + ] + }, + "Installer": "apps/pcdmis.msi", + "LogFile": "C:\\Logs\\pcdmis.log", + "Name": "PC-DMIS", + "PCTypesStrict": true, + "PreEnrollment": true, + "Type": "MSI", + "appid": null, + "appname": null, + "entryid": 1, + "haspayload": false, + "payloadref": null, + "payloadsha256": null, + "payloadsource": "smb", + "sortorder": 0 + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "PUT", + "path": "/api/geenforce/scopes//entries/reorder", + "auth": "permission:geenforce.manage", + "params": "path: scopeid (int); body: JSON (fields not yet documented)", + "purpose": "Set entry order from a list of entryids (the ordering contract).", + "example": "curl -X PUT http://localhost:5001/api/geenforce/scopes/1/entries/reorder -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "requestexample": { + "order": [ + 2, + 1 + ] + }, + "responseexample": { + "data": { + "order": [ + 2, + 1 + ] + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "POST", + "path": "/api/geenforce/scopes//export-share", + "auth": "permission:geenforce.publish", + "params": "path: scopeid (int); body: JSON (fields not yet documented)", + "purpose": "Write the scope's current published JSON to the configured share root (backing up the old file to _meta/history first).", + "example": "curl -X POST http://localhost:5001/api/geenforce/scopes/1/export-share -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "responseexample": { + "data": { + "path": "" + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "GET", + "path": "/api/geenforce/scopes//preview", + "auth": "permission:geenforce.view or geenforce.manage", + "params": "path: scopeid (int)", + "purpose": "Render the DRAFT manifest JSON a publish would freeze (review before ship).", + "example": "curl http://localhost:5001/api/geenforce/scopes/1/preview -H \"Authorization: Bearer $TOK\"", + "responseexample": { + "data": { + "manifest": { + "Applications": [ + { + "DetectionMethod": "Registry", + "DetectionPath": "HKLM:\\SOFTWARE\\Alpha", + "Installer": "apps/alpha.msi", + "Name": "Alpha", + "Type": "MSI" + }, + { + "DetectionMethod": "Always", + "Name": "Beta", + "Script": "scripts/beta.ps1", + "Type": "PS1" + } + ], + "Version": "2.6" + }, + "scopename": "gea-shopfloor-cmm" + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "POST", + "path": "/api/geenforce/scopes//publish", + "auth": "permission:geenforce.publish", + "params": "path: scopeid (int); body: JSON (fields not yet documented)", + "purpose": "UNDOCUMENTED: geenforce.publish_scope_route has no docstring.", + "example": "curl -X POST http://localhost:5001/api/geenforce/scopes/1/publish -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "requestexample": { + "notes": "v1" + }, + "responseexample": { + "data": { + "versionnumber": 1 + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "GET", + "path": "/api/geenforce/scopes//publish-preflight", + "auth": "permission:geenforce.view or geenforce.manage", + "params": "path: scopeid (int)", + "purpose": "Would publishing this scope outrun the fleet's enforcer lib?", + "example": "curl http://localhost:5001/api/geenforce/scopes/1/publish-preflight -H \"Authorization: Bearer $TOK\"" + }, + { + "method": "POST", + "path": "/api/geenforce/scopes//rollback", + "auth": "permission:geenforce.publish", + "params": "path: scopeid (int); body: JSON (fields not yet documented)", + "purpose": "UNDOCUMENTED: geenforce.rollback_scope_route has no docstring.", + "example": "curl -X POST http://localhost:5001/api/geenforce/scopes/1/rollback -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "requestexample": { + "versionnumber": 1 + }, + "responseexample": { + "data": { + "versionnumber": 1 + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "GET", + "path": "/api/geenforce/scopes//simulate", + "auth": "permission:geenforce.view or geenforce.manage", + "params": "path: scopeid (int)", + "purpose": "Which draft entries apply to a given machine profile, and why the rest are filtered out (reuses the engine-mirror filters).", + "example": "curl http://localhost:5001/api/geenforce/scopes/1/simulate -H \"Authorization: Bearer $TOK\"", + "queryparams": [ + { + "name": "cmmversion", + "type": "string", + "required": false + }, + { + "name": "hostname", + "type": "string", + "required": false + }, + { + "name": "machinenumber", + "type": "string", + "required": false + }, + { + "name": "pctype", + "type": "string", + "required": false + }, + { + "name": "subtype", + "type": "string", + "required": false + } + ], + "responseexample": { + "data": { + "applied": [ + "CLM (untagged)", + "PC-DMIS 2019" + ], + "filtered": [ + { + "filteredby": [ + "_CmmVersion" + ], + "name": "PC-DMIS 2016" + } + ], + "profile": { + "cmmversion": "2019", + "hostname": "", + "machinenumber": null, + "pctype": "gea-shopfloor-cmm", + "phase": "runtime", + "subtype": null + } + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "GET", + "path": "/api/geenforce/scopes//versions", + "auth": "permission:geenforce.view or geenforce.manage", + "params": "path: scopeid (int)", + "purpose": "UNDOCUMENTED: geenforce.list_versions has no docstring.", + "example": "curl http://localhost:5001/api/geenforce/scopes/1/versions -H \"Authorization: Bearer $TOK\"", + "responseexample": { + "data": [ + { + "iscurrent": false, + "notes": "v2", + "publishedat": "2026-01-01T00:00:00.000000Z", + "publishedby": 1, + "versionnumber": 2 + }, + { + "iscurrent": true, + "notes": "v1", + "publishedat": "2026-01-01T00:00:00.000000Z", + "publishedby": 1, + "versionnumber": 1 + } + ], + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "GET", + "path": "/api/geenforce/scopes//versions/", + "auth": "permission:geenforce.view or geenforce.manage", + "params": "path: scopeid (int), versionnumber (int)", + "purpose": "UNDOCUMENTED: geenforce.get_version has no docstring.", + "example": "curl http://localhost:5001/api/geenforce/scopes/1/versions/1 -H \"Authorization: Bearer $TOK\"", + "responseexample": { + "data": { + "manifest": { + "Applications": [ + { + "Name": "Alpha", + "Type": "MSI" + }, + { + "Name": "Beta", + "Type": "PS1" + } + ], + "Version": "1.0" + }, + "versionnumber": 2 + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + } + ] + }, + { + "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/", + "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/", + "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//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//restore/", + "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//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//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//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/", + "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/", + "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/", + "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": "", + "guideid": 1, + "guiderevisionid": 1, + "note": null, + "revision": 1, + "shorthash": "", + "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/", + "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/", + "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/", + "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//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": "0410", + "assettypecolor": null, + "assettypeid": 1, + "assettypename": "machine", + "businessunitid": null, + "createdby": "", + "createddate": "2026-01-01T00:00:00.000000Z", + "deletedby": null, + "deleteddate": null, + "dualpathpartner": 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": null, + "machineid": 1, + "machinetypeid": 1, + "machinetypename": "Part Washer", + "maintenanceintervaldays": null, + "modelnumberid": null, + "modifieddate": "2026-01-01T00:00:00.000000Z", + "nextmaintenancedate": null, + "requiresmanualconfig": false, + "vendorid": 1, + "vendorname": "Acme Industrial" + }, + "maintenancereference": null, + "mapverifiedat": null, + "mapx": null, + "mapy": null, + "modifiedby": "", + "modifieddate": "2026-01-01T00:00:00.000000Z", + "name": "Cell 4 washer", + "notes": null, + "ownlevelid": null, + "ownlocationid": null, + "ownmapx": null, + "ownmapy": null, + "pluginid": 1, + "serialnumber": "", + "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": "", + "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": "", + "modifieddate": "2026-01-01T00:00:00.000000Z", + "name": "Maintenance date probe", + "notes": null, + "ownlevelid": null, + "ownlocationid": null, + "ownmapx": null, + "ownmapy": null, + "pluginid": 1, + "serialnumber": "", + "statusid": 1 + }, + "message": "Machine created", + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "DELETE", + "path": "/api/machines/", + "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/", + "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": "2001", + "assettypecolor": null, + "assettypeid": 1, + "assettypename": "machine", + "businessunitid": null, + "createdby": "", + "createddate": "2026-01-01T00:00:00.000000Z", + "deletedby": null, + "deleteddate": null, + "dualpathpartner": 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", + "imageurl": "/api/models/images/model-1.png", + "isactive": true, + "islocationonly": false, + "lastmaintenancedate": null, + "machineid": 1, + "machinetypeid": null, + "maintenanceintervaldays": null, + "modelname": "IMG-MODEL-1", + "modelnumberid": 1, + "modifieddate": "2026-01-01T00:00:00.000000Z", + "nextmaintenancedate": null, + "requiresmanualconfig": false, + "vendorid": null + }, + "maintenancereference": null, + "mapverifiedat": null, + "mapx": null, + "mapy": null, + "modifiedby": "", + "modifieddate": "2026-01-01T00:00:00.000000Z", + "name": null, + "notes": null, + "ownlevelid": null, + "ownlocationid": null, + "ownmapx": null, + "ownmapy": null, + "pluginid": 1, + "serialnumber": "", + "statusid": 1 + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "PUT", + "path": "/api/machines/", + "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/", + "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/", + "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/", + "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/", + "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-measuringtools", + "endpoints": [ + { + "method": "GET", + "path": "/api/measuringtools", + "auth": "permission:measuringtools.view", + "params": "not documented", + "purpose": "List measuring tools with filters + pagination.", + "example": "curl http://localhost:5001/api/measuringtools -H \"Authorization: Bearer $TOK\"", + "queryparams": [ + { + "name": "active", + "type": "string", + "required": false, + "default": "true" + }, + { + "name": "assetnumber", + "type": "string", + "required": false + }, + { + "name": "calibrationstatus", + "type": "string", + "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": "statusid", + "type": "integer", + "required": false + }, + { + "name": "typeid", + "type": "integer", + "required": false + } + ], + "responseexample": { + "data": [ + { + "assetid": 26, + "assetnumber": "MT-PAGE-05", + "assettypecolor": null, + "assettypeid": 1, + "assettypename": "measuring_tool", + "businessunitid": null, + "createdby": "", + "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, + "measuringtool": { + "assetid": 26, + "calibrationintervaldays": null, + "calibrationprovider": null, + "calibrationstatus": "overdue", + "calibrationstatuscolor": "#F44336", + "createddate": "2026-01-01T00:00:00.000000Z", + "isactive": true, + "lastcalibrationdate": null, + "measuringtoolid": 26, + "measuringtooltypeid": null, + "modifieddate": "2026-01-01T00:00:00.000000Z", + "nextcalibrationdate": "2026-01-01", + "notes": null + }, + "modifiedby": "", + "modifieddate": "2026-01-01T00:00:00.000000Z", + "name": "Paged tool 5", + "notes": null, + "ownlevelid": null, + "ownlocationid": null, + "ownmapx": null, + "ownmapy": null, + "pluginid": 26, + "serialnumber": "", + "statuscolor": null, + "statusid": 1, + "statusname": "In Use" + } + ], + "meta": { + "pagination": { + "hasnext": false, + "hasprev": false, + "page": 1, + "perpage": 2, + "total": 1, + "totalpages": 1 + }, + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "POST", + "path": "/api/measuringtools", + "auth": "permission:measuringtools.create", + "params": "body: JSON (fields not yet documented)", + "purpose": "Create a measuring tool: one Asset core row + one extension row.", + "example": "curl -X POST http://localhost:5001/api/measuringtools -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "requestexample": { + "assetnumber": "MT-001", + "calibrationintervaldays": 365, + "calibrationprovider": "Metro Cal Lab", + "gaugelabreference": "GL-42", + "lastcalibrationdate": "2026-01-01", + "measuringtooltypeid": 1, + "name": "Bench caliper", + "nextcalibrationdate": "2026-01-01", + "serialnumber": "", + "statusid": 1 + }, + "responseexample": { + "data": { + "assetid": 1, + "assetnumber": "MT-001", + "assettypecolor": null, + "assettypeid": 1, + "assettypename": "measuring_tool", + "businessunitid": null, + "createdby": "", + "createddate": "2026-01-01T00:00:00.000000Z", + "deletedby": null, + "deleteddate": null, + "gaugelabreference": "GL-42", + "isactive": true, + "levelid": null, + "locationcode": null, + "locationid": null, + "maintenancereference": null, + "mapverifiedat": null, + "mapx": null, + "mapy": null, + "measuringtool": { + "assetid": 1, + "calibrationintervaldays": 365, + "calibrationprovider": "Metro Cal Lab", + "calibrationstatus": "current", + "calibrationstatuscolor": "#4CAF50", + "createddate": "2026-01-01T00:00:00.000000Z", + "isactive": true, + "lastcalibrationdate": "2026-01-01", + "measuringtoolid": 1, + "measuringtooltypecolor": "#14abef", + "measuringtooltypeid": 1, + "measuringtooltypename": "Caliper", + "modifieddate": "2026-01-01T00:00:00.000000Z", + "nextcalibrationdate": "2026-01-01", + "notes": null + }, + "modifiedby": "", + "modifieddate": "2026-01-01T00:00:00.000000Z", + "name": "Bench caliper", + "notes": null, + "ownlevelid": null, + "ownlocationid": null, + "ownmapx": null, + "ownmapy": null, + "pluginid": 1, + "serialnumber": "", + "statuscolor": null, + "statusid": 1, + "statusname": "In Use" + }, + "message": "Measuring tool created", + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "DELETE", + "path": "/api/measuringtools/", + "auth": "permission:measuringtools.delete", + "params": "path: tool_id (int)", + "purpose": "Soft delete a measuring tool (deactivates its asset).", + "example": "curl -X DELETE http://localhost:5001/api/measuringtools/1 -H \"Authorization: Bearer $TOK\"", + "responseexample": { + "message": "Measuring tool deleted", + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "GET", + "path": "/api/measuringtools/", + "auth": "permission:measuringtools.view", + "params": "path: tool_id (int)", + "purpose": "Get one measuring tool (asset core merged with the extension).", + "example": "curl http://localhost:5001/api/measuringtools/1 -H \"Authorization: Bearer $TOK\"", + "responseexample": { + "data": { + "assetid": 1, + "assetnumber": "MT-001", + "assettypecolor": null, + "assettypeid": 1, + "assettypename": "measuring_tool", + "businessunitid": null, + "createdby": "", + "createddate": "2026-01-01T00:00:00.000000Z", + "deletedby": null, + "deleteddate": null, + "gaugelabreference": "GL-42", + "isactive": true, + "levelid": null, + "locationcode": null, + "locationid": null, + "maintenancereference": null, + "mapverifiedat": null, + "mapx": null, + "mapy": null, + "measuringtool": { + "assetid": 1, + "calibrationintervaldays": 365, + "calibrationprovider": "Metro Cal Lab", + "calibrationstatus": "current", + "calibrationstatuscolor": "#4CAF50", + "createddate": "2026-01-01T00:00:00.000000Z", + "isactive": true, + "lastcalibrationdate": "2026-01-01", + "measuringtoolid": 1, + "measuringtooltypecolor": "#14abef", + "measuringtooltypeid": 1, + "measuringtooltypename": "Caliper", + "modifieddate": "2026-01-01T00:00:00.000000Z", + "nextcalibrationdate": "2026-01-01", + "notes": null + }, + "modifiedby": "", + "modifieddate": "2026-01-01T00:00:00.000000Z", + "name": "Bench caliper", + "notes": null, + "ownlevelid": null, + "ownlocationid": null, + "ownmapx": null, + "ownmapy": null, + "pluginid": 1, + "serialnumber": "", + "statuscolor": null, + "statusid": 1, + "statusname": "In Use" + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "PUT", + "path": "/api/measuringtools/", + "auth": "permission:measuringtools.edit", + "params": "path: tool_id (int); body: JSON (fields not yet documented)", + "purpose": "Update a measuring tool (asset core fields + extension in one payload).", + "example": "curl -X PUT http://localhost:5001/api/measuringtools/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "requestexample": { + "calibrationprovider": "In-house", + "name": "Renamed tool", + "nextcalibrationdate": "2026-01-01" + }, + "responseexample": { + "data": { + "assetid": 20, + "assetnumber": "MT-AUDIT-1", + "assettypecolor": null, + "assettypeid": 1, + "assettypename": "measuring_tool", + "businessunitid": null, + "createdby": "", + "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, + "measuringtool": { + "assetid": 20, + "calibrationintervaldays": null, + "calibrationprovider": null, + "calibrationstatus": "current", + "calibrationstatuscolor": "#4CAF50", + "createddate": "2026-01-01T00:00:00.000000Z", + "isactive": true, + "lastcalibrationdate": "2026-01-01", + "measuringtoolid": 20, + "measuringtooltypeid": null, + "modifieddate": "2026-01-01T00:00:00.000000Z", + "nextcalibrationdate": "2026-01-01", + "notes": null + }, + "modifiedby": "", + "modifieddate": "2026-01-01T00:00:00.000000Z", + "name": "After rename", + "notes": null, + "ownlevelid": null, + "ownlocationid": null, + "ownmapx": null, + "ownmapy": null, + "pluginid": 20, + "serialnumber": "", + "statuscolor": null, + "statusid": 1, + "statusname": "In Use" + }, + "message": "Measuring tool updated", + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "GET", + "path": "/api/measuringtools/by-asset/", + "auth": "permission:measuringtools.view", + "params": "path: asset_id (int)", + "purpose": "Get a measuring tool by its core asset id.", + "example": "curl http://localhost:5001/api/measuringtools/by-asset/1 -H \"Authorization: Bearer $TOK\"" + }, + { + "method": "GET", + "path": "/api/measuringtools/map-overlay", + "auth": "permission:measuringtools.view", + "params": "not documented", + "purpose": "Calibration-status overlay for active measuring tools.", + "example": "curl http://localhost:5001/api/measuringtools/map-overlay -H \"Authorization: Bearer $TOK\"", + "responseexample": { + "data": [ + { + "assetid": 4, + "color": "#F44336", + "label": "Overdue" + }, + { + "assetid": 6, + "color": "#F44336", + "label": "Overdue" + }, + { + "assetid": 16, + "color": "#F44336", + "label": "Overdue" + } + ], + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "GET", + "path": "/api/measuringtools/report/calibration", + "auth": "permission:measuringtools.view", + "params": "not documented", + "purpose": "Counts + lists bucketed by derived calibration status.", + "example": "curl http://localhost:5001/api/measuringtools/report/calibration -H \"Authorization: Bearer $TOK\"", + "responseexample": { + "data": { + "buckets": { + "current": [], + "duesoon": [], + "overdue": [], + "unknown": [] + }, + "counts": { + "current": 0, + "duesoon": 0, + "overdue": 0, + "unknown": 0 + }, + "statuscolors": { + "current": "#4CAF50", + "duesoon": "#FF9800", + "overdue": "#F44336", + "unknown": "#9E9E9E" + } + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "GET", + "path": "/api/measuringtools/types", + "auth": "permission:measuringtools.view", + "params": "not documented", + "purpose": "List measuring-tool types.", + "example": "curl http://localhost:5001/api/measuringtools/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": [ + { + "color": "#7934f3", + "createddate": "2026-01-01T00:00:00.000000Z", + "description": "Bore / hole diameter gage", + "isactive": true, + "measuringtooltypeid": 4, + "modifieddate": "2026-01-01T00:00:00.000000Z", + "name": "Bore Gage" + }, + { + "color": "#14abef", + "createddate": "2026-01-01T00:00:00.000000Z", + "description": "Vernier / digital caliper", + "isactive": true, + "measuringtooltypeid": 1, + "modifieddate": "2026-01-01T00:00:00.000000Z", + "name": "Caliper" + }, + { + "color": "#e83e8c", + "createddate": "2026-01-01T00:00:00.000000Z", + "description": "Reference gage block set", + "isactive": true, + "measuringtooltypeid": 7, + "modifieddate": "2026-01-01T00:00:00.000000Z", + "name": "Gage Block Set" + }, + "" + ], + "meta": { + "pagination": { + "hasnext": false, + "hasprev": false, + "page": 1, + "perpage": 20, + "total": 8, + "totalpages": 1 + }, + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "POST", + "path": "/api/measuringtools/types", + "auth": "permission:measuringtools.create", + "params": "body: JSON (fields not yet documented)", + "purpose": "Create a measuring-tool type (reactivates a soft-deleted same-named one).", + "example": "curl -X POST http://localhost:5001/api/measuringtools/types -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "requestexample": { + "color": "#123456", + "description": "Pin gage set", + "name": "Pin Gage" + }, + "responseexample": { + "data": { + "color": "#123456", + "createddate": "2026-01-01T00:00:00.000000Z", + "description": "Pin gage set", + "isactive": true, + "measuringtooltypeid": 9, + "modifieddate": "2026-01-01T00:00:00.000000Z", + "name": "Pin Gage" + }, + "message": "Measuring-tool type created", + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "DELETE", + "path": "/api/measuringtools/types/", + "auth": "permission:measuringtools.delete", + "params": "path: type_id (int)", + "purpose": "Delete a measuring-tool type. Refused if any tool still uses it.", + "example": "curl -X DELETE http://localhost:5001/api/measuringtools/types/1 -H \"Authorization: Bearer $TOK\"", + "responseexample": { + "message": "Measuring-tool type deleted", + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "GET", + "path": "/api/measuringtools/types/", + "auth": "permission:measuringtools.view", + "params": "path: type_id (int)", + "purpose": "Get one measuring-tool type.", + "example": "curl http://localhost:5001/api/measuringtools/types/1 -H \"Authorization: Bearer $TOK\"" + }, + { + "method": "PUT", + "path": "/api/measuringtools/types/", + "auth": "permission:measuringtools.edit", + "params": "path: type_id (int); body: JSON (fields not yet documented)", + "purpose": "Update a measuring-tool type.", + "example": "curl -X PUT http://localhost:5001/api/measuringtools/types/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "requestexample": { + "description": "Updated" + }, + "responseexample": { + "data": { + "color": "#123456", + "createddate": "2026-01-01T00:00:00.000000Z", + "description": "Updated", + "isactive": true, + "measuringtooltypeid": 9, + "modifieddate": "2026-01-01T00:00:00.000000Z", + "name": "Pin Gage" + }, + "message": "Measuring-tool type updated", + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "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": "", + "createddate": "2026-01-01T00:00:00.000000Z", + "deletedby": null, + "deleteddate": null, + "gaugelabreference": null, + "ipaddress": "", + "isactive": true, + "levelid": null, + "locationcode": null, + "locationid": null, + "maintenancereference": null, + "mapverifiedat": null, + "mapx": null, + "mapy": null, + "modifiedby": "", + "modifieddate": "2026-01-01T00:00:00.000000Z", + "name": null, + "networkdevice": { + "assetid": 1, + "createddate": "2026-01-01T00:00:00.000000Z", + "firmwareversion": null, + "hostname": "", + "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": "", + "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": "", + "ipaddress": "", + "name": "Core switch" + }, + "responseexample": { + "data": { + "assetid": 1, + "assetnumber": "APNL-Dock-Door-4", + "assettypecolor": null, + "assettypeid": 1, + "assettypename": "network_device", + "businessunitid": null, + "createdby": "", + "createddate": "2026-01-01T00:00:00.000000Z", + "deletedby": null, + "deleteddate": null, + "gaugelabreference": null, + "ipaddress": "", + "isactive": true, + "levelid": null, + "locationcode": null, + "locationid": null, + "maintenancereference": null, + "mapverifiedat": null, + "mapx": null, + "mapy": null, + "modifiedby": "", + "modifieddate": "2026-01-01T00:00:00.000000Z", + "name": "Dock Door 4", + "networkdevice": { + "assetid": 1, + "createddate": "2026-01-01T00:00:00.000000Z", + "firmwareversion": null, + "hostname": "", + "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": "", + "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/", + "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/", + "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": "", + "createddate": "2026-01-01T00:00:00.000000Z", + "deletedby": null, + "deleteddate": null, + "gaugelabreference": "GL-2", + "ipaddress": "", + "isactive": true, + "levelid": null, + "locationcode": null, + "locationid": null, + "maintenancereference": "MNT-2", + "mapverifiedat": null, + "mapx": null, + "mapy": null, + "modifiedby": "", + "modifieddate": "2026-01-01T00:00:00.000000Z", + "name": null, + "networkdevice": { + "assetid": 1, + "createddate": "2026-01-01T00:00:00.000000Z", + "firmwareversion": null, + "hostname": "", + "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": "", + "statusid": 1 + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "PUT", + "path": "/api/network/", + "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": "", + "createddate": "2026-01-01T00:00:00.000000Z", + "deletedby": null, + "deleteddate": null, + "gaugelabreference": "GL-2", + "ipaddress": "", + "isactive": true, + "levelid": null, + "locationcode": null, + "locationid": null, + "maintenancereference": "MNT-2", + "mapverifiedat": null, + "mapx": null, + "mapy": null, + "modifiedby": "", + "modifieddate": "2026-01-01T00:00:00.000000Z", + "name": null, + "networkdevice": { + "assetid": 1, + "createddate": "2026-01-01T00:00:00.000000Z", + "firmwareversion": null, + "hostname": "", + "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": "", + "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/", + "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/", + "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": "", + "name": "Attached", + "vlanid": 1 + }, + "responseexample": { + "data": { + "broadcastaddress": null, + "cidr": "", + "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/", + "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/", + "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/", + "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/", + "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/", + "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/", + "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/", + "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/", + "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/", + "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": [ + "", + "" + ] + }, + "notification": "Line 3 is down", + "notificationtypeid": 1 + }, + "responseexample": { + "data": { + "alertfleet": true, + "alertscope": { + "computertype": "CMM PC", + "hostname": [ + "", + "" + ] + }, + "alerttimeout": 0, + "appid": null, + "businessunitid": null, + "employeename": "", + "employeesso": "", + "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/", + "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/", + "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/", + "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": "", + "employeesso": "", + "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/", + "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": "", + "employeepicture": "", + "employeesso": "", + "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": "", + "employeepicture": "", + "employeesso": "", + "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": "", + "splitperemployee": "", + "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": "", + "splitperemployee": "", + "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/", + "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": "", + "splitperemployee": "", + "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-printedparts", + "endpoints": [ + { + "method": "DELETE", + "path": "/api/printedparts/files/", + "auth": "permission:printedparts.delete", + "params": "path: file_id (int)", + "purpose": "Remove a bad revision (wrong file uploaded). History otherwise stays.", + "example": "curl -X DELETE http://localhost:5001/api/printedparts/files/1 -H \"Authorization: Bearer $TOK\"" + }, + { + "method": "GET", + "path": "/api/printedparts/files//download", + "auth": "permission:printedparts.view", + "params": "path: file_id (int)", + "purpose": "Download a revision under its original filename.", + "example": "curl http://localhost:5001/api/printedparts/files/1/download -H \"Authorization: Bearer $TOK\"" + }, + { + "method": "GET", + "path": "/api/printedparts/image/", + "auth": "none (reviewed: named in the public-read or mutation sweep)", + "params": "path: filename (path)", + "purpose": "Serve an uploaded item image (public - kiosk and list read it).", + "example": "curl http://localhost:5001/api/printedparts/image/example.png" + }, + { + "method": "GET", + "path": "/api/printedparts/items", + "auth": "permission:printedparts.view", + "params": "not documented", + "purpose": "List printed items, paginated; search + low-stock filter.", + "example": "curl http://localhost:5001/api/printedparts/items -H \"Authorization: Bearer $TOK\"", + "queryparams": [ + { + "name": "active", + "type": "string", + "required": false, + "default": "true" + }, + { + "name": "lowstock", + "type": "string", + "required": false, + "default": "" + }, + { + "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": [ + { + "binlocation": null, + "createddate": "2026-01-01T00:00:00.000000Z", + "gagelabtag": "WJRP0117", + "imageurl": null, + "isactive": true, + "islowstock": true, + "itemcode": "3DP0001", + "itemdescription": null, + "itemname": "Gage block holder", + "latestrevision": null, + "lowstockthreshold": 5, + "modifieddate": "2026-01-01T00:00:00.000000Z", + "printeditemid": 1, + "printnotes": null, + "quantityonhand": 0 + } + ], + "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/printedparts/items", + "auth": "permission:printedparts.create", + "params": "body: JSON (fields not yet documented)", + "purpose": "Create a printed item.", + "example": "curl -X POST http://localhost:5001/api/printedparts/items -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "requestexample": { + "gagelabtag": "wjrp0117", + "itemname": "Gage block holder" + }, + "responseexample": { + "data": { + "binlocation": null, + "createddate": "2026-01-01T00:00:00.000000Z", + "gagelabtag": "WJRP0117", + "imageurl": null, + "isactive": true, + "islowstock": true, + "itemcode": "3DP0001", + "itemdescription": null, + "itemname": "Gage block holder", + "latestrevision": null, + "lowstockthreshold": 5, + "modifieddate": "2026-01-01T00:00:00.000000Z", + "printeditemid": 1, + "printnotes": null, + "quantityonhand": 0 + }, + "message": "Printed item created", + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "DELETE", + "path": "/api/printedparts/items/", + "auth": "permission:printedparts.delete", + "params": "path: item_id (int)", + "purpose": "Soft-retire an item; its ledger history stays.", + "example": "curl -X DELETE http://localhost:5001/api/printedparts/items/1 -H \"Authorization: Bearer $TOK\"", + "responseexample": { + "message": "Printed item retired", + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "GET", + "path": "/api/printedparts/items/", + "auth": "permission:printedparts.view", + "params": "path: item_id (int)", + "purpose": "Get one printed item with its recent transactions.", + "example": "curl http://localhost:5001/api/printedparts/items/1 -H \"Authorization: Bearer $TOK\"" + }, + { + "method": "PUT", + "path": "/api/printedparts/items/", + "auth": "permission:printedparts.edit", + "params": "path: item_id (int); body: JSON (fields not yet documented)", + "purpose": "Update catalog fields. Quantity moves ONLY through the ledger.", + "example": "curl -X PUT http://localhost:5001/api/printedparts/items/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "readsbody": true + }, + { + "method": "POST", + "path": "/api/printedparts/items//adjust", + "auth": "permission:printedparts.restock", + "params": "path: item_id (int); body: JSON (fields not yet documented)", + "purpose": "Correct the count (damage, recount). Body: {quantitychange, reason, badge}.", + "example": "curl -X POST http://localhost:5001/api/printedparts/items/1/adjust -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "readsbody": true + }, + { + "method": "GET", + "path": "/api/printedparts/items//files", + "auth": "permission:printedparts.view", + "params": "path: item_id (int)", + "purpose": "Revision history, newest first.", + "example": "curl http://localhost:5001/api/printedparts/items/1/files -H \"Authorization: Bearer $TOK\"", + "responseexample": { + "data": [ + { + "fileid": 2, + "filename": "clip_v2.gcode", + "filesize": 8, + "printeditemid": 1, + "revision": 2, + "uploadedby": "testadmin", + "uploadeddate": "2026-01-01T00:00:00.000000Z", + "uploadnote": null + }, + { + "fileid": 1, + "filename": "clip_v1.stl", + "filesize": 10, + "printeditemid": 1, + "revision": 1, + "uploadedby": "testadmin", + "uploadeddate": "2026-01-01T00:00:00.000000Z", + "uploadnote": "initial" + } + ], + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "POST", + "path": "/api/printedparts/items//files", + "auth": "permission:printedparts.edit", + "params": "path: item_id (int); body: JSON (fields not yet documented)", + "purpose": "Upload the next revision of the item's print file.", + "example": "curl -X POST http://localhost:5001/api/printedparts/items/1/files -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "responseexample": { + "data": { + "fileid": 1, + "filename": "clip_v1.stl", + "filesize": 10, + "printeditemid": 1, + "revision": 1, + "uploadedby": "testadmin", + "uploadeddate": "2026-01-01T00:00:00.000000Z", + "uploadnote": "initial" + }, + "message": "Revision 1 uploaded", + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "DELETE", + "path": "/api/printedparts/items//image", + "auth": "permission:printedparts.delete", + "params": "path: item_id (int)", + "purpose": "Clear an item image; delete the file only if this plugin owns it.", + "example": "curl -X DELETE http://localhost:5001/api/printedparts/items/1/image -H \"Authorization: Bearer $TOK\"" + }, + { + "method": "POST", + "path": "/api/printedparts/items//image", + "auth": "permission:printedparts.edit", + "params": "path: item_id (int); body: JSON (fields not yet documented)", + "purpose": "Upload (or replace) the photo for an item (multipart file=).", + "example": "curl -X POST http://localhost:5001/api/printedparts/items/1/image -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "readsbody": true + }, + { + "method": "POST", + "path": "/api/printedparts/items//restock", + "auth": "permission:printedparts.restock", + "params": "path: item_id (int); body: JSON (fields not yet documented)", + "purpose": "Add freshly printed stock. Body: {quantity, badge}.", + "example": "curl -X POST http://localhost:5001/api/printedparts/items/1/restock -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "requestexample": { + "badge": "", + "quantity": 10 + }, + "responseexample": { + "data": { + "binlocation": null, + "createddate": "2026-01-01T00:00:00.000000Z", + "gagelabtag": null, + "imageurl": null, + "isactive": true, + "islowstock": false, + "itemcode": "3DP-9001", + "itemdescription": null, + "itemname": "Test clip", + "latestrevision": null, + "lowstockthreshold": 5, + "modifieddate": "2026-01-01T00:00:00.000000Z", + "printeditemid": 1, + "printnotes": null, + "quantityonhand": 10 + }, + "message": "Stock added", + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "POST", + "path": "/api/printedparts/items//restore", + "auth": "permission:printedparts.delete", + "params": "path: item_id (int); body: JSON (fields not yet documented)", + "purpose": "Bring a retired item back; code, photo, and history are intact.", + "example": "curl -X POST http://localhost:5001/api/printedparts/items/1/restore -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "responseexample": { + "data": { + "binlocation": null, + "createddate": "2026-01-01T00:00:00.000000Z", + "gagelabtag": null, + "imageurl": null, + "isactive": true, + "islowstock": true, + "itemcode": "3DP-9001", + "itemdescription": null, + "itemname": "Test clip", + "latestrevision": null, + "lowstockthreshold": 5, + "modifieddate": "2026-01-01T00:00:00.000000Z", + "printeditemid": 1, + "printnotes": null, + "quantityonhand": 0 + }, + "message": "Printed item restored", + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "GET", + "path": "/api/printedparts/kiosk/item/", + "auth": "api-key-optional (kiosk: the per-device token in the X-Kiosk-Token header, OR a caller address inside the site's kiosk CIDR allowlist - an allowlisted caller sends no credential; 404 while the site's kiosk flag is off)", + "params": "path: itemcode (string)", + "purpose": "Item summary for a scanned bin barcode. Kiosk-token gated.", + "example": "curl http://localhost:5001/api/printedparts/kiosk/item/x", + "responseexample": { + "data": { + "binlocation": null, + "createddate": "2026-01-01T00:00:00.000000Z", + "gagelabtag": "WJRP0117", + "imageurl": null, + "isactive": true, + "islowstock": true, + "itemcode": "3DP0001", + "itemdescription": null, + "itemname": "Gage block holder", + "latestrevision": null, + "lowstockthreshold": 5, + "modifieddate": "2026-01-01T00:00:00.000000Z", + "printeditemid": 1, + "printnotes": null, + "quantityonhand": 0 + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "GET", + "path": "/api/printedparts/kiosk/provisioning-link", + "auth": "permission:settings.edit", + "params": "not documented", + "purpose": "The URL that provisions a screen, token included, for an administrator.", + "example": "curl http://localhost:5001/api/printedparts/kiosk/provisioning-link -H \"Authorization: Bearer $TOK\"" + }, + { + "method": "POST", + "path": "/api/printedparts/kiosk/take", + "auth": "api-key-optional (kiosk: the per-device token in the X-Kiosk-Token header, OR a caller address inside the site's kiosk CIDR allowlist - an allowlisted caller sends no credential; 404 while the site's kiosk flag is off)", + "params": "body: JSON (fields not yet documented)", + "purpose": "Take parts from a bin. Body: {itemcode, badge, quantity}.", + "example": "curl -X POST http://localhost:5001/api/printedparts/kiosk/take -H 'Content-Type: application/json' -d '{}'", + "requestexample": { + "badge": "", + "itemcode": "WJRP7000|3", + "quantity": 1 + }, + "responseexample": { + "data": { + "binlocation": null, + "createddate": "2026-01-01T00:00:00.000000Z", + "gagelabtag": "WJRP7000", + "imageurl": null, + "isactive": true, + "islowstock": false, + "itemcode": "3DP-7000", + "itemdescription": null, + "itemname": "Rev part", + "latestrevision": null, + "lowstockthreshold": 2, + "modifieddate": "2026-01-01T00:00:00.000000Z", + "printeditemid": 1, + "printnotes": null, + "quantityonhand": 8 + }, + "message": "Took 1, 8 left", + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "GET", + "path": "/api/printedparts/reports/by-person", + "auth": "permission:printedparts.view", + "params": "not documented", + "purpose": "Takes grouped by employee, optionally bounded by ?days= (default 30).", + "example": "curl http://localhost:5001/api/printedparts/reports/by-person -H \"Authorization: Bearer $TOK\"", + "queryparams": [ + { + "name": "days", + "type": "integer", + "required": false, + "default": 30 + }, + { + "name": "format", + "type": "string", + "required": false + } + ], + "responseexample": { + "data": { + "columns": [ + "employeesso", + "employeename", + "takes", + "" + ], + "days": 30, + "rows": [] + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "GET", + "path": "/api/printedparts/reports/consumption", + "auth": "permission:printedparts.view", + "params": "not documented", + "purpose": "Takes per item, optionally bounded by ?days= (default 30).", + "example": "curl http://localhost:5001/api/printedparts/reports/consumption -H \"Authorization: Bearer $TOK\"", + "queryparams": [ + { + "name": "days", + "type": "integer", + "required": false, + "default": 30 + }, + { + "name": "format", + "type": "string", + "required": false + } + ], + "responseexample": { + "data": { + "columns": [ + "itemcode", + "itemname", + "takes", + "" + ], + "days": 30, + "rows": [] + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "GET", + "path": "/api/printedparts/reports/stock", + "auth": "permission:printedparts.view", + "params": "not documented", + "purpose": "Stock levels with low-stock flags and the cache-vs-ledger reconcile.", + "example": "curl http://localhost:5001/api/printedparts/reports/stock -H \"Authorization: Bearer $TOK\"", + "queryparams": [ + { + "name": "format", + "type": "string", + "required": false + } + ], + "responseexample": { + "data": { + "columns": [ + "itemcode", + "itemname", + "binlocation", + "" + ], + "rows": [] + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + } + ] + }, + { + "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": "", + "createddate": "2026-01-01T00:00:00.000000Z", + "deletedby": null, + "deleteddate": null, + "gaugelabreference": null, + "ipaddress": "", + "isactive": true, + "levelid": null, + "locationcode": null, + "locationid": null, + "maintenancereference": null, + "mapverifiedat": null, + "mapx": null, + "mapy": null, + "modifiedby": "", + "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": "", + "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": "", + "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": "", + "installpath": "", + "mapx": 120, + "mapy": 240 + }, + "responseexample": { + "data": { + "assetid": 1, + "assetnumber": "SpoolsInspection-Xerox", + "assettypecolor": null, + "assettypeid": 1, + "assettypename": "printer", + "businessunitid": null, + "createdby": "", + "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": "", + "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": "", + "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": "", + "statusid": 1 + }, + "message": "Printer created", + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "DELETE", + "path": "/api/printers/", + "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/", + "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": "", + "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": "", + "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": "", + "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": "", + "statusid": 1 + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "PUT", + "path": "/api/printers/", + "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": "", + "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": "", + "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": "", + "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": "", + "statusid": 1 + }, + "message": "Printer updated", + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "GET", + "path": "/api/printers//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/", + "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/", + "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/", + "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/", + "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 + }, + "" + ], + "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": "", + "name": "HP universal", + "vendorid": 1 + }, + "responseexample": { + "data": { + "description": null, + "driverid": 1, + "drivername": "HP Universal Printing PCL 6", + "isactive": true, + "location": "", + "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/", + "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/", + "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": "", + "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/", + "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": "", + "printers": [ + { + "assetid": 4, + "driverid": null, + "driverlocation": null, + "drivername": null, + "hostname": "", + "inheritedfromassetid": 3, + "installpath": null, + "ipaddress": "", + "isdefault": false, + "port": null, + "printerid": 1, + "queuename": "PRINTER-A", + "sharename": null, + "windowsname": "PRINTER-A" + }, + { + "assetid": 5, + "driverid": null, + "driverlocation": null, + "drivername": null, + "hostname": "", + "inheritedfromassetid": 3, + "installpath": null, + "ipaddress": "", + "isdefault": false, + "port": null, + "printerid": 2, + "queuename": "PRINTER-B", + "sharename": null, + "windowsname": "PRINTER-B" + }, + { + "assetid": 6, + "driverid": null, + "driverlocation": null, + "drivername": null, + "hostname": "", + "inheritedfromassetid": 3, + "installpath": null, + "ipaddress": "", + "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": "", + "installpath": "", + "ipaddress": "", + "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//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//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/", + "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/", + "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": "", + "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": "", + "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": "", + "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": "", + "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": "", + "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/", + "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/", + "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", + "" + ], + "colors": [ + "black", + "cyan", + "magenta", + "" + ], + "supplytypes": [ + "toner", + "drum", + "waste", + "" + ] + }, + "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/", + "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/", + "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/", + "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/", + "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//", + "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//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//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//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//", + "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": "", + "iv": "MTIzNDU2Nzg5MDEy", + "views": 100 + }, + "responseexample": { + "data": { + "createddate": "2026-01-01T00:00:00.000000", + "expiresat": "2026-01-01T00:00:00.000000", + "token": "", + "viewcount": 0, + "viewsremaining": 100 + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "GET", + "path": "/api/tools/secrets/", + "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/", + "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": "", + "iv": "MTIzNDU2Nzg5MDEy" + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + } + ] + }, + { + "surface": "plugin-usb", + "endpoints": [ + { + "method": "GET", + "path": "/api/usb", + "auth": "permission:usb.view", + "params": "not documented", + "purpose": "List USB devices with checkout status.", + "example": "curl http://localhost:5001/api/usb -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, + "default": "" + }, + { + "name": "status", + "type": "string", + "required": false, + "default": "" + } + ] + }, + { + "method": "POST", + "path": "/api/usb", + "auth": "permission:usb.create", + "params": "body: JSON (fields not yet documented)", + "purpose": "Add a device (starts checked-in).", + "example": "curl -X POST http://localhost:5001/api/usb -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "readsbody": true + }, + { + "method": "GET", + "path": "/api/usb/", + "auth": "permission:usb.view", + "params": "path: device_id (string)", + "purpose": "Get a single device plus its last 20 check-in/out log rows.", + "example": "curl http://localhost:5001/api/usb/x -H \"Authorization: Bearer $TOK\"" + }, + { + "method": "PUT", + "path": "/api/usb/", + "auth": "permission:usb.edit", + "params": "path: device_id (string); body: JSON (fields not yet documented)", + "purpose": "Edit device_desc / device_owner / locker_location / status.", + "example": "curl -X PUT http://localhost:5001/api/usb/x -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "readsbody": true + }, + { + "method": "POST", + "path": "/api/usb//checkin", + "auth": "permission:usb.create", + "params": "path: device_id (string); body: JSON (fields not yet documented)", + "purpose": "Check a device back in from a badge.", + "example": "curl -X POST http://localhost:5001/api/usb/x/checkin -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "readsbody": true + }, + { + "method": "POST", + "path": "/api/usb//checkout", + "auth": "permission:usb.create", + "params": "path: device_id (string); body: JSON (fields not yet documented)", + "purpose": "Check a device out to a badge.", + "example": "curl -X POST http://localhost:5001/api/usb/x/checkout -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'", + "readsbody": true + }, + { + "method": "GET", + "path": "/api/usb//history", + "auth": "permission:usb.view", + "params": "path: device_id (string)", + "purpose": "Paginated check-in/out log for one device.", + "example": "curl http://localhost:5001/api/usb/x/history -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 + } + ] + }, + { + "method": "POST", + "path": "/api/usb//retire", + "auth": "permission:usb.edit", + "params": "path: device_id (string); body: JSON (fields not yet documented)", + "purpose": "Retire a device (status -> retired).", + "example": "curl -X POST http://localhost:5001/api/usb/x/retire -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'" + }, + { + "method": "GET", + "path": "/api/usb/checkouts", + "auth": "permission:usb.view", + "params": "not documented", + "purpose": "List check-out log rows.", + "example": "curl http://localhost:5001/api/usb/checkouts -H \"Authorization: Bearer $TOK\"", + "queryparams": [ + { + "name": "active", + "type": "string", + "required": false, + "default": "" + }, + { + "name": "badge", + "type": "string", + "required": false, + "default": "" + }, + { + "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/usb/checkouts/active", + "auth": "permission:usb.view", + "params": "not documented", + "purpose": "List the latest check-out log row for every currently checked-out device.", + "example": "curl http://localhost:5001/api/usb/checkouts/active -H \"Authorization: Bearer $TOK\"", + "queryparams": [ + { + "name": "badge", + "type": "string", + "required": false, + "default": "" + } + ] + }, + { + "method": "POST", + "path": "/api/usb/kiosk/checkin", + "auth": "api-key-optional (kiosk: the per-device token in the X-Kiosk-Token header, OR a caller address inside the site's kiosk CIDR allowlist - an allowlisted caller sends no credential; 404 while the site's kiosk flag is off)", + "params": "body: JSON (fields not yet documented)", + "purpose": "Check a device in at the kiosk. Body: {device_id, badge, forsomeoneelse}.", + "example": "curl -X POST http://localhost:5001/api/usb/kiosk/checkin -H 'Content-Type: application/json' -d '{}'", + "requestexample": { + "badge": "", + "device_id": "USB-1", + "forsomeoneelse": true + }, + "responseexample": { + "data": { + "device_id": "USB-1" + }, + "message": "USB-1 checked in", + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "POST", + "path": "/api/usb/kiosk/checkout", + "auth": "api-key-optional (kiosk: the per-device token in the X-Kiosk-Token header, OR a caller address inside the site's kiosk CIDR allowlist - an allowlisted caller sends no credential; 404 while the site's kiosk flag is off)", + "params": "body: JSON (fields not yet documented)", + "purpose": "Check a device out at the kiosk. Body: {device_id, badge}.", + "example": "curl -X POST http://localhost:5001/api/usb/kiosk/checkout -H 'Content-Type: application/json' -d '{}'", + "requestexample": { + "badge": "", + "device_id": "USB-1" + }, + "responseexample": { + "data": { + "device_id": "USB-1", + "holdername": "Dana Reyes" + }, + "message": "USB-1 checked out to Dana Reyes", + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "GET", + "path": "/api/usb/kiosk/device/", + "auth": "api-key-optional (kiosk: the per-device token in the X-Kiosk-Token header, OR a caller address inside the site's kiosk CIDR allowlist - an allowlisted caller sends no credential; 404 while the site's kiosk flag is off)", + "params": "path: device_id (string)", + "purpose": "What the kiosk shows after a device is scanned.", + "example": "curl http://localhost:5001/api/usb/kiosk/device/x", + "responseexample": { + "data": { + "device_desc": "Blue Kingston", + "device_id": "USB-1", + "holdername": "Dana Reyes", + "locker_location": null, + "status": "checked-out" + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "POST", + "path": "/api/usb/kiosk/others", + "auth": "api-key-optional (kiosk: the per-device token in the X-Kiosk-Token header, OR a caller address inside the site's kiosk CIDR allowlist - an allowlisted caller sends no credential; 404 while the site's kiosk flag is off)", + "params": "body: JSON (fields not yet documented)", + "purpose": "Drives checked out to OTHER people, with holder names. Body: {badge}.", + "example": "curl -X POST http://localhost:5001/api/usb/kiosk/others -H 'Content-Type: application/json' -d '{}'", + "requestexample": { + "badge": "" + }, + "responseexample": { + "data": [ + { + "device_desc": "Blue Kingston", + "device_id": "USB-1", + "holdername": "Dana Reyes", + "locker_location": null + } + ], + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "GET", + "path": "/api/usb/kiosk/provisioning-link", + "auth": "permission:settings.edit", + "params": "not documented", + "purpose": "The URL that provisions a screen, token included, for an administrator.", + "example": "curl http://localhost:5001/api/usb/kiosk/provisioning-link -H \"Authorization: Bearer $TOK\"", + "responseexample": { + "data": { + "expiresinminutes": 30, + "url": "/api/usb/kiosk/setup?code=" + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + } + }, + { + "method": "POST", + "path": "/api/usb/kiosk/session", + "auth": "api-key-optional (kiosk: the per-device token in the X-Kiosk-Token header, OR a caller address inside the site's kiosk CIDR allowlist - an allowlisted caller sends no credential; 404 while the site's kiosk flag is off)", + "params": "body: JSON (fields not yet documented)", + "purpose": "What one badge may do right now. Body: {badge}.", + "example": "curl -X POST http://localhost:5001/api/usb/kiosk/session -H 'Content-Type: application/json' -d '{}'", + "requestexample": { + "badge": "" + }, + "responseexample": { + "data": { + "available": [ + { + "device_desc": "Second", + "device_id": "USB-2", + "locker_location": null + } + ], + "name": "Dana Reyes", + "otherscount": 0, + "yours": [ + { + "device_desc": "Blue Kingston", + "device_id": "USB-1", + "locker_location": null + } + ] + }, + "meta": { + "requestid": "00000000", + "timestamp": "2026-01-01T00:00:00.000000Z" + }, + "status": "success" + }, + "readsbody": true + }, + { + "method": "GET", + "path": "/api/usb/kiosk/setup", + "auth": "setup-code (single-use kiosk setup code in ?code=, issued by the permission-gated provisioning link; spent on any attempt, 410 once used or expired)", + "params": "not documented", + "purpose": "Trade a setup code for this browser's kiosk cookie, then open the kiosk.", + "example": "curl http://localhost:5001/api/usb/kiosk/setup", + "queryparams": [ + { + "name": "code", + "type": "string", + "required": false + } + ] + }, + { + "method": "GET", + "path": "/api/usb/reports/audit", + "auth": "permission:usb.view", + "params": "not documented", + "purpose": "Every check-out and check-in in the window, newest first.", + "example": "curl http://localhost:5001/api/usb/reports/audit -H \"Authorization: Bearer $TOK\"", + "responseexample": { + "data": { + "columns": [ + "timestamp", + "action", + "device_id", + "" + ], + "days": 365, + "rows": [ + { + "action": "check-in", + "badge": "", + "device_desc": "Blue Kingston", + "device_id": "USB-1", + "locker_location": "", + "name": "Dana Reyes", + "sanitized": "", + "scanned_viruses": "", + "timestamp": "2026-01-01T00:00:00.000000" + }, + { + "action": "check-out", + "badge": "", + "device_desc": "Blue Kingston", + "device_id": "USB-1", + "locker_location": "", + "name": "Dana Reyes", + "sanitized": "", + "scanned_viruses": "", + "timestamp": "2026-01-01T00:00:00.000000" + }, + { + "action": "check-out", + "badge": "", + "device_desc": "Red SanDisk", + "device_id": "USB-2", + "locker_location": "", + "name": "Sam Okafor", + "sanitized": "", + "scanned_viruses": "", + "timestamp": "2026-01-01T00:00:00.000000" + } + ], + "summary": { + "checkins": 1, + "checkouts": 2, + "devices": 2, + "events": 3, + "people": 2 + } + }, + "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": "", + "vendor": "Acme" + }, + "responseexample": { + "data": { + "assets": [], + "enddate": "2026-01-01", + "isactive": true, + "lastcheckeddate": null, + "notes": null, + "prooffilename": null, + "proofurl": null, + "provider": "manual", + "servicelevel": null, + "servicetag": "", + "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/", + "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/", + "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/", + "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": "", + "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//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": "", + "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//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": "", + "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//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/", + "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/", + "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" + } + } + ] + } +]